From edf1cbd2af337770bae6f0ce52071b209ed5f93d Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 20:14:03 -0700
Subject: [PATCH 01/48] Remove tagilla brain from PMC brain pool
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/pmc.json | 4 ----
1 file changed, 4 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/pmc.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/pmc.json
index 27c89a2c..f7ccb311 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/pmc.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/pmc.json
@@ -182,11 +182,9 @@
"pmcType": {
"pmcbear": {
"factory4_day": {
- "bossTagilla": 1,
"pmcBEAR": 10
},
"factory4_night": {
- "bossTagilla": 1,
"pmcBEAR": 10
},
"bigmap": {
@@ -225,11 +223,9 @@
},
"pmcusec": {
"factory4_day": {
- "bossTagilla": 1,
"pmcUSEC": 10
},
"factory4_night": {
- "bossTagilla": 1,
"pmcUSEC": 10
},
"bigmap": {
From e00dcc719cfcf95207bf12c946566f0039acf380 Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 21:19:32 -0700
Subject: [PATCH 02/48] Fix examining item in hideout upgrade panel exception
---
.../Controllers/InventoryController.cs | 12 +++++++++---
.../SPTarkov.Server.Core/Helpers/InventoryHelper.cs | 2 +-
.../Eft/Common/Request/BaseInteractionRequestData.cs | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
index 2545e35e..fd508a84 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
@@ -509,7 +509,7 @@ public class InventoryController(
return presetHelper.GetBaseItemTpl(request.ItemId);
}
- if (request.FromOwner.Id == Traders.FENCE)
+ if (Traders.FENCE.Equals(request.FromOwner.Id))
// Get tpl from fence assorts
{
return fenceService.GetRawFenceAssorts().Items.FirstOrDefault(x => x.Id == request.ItemId)?.Template;
@@ -520,7 +520,7 @@ public class InventoryController(
// get tpl from trader assort
{
return databaseService
- .GetTrader(request.FromOwner.Id.Value)
+ .GetTrader(request.FromOwner.Id)
.Assort.Items.FirstOrDefault(item => item.Id == request.ItemId)
?.Template;
}
@@ -536,7 +536,7 @@ public class InventoryController(
// Try alternate way of getting offer if first approach fails
var offer =
- ragfairOfferService.GetOfferByOfferId(request.ItemId) ?? ragfairOfferService.GetOfferByOfferId(request.FromOwner.Id.Value);
+ ragfairOfferService.GetOfferByOfferId(request.ItemId) ?? ragfairOfferService.GetOfferByOfferId(request.FromOwner.Id);
// Try find examine item inside offer items array
var matchingItem = offer.Items.FirstOrDefault(offerItem => offerItem.Id == request.ItemId);
@@ -555,6 +555,12 @@ public class InventoryController(
return request.ItemId;
}
+ // Hideout upgrade
+ if (request.FromOwner.Type == "HideoutUpgrade")
+ {
+ return request.ItemId;
+ }
+
if (request.FromOwner.Type == "Mail")
{
// when inspecting an item in mail rewards, we are given on the message its in and its mongoId, not the Template, so we have to go find it ourselves
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs
index cc1083a2..688328df 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs
@@ -860,7 +860,7 @@ public class InventoryHelper(
else if (string.Equals(request.FromOwner.Type, "mail", StringComparison.OrdinalIgnoreCase))
{
// Split requests don't use 'use' but 'splitItem' property
- fromInventoryItems = dialogueHelper.GetMessageItemContents(request.FromOwner.Id.Value, sessionId, itemId);
+ fromInventoryItems = dialogueHelper.GetMessageItemContents(request.FromOwner.Id, sessionId, itemId);
fromType = "mail";
}
}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
index 31b6a5c2..52984bd1 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
@@ -18,7 +18,7 @@ public record BaseInteractionRequestData
public record OwnerInfo
{
[JsonPropertyName("id")]
- public MongoId? Id { get; set; }
+ public string? Id { get; set; }
[JsonPropertyName("type")]
public string? Type { get; set; }
From b416d7109a8b6faaa71fd2e9413723ab14db3bec Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:44:27 -0700
Subject: [PATCH 03/48] Fix launcher not showing mods Convert `Version` and
`SptVersion` to strings when serializing JSON for AbstractModMetadata
---
.../Models/Spt/Mod/AbstractModMetadata.cs | 6 ++++-
.../Json/Converters/ToStringJsonConverter.cs | 24 +++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
create mode 100644 Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
index 17d0c435..b711730e 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
@@ -1,4 +1,6 @@
-using Range = SemanticVersioning.Range;
+using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Utils.Json.Converters;
+using Range = SemanticVersioning.Range;
using Version = SemanticVersioning.Version;
namespace SPTarkov.Server.Core.Models.Spt.Mod;
@@ -40,6 +42,7 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("1.0.0.0"); is not
///
+ [JsonConverter(typeof(ToStringJsonConverter))]
public abstract Version Version { get; init; }
///
@@ -49,6 +52,7 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("4.0.0.0"); is not
///
+ [JsonConverter(typeof(ToStringJsonConverter))]
public abstract Range SptVersion { get; init; }
///
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
new file mode 100644
index 00000000..8e6c9454
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
@@ -0,0 +1,24 @@
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Utils.Json.Converters;
+
+internal class ToStringJsonConverter : JsonConverter
+{
+ public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ throw new NotSupportedException($"Deserialization of {typeof(T).Name} from string is not supported.");
+ }
+
+ public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
+ {
+ if (value == null)
+ {
+ writer.WriteNullValue();
+ }
+ else
+ {
+ writer.WriteStringValue(value.ToString());
+ }
+ }
+}
From 1bdfd4186e193844d014201d3c67432a9828856b Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:55:44 -0700
Subject: [PATCH 04/48] Implement ToStringJsonConverter Read method
---
.../Json/Converters/ToStringJsonConverter.cs | 22 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
index 8e6c9454..11069f08 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
@@ -5,9 +5,27 @@ namespace SPTarkov.Server.Core.Utils.Json.Converters;
internal class ToStringJsonConverter : JsonConverter
{
- public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- throw new NotSupportedException($"Deserialization of {typeof(T).Name} from string is not supported.");
+ if (reader.TokenType == JsonTokenType.Null)
+ {
+ return default;
+ }
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ var value = reader.GetString();
+ try
+ {
+ return (T?)Activator.CreateInstance(typeToConvert, value);
+ }
+ catch (Exception ex)
+ {
+ throw new JsonException($"Unable to convert \"{value}\" to {typeof(T).Name}.", ex);
+ }
+ }
+
+ throw new JsonException($"Expected string to deserialize {typeof(T).Name} but got {reader.TokenType}.");
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
From e4c5b69fecea6503e3b646b862681caf03d4b8ae Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:57:03 -0700
Subject: [PATCH 05/48] Formatting
---
.../SPTarkov.Server.Core/Controllers/InventoryController.cs | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
index fd508a84..19053150 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
@@ -519,10 +519,7 @@ public class InventoryController(
// Not fence
// get tpl from trader assort
{
- return databaseService
- .GetTrader(request.FromOwner.Id)
- .Assort.Items.FirstOrDefault(item => item.Id == request.ItemId)
- ?.Template;
+ return databaseService.GetTrader(request.FromOwner.Id).Assort.Items.FirstOrDefault(item => item.Id == request.ItemId)?.Template;
}
if (request.FromOwner.Type == "RagFair")
From a7798b1b2742875781acd24d61c9b3f38f9d50fd Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 09:43:45 +0100
Subject: [PATCH 06/48] Added comments to `GetOffersOfType`
---
.../SPTarkov.Server.Core/Services/RagfairOfferService.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs
index 8d526488..6347176b 100644
--- a/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs
@@ -49,6 +49,11 @@ public class RagfairOfferService(
return ragfairOfferHolder.GetOfferById(offerId);
}
+ ///
+ /// Get offers for a desired item tpl
+ ///
+ /// Id of item to get offers for
+ /// IEnumerable
public IEnumerable? GetOffersOfType(MongoId templateId)
{
return ragfairOfferHolder.GetOffersByTemplate(templateId);
From 7a78eb8400c8596f03afc936b3145b843ee73ddc Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 11:15:11 +0100
Subject: [PATCH 07/48] Updated `bossKnight` spawnchance chance to 18% from 0%
---
.../SPT_Data/database/locations/bigmap/base.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/bigmap/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/bigmap/base.json
index c30682fb..dc999218 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/bigmap/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/bigmap/base.json
@@ -138,7 +138,7 @@
"TriggerName": ""
},
{
- "BossChance": 0,
+ "BossChance": 18,
"BossDifficult": "normal",
"BossEscortAmount": "2",
"BossEscortDifficult": "normal",
From 9bbfee8e6dbfcffe2d420ff02dc8bba2f67b030a Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 11:16:19 +0100
Subject: [PATCH 08/48] Cleaned up comments and var usage inside
`UpdateQuestsForGameEdition`
---
Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs
index 6ff44f61..1e98865c 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs
@@ -1245,7 +1245,7 @@ public class QuestHelper(
}
///
- /// Create a clone of the given quest Collection with the rewards updated to reflect the given game version
+ /// Remove rewards from quests that do not fulfil the gameversion requirement
///
/// List of quests to check
/// Game version of the profile
@@ -1255,15 +1255,15 @@ public class QuestHelper(
foreach (var quest in quests)
{
// Remove any reward that doesn't pass the game edition check
- var propsAsDict = quest.Rewards;
- foreach (var rewardType in propsAsDict)
+ foreach (var rewardType in quest.Rewards)
{
if (rewardType.Value is null)
{
continue;
}
- propsAsDict[rewardType.Key] = propsAsDict[rewardType.Key]
+ quest.Rewards[rewardType.Key] = quest
+ .Rewards[rewardType.Key]
.Where(reward => rewardHelper.RewardIsForGameEdition(reward, gameVersion))
.ToList();
}
From a66ce40ba8d10f1d5002284e56a8124c104802d5 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 16:34:36 +0100
Subject: [PATCH 09/48] Updated `Cost` logging to be debug
---
.../SPTarkov.Server.Core/Controllers/InsuranceController.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
index 6a4dd183..62733df3 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
@@ -842,7 +842,7 @@ public class InsuranceController(
)
)
{
- logger.Warning(
+ logger.Debug(
$"Unable to add item id: {itemId.ToString()} to client/insurance/items/list/cost response, already exists"
);
}
From 64b4881dfbe1771822af4b342c8ae6f8ba7b19f6 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 17:21:33 +0100
Subject: [PATCH 10/48] Log Total system memory in OS-agnostic way
---
Libraries/SPTarkov.Server.Core/Utils/App.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/App.cs b/Libraries/SPTarkov.Server.Core/Utils/App.cs
index c7ad8938..4c8bd14f 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/App.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/App.cs
@@ -32,7 +32,15 @@ public class App(
if (logger.IsLogEnabled(LogLevel.Debug))
{
+ var totalMemoryBytes = GC.GetGCMemoryInfo().TotalAvailableMemoryBytes;
+
+ // Convert bytes to GB
+ var totalMemoryGb = totalMemoryBytes / (1024.0 * 1024.0 * 1024.0);
+ var pageFileGb = Environment.SystemPageSize / (1024.0 * 1024.0 * 1024.0);
+
logger.Debug($"OS: {Environment.OSVersion.Version} | {Environment.OSVersion.Platform}");
+ logger.Debug($"Pagefile: {pageFileGb:F2} GB");
+ logger.Debug($"RAM: {totalMemoryGb:F2} GB");
logger.Debug($"Ran as admin: {Environment.IsPrivilegedProcess}");
logger.Debug($"CPU cores: {Environment.ProcessorCount}");
logger.Debug($"PATH: {(Environment.ProcessPath ?? "null returned").Encode(EncodeType.BASE64)}");
From 03fae2a97544d93110f0b4999c6989e789b54634 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Sun, 12 Oct 2025 22:00:13 +0100
Subject: [PATCH 11/48] Blacklisted unlootable `PMC Origins figurine`
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
index 0fdd5179..17522fc8 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
@@ -584,7 +584,8 @@
"68418091b5b0c9e4c60f0e7a",
"684180ee9b6d80d840042e8a",
"684181208d035f60230f63f9",
- "6866665cdf54e1190902df55"
+ "6866665cdf54e1190902df55",
+ "6841b6b674a3c16f5e03d653"
],
"rewardItemTypeBlacklist": [
"65649eb40bf0ed77b8044453"
From fa674ef3ae0184e6ef0915cd384c00ca86515f16 Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 15:16:30 +0200
Subject: [PATCH 12/48] Make file writes atomic
---
.../SPTarkov.Server.Core/Utils/FileUtil.cs | 47 +++++++++++++------
1 file changed, 33 insertions(+), 14 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
index b3f3e4ab..20b9ad61 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
@@ -1,3 +1,4 @@
+using System.Text;
using SPTarkov.DI.Annotations;
namespace SPTarkov.Server.Core.Utils;
@@ -101,27 +102,45 @@ public class FileUtil
public async Task WriteFileAsync(string filePath, string fileContent)
{
- if (!DirectoryExists(Path.GetDirectoryName(filePath)))
- {
- CreateDirectory(Path.GetDirectoryName(filePath));
- }
-
- if (!FileExists(filePath))
- {
- CreateFile(filePath);
- }
-
- await File.WriteAllTextAsync(filePath, fileContent);
+ var bytes = Encoding.UTF8.GetBytes(fileContent);
+ await WriteFileAsync(filePath, bytes);
}
public async Task WriteFileAsync(string filePath, byte[] fileContent)
{
- if (!FileExists(filePath))
+ var directoryPath = Path.GetDirectoryName(filePath);
+
+ if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath))
{
- CreateFile(filePath);
+ Directory.CreateDirectory(directoryPath);
}
- await File.WriteAllBytesAsync(filePath, fileContent);
+ var tempFilePath = filePath + ".bak";
+
+ try
+ {
+ await using (
+ var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)
+ )
+ {
+ await fs.WriteAsync(fileContent, 0, fileContent.Length);
+ await fs.FlushAsync();
+ }
+
+ File.Move(tempFilePath, filePath, overwrite: true);
+ }
+ catch
+ {
+ if (File.Exists(tempFilePath))
+ {
+ try
+ {
+ File.Delete(tempFilePath);
+ }
+ catch { }
+ }
+ throw;
+ }
}
private void CreateFile(string filePath)
From 3d1f757d1e7a15b7331a85ee663594c7a6093b90 Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 15:19:49 +0200
Subject: [PATCH 13/48] Fix index going out of range on probability object
array
---
.../Utils/Collections/ProbabilityObjectArray.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
index 670de92c..3ef05bfe 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
@@ -159,7 +159,13 @@ public class ProbabilityObjectArray : List>
for (var i = 0; i < itemCountToDraw; i++)
{
var rand = Random.Shared.NextDouble();
- var randomIndex = cumulativeProbabilities.FindIndex(probability => probability > rand);
+ var randomIndex = cumulativeProbabilities.FindIndex(probability => probability >= rand);
+
+ if (randomIndex == -1)
+ {
+ continue;
+ }
+
results.Add(this[randomIndex].Key);
}
From 740895056f43356fb80cec6155878cd5761921ef Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 15:23:39 +0200
Subject: [PATCH 14/48] Accept VS suggestion
---
Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
index 20b9ad61..65eee9fa 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
@@ -123,7 +123,7 @@ public class FileUtil
var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)
)
{
- await fs.WriteAsync(fileContent, 0, fileContent.Length);
+ await fs.WriteAsync(fileContent);
await fs.FlushAsync();
}
From 6d65e68e29b42210fad7f47c138720b0a8e35377 Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 15:34:46 +0200
Subject: [PATCH 15/48] Add comments
---
Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
index 65eee9fa..8a961dbb 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
@@ -106,6 +106,10 @@ public class FileUtil
await WriteFileAsync(filePath, bytes);
}
+ ///
+ /// Writes a file atomically by first writing to a temporary file, then replacing the original.
+ /// This prevents corruption if the write operation fails or is interrupted.
+ ///
public async Task WriteFileAsync(string filePath, byte[] fileContent)
{
var directoryPath = Path.GetDirectoryName(filePath);
@@ -124,9 +128,12 @@ public class FileUtil
)
{
await fs.WriteAsync(fileContent);
+
+ // We flush here so we can be sure it's immediately committed to disk
await fs.FlushAsync();
}
+ // Overwrite over the old file
File.Move(tempFilePath, filePath, overwrite: true);
}
catch
From 4cf3279f97b1201949fb1f6c200fbb586ca61949 Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 16:27:21 +0200
Subject: [PATCH 16/48] Add handler for PointsEarnedDuringSession overflow
---
.../Models/Eft/Common/Tables/BotBase.cs | 1 +
.../Json/Converters/SafeDoubleConverter.cs | 49 +++++++++++++++++++
2 files changed, 50 insertions(+)
create mode 100644 Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
index ec9efa64..dd601592 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
@@ -425,6 +425,7 @@ public record MasterySkill
public record CommonSkill
{
+ [JsonConverter(typeof(SafeDoubleConverter))]
public double PointsEarnedDuringSession { get; set; }
public long LastAccess { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
new file mode 100644
index 00000000..04577710
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
@@ -0,0 +1,49 @@
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Utils.Json.Converters;
+
+public class SafeDoubleConverter : JsonConverter
+{
+ public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ switch (reader.TokenType)
+ {
+ case JsonTokenType.Number:
+ try
+ {
+ return reader.GetDouble();
+ }
+ catch (FormatException)
+ {
+ try
+ {
+ var decimalValue = reader.GetDecimal();
+ return decimalValue > 0 ? double.MaxValue : double.MinValue;
+ }
+ catch
+ {
+ return double.MaxValue;
+ }
+ }
+
+ case JsonTokenType.String:
+ if (double.TryParse(reader.GetString(), out var stringParsed))
+ {
+ return stringParsed;
+ }
+ return 0;
+
+ case JsonTokenType.Null:
+ return 0;
+
+ default:
+ return 0;
+ }
+ }
+
+ public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOptions options)
+ {
+ writer.WriteNumberValue(value);
+ }
+}
From a9b715c0c37df0a9807bcef02181542e1535da6f Mon Sep 17 00:00:00 2001
From: Archangel
Date: Mon, 13 Oct 2025 16:42:43 +0200
Subject: [PATCH 17/48] Set to 0 if we're below 0
---
.../Utils/Json/Converters/SafeDoubleConverter.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
index 04577710..5a5ca511 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SafeDoubleConverter.cs
@@ -19,7 +19,7 @@ public class SafeDoubleConverter : JsonConverter
try
{
var decimalValue = reader.GetDecimal();
- return decimalValue > 0 ? double.MaxValue : double.MinValue;
+ return decimalValue > 0 ? double.MaxValue : 0;
}
catch
{
From 14e6f187b815f9533d55307e8b841614f0094463 Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Mon, 13 Oct 2025 14:44:38 -0700
Subject: [PATCH 18/48] Fix commando inheriting all chat commands - Add new
ICommandoCommand interface for Commando-specific commands
---
.../Helpers/Dialogue/Commando/ICommandoCommand.cs | 7 +++++++
.../Helpers/Dialogue/Commando/SptCommandoCommands.cs | 3 ++-
.../Helpers/Dialogue/CommandoDialogChatBot.cs | 3 ++-
3 files changed, 11 insertions(+), 2 deletions(-)
create mode 100644 Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
new file mode 100644
index 00000000..736a6632
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
@@ -0,0 +1,7 @@
+using SPTarkov.Server.Core.Helpers.Dialog.Commando;
+
+namespace SPTarkov.Server.Core.Helpers.Dialogue.Commando;
+
+public interface ICommandoCommand : IChatCommand
+{
+}
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs
index 0e69643b..4527d81d 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs
@@ -1,5 +1,6 @@
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Helpers.Dialog.Commando.SptCommands;
+using SPTarkov.Server.Core.Helpers.Dialogue.Commando;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Dialog;
using SPTarkov.Server.Core.Models.Eft.Profile;
@@ -10,7 +11,7 @@ using SPTarkov.Server.Core.Services;
namespace SPTarkov.Server.Core.Helpers.Dialog.Commando;
[Injectable]
-public class SptCommandoCommands : IChatCommand
+public class SptCommandoCommands : ICommandoCommand
{
protected readonly ServerLocalisationService _serverLocalisationService;
protected readonly IDictionary _sptCommands;
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/CommandoDialogChatBot.cs b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/CommandoDialogChatBot.cs
index 95f20310..e57fa993 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/CommandoDialogChatBot.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/CommandoDialogChatBot.cs
@@ -1,5 +1,6 @@
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Helpers.Dialog.Commando;
+using SPTarkov.Server.Core.Helpers.Dialogue.Commando;
using SPTarkov.Server.Core.Models.Eft.Profile;
using SPTarkov.Server.Core.Models.Enums;
using SPTarkov.Server.Core.Models.Spt.Config;
@@ -15,7 +16,7 @@ public class CommandoDialogChatBot(
MailSendService mailSendService,
ServerLocalisationService localisationService,
ConfigServer configServer,
- IEnumerable chatCommands
+ IEnumerable chatCommands
) : AbstractDialogChatBot(logger, mailSendService, localisationService, chatCommands)
{
protected readonly CoreConfig CoreConfig = configServer.GetConfig();
From eedc4e543e5a2944a2fa63362bb1801d910df8dc Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Mon, 13 Oct 2025 14:45:57 -0700
Subject: [PATCH 19/48] Formatting
---
.../Helpers/Dialogue/Commando/ICommandoCommand.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
index 736a6632..8e25bfbe 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/Commando/ICommandoCommand.cs
@@ -2,6 +2,4 @@
namespace SPTarkov.Server.Core.Helpers.Dialogue.Commando;
-public interface ICommandoCommand : IChatCommand
-{
-}
+public interface ICommandoCommand : IChatCommand { }
From 6bdc1cc702447e00e184765320b2923d55cc04b3 Mon Sep 17 00:00:00 2001
From: Cj <161484149+CJ-SPT@users.noreply.github.com>
Date: Mon, 13 Oct 2025 20:52:02 -0400
Subject: [PATCH 20/48] Add new PMC names
---
.../SPT_Data/database/bots/types/bear.json | 5 ++++-
.../SPT_Data/database/bots/types/usec.json | 5 ++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
index 019651b4..bb3c9c8a 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
@@ -2976,7 +2976,10 @@
"YukoVR",
"ZenosBleed",
"chrispawl89",
- "hulkhan"
+ "hulkhan",
+ "LycorisOni",
+ "HB",
+ "Quik"
],
"generation": {
"items": {
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
index 91a9c8f4..267e932f 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
@@ -2967,7 +2967,10 @@
"YukoVR",
"ZenosBleed",
"chrispawl89",
- "hulkhan"
+ "hulkhan",
+ "LycorisOni",
+ "HB",
+ "Quik"
],
"generation": {
"items": {
From 5e60904eb712ea2c790b0859739c6c18f0d26aec Mon Sep 17 00:00:00 2001
From: Cj <161484149+CJ-SPT@users.noreply.github.com>
Date: Mon, 13 Oct 2025 20:59:15 -0400
Subject: [PATCH 21/48] remove duped name
---
.../SPT_Data/database/bots/types/bear.json | 1 -
.../SPT_Data/database/bots/types/usec.json | 1 -
2 files changed, 2 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
index bb3c9c8a..cd46e67c 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json
@@ -2978,7 +2978,6 @@
"chrispawl89",
"hulkhan",
"LycorisOni",
- "HB",
"Quik"
],
"generation": {
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
index 267e932f..a929c419 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json
@@ -2969,7 +2969,6 @@
"chrispawl89",
"hulkhan",
"LycorisOni",
- "HB",
"Quik"
],
"generation": {
From a3f5385d3577192cbf355560874af31ca7aa9ace Mon Sep 17 00:00:00 2001
From: Chomp
Date: Tue, 14 Oct 2025 09:52:49 +0100
Subject: [PATCH 22/48] Blacklisted `Corpse room key` from rewards
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
index 17522fc8..f2f696e1 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
@@ -585,7 +585,8 @@
"684180ee9b6d80d840042e8a",
"684181208d035f60230f63f9",
"6866665cdf54e1190902df55",
- "6841b6b674a3c16f5e03d653"
+ "6841b6b674a3c16f5e03d653",
+ "679bab714e9ca6b3d80586b4"
],
"rewardItemTypeBlacklist": [
"65649eb40bf0ed77b8044453"
From b6ded0751fe9f450bf4550d4100e5e98fc48d88b Mon Sep 17 00:00:00 2001
From: Chomp
Date: Tue, 14 Oct 2025 10:18:57 +0100
Subject: [PATCH 23/48] Blacklisted `Rusted bloody key` from rewards
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
index f2f696e1..7fff618d 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/item.json
@@ -586,7 +586,8 @@
"684181208d035f60230f63f9",
"6866665cdf54e1190902df55",
"6841b6b674a3c16f5e03d653",
- "679bab714e9ca6b3d80586b4"
+ "679bab714e9ca6b3d80586b4",
+ "64d4b23dc1b37504b41ac2b6"
],
"rewardItemTypeBlacklist": [
"65649eb40bf0ed77b8044453"
From 562dee37d7158eee84e97324728f69958a4e10dd Mon Sep 17 00:00:00 2001
From: Chomp
Date: Tue, 14 Oct 2025 12:19:15 +0100
Subject: [PATCH 24/48] Fixed tiered flea issue. A level level profile can lock
item for all other profiles until server restarts
---
.../Helpers/RagfairOfferHelper.cs | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
index d7e5559d..71d95ede 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
@@ -14,6 +14,7 @@ using SPTarkov.Server.Core.Routers;
using SPTarkov.Server.Core.Servers;
using SPTarkov.Server.Core.Services;
using SPTarkov.Server.Core.Utils;
+using SPTarkov.Server.Core.Utils.Cloners;
namespace SPTarkov.Server.Core.Helpers;
@@ -38,7 +39,8 @@ public class RagfairOfferHelper(
RagfairRequiredItemsService ragfairRequiredItemsService,
ProfileHelper profileHelper,
EventOutputHolder eventOutputHolder,
- ConfigServer configServer
+ ConfigServer configServer,
+ ICloner cloner
)
{
protected const string GoodSoldTemplate = "5bdabfb886f7743e152e867e 0"; // Your {soldItem} {itemCount} items were bought by {buyerNickname}.
@@ -63,8 +65,10 @@ public class RagfairOfferHelper(
var playerIsFleaBanned = pmcData.PlayerIsFleaBanned(timeUtil.GetTimeStamp());
var tieredFlea = RagfairConfig.TieredFlea;
var tieredFleaLimitTypes = tieredFlea.UnlocksType;
- return ragfairOfferService
- .GetOffers()
+
+ // Clone offers if tiered flea is enabled as we perform modification of offer data prior to return
+ var offers = tieredFlea.Enabled ? cloner.Clone(ragfairOfferService.GetOffers()) : ragfairOfferService.GetOffers();
+ return offers
.Where(offer =>
{
var offerRootItem = offer.Items.FirstOrDefault();
@@ -182,7 +186,7 @@ public class RagfairOfferHelper(
var result = new List();
foreach (
var offer in offerIDsForItem
- .Select(ragfairOfferService.GetOfferByOfferId)
+ .Select(tieredFlea.Enabled ? cloner.Clone(ragfairOfferService.GetOfferByOfferId) : ragfairOfferService.GetOfferByOfferId) // Clone offer when tiered flea enabled as we may modify offer data
.Where(offer => PassesSearchFilterCriteria(searchRequest, offer, offer.Items.FirstOrDefault(), pmcData))
)
{
@@ -220,7 +224,10 @@ public class RagfairOfferHelper(
foreach (var desiredItemTpl in searchRequest.BuildItems)
{
- var matchingOffers = ragfairOfferService.GetOffersOfType(desiredItemTpl.Key);
+ // Clone offers when tiered flea enabled as we may modify the offer
+ var matchingOffers = tieredFlea.Enabled
+ ? cloner.Clone(ragfairOfferService.GetOffersOfType(desiredItemTpl.Key))
+ : ragfairOfferService.GetOffersOfType(desiredItemTpl.Key);
if (matchingOffers is null)
// No offers found for this item, skip
{
From 12a086bc702fa492967d8976a5481afa643446cc Mon Sep 17 00:00:00 2001
From: Chomp
Date: Tue, 14 Oct 2025 12:22:32 +0100
Subject: [PATCH 25/48] Show `unlock at level x` instead of offer creators name
in flea while item is tier locked
---
.../Helpers/RagfairOfferHelper.cs | 20 ++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
index 71d95ede..e52e37dd 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
@@ -132,6 +132,7 @@ public class RagfairOfferHelper(
{
// Lock the offer if player's level is below the ammo's unlock requirement
offer.Locked = true;
+ offer.User.Nickname = $"Unlock level: {unlockLevel}";
return;
}
@@ -144,6 +145,7 @@ public class RagfairOfferHelper(
{
// Lock the offer if player's level is below the item's specific requirement
offer.Locked = true;
+ offer.User.Nickname = $"Unlock level: {itemLevelRequirement}";
return;
}
@@ -156,14 +158,22 @@ public class RagfairOfferHelper(
}
// Check if the item belongs to any restricted type and if player level is insufficient
- if (
- tieredFleaLimitTypes
- .Where(tieredItemType => itemHelper.IsOfBaseclass(offerItemTpl, tieredItemType))
- .Any(tieredItemType => playerLevel < tieredFlea.UnlocksType[tieredItemType])
- )
+ var matchingTypes = tieredFleaLimitTypes.Where(tieredItemType => itemHelper.IsOfBaseclass(offerItemTpl, tieredItemType));
+ if (!matchingTypes.Any())
+ {
+ return;
+ }
+
+ //Get all matches
+ var levelRequirements = tieredFlea.UnlocksType.Where(x => matchingTypes.Contains(x.Key)).Select(x => x.Value);
+
+ // Get highest requirement
+ var highestRequirement = levelRequirements.Max();
+ if (highestRequirement < playerLevel)
{
// Players level is below matching types requirement, flag as locked
offer.Locked = true;
+ offer.User.Nickname = $"Unlock level: {levelRequirements.Max()}";
}
}
From 56026297cf6cdba02e6b7aacd19e1b354019b336 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Tue, 14 Oct 2025 18:23:09 +0100
Subject: [PATCH 26/48] Fixed logic error inside
`CheckAndLockOfferFromPlayerTieredFlea`
---
Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
index e52e37dd..65d80fa7 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs
@@ -169,7 +169,7 @@ public class RagfairOfferHelper(
// Get highest requirement
var highestRequirement = levelRequirements.Max();
- if (highestRequirement < playerLevel)
+ if (playerLevel < highestRequirement)
{
// Players level is below matching types requirement, flag as locked
offer.Locked = true;
From a1a3db783cd184f7ca04449e27b6d6c0f1f59eba Mon Sep 17 00:00:00 2001
From: Cj <161484149+CJ-SPT@users.noreply.github.com>
Date: Wed, 15 Oct 2025 01:33:18 -0400
Subject: [PATCH 27/48] Explicitly handle socket exceptions (Multiple servers
running)
---
SPTarkov.Server/Program.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs
index 443debc0..c7a991c7 100644
--- a/SPTarkov.Server/Program.cs
+++ b/SPTarkov.Server/Program.cs
@@ -32,6 +32,14 @@ public static class Program
{
await StartServer(args);
}
+ catch (SocketException)
+ {
+ Console.WriteLine("=========================================================================================================");
+ Console.WriteLine("You have multiple servers running or another process using port 6969");
+ Console.WriteLine("=========================================================================================================");
+ Console.WriteLine("Press any key to exit...");
+ Console.ReadLine();
+ }
catch (Exception e)
{
Console.WriteLine("=========================================================================================================");
From b15892b25647313dba616aeb90bc210c793e59fd Mon Sep 17 00:00:00 2001
From: Chomp
Date: Wed, 15 Oct 2025 20:29:02 +0100
Subject: [PATCH 28/48] Fixed nullref inside `ChargePlayerTaxFee` #620
---
Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
index a607935b..e4378874 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
@@ -858,7 +858,7 @@ public class RagfairController(
if (logger.IsLogEnabled(LogLevel.Debug))
{
- logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue.Count is not null}");
+ logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue?.Count is not null}");
}
// Cleanup of cache now we've used the tax value from it
From 78b41ecde4aa735f09252673fa40e7a79793d0a5 Mon Sep 17 00:00:00 2001
From: Greelan <53196309+Greelan@users.noreply.github.com>
Date: Thu, 16 Oct 2025 11:17:57 +1100
Subject: [PATCH 29/48] Allow bypass of SetConsoleOutputMode function
---
SPTarkov.Server/Program.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs
index c7a991c7..30f76f55 100644
--- a/SPTarkov.Server/Program.cs
+++ b/SPTarkov.Server/Program.cs
@@ -234,7 +234,7 @@ public static class Program
private static void SetConsoleOutputMode()
{
- if (!OperatingSystem.IsWindows())
+ if (!OperatingSystem.IsWindows() || Environment.GetEnvironmentVariable("DISABLE_VIRTUAL_TERMINAL") == "1")
{
return;
}
From 4cfc6a33384b0d81eb8e27453d59ed0fd5079721 Mon Sep 17 00:00:00 2001
From: Greelan <53196309+Greelan@users.noreply.github.com>
Date: Thu, 16 Oct 2025 11:28:40 +1100
Subject: [PATCH 30/48] Improve environment variable check flexibility
As per bot suggestion
---
SPTarkov.Server/Program.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs
index 30f76f55..e1836221 100644
--- a/SPTarkov.Server/Program.cs
+++ b/SPTarkov.Server/Program.cs
@@ -234,7 +234,9 @@ public static class Program
private static void SetConsoleOutputMode()
{
- if (!OperatingSystem.IsWindows() || Environment.GetEnvironmentVariable("DISABLE_VIRTUAL_TERMINAL") == "1")
+ var disableFlag = Environment.GetEnvironmentVariable("DISABLE_VIRTUAL_TERMINAL");
+
+ if (!OperatingSystem.IsWindows() || disableFlag == "1" || string.Equals(disableFlag, "true", StringComparison.OrdinalIgnoreCase))
{
return;
}
From 2d0713d94e7597bbaf49e3febb1fb00817dd796f Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Wed, 15 Oct 2025 18:15:28 -0700
Subject: [PATCH 31/48] Offset PMC spawns to start of raid when using a
simulated raid start
---
.../Services/RaidTimeAdjustmentService.cs | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs b/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs
index e5287444..d27be8da 100644
--- a/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs
@@ -1,4 +1,5 @@
using SPTarkov.DI.Annotations;
+using SPTarkov.Server.Core.Constants;
using SPTarkov.Server.Core.Helpers;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common;
@@ -157,6 +158,21 @@ public class RaidTimeAdjustmentService(
wave.TimeMax -= (int)Math.Max(startSeconds, 0);
}
+ // Now additionally move all PMCs back so they spawn starting at the beginning of the raid
+ var pmcSpawns = mapBase.BossLocationSpawn.Where(boss => boss.BossName is Sides.PmcUsec or Sides.PmcBear);
+ var firstPmcSpawn = pmcSpawns.OrderBy(boss => boss.Time).FirstOrDefault();
+ if (firstPmcSpawn != null)
+ {
+ var pmcStartSeconds = firstPmcSpawn.Time.GetValueOrDefault(1);
+ foreach (var spawn in pmcSpawns)
+ {
+ // Sanity check, the client won't spawn a time of 0
+ spawn.Time = (double)Math.Max(spawn.Time.GetValueOrDefault(1) - pmcStartSeconds, 1);
+ }
+
+ logger.Debug($"Offset PMC spawns by {pmcStartSeconds} seconds");
+ }
+
logger.Debug(
$"Removed: {originalPmcWaveCount - mapBase.BossLocationSpawn.Count} boss waves from map due to simulated raid start time of {raidAdjustments.SimulatedRaidStartSeconds / 60} minutes"
);
From d6b7a783e40ecf3eb6897fcf1bec22d28e2735f8 Mon Sep 17 00:00:00 2001
From: qe201020335 <31044781+qe201020335@users.noreply.github.com>
Date: Thu, 16 Oct 2025 00:36:52 -0400
Subject: [PATCH 32/48] Fix `checks.dat` not being copied into output directory
during a clean compile (#616)
---
.../SPTarkov.Server.Assets.csproj | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPTarkov.Server.Assets.csproj b/Libraries/SPTarkov.Server.Assets/SPTarkov.Server.Assets.csproj
index 52b5cd89..005fe28a 100644
--- a/Libraries/SPTarkov.Server.Assets/SPTarkov.Server.Assets.csproj
+++ b/Libraries/SPTarkov.Server.Assets/SPTarkov.Server.Assets.csproj
@@ -17,7 +17,15 @@
-
+
+ Always
+ True
+ True
+ None
+ true
+ contentFiles\any\any\SPT_Data\
+
+
Always
True
True
@@ -26,8 +34,11 @@
contentFiles\any\any\SPT_Data\
-
-
+
+
+
+
+
From f9638ee7c22671134ecc09f9981fa8f48c86e7f4 Mon Sep 17 00:00:00 2001
From: sp-tarkov-bot
Date: Thu, 16 Oct 2025 07:45:25 +0000
Subject: [PATCH 33/48] Format Style Fixes
---
SPTarkov.Server/Program.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs
index e1836221..c8c94860 100644
--- a/SPTarkov.Server/Program.cs
+++ b/SPTarkov.Server/Program.cs
@@ -235,7 +235,7 @@ public static class Program
private static void SetConsoleOutputMode()
{
var disableFlag = Environment.GetEnvironmentVariable("DISABLE_VIRTUAL_TERMINAL");
-
+
if (!OperatingSystem.IsWindows() || disableFlag == "1" || string.Equals(disableFlag, "true", StringComparison.OrdinalIgnoreCase))
{
return;
From 84d08ade22f7dded422edb7f2208821392e10a62 Mon Sep 17 00:00:00 2001
From: Archangel
Date: Thu, 16 Oct 2025 10:47:56 +0200
Subject: [PATCH 34/48] Initialize MVC before Blazor
---
Libraries/SPTarkov.Server.Web/SPTWeb.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Web/SPTWeb.cs b/Libraries/SPTarkov.Server.Web/SPTWeb.cs
index c4c11bc3..d1dff139 100644
--- a/Libraries/SPTarkov.Server.Web/SPTWeb.cs
+++ b/Libraries/SPTarkov.Server.Web/SPTWeb.cs
@@ -17,7 +17,6 @@ public static class SPTWeb
builder.WebHost.UseStaticWebAssets();
builder.Services.AddMudServices();
- builder.Services.AddRazorComponents().AddInteractiveServerComponents();
var mvcBuilder = builder.Services.AddControllers();
@@ -25,6 +24,8 @@ public static class SPTWeb
{
mvcBuilder.AddApplicationPart(assembly);
}
+
+ builder.Services.AddRazorComponents().AddInteractiveServerComponents();
}
public static void UseSptBlazor(this WebApplication app)
@@ -33,6 +34,7 @@ public static class SPTWeb
app.UseAntiforgery();
app.UseStaticFiles();
+ app.MapControllers();
var razorBuilder = app.MapRazorComponents().AddInteractiveServerRenderMode();
@@ -67,7 +69,5 @@ public static class SPTWeb
);
}
}
-
- app.MapControllers();
}
}
From 0e548aa080f1ff4f0c378b6c2bacf9e5b7c476db Mon Sep 17 00:00:00 2001
From: Archangel
Date: Thu, 16 Oct 2025 12:34:03 +0200
Subject: [PATCH 35/48] UnmappedMemberHandling on debug builds only
---
Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs
index c866bc75..c5434228 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs
@@ -20,7 +20,9 @@ public class JsonUtil
ReadCommentHandling = JsonCommentHandling.Skip,
WriteIndented = false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
+#if DEBUG
UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow,
+#endif
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
};
From 697e07456db099523f3722e71a9109cbad46d99c Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 15:55:49 +0100
Subject: [PATCH 36/48] Persist PMC stats on prestige
---
.../Helpers/PrestigeHelper.cs | 34 ++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs
index 332d2233..550be953 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs
@@ -28,7 +28,6 @@ public class PrestigeHelper(
var indexOfPrestigeObtained = Math.Clamp((prestige.PrestigeLevel ?? 1) - 1, 0, prestigeLevels.Count - 1); // Levels are 1 to 4, Index is 0 to 3
// Skill copy
-
var skillProgressCopyAmount = (float)(1 - prestigeLevels[indexOfPrestigeObtained].TransferConfigs.SkillConfig.TransferMultiplier);
var masteringProgressCopyAmount = (float)(
1 - prestigeLevels[indexOfPrestigeObtained].TransferConfigs.MasteringConfig.TransferMultiplier
@@ -90,6 +89,9 @@ public class PrestigeHelper(
AddPrestigeRewardsToProfile(sessionId!.Value, newProfile, prestigeRewards);
+ // Copy profile stats
+ CopyStats(newProfile, oldProfile);
+
// Flag profile as having achieved this prestige level
if (newProfile.CharacterData?.PmcData?.Prestige?.TryAdd(currentPrestigeData!.Id, timeUtil.GetTimeStamp()) is false)
{
@@ -126,6 +128,36 @@ public class PrestigeHelper(
newProfile.CharacterData!.PmcData!.Info!.PrestigeLevel = prestige.PrestigeLevel;
}
+ ///
+ /// Copy over profile stats from old profile to new
+ /// Remove some stats once copied over
+ ///
+ /// Profile to add stats to
+ /// Profile to copy stats from
+ protected void CopyStats(SptProfile newProfile, SptProfile oldProfile)
+ {
+ var newPmcStats = newProfile.CharacterData.PmcData.Stats;
+ var oldPmcStats = oldProfile.CharacterData.PmcData.Stats;
+
+ newPmcStats.Eft = oldPmcStats.Eft;
+
+ // Reset some PMC stats that should not be copied over
+ newPmcStats.Eft.CarriedQuestItems = [];
+ newPmcStats.Eft.FoundInRaidItems = [];
+ newPmcStats.Eft.LastSessionDate = 0;
+
+ // TODO: find evidence scav stats are copied over in live
+ //var newScavStats = newProfile.CharacterData.ScavData.Stats;
+ //var oldScavStats = oldProfile.CharacterData.ScavData.Stats;
+
+ //newPmcStats.Eft = oldScavStats.Eft;
+
+ //// Reset some Scav stats that should not be copied over
+ //newScavStats.Eft.CarriedQuestItems = [];
+ //newScavStats.Eft.FoundInRaidItems = [];
+ //newScavStats.Eft.LastSessionDate = 0;
+ }
+
private void AddPrestigeRewardsToProfile(MongoId sessionId, SptProfile newProfile, IEnumerable rewards)
{
var itemsToSend = new List- ();
From 13f370f0dcce18cb29abaa84604677d499fec211 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 16:29:47 +0100
Subject: [PATCH 37/48] Fixed nullref inside `GetItemMinAvgMaxFleaPriceValues`
---
Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
index e4378874..c9f79f4b 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs
@@ -343,7 +343,7 @@ public class RagfairController(
var offers = ragfairOfferService.GetOffersOfType(getPriceRequest.TemplateId);
// Offers exist for item, get averages of what's listed
- if (offers.Any())
+ if (offers != null && offers.Any())
{
// These get calculated while iterating through the list below
var minMax = new MinMax(int.MaxValue, 0);
From b23832267ce4bd2bd8fbedd70a093f0b3c1b965c Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 18:23:26 +0100
Subject: [PATCH 38/48] Fixed sort by name not working due to it being really
slow #625
---
.../Helpers/RagfairSortHelper.cs | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs
index 2eb47f74..0c52e5cc 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs
@@ -33,7 +33,8 @@ public class RagfairSortHelper(LocaleService localeService)
break;
case RagfairSort.OFFER_TITLE:
- offers.Sort(SortOffersByName);
+ var locale = localeService.GetLocaleDb();
+ offers.Sort((offer, ragfairOffer) => SortOffersByName(offer, ragfairOffer, locale));
break;
case RagfairSort.PRICE:
@@ -75,14 +76,12 @@ public class RagfairSortHelper(LocaleService localeService)
return ratingA.CompareTo(ratingB);
}
- protected int SortOffersByName(RagfairOffer a, RagfairOffer b)
+ protected int SortOffersByName(RagfairOffer a, RagfairOffer b, Dictionary locale)
{
- var locale = localeService.GetLocaleDb();
-
- var tplA = a.Items[0].Template;
- var tplB = b.Items[0].Template;
- var nameA = locale.GetValueOrDefault($"{tplA} Name", tplA);
- var nameB = locale.GetValueOrDefault($"{tplB} Name", tplB);
+ var tplA = a.Items.First().Template;
+ var tplB = b.Items.First().Template;
+ var nameA = locale.GetValueOrDefault($"{tplA} Name", tplA.ToString());
+ var nameB = locale.GetValueOrDefault($"{tplB} Name", tplB.ToString());
return string.CompareOrdinal(nameA, nameB);
}
From 03756f6ff443c73aa9c4ec256f3e1825f0827755 Mon Sep 17 00:00:00 2001
From: qingchun <96961592+qingchunnh@users.noreply.github.com>
Date: Fri, 17 Oct 2025 01:55:31 +0800
Subject: [PATCH 39/48] Fix stash upgrade usage limit
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json
index e3e38886..01bcb2d9 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json
@@ -190,7 +190,7 @@
"giveCommandEnabled": true
},
"commandUseLimits": {
- "StashRows": 29
+ "StashRows": 28
},
"ids": {
"commando": "6723fd51c5924c57ce0ca01e",
From e16e3875507b5d5e0283ad119ac6117cd929e01c Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 21:09:01 +0100
Subject: [PATCH 40/48] Updated non-active map base.json data
---
.../database/locations/develop/base.json | 1266 +++++++++--------
.../database/locations/hideout/base.json | 417 +++---
.../database/locations/privatearea/base.json | 293 ++--
.../database/locations/suburbs/base.json | 287 ++--
.../database/locations/terminal/base.json | 263 ++--
.../database/locations/town/base.json | 287 ++--
6 files changed, 1583 insertions(+), 1230 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
index e12b4681..8dc0d79a 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
@@ -1,592 +1,690 @@
{
- "Enabled": false,
- "Locked": false,
- "Insurance": false,
- "SafeLocation": false,
- "Name": "Arena",
- "Scene": {
- "path": "maps/develop_preset.bundle",
- "rcid": "develop.scenespreset.asset"
- },
- "Area": 0,
- "RequiredPlayerLevel": 1,
- "MinPlayers": 1,
- "MaxPlayers": 10,
- "exit_count": 0,
- "exit_access_time": 0,
- "exit_time": 0,
- "IconX": 156,
- "IconY": 551,
- "waves": [
- {
- "number": 0,
- "time_min": 0,
- "time_max": 10,
- "slots_min": 1,
- "slots_max": 2,
- "BotSide": "Savage",
- "BotPreset": "normal",
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": true
- },
- {
- "number": 1,
- "time_min": 10,
- "time_max": 120,
- "slots_min": 2,
- "slots_max": 3,
- "BotSide": "Savage",
- "BotPreset": "easy",
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": true
- },
- {
- "number": 0,
- "time_min": 120,
- "time_max": 240,
- "slots_min": 3,
- "slots_max": 4,
- "BotSide": "Savage",
- "BotPreset": "hard",
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": true
- }
- ],
- "limits": [],
- "AveragePlayTime": 2,
- "AveragePlayerLevel": 10,
- "escape_time_limit": 60000,
- "Rules": "Normal",
- "IsSecret": false,
- "doors": [],
- "tmp_location_field_remove_me": 0,
- "MinDistToExitPoint": 0,
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": true,
- "GlobalLootChanceModifier": 0,
- "OldSpawn": true,
- "NewSpawn": false,
- "BotMax": 5,
- "BotStart": 30,
- "BotStop": 2400,
- "BotMaxTimePlayer": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotMaxPlayer": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "AccessKeys": [],
- "UnixDateTime": 1600869802,
- "users_gather_seconds": 0,
- "users_spawn_seconds_n": 0,
- "users_spawn_seconds_n2": 0,
- "users_summon_seconds": 0,
- "sav_summon_seconds": 0,
- "matching_min_seconds": 0,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 1,
- "Scattering": 1,
- "GainSight": 1,
- "MarksmanAccuratyCoef": 1,
- "VisibleDistance": 1,
- "DistToSleep": 100,
- "DistToActivate": 80,
- "MagnetPower": 10
- },
- "exits": [
- {
- "Name": "UN Roadblock",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 0,
- "MaxTime": 0,
- "PlayersCount": 0,
- "ExfiltrationTime": 10,
- "PassageRequirement": "TransferItem",
- "ExfiltrationType": "SharedTimer",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "5449016a4bdc2d6f028b456f",
- "RequirementTip": "Сотку должен",
- "Count": 100
- },
- {
- "Name": "Elevator",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 0,
- "MaxTime": 0,
- "PlayersCount": 3,
- "ExfiltrationTime": 10,
- "PassageRequirement": "None",
- "ExfiltrationType": "Individual",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "",
- "RequirementTip": "",
- "Count": 0
- },
- {
- "Name": "Outskirts",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 0,
- "MaxTime": 0,
- "PlayersCount": 0,
- "ExfiltrationTime": 10,
- "PassageRequirement": "None",
- "ExfiltrationType": "Individual",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "",
- "RequirementTip": "",
- "Count": 0
- },
- {
- "Name": "Hangar Gate",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 0,
- "MaxTime": 0,
- "PlayersCount": 0,
- "ExfiltrationTime": 10,
- "PassageRequirement": "None",
- "ExfiltrationType": "Individual",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "",
- "RequirementTip": "",
- "Count": 0
- },
- {
- "Name": "Tunnel",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 0,
- "MaxTime": 0,
- "PlayersCount": 0,
- "ExfiltrationTime": 10,
- "PassageRequirement": "None",
- "ExfiltrationType": "Individual",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "",
- "RequirementTip": "",
- "Count": 0
- },
- {
- "Name": "EXFIL_Train",
- "EntryPoints": "House,Houseb",
- "Chance": 100,
- "MinTime": 30,
- "MaxTime": 60,
- "PlayersCount": 0,
- "ExfiltrationTime": 5,
- "PassageRequirement": "Train",
- "ExfiltrationType": "SharedTimer",
- "RequiredSlot": "FirstPrimaryWeapon",
- "Id": "0",
- "RequirementTip": "TIP IS HARDCODED",
- "Count": 90
- }
- ],
- "DisabledForScav": false,
- "BossLocationSpawn": [],
- "SpawnPointParams": [
- {
- "Id": "03841924-ea1a-4e5c-bf27-82af7868beb1",
- "Position": {
- "x": -30.359436,
- "y": 0.1,
- "z": -6.39318848
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 2,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 5,
+ "BotMaxPvE": 5,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 30,
+ "BotStartPlayer": 0,
+ "BotStop": 2400,
+ "DisabledScavExits": "",
+ "EnableCoop": false,
+ "Enabled": false,
+ "EscapeTimeLimit": 60000,
+ "EscapeTimeLimitCoop": 60000,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
},
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
],
- "Categories": [
- "Player"
+ "IconX": 156,
+ "IconY": 551,
+ "IsSecret": false,
+ "Locked": false,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 10,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 10,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 1,
+ "Name": "Arena",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": true,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "maps/develop_preset.bundle",
+ "rcid": "develop.scenespreset.asset"
+ },
+ "UnixDateTime": 1600869802,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 2,
+ "slots_min": 1,
+ "time_max": 10,
+ "time_min": 0
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 3,
+ "slots_min": 2,
+ "time_max": 120,
+ "time_min": 10
+ },
+ {
+ "BotPreset": "hard",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 4,
+ "slots_min": 3,
+ "time_max": 240,
+ "time_min": 120
+ }
],
- "Infiltration": "House",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
+ "AirdropParameters": [
+ {
+ "AirdropPointDeactivateDistance": 50,
+ "MinPlayersCountToSpawnAirdrop": 0,
+ "PlaneAirdropChance": 0,
+ "PlaneAirdropCooldownMax": 900,
+ "PlaneAirdropCooldownMin": 600,
+ "PlaneAirdropEnd": 2100,
+ "PlaneAirdropMax": 0,
+ "PlaneAirdropStartMax": 900,
+ "PlaneAirdropStartMin": 300,
+ "UnsuccessfulTryPenalty": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 1,
+ "DistToActivate": 80,
+ "DistToActivatePvE": 80,
+ "DistToSleep": 100,
+ "DistToSleepPvE": 100,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 1,
+ "MagnetPower": 10,
+ "MarksmanAccuratyCoef": 1,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 1,
+ "VisibleDistance": 1
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
},
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "03841924-ea1a-4e5c-bf27-82af7868beb1",
+ "Infiltration": "House",
+ "Position": {
+ "x": -30.359436,
+ "y": 0.1,
+ "z": -6.39318848
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "0da5b986-424a-44d1-906a-1d7cc118413a",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 19.715271,
+ "y": 0.06,
+ "z": 5.14703369
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "110e3c75-e58d-461c-ab61-9f6a715ca6b1",
+ "Infiltration": "House",
+ "Position": {
+ "x": -30.0410156,
+ "y": 0.1,
+ "z": -1.40075684
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "1a40138b-6f65-4866-bad2-64162d7772de",
+ "Infiltration": "House",
+ "Position": {
+ "x": -29.2000122,
+ "y": 0.1,
+ "z": 5.14001465
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "3feb492c-8c45-405a-8e7a-8dd903433eb0",
+ "Infiltration": "House",
+ "Position": {
+ "x": -23.7852783,
+ "y": 0.1,
+ "z": -2.34625244
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "52d3284b-0e8f-47e8-a7d1-701bf4cd8e5b",
+ "Infiltration": "House",
+ "Position": {
+ "x": -23.4979248,
+ "y": 0.1,
+ "z": 3.856079
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "870629fd-e4d5-4fa1-8274-94c223ad9692",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 12.9941406,
+ "y": 0.06,
+ "z": 1.34918213
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "93a1c6d6-1379-43e6-99c2-c346178bb3e0",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 18.1246338,
+ "y": 0.06,
+ "z": -6.334656
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "BotZoneMain",
+ "Categories": [
+ "Bot"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 4
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 10,
+ "Id": "971882ef-596f-4419-acfb-ca2bfe52d043",
+ "Infiltration": "",
+ "Position": {
+ "x": -17.92,
+ "y": 0,
+ "z": 5.55
+ },
+ "Rotation": 0,
+ "Sides": [
+ "Savage"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "cf24125e-1c3a-457e-a024-613a8df98b06",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 12.47467,
+ "y": 0.06,
+ "z": -4.838135
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "d052b031-b477-465f-8913-ae108c9ca2c3",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 19.210022,
+ "y": 0.06,
+ "z": 0.16998291
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ }
+ ],
+ "exits": [
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 100,
+ "CountPVE": 100,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "SharedTimer",
+ "Id": "5449016a4bdc2d6f028b456f",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "UN Roadblock",
+ "PassageRequirement": "TransferItem",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": "Сотку должен"
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Elevator",
+ "PassageRequirement": "None",
+ "PlayersCount": 3,
+ "PlayersCountPVE": 3,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Outskirts",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Hangar Gate",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Tunnel",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 90,
+ "CountPVE": 90,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 5,
+ "ExfiltrationTimePVE": 5,
+ "ExfiltrationType": "SharedTimer",
+ "Id": "0",
+ "MaxTime": 60,
+ "MaxTimePVE": 60,
+ "MinTime": 30,
+ "MinTimePVE": 30,
+ "Name": "EXFIL_Train",
+ "PassageRequirement": "Train",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": "TIP IS HARDCODED"
+ }
+ ],
+ "maxItemCountInLocation": [],
+ "Id": "develop",
+ "_Id": "56db0b3bd2720bb0678b4567",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5805f617245977100b2c1f41",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
}
}
- },
- "BotZoneName": ""
- },
- {
- "Id": "0da5b986-424a-44d1-906a-1d7cc118413a",
- "Position": {
- "x": 19.715271,
- "y": 0.06,
- "z": 5.14703369
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Houseb",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "110e3c75-e58d-461c-ab61-9f6a715ca6b1",
- "Position": {
- "x": -30.0410156,
- "y": 0.1,
- "z": -1.40075684
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "House",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "1a40138b-6f65-4866-bad2-64162d7772de",
- "Position": {
- "x": -29.2000122,
- "y": 0.1,
- "z": 5.14001465
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "House",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "3feb492c-8c45-405a-8e7a-8dd903433eb0",
- "Position": {
- "x": -23.7852783,
- "y": 0.1,
- "z": -2.34625244
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "House",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "52d3284b-0e8f-47e8-a7d1-701bf4cd8e5b",
- "Position": {
- "x": -23.4979248,
- "y": 0.1,
- "z": 3.856079
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "House",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "870629fd-e4d5-4fa1-8274-94c223ad9692",
- "Position": {
- "x": 12.9941406,
- "y": 0.06,
- "z": 1.34918213
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Houseb",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "93a1c6d6-1379-43e6-99c2-c346178bb3e0",
- "Position": {
- "x": 18.1246338,
- "y": 0.06,
- "z": -6.334656
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Houseb",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "971882ef-596f-4419-acfb-ca2bfe52d043",
- "Position": {
- "x": -17.92,
- "y": 0,
- "z": 5.55
- },
- "Rotation": 0,
- "Sides": [
- "Savage"
- ],
- "Categories": [
- "Bot"
- ],
- "Infiltration": "",
- "DelayToCanSpawnSec": 10,
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Radius": 4
- }
- },
- "BotZoneName": "BotZoneMain"
- },
- {
- "Id": "cf24125e-1c3a-457e-a024-613a8df98b06",
- "Position": {
- "x": 12.47467,
- "y": 0.06,
- "z": -4.838135
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Houseb",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "d052b031-b477-465f-8913-ae108c9ca2c3",
- "Position": {
- "x": 19.210022,
- "y": 0.06,
- "z": 0.16998291
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Houseb",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "BotZoneName": ""
- }
- ],
- "maxItemCountInLocation": [],
- "Id": "develop",
- "_Id": "56db0b3bd2720bb0678b4567",
- "Loot": [],
- "Banners": [
- {
- "id": "5805f617245977100b2c1f41",
- "pic": {
- "path": "CONTENT/banners/tglabs.jpg",
- "rcid": ""
- }
- },
- {
- "id": "5807be8924597742c603fa19",
- "pic": {
- "path": "CONTENT/banners/banner_tarkov.jpg",
- "rcid": ""
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "path": "CONTENT/banners/banner_scavraider.jpg",
- "rcid": ""
- }
- }
- ]
-}
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
index fcc30edb..d42ebac9 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
@@ -1,193 +1,238 @@
{
- "Enabled": false,
- "EnableCoop": true,
- "Locked": true,
- "Name": "Hideout",
- "Scene": {
- "path": "maps/bunker_preset.bundle",
- "rcid": "bunker.ScenesPreset.asset"
- },
- "Area": 0,
- "RequiredPlayerLevelMin": 1,
- "RequiredPlayerLevelMax": 100,
- "PmcMaxPlayersInGroup": 5,
- "ScavMaxPlayersInGroup": 4,
- "MinPlayers": 1,
- "MaxPlayers": 10,
- "MaxCoopGroup": 10,
- "IconX": 0,
- "IconY": 0,
- "waves": [],
- "limits": [],
- "AveragePlayTime": 1000000,
- "AveragePlayerLevel": 10,
- "EscapeTimeLimit": 99999,
- "EscapeTimeLimitCoop": 99999,
- "Rules": "Normal",
- "IsSecret": false,
- "doors": [],
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": false,
- "OldSpawn": true,
- "OfflineOldSpawn": true,
- "NewSpawn": false,
- "OfflineNewSpawn": true,
- "BotMax": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "MinPlayerLvlAccessKeys": 0,
- "AccessKeys": [],
- "UnixDateTime": 1689772567,
- "PlayersRequestCount": -1,
- "NonWaveGroupScenario": {
- "MinToBeGroup": 2,
- "MaxToBeGroup": 3,
- "Chance": 50,
- "Enabled": false
- },
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "GlobalContainerChanceModifier": 1,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 1,
- "Scattering": 1,
- "GainSight": 1,
- "MarksmanAccuratyCoef": 1,
- "VisibleDistance": 0
- },
- "exits": [],
- "DisabledForScav": false,
- "SpawnPointParams": [
- {
- "Id": "f656a561-6524-49e2-90c0-1cbbece183ce",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 1000000,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 99999,
+ "EscapeTimeLimitCoop": 99999,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
},
- "Rotation": 45.0000038,
- "Sides": [
- "Usec"
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
],
- "Categories": [
- "Player",
- "Bot"
- ],
- "Infiltration": "",
- "DelayToCanSpawnSec": 0.5,
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
+ "IconX": 0,
+ "IconY": 0,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 10,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 10,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 1,
+ "Name": "Hideout",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 1,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "maps/bunker_preset.bundle",
+ "rcid": "bunker.ScenesPreset.asset"
+ },
+ "UnixDateTime": 1689772567,
+ "doors": [],
+ "limits": [],
+ "waves": [],
+ "BotLocationModifier": {
+ "AccuracySpeed": 1,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 1,
+ "MarksmanAccuratyCoef": 1,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 1,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player",
+ "Bot"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 10
+ }
},
- "Radius": 10
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "f92541a9-08ab-4c9e-957a-d802e143b705",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
- },
- "Rotation": 45.0000038,
- "Sides": [
- "All"
- ],
- "Categories": [
- "Player"
- ],
- "Infiltration": "Hideout",
- "DelayToCanSpawnSec": 4,
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
+ "DelayToCanSpawnSec": 0.5,
+ "Id": "f656a561-6524-49e2-90c0-1cbbece183ce",
+ "Infiltration": "",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
},
- "Radius": 10
- }
- },
- "BotZoneName": ""
- },
- {
- "Id": "faf351a1-e5f5-4642-8ece-267508fdfea6",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
- },
- "Rotation": 45.0000038,
- "Sides": [
- "Bear"
- ],
- "Categories": [
- "Player",
- "Bot"
- ],
- "Infiltration": "",
- "DelayToCanSpawnSec": 0.5,
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
+ "Rotation": 45.0000038,
+ "Sides": [
+ "Usec"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 10
+ }
},
- "Radius": 10
+ "DelayToCanSpawnSec": 4,
+ "Id": "f92541a9-08ab-4c9e-957a-d802e143b705",
+ "Infiltration": "Hideout",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
+ },
+ "Rotation": 45.0000038,
+ "Sides": [
+ "All"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player",
+ "Bot"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 10
+ }
+ },
+ "DelayToCanSpawnSec": 0.5,
+ "Id": "faf351a1-e5f5-4642-8ece-267508fdfea6",
+ "Infiltration": "",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
+ },
+ "Rotation": 45.0000038,
+ "Sides": [
+ "Bear"
+ ]
}
- },
- "BotZoneName": ""
- }
- ],
- "maxItemCountInLocation": [
- {
- "TemplateId": "604b47caa16c2359315ad047",
- "Value": 0
- }
- ],
- "Id": "hideout",
- "_Id": "599319c986f7740dca3070a6",
- "Loot": [],
- "Banners": [
- {
- "id": "5805f617245977100b2c1f41",
- "pic": {
- "path": "CONTENT/banners/tglabs.jpg",
- "rcid": ""
- }
- },
- {
- "id": "5807be8924597742c603fa19",
- "pic": {
- "path": "CONTENT/banners/banner_tarkov.jpg",
- "rcid": ""
- }
- }
- ],
- "BossLocationSpawn": []
-}
+ ],
+ "exits": [],
+ "maxItemCountInLocation": [
+ {
+ "TemplateId": "604b47caa16c2359315ad047",
+ "Value": 0
+ }
+ ],
+ "Id": "hideout",
+ "_Id": "599319c986f7740dca3070a6",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5805f617245977100b2c1f41",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5807be8924597742c603fa19",
+ "pic": {
+ "file": "67e4046dbec96f5d8e09732a.jpg",
+ "path": "banners/67e4046dbec96f5d8e09732a.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
index f7b34005..ca66e7ba 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
@@ -1,125 +1,172 @@
{
- "Enabled": false,
- "Locked": true,
- "Insurance": true,
- "SafeLocation": false,
- "Name": "Private Sector",
- "Description": "Private residential sector, built up with cottages of the upper-class citizens of Tarkov. In the first weeks of emerging chaos it served as a refugee staging camp, but has become a known scavenger haunt afterwards.",
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "Area": 0,
- "RequiredPlayerLevel": 0,
- "MinPlayers": 6,
- "MaxPlayers": 9,
- "exit_count": 1,
- "exit_access_time": 10,
- "exit_time": 2,
- "Preview": {
- "path": "",
- "rcid": ""
- },
- "IconX": 224,
- "IconY": 646,
- "filter_ex": [],
- "waves": [
- {
- "number": 0,
- "time_min": 1,
- "time_max": 2,
- "slots_min": 3,
- "slots_max": 6,
- "SpawnPoints": "",
- "BotSide": "Savage",
- "BotPreset": "normal",
- "isPlayers": false,
- "WildSpawnType": "assault"
- },
- {
- "number": 1,
- "time_min": 10,
- "time_max": 12,
- "slots_min": 3,
- "slots_max": 5,
- "SpawnPoints": "",
- "BotSide": "Usec",
- "BotPreset": "hard",
- "isPlayers": false,
- "WildSpawnType": "assault"
- }
- ],
- "limits": [],
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "escape_time_limit": 0,
- "Rules": "Normal",
- "IsSecret": true,
- "doors": [],
- "tmp_location_field_remove_me": 0,
- "MinDistToExitPoint": 30,
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": false,
- "GlobalLootChanceModifier": 1,
- "OldSpawn": true,
- "NewSpawn": false,
- "BotMax": 0,
- "BotStart": 0,
- "BotStop": 0,
- "BotMaxTimePlayer": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotMaxPlayer": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "AccessKeys": [],
- "UnixDateTime": 0,
- "users_gather_seconds": 120,
- "users_spawn_seconds_n": 60,
- "users_spawn_seconds_n2": 90,
- "users_summon_seconds": 0,
- "sav_summon_seconds": 60,
- "matching_min_seconds": 120,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "Scattering": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "VisibleDistance": 0
- },
- "exits": [],
- "DisabledForScav": false,
- "SpawnPointParams": [],
- "maxItemCountInLocation": [],
- "Id": "Private Area",
- "_Id": "5704e64ad2720bb55b8b456e",
- "Loot": [],
- "Banners": [
- {
- "id": "5803a58524597710ca36fcb2",
- "pic": {
- "path": "CONTENT/banners/banner_terragroup.jpg",
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 224,
+ "IconY": 646,
+ "IsSecret": true,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Private Sector",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
"rcid": ""
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "path": "CONTENT/banners/banner_scavraider.jpg",
- "rcid": ""
- }
- }
- ],
- "BossLocationSpawn": []
-}
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "hard",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Private Area",
+ "_Id": "5704e64ad2720bb55b8b456e",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5803a58524597710ca36fcb2",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
index 7b9dae9d..f32ceb9e 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
@@ -1,119 +1,172 @@
{
- "Enabled": false,
- "Locked": true,
- "Insurance": false,
- "SafeLocation": false,
- "Name": "Suburbs",
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "Area": 0,
- "RequiredPlayerLevel": 0,
- "MinPlayers": 6,
- "MaxPlayers": 9,
- "exit_count": 0,
- "exit_access_time": 0,
- "exit_time": 0,
- "IconX": 480,
- "IconY": 577,
- "waves": [
- {
- "number": 0,
- "time_min": 1,
- "time_max": 2,
- "slots_min": 3,
- "slots_max": 6,
- "SpawnPoints": "",
- "BotSide": "Savage",
- "BotPreset": "normal",
- "isPlayers": false,
- "WildSpawnType": "assault"
- },
- {
- "number": 1,
- "time_min": 10,
- "time_max": 12,
- "slots_min": 3,
- "slots_max": 5,
- "SpawnPoints": "",
- "BotSide": "Usec",
- "BotPreset": "easy",
- "isPlayers": false,
- "WildSpawnType": "assault"
- }
- ],
- "limits": [],
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "escape_time_limit": 0,
- "Rules": "Normal",
- "IsSecret": false,
- "doors": [],
- "tmp_location_field_remove_me": 0,
- "MinDistToExitPoint": 0,
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": false,
- "GlobalLootChanceModifier": 0,
- "OldSpawn": true,
- "NewSpawn": false,
- "BotMax": 0,
- "BotStart": 0,
- "BotStop": 0,
- "BotMaxTimePlayer": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotMaxPlayer": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "AccessKeys": [],
- "UnixDateTime": 0,
- "users_gather_seconds": 0,
- "users_spawn_seconds_n": 0,
- "users_spawn_seconds_n2": 0,
- "users_summon_seconds": 0,
- "sav_summon_seconds": 0,
- "matching_min_seconds": 0,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "Scattering": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "VisibleDistance": 0
- },
- "exits": [],
- "DisabledForScav": false,
- "BossLocationSpawn": [],
- "SpawnPointParams": [],
- "maxItemCountInLocation": [],
- "Id": "Suburbs",
- "_Id": "5714dc342459777137212e0b",
- "Loot": [],
- "Banners": [
- {
- "id": "5807be8924597742c603fa19",
- "pic": {
- "path": "CONTENT/banners/banner_tarkov.jpg",
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 480,
+ "IconY": 577,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Suburbs",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
"rcid": ""
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "path": "CONTENT/banners/banner_scavraider.jpg",
- "rcid": ""
- }
- }
- ]
-}
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Suburbs",
+ "_Id": "5714dc342459777137212e0b",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5807be8924597742c603fa19",
+ "pic": {
+ "file": "67e4046dbec96f5d8e09732a.jpg",
+ "path": "banners/67e4046dbec96f5d8e09732a.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
index c63c81c1..cb7e9087 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
@@ -1,104 +1,161 @@
{
- "Enabled": true,
- "Locked": true,
- "Insurance": false,
- "SafeLocation": false,
- "Name": "Terminal",
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "Area": 0,
- "RequiredPlayerLevel": 0,
- "MinPlayers": 6,
- "MaxPlayers": 9,
- "exit_count": 0,
- "exit_access_time": 0,
- "exit_time": 0,
- "IconX": 280,
- "IconY": 160,
- "waves": [
- {
- "number": 0,
- "time_min": 1,
- "time_max": 2,
- "slots_min": 3,
- "slots_max": 6,
- "SpawnPoints": "",
- "BotSide": "Savage",
- "BotPreset": "easy",
- "isPlayers": false,
- "WildSpawnType": "assault"
- },
- {
- "number": 1,
- "time_min": 10,
- "time_max": 12,
- "slots_min": 3,
- "slots_max": 5,
- "SpawnPoints": "",
- "BotSide": "Savage",
- "BotPreset": "easy",
- "isPlayers": false,
- "WildSpawnType": "assault"
- }
- ],
- "limits": [],
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "escape_time_limit": 0,
- "Rules": "Normal",
- "IsSecret": false,
- "doors": [],
- "tmp_location_field_remove_me": 0,
- "MinDistToExitPoint": 0,
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": false,
- "GlobalLootChanceModifier": 0,
- "OldSpawn": true,
- "NewSpawn": false,
- "BotMax": 0,
- "BotStart": 0,
- "BotStop": 0,
- "BotMaxTimePlayer": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotMaxPlayer": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "AccessKeys": [],
- "UnixDateTime": 0,
- "users_gather_seconds": 0,
- "users_spawn_seconds_n": 0,
- "users_spawn_seconds_n2": 0,
- "users_summon_seconds": 0,
- "sav_summon_seconds": 0,
- "matching_min_seconds": 0,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "Scattering": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "VisibleDistance": 0
- },
- "exits": [],
- "DisabledForScav": false,
- "BossLocationSpawn": [],
- "SpawnPointParams": [],
- "maxItemCountInLocation": [],
- "Id": "Terminal",
- "_Id": "5704e5a4d2720bb45b8b4567",
- "Loot": [],
- "Banners": []
-}
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": true,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 280,
+ "IconY": 160,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Terminal",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
+ "rcid": ""
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "LockSpawnCheckRadius": 150,
+ "LockSpawnCheckRadiusPvE": 150,
+ "LockSpawnStartTime": 10,
+ "LockSpawnStartTimePvE": 10,
+ "LockSpawnStepTime": 50,
+ "LockSpawnStepTimePvE": 50,
+ "MarksmanAccuratyCoef": 0,
+ "NonWaveSpawnBotsLimitPerPlayer": 10,
+ "NonWaveSpawnBotsLimitPerPlayerPvE": 15,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Terminal",
+ "_Id": "5704e5a4d2720bb45b8b4567",
+ "Loot": [],
+ "Banners": [],
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
index cda252da..28965e16 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
@@ -1,119 +1,172 @@
{
- "Enabled": false,
- "Locked": true,
- "Insurance": false,
- "SafeLocation": false,
- "Name": "Town",
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "Area": 0,
- "RequiredPlayerLevel": 0,
- "MinPlayers": 6,
- "MaxPlayers": 9,
- "exit_count": 0,
- "exit_access_time": 0,
- "exit_time": 0,
- "IconX": 72,
- "IconY": 413,
- "waves": [
- {
- "number": 0,
- "time_min": 1,
- "time_max": 2,
- "slots_min": 3,
- "slots_max": 6,
- "SpawnPoints": "",
- "BotSide": "Usec",
- "BotPreset": "hard",
- "WildSpawnType": "assault",
- "isPlayers": false
- },
- {
- "number": 1,
- "time_min": 10,
- "time_max": 12,
- "slots_min": 3,
- "slots_max": 5,
- "SpawnPoints": "",
- "BotSide": "Savage",
- "BotPreset": "normal",
- "WildSpawnType": "assault",
- "isPlayers": false
- }
- ],
- "limits": [],
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "escape_time_limit": 0,
- "Rules": "Normal",
- "IsSecret": false,
- "doors": [],
- "tmp_location_field_remove_me": 0,
- "MinDistToExitPoint": 0,
- "MaxDistToFreePoint": 900,
- "MinDistToFreePoint": 10,
- "MaxBotPerZone": 0,
- "OpenZones": "",
- "OcculsionCullingEnabled": false,
- "GlobalLootChanceModifier": 0,
- "OldSpawn": true,
- "NewSpawn": false,
- "BotMax": 0,
- "BotStart": 0,
- "BotStop": 0,
- "BotMaxTimePlayer": 0,
- "BotSpawnTimeOnMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOffMax": 0,
- "BotMaxPlayer": 0,
- "BotEasy": 0,
- "BotNormal": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotAssault": 0,
- "BotMarksman": 0,
- "DisabledScavExits": "",
- "AccessKeys": [],
- "UnixDateTime": 0,
- "users_gather_seconds": 0,
- "users_spawn_seconds_n": 0,
- "users_spawn_seconds_n2": 0,
- "users_summon_seconds": 0,
- "sav_summon_seconds": 0,
- "matching_min_seconds": 0,
- "MinMaxBots": [],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "Scattering": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "VisibleDistance": 0
- },
- "exits": [],
- "DisabledForScav": false,
- "BossLocationSpawn": [],
- "SpawnPointParams": [],
- "maxItemCountInLocation": [],
- "Id": "Town",
- "_Id": "5704e47ed2720bb35b8b4568",
- "Loot": [],
- "Banners": [
- {
- "id": "5464e0454bdc2d06708b4567",
- "pic": {
- "path": "CONTENT/banners/banner_bear.jpg",
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 72,
+ "IconY": 413,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Town",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
"rcid": ""
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "path": "CONTENT/banners/banner_scavraider.jpg",
- "rcid": ""
- }
- }
- ]
-}
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "hard",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Town",
+ "_Id": "5704e47ed2720bb35b8b4568",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5464e0454bdc2d06708b4567",
+ "pic": {
+ "file": "67e4045225a1aca9270117e7.jpg",
+ "path": "banners/67e4045225a1aca9270117e7.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+ }
\ No newline at end of file
From e9a6b5953d312598596f929cd5708c36b0ef269d Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 21:09:34 +0100
Subject: [PATCH 41/48] Flagged
`BotLocationModifier.AdditionalHostilitySettings` as nullable
---
.../SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs | 2 +-
.../SPTarkov.Server.Core/Services/LocationLifecycleService.cs | 2 +-
Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
index 8e974e0f..56d6689e 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
@@ -586,7 +586,7 @@ public record BotLocationModifier
public double? AccuracySpeed { get; set; }
[JsonPropertyName("AdditionalHostilitySettings")]
- public IEnumerable AdditionalHostilitySettings { get; set; }
+ public IEnumerable? AdditionalHostilitySettings { get; set; }
[JsonPropertyName("DistToActivate")]
public double? DistanceToActivate { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
index 5edb94c2..bc296251 100644
--- a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
@@ -210,7 +210,7 @@ public class LocationLifecycleService(
foreach (var botId in PMCConfig.HostilitySettings)
{
var configHostilityChanges = PMCConfig.HostilitySettings[botId.Key];
- var locationBotHostilityDetails = location.BotLocationModifier.AdditionalHostilitySettings.FirstOrDefault(botSettings =>
+ var locationBotHostilityDetails = location.BotLocationModifier.AdditionalHostilitySettings?.FirstOrDefault(botSettings =>
string.Equals(botSettings.BotRole, botId.Key, StringComparison.OrdinalIgnoreCase)
);
diff --git a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
index 408c9fe4..a408a21c 100644
--- a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
@@ -615,7 +615,7 @@ public class SeasonalEventService(
foreach (var settings in newHostilitySettings)
{
- var matchingBaseSettings = locationBase.Base.BotLocationModifier.AdditionalHostilitySettings.FirstOrDefault(x =>
+ var matchingBaseSettings = locationBase.Base.BotLocationModifier?.AdditionalHostilitySettings?.FirstOrDefault(x =>
x.BotRole == settings.BotRole
);
if (matchingBaseSettings is null)
From 52d222041316a24af4152ae9c17f302560015fa6 Mon Sep 17 00:00:00 2001
From: sp-tarkov-bot
Date: Thu, 16 Oct 2025 20:10:46 +0000
Subject: [PATCH 42/48] Format Style Fixes
---
.../database/locations/develop/base.json | 1366 ++++++++---------
.../database/locations/hideout/base.json | 460 +++---
.../database/locations/privatearea/base.json | 342 ++---
.../database/locations/suburbs/base.json | 342 ++---
.../database/locations/terminal/base.json | 320 ++--
.../database/locations/town/base.json | 342 ++---
6 files changed, 1586 insertions(+), 1586 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
index 8dc0d79a..de3e8e43 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/develop/base.json
@@ -1,690 +1,690 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 2,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 5,
- "BotMaxPvE": 5,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 30,
- "BotStartPlayer": 0,
- "BotStop": 2400,
- "DisabledScavExits": "",
- "EnableCoop": false,
- "Enabled": false,
- "EscapeTimeLimit": 60000,
- "EscapeTimeLimitCoop": 60000,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 2,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 5,
+ "BotMaxPvE": 5,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 30,
+ "BotStartPlayer": 0,
+ "BotStop": 2400,
+ "DisabledScavExits": "",
+ "EnableCoop": false,
+ "Enabled": false,
+ "EscapeTimeLimit": 60000,
+ "EscapeTimeLimitCoop": 60000,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 156,
+ "IconY": 551,
+ "IsSecret": false,
+ "Locked": false,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 10,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 10,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 1,
+ "Name": "Arena",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": true,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "maps/develop_preset.bundle",
+ "rcid": "develop.scenespreset.asset"
+ },
+ "UnixDateTime": 1600869802,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 2,
+ "slots_min": 1,
+ "time_max": 10,
+ "time_min": 0
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 3,
+ "slots_min": 2,
+ "time_max": 120,
+ "time_min": 10
+ },
+ {
+ "BotPreset": "hard",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "BotZoneMain",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 4,
+ "slots_min": 3,
+ "time_max": 240,
+ "time_min": 120
+ }
+ ],
+ "AirdropParameters": [
+ {
+ "AirdropPointDeactivateDistance": 50,
+ "MinPlayersCountToSpawnAirdrop": 0,
+ "PlaneAirdropChance": 0,
+ "PlaneAirdropCooldownMax": 900,
+ "PlaneAirdropCooldownMin": 600,
+ "PlaneAirdropEnd": 2100,
+ "PlaneAirdropMax": 0,
+ "PlaneAirdropStartMax": 900,
+ "PlaneAirdropStartMin": 300,
+ "UnsuccessfulTryPenalty": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 1,
+ "DistToActivate": 80,
+ "DistToActivatePvE": 80,
+ "DistToSleep": 100,
+ "DistToSleepPvE": 100,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 1,
+ "MagnetPower": 10,
+ "MarksmanAccuratyCoef": 1,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 1,
+ "VisibleDistance": 1
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
],
- "IconX": 156,
- "IconY": 551,
- "IsSecret": false,
- "Locked": false,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 10,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 10,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 1,
- "Name": "Arena",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": true,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 0,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "maps/develop_preset.bundle",
- "rcid": "develop.scenespreset.asset"
- },
- "UnixDateTime": 1600869802,
- "doors": [],
- "limits": [],
- "waves": [
- {
- "BotPreset": "normal",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 2,
- "slots_min": 1,
- "time_max": 10,
- "time_min": 0
- },
- {
- "BotPreset": "easy",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 1,
- "slots_max": 3,
- "slots_min": 2,
- "time_max": 120,
- "time_min": 10
- },
- {
- "BotPreset": "hard",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "BotZoneMain",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 4,
- "slots_min": 3,
- "time_max": 240,
- "time_min": 120
- }
- ],
- "AirdropParameters": [
- {
- "AirdropPointDeactivateDistance": 50,
- "MinPlayersCountToSpawnAirdrop": 0,
- "PlaneAirdropChance": 0,
- "PlaneAirdropCooldownMax": 900,
- "PlaneAirdropCooldownMin": 600,
- "PlaneAirdropEnd": 2100,
- "PlaneAirdropMax": 0,
- "PlaneAirdropStartMax": 900,
- "PlaneAirdropStartMin": 300,
- "UnsuccessfulTryPenalty": 10
- }
- ],
- "BotLocationModifier": {
- "AccuracySpeed": 1,
- "DistToActivate": 80,
- "DistToActivatePvE": 80,
- "DistToSleep": 100,
- "DistToSleepPvE": 100,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 1,
- "MagnetPower": 10,
- "MarksmanAccuratyCoef": 1,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 1,
- "VisibleDistance": 1
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "03841924-ea1a-4e5c-bf27-82af7868beb1",
- "Infiltration": "House",
- "Position": {
- "x": -30.359436,
- "y": 0.1,
- "z": -6.39318848
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "0da5b986-424a-44d1-906a-1d7cc118413a",
- "Infiltration": "Houseb",
- "Position": {
- "x": 19.715271,
- "y": 0.06,
- "z": 5.14703369
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "110e3c75-e58d-461c-ab61-9f6a715ca6b1",
- "Infiltration": "House",
- "Position": {
- "x": -30.0410156,
- "y": 0.1,
- "z": -1.40075684
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "1a40138b-6f65-4866-bad2-64162d7772de",
- "Infiltration": "House",
- "Position": {
- "x": -29.2000122,
- "y": 0.1,
- "z": 5.14001465
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "3feb492c-8c45-405a-8e7a-8dd903433eb0",
- "Infiltration": "House",
- "Position": {
- "x": -23.7852783,
- "y": 0.1,
- "z": -2.34625244
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "52d3284b-0e8f-47e8-a7d1-701bf4cd8e5b",
- "Infiltration": "House",
- "Position": {
- "x": -23.4979248,
- "y": 0.1,
- "z": 3.856079
- },
- "Rotation": 87.10709,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "870629fd-e4d5-4fa1-8274-94c223ad9692",
- "Infiltration": "Houseb",
- "Position": {
- "x": 12.9941406,
- "y": 0.06,
- "z": 1.34918213
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "93a1c6d6-1379-43e6-99c2-c346178bb3e0",
- "Infiltration": "Houseb",
- "Position": {
- "x": 18.1246338,
- "y": 0.06,
- "z": -6.334656
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "BotZoneMain",
- "Categories": [
- "Bot"
- ],
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Radius": 4
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 10,
- "Id": "971882ef-596f-4419-acfb-ca2bfe52d043",
- "Infiltration": "",
- "Position": {
- "x": -17.92,
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
"y": 0,
- "z": 5.55
+ "z": 0
},
- "Rotation": 0,
- "Sides": [
- "Savage"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "cf24125e-1c3a-457e-a024-613a8df98b06",
- "Infiltration": "Houseb",
- "Position": {
- "x": 12.47467,
- "y": 0.06,
- "z": -4.838135
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnBoxParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Size": {
- "x": 2.2,
- "y": 2.04,
- "z": 2.14
- }
- }
- },
- "CorePointId": 0,
- "DelayToCanSpawnSec": 4,
- "Id": "d052b031-b477-465f-8913-ae108c9ca2c3",
- "Infiltration": "Houseb",
- "Position": {
- "x": 19.210022,
- "y": 0.06,
- "z": 0.16998291
- },
- "Rotation": 269.253418,
- "Sides": [
- "Bear"
- ]
- }
- ],
- "exits": [
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 100,
- "CountPVE": 100,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 10,
- "ExfiltrationTimePVE": 10,
- "ExfiltrationType": "SharedTimer",
- "Id": "5449016a4bdc2d6f028b456f",
- "MaxTime": 0,
- "MaxTimePVE": 0,
- "MinTime": 0,
- "MinTimePVE": 0,
- "Name": "UN Roadblock",
- "PassageRequirement": "TransferItem",
- "PlayersCount": 0,
- "PlayersCountPVE": 0,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": "Сотку должен"
- },
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 0,
- "CountPVE": 0,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 10,
- "ExfiltrationTimePVE": 10,
- "ExfiltrationType": "Individual",
- "Id": "",
- "MaxTime": 0,
- "MaxTimePVE": 0,
- "MinTime": 0,
- "MinTimePVE": 0,
- "Name": "Elevator",
- "PassageRequirement": "None",
- "PlayersCount": 3,
- "PlayersCountPVE": 3,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": ""
- },
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 0,
- "CountPVE": 0,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 10,
- "ExfiltrationTimePVE": 10,
- "ExfiltrationType": "Individual",
- "Id": "",
- "MaxTime": 0,
- "MaxTimePVE": 0,
- "MinTime": 0,
- "MinTimePVE": 0,
- "Name": "Outskirts",
- "PassageRequirement": "None",
- "PlayersCount": 0,
- "PlayersCountPVE": 0,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": ""
- },
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 0,
- "CountPVE": 0,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 10,
- "ExfiltrationTimePVE": 10,
- "ExfiltrationType": "Individual",
- "Id": "",
- "MaxTime": 0,
- "MaxTimePVE": 0,
- "MinTime": 0,
- "MinTimePVE": 0,
- "Name": "Hangar Gate",
- "PassageRequirement": "None",
- "PlayersCount": 0,
- "PlayersCountPVE": 0,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": ""
- },
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 0,
- "CountPVE": 0,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 10,
- "ExfiltrationTimePVE": 10,
- "ExfiltrationType": "Individual",
- "Id": "",
- "MaxTime": 0,
- "MaxTimePVE": 0,
- "MinTime": 0,
- "MinTimePVE": 0,
- "Name": "Tunnel",
- "PassageRequirement": "None",
- "PlayersCount": 0,
- "PlayersCountPVE": 0,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": ""
- },
- {
- "Chance": 100,
- "ChancePVE": 100,
- "Count": 90,
- "CountPVE": 90,
- "EntryPoints": "House,Houseb",
- "ExfiltrationTime": 5,
- "ExfiltrationTimePVE": 5,
- "ExfiltrationType": "SharedTimer",
- "Id": "0",
- "MaxTime": 60,
- "MaxTimePVE": 60,
- "MinTime": 30,
- "MinTimePVE": 30,
- "Name": "EXFIL_Train",
- "PassageRequirement": "Train",
- "PlayersCount": 0,
- "PlayersCountPVE": 0,
- "RequiredSlot": "FirstPrimaryWeapon",
- "RequirementTip": "TIP IS HARDCODED"
- }
- ],
- "maxItemCountInLocation": [],
- "Id": "develop",
- "_Id": "56db0b3bd2720bb0678b4567",
- "Loot": [],
- "Banners": [
- {
- "id": "5805f617245977100b2c1f41",
- "pic": {
- "file": "67e404d9bec96f5d8e097331.jpg",
- "path": "banners/67e404d9bec96f5d8e097331.jpg",
- "rcid": "",
- "type": "banners"
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
}
}
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "03841924-ea1a-4e5c-bf27-82af7868beb1",
+ "Infiltration": "House",
+ "Position": {
+ "x": -30.359436,
+ "y": 0.1,
+ "z": -6.39318848
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "0da5b986-424a-44d1-906a-1d7cc118413a",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 19.715271,
+ "y": 0.06,
+ "z": 5.14703369
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "110e3c75-e58d-461c-ab61-9f6a715ca6b1",
+ "Infiltration": "House",
+ "Position": {
+ "x": -30.0410156,
+ "y": 0.1,
+ "z": -1.40075684
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "1a40138b-6f65-4866-bad2-64162d7772de",
+ "Infiltration": "House",
+ "Position": {
+ "x": -29.2000122,
+ "y": 0.1,
+ "z": 5.14001465
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "3feb492c-8c45-405a-8e7a-8dd903433eb0",
+ "Infiltration": "House",
+ "Position": {
+ "x": -23.7852783,
+ "y": 0.1,
+ "z": -2.34625244
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "52d3284b-0e8f-47e8-a7d1-701bf4cd8e5b",
+ "Infiltration": "House",
+ "Position": {
+ "x": -23.4979248,
+ "y": 0.1,
+ "z": 3.856079
+ },
+ "Rotation": 87.10709,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "870629fd-e4d5-4fa1-8274-94c223ad9692",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 12.9941406,
+ "y": 0.06,
+ "z": 1.34918213
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "93a1c6d6-1379-43e6-99c2-c346178bb3e0",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 18.1246338,
+ "y": 0.06,
+ "z": -6.334656
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "BotZoneMain",
+ "Categories": [
+ "Bot"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 4
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 10,
+ "Id": "971882ef-596f-4419-acfb-ca2bfe52d043",
+ "Infiltration": "",
+ "Position": {
+ "x": -17.92,
+ "y": 0,
+ "z": 5.55
+ },
+ "Rotation": 0,
+ "Sides": [
+ "Savage"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "cf24125e-1c3a-457e-a024-613a8df98b06",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 12.47467,
+ "y": 0.06,
+ "z": -4.838135
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
+ ],
+ "ColliderParams": {
+ "_parent": "SpawnBoxParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Size": {
+ "x": 2.2,
+ "y": 2.04,
+ "z": 2.14
+ }
+ }
+ },
+ "CorePointId": 0,
+ "DelayToCanSpawnSec": 4,
+ "Id": "d052b031-b477-465f-8913-ae108c9ca2c3",
+ "Infiltration": "Houseb",
+ "Position": {
+ "x": 19.210022,
+ "y": 0.06,
+ "z": 0.16998291
+ },
+ "Rotation": 269.253418,
+ "Sides": [
+ "Bear"
+ ]
+ }
+ ],
+ "exits": [
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 100,
+ "CountPVE": 100,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "SharedTimer",
+ "Id": "5449016a4bdc2d6f028b456f",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "UN Roadblock",
+ "PassageRequirement": "TransferItem",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": "Сотку должен"
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Elevator",
+ "PassageRequirement": "None",
+ "PlayersCount": 3,
+ "PlayersCountPVE": 3,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Outskirts",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Hangar Gate",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 0,
+ "CountPVE": 0,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 10,
+ "ExfiltrationTimePVE": 10,
+ "ExfiltrationType": "Individual",
+ "Id": "",
+ "MaxTime": 0,
+ "MaxTimePVE": 0,
+ "MinTime": 0,
+ "MinTimePVE": 0,
+ "Name": "Tunnel",
+ "PassageRequirement": "None",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": ""
+ },
+ {
+ "Chance": 100,
+ "ChancePVE": 100,
+ "Count": 90,
+ "CountPVE": 90,
+ "EntryPoints": "House,Houseb",
+ "ExfiltrationTime": 5,
+ "ExfiltrationTimePVE": 5,
+ "ExfiltrationType": "SharedTimer",
+ "Id": "0",
+ "MaxTime": 60,
+ "MaxTimePVE": 60,
+ "MinTime": 30,
+ "MinTimePVE": 30,
+ "Name": "EXFIL_Train",
+ "PassageRequirement": "Train",
+ "PlayersCount": 0,
+ "PlayersCountPVE": 0,
+ "RequiredSlot": "FirstPrimaryWeapon",
+ "RequirementTip": "TIP IS HARDCODED"
+ }
+ ],
+ "maxItemCountInLocation": [],
+ "Id": "develop",
+ "_Id": "56db0b3bd2720bb0678b4567",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5805f617245977100b2c1f41",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+}
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
index d42ebac9..00bf121c 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/hideout/base.json
@@ -1,238 +1,238 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 1000000,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 0,
- "BotMaxPvE": 0,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "DisabledScavExits": "",
- "EnableCoop": true,
- "Enabled": false,
- "EscapeTimeLimit": 99999,
- "EscapeTimeLimitCoop": 99999,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 1000000,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 99999,
+ "EscapeTimeLimitCoop": 99999,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 0,
+ "IconY": 0,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 10,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 10,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 1,
+ "Name": "Hideout",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 1,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "maps/bunker_preset.bundle",
+ "rcid": "bunker.ScenesPreset.asset"
+ },
+ "UnixDateTime": 1689772567,
+ "doors": [],
+ "limits": [],
+ "waves": [],
+ "BotLocationModifier": {
+ "AccuracySpeed": 1,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 1,
+ "MarksmanAccuratyCoef": 1,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 1,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player",
+ "Bot"
],
- "IconX": 0,
- "IconY": 0,
- "IsSecret": false,
- "Locked": true,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 10,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 10,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 1,
- "Name": "Hideout",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": false,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 1,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "maps/bunker_preset.bundle",
- "rcid": "bunker.ScenesPreset.asset"
- },
- "UnixDateTime": 1689772567,
- "doors": [],
- "limits": [],
- "waves": [],
- "BotLocationModifier": {
- "AccuracySpeed": 1,
- "DistToActivatePvE": 0,
- "DistToSleepPvE": 0,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 1,
- "MarksmanAccuratyCoef": 1,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 1,
- "VisibleDistance": 0,
- "DistToActivate": 0,
- "DistToSleep": 0
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [
- {
- "BotZoneName": "",
- "Categories": [
- "Player",
- "Bot"
- ],
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Radius": 10
- }
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
},
- "DelayToCanSpawnSec": 0.5,
- "Id": "f656a561-6524-49e2-90c0-1cbbece183ce",
- "Infiltration": "",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
- },
- "Rotation": 45.0000038,
- "Sides": [
- "Usec"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player"
- ],
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Radius": 10
- }
- },
- "DelayToCanSpawnSec": 4,
- "Id": "f92541a9-08ab-4c9e-957a-d802e143b705",
- "Infiltration": "Hideout",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
- },
- "Rotation": 45.0000038,
- "Sides": [
- "All"
- ]
- },
- {
- "BotZoneName": "",
- "Categories": [
- "Player",
- "Bot"
- ],
- "ColliderParams": {
- "_parent": "SpawnSphereParams",
- "_props": {
- "Center": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Radius": 10
- }
- },
- "DelayToCanSpawnSec": 0.5,
- "Id": "faf351a1-e5f5-4642-8ece-267508fdfea6",
- "Infiltration": "",
- "Position": {
- "x": -5.8,
- "y": 0.1,
- "z": -5.4
- },
- "Rotation": 45.0000038,
- "Sides": [
- "Bear"
- ]
+ "Radius": 10
}
+ },
+ "DelayToCanSpawnSec": 0.5,
+ "Id": "f656a561-6524-49e2-90c0-1cbbece183ce",
+ "Infiltration": "",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
+ },
+ "Rotation": 45.0000038,
+ "Sides": [
+ "Usec"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player"
],
- "exits": [],
- "maxItemCountInLocation": [
- {
- "TemplateId": "604b47caa16c2359315ad047",
- "Value": 0
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 10
}
+ },
+ "DelayToCanSpawnSec": 4,
+ "Id": "f92541a9-08ab-4c9e-957a-d802e143b705",
+ "Infiltration": "Hideout",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
+ },
+ "Rotation": 45.0000038,
+ "Sides": [
+ "All"
+ ]
+ },
+ {
+ "BotZoneName": "",
+ "Categories": [
+ "Player",
+ "Bot"
],
- "Id": "hideout",
- "_Id": "599319c986f7740dca3070a6",
- "Loot": [],
- "Banners": [
- {
- "id": "5805f617245977100b2c1f41",
- "pic": {
- "file": "67e404d9bec96f5d8e097331.jpg",
- "path": "banners/67e404d9bec96f5d8e097331.jpg",
- "rcid": "",
- "type": "banners"
- }
- },
- {
- "id": "5807be8924597742c603fa19",
- "pic": {
- "file": "67e4046dbec96f5d8e09732a.jpg",
- "path": "banners/67e4046dbec96f5d8e09732a.jpg",
- "rcid": "",
- "type": "banners"
- }
+ "ColliderParams": {
+ "_parent": "SpawnSphereParams",
+ "_props": {
+ "Center": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Radius": 10
}
- ],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ },
+ "DelayToCanSpawnSec": 0.5,
+ "Id": "faf351a1-e5f5-4642-8ece-267508fdfea6",
+ "Infiltration": "",
+ "Position": {
+ "x": -5.8,
+ "y": 0.1,
+ "z": -5.4
+ },
+ "Rotation": 45.0000038,
+ "Sides": [
+ "Bear"
+ ]
+ }
+ ],
+ "exits": [],
+ "maxItemCountInLocation": [
+ {
+ "TemplateId": "604b47caa16c2359315ad047",
+ "Value": 0
+ }
+ ],
+ "Id": "hideout",
+ "_Id": "599319c986f7740dca3070a6",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5805f617245977100b2c1f41",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5807be8924597742c603fa19",
+ "pic": {
+ "file": "67e4046dbec96f5d8e09732a.jpg",
+ "path": "banners/67e4046dbec96f5d8e09732a.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+}
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
index ca66e7ba..3b243fe4 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/privatearea/base.json
@@ -1,172 +1,172 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 0,
- "BotMaxPvE": 0,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "DisabledScavExits": "",
- "EnableCoop": true,
- "Enabled": false,
- "EscapeTimeLimit": 0,
- "EscapeTimeLimitCoop": 0,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
- ],
- "IconX": 224,
- "IconY": 646,
- "IsSecret": true,
- "Locked": true,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 9,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 9,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 6,
- "Name": "Private Sector",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": false,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 0,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "UnixDateTime": 0,
- "doors": [],
- "limits": [],
- "waves": [
- {
- "BotPreset": "normal",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 6,
- "slots_min": 3,
- "time_max": 2,
- "time_min": 1
- },
- {
- "BotPreset": "hard",
- "BotSide": "Usec",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 1,
- "slots_max": 5,
- "slots_min": 3,
- "time_max": 12,
- "time_min": 10
- }
- ],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "DistToActivatePvE": 0,
- "DistToSleepPvE": 0,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 0,
- "VisibleDistance": 0,
- "DistToActivate": 0,
- "DistToSleep": 0
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [],
- "exits": [],
- "maxItemCountInLocation": [],
- "Id": "Private Area",
- "_Id": "5704e64ad2720bb55b8b456e",
- "Loot": [],
- "Banners": [
- {
- "id": "5803a58524597710ca36fcb2",
- "pic": {
- "file": "67e404d9bec96f5d8e097331.jpg",
- "path": "banners/67e404d9bec96f5d8e097331.jpg",
- "rcid": "",
- "type": "banners"
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "file": "67e404c5bec96f5d8e09732f.jpg",
- "path": "banners/67e404c5bec96f5d8e09732f.jpg",
- "rcid": "",
- "type": "banners"
- }
- }
- ],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 224,
+ "IconY": 646,
+ "IsSecret": true,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Private Sector",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
+ "rcid": ""
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "hard",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Private Area",
+ "_Id": "5704e64ad2720bb55b8b456e",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5803a58524597710ca36fcb2",
+ "pic": {
+ "file": "67e404d9bec96f5d8e097331.jpg",
+ "path": "banners/67e404d9bec96f5d8e097331.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+}
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
index f32ceb9e..2cd9bb44 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/suburbs/base.json
@@ -1,172 +1,172 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 0,
- "BotMaxPvE": 0,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "DisabledScavExits": "",
- "EnableCoop": true,
- "Enabled": false,
- "EscapeTimeLimit": 0,
- "EscapeTimeLimitCoop": 0,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
- ],
- "IconX": 480,
- "IconY": 577,
- "IsSecret": false,
- "Locked": true,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 9,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 9,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 6,
- "Name": "Suburbs",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": false,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 0,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "UnixDateTime": 0,
- "doors": [],
- "limits": [],
- "waves": [
- {
- "BotPreset": "normal",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 6,
- "slots_min": 3,
- "time_max": 2,
- "time_min": 1
- },
- {
- "BotPreset": "easy",
- "BotSide": "Usec",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 1,
- "slots_max": 5,
- "slots_min": 3,
- "time_max": 12,
- "time_min": 10
- }
- ],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "DistToActivatePvE": 0,
- "DistToSleepPvE": 0,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 0,
- "VisibleDistance": 0,
- "DistToActivate": 0,
- "DistToSleep": 0
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [],
- "exits": [],
- "maxItemCountInLocation": [],
- "Id": "Suburbs",
- "_Id": "5714dc342459777137212e0b",
- "Loot": [],
- "Banners": [
- {
- "id": "5807be8924597742c603fa19",
- "pic": {
- "file": "67e4046dbec96f5d8e09732a.jpg",
- "path": "banners/67e4046dbec96f5d8e09732a.jpg",
- "rcid": "",
- "type": "banners"
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "file": "67e404c5bec96f5d8e09732f.jpg",
- "path": "banners/67e404c5bec96f5d8e09732f.jpg",
- "rcid": "",
- "type": "banners"
- }
- }
- ],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 480,
+ "IconY": 577,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Suburbs",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
+ "rcid": ""
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Suburbs",
+ "_Id": "5714dc342459777137212e0b",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5807be8924597742c603fa19",
+ "pic": {
+ "file": "67e4046dbec96f5d8e09732a.jpg",
+ "path": "banners/67e4046dbec96f5d8e09732a.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+}
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
index cb7e9087..bb9ad53c 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/terminal/base.json
@@ -1,161 +1,161 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 0,
- "BotMaxPvE": 0,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "DisabledScavExits": "",
- "EnableCoop": true,
- "Enabled": true,
- "EscapeTimeLimit": 0,
- "EscapeTimeLimitCoop": 0,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
- ],
- "IconX": 280,
- "IconY": 160,
- "IsSecret": false,
- "Locked": true,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 9,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 9,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 6,
- "Name": "Terminal",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": false,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 0,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "UnixDateTime": 0,
- "doors": [],
- "limits": [],
- "waves": [
- {
- "BotPreset": "easy",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 6,
- "slots_min": 3,
- "time_max": 2,
- "time_min": 1
- },
- {
- "BotPreset": "easy",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 1,
- "slots_max": 5,
- "slots_min": 3,
- "time_max": 12,
- "time_min": 10
- }
- ],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "DistToActivatePvE": 0,
- "DistToSleepPvE": 0,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 0,
- "LockSpawnCheckRadius": 150,
- "LockSpawnCheckRadiusPvE": 150,
- "LockSpawnStartTime": 10,
- "LockSpawnStartTimePvE": 10,
- "LockSpawnStepTime": 50,
- "LockSpawnStepTimePvE": 50,
- "MarksmanAccuratyCoef": 0,
- "NonWaveSpawnBotsLimitPerPlayer": 10,
- "NonWaveSpawnBotsLimitPerPlayerPvE": 15,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 0,
- "VisibleDistance": 0,
- "DistToActivate": 0,
- "DistToSleep": 0
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [],
- "exits": [],
- "maxItemCountInLocation": [],
- "Id": "Terminal",
- "_Id": "5704e5a4d2720bb45b8b4567",
- "Loot": [],
- "Banners": [],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": true,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 280,
+ "IconY": 160,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Terminal",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
+ "rcid": ""
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "easy",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "LockSpawnCheckRadius": 150,
+ "LockSpawnCheckRadiusPvE": 150,
+ "LockSpawnStartTime": 10,
+ "LockSpawnStartTimePvE": 10,
+ "LockSpawnStepTime": 50,
+ "LockSpawnStepTimePvE": 50,
+ "MarksmanAccuratyCoef": 0,
+ "NonWaveSpawnBotsLimitPerPlayer": 10,
+ "NonWaveSpawnBotsLimitPerPlayerPvE": 15,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Terminal",
+ "_Id": "5704e5a4d2720bb45b8b4567",
+ "Loot": [],
+ "Banners": [],
+ "BossLocationSpawn": []
+}
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
index 28965e16..dbd0ffc1 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locations/town/base.json
@@ -1,172 +1,172 @@
{
- "AccessKeys": [],
- "AccessKeysPvE": [],
- "Area": 0,
- "AveragePlayTime": 100,
- "AveragePlayerLevel": 10,
- "BotAssault": 0,
- "BotEasy": 0,
- "BotHard": 0,
- "BotImpossible": 0,
- "BotMarksman": 0,
- "BotMax": 0,
- "BotMaxPvE": 0,
- "BotNormal": 0,
- "BotSpawnCountStep": 3,
- "BotSpawnPeriodCheck": 15,
- "BotSpawnTimeOffMax": 0,
- "BotSpawnTimeOffMin": 0,
- "BotSpawnTimeOnMax": 0,
- "BotSpawnTimeOnMin": 0,
- "BotStart": 0,
- "BotStartPlayer": 0,
- "BotStop": 0,
- "DisabledScavExits": "",
- "EnableCoop": true,
- "Enabled": false,
- "EscapeTimeLimit": 0,
- "EscapeTimeLimitCoop": 0,
- "ForceOnlineRaidInPVE": false,
- "GlobalContainerChanceModifier": 1,
- "HeatmapCellSize": {
- "x": 1,
- "y": 2,
- "z": 1
- },
- "HeatmapLayers": [
- "AllCharactersPositions",
- "AllBotsPositions",
- "AllRealPlayersPositions",
- "RealPlayersSavagesPositions",
- "RealPlayersSavagesDeads",
- "RealPlayersSavagesDamages",
- "RealPlayersPmcPositions",
- "RealPlayersPmcDeads",
- "RealPlayersPmcDamages",
- "RealPlayersPmcLaydownPositions",
- "RealPlayersPmcEquipmentDropPositions",
- "RealPlayersPmcHealingPositions",
- "BotsBossPositions",
- "BotsBossDeads",
- "BotsBossDamages",
- "BotsSavagesPositions",
- "BotsSavagesDeads",
- "BotsSavagesDamages",
- "AllCharactersDamageSources",
- "RealPlayerDamageSources",
- "BotsDamageSources",
- "LootPositions"
- ],
- "IconX": 72,
- "IconY": 413,
- "IsSecret": false,
- "Locked": true,
- "MaxBotPerZone": 0,
- "MaxCoopGroup": 9,
- "MaxDistToFreePoint": 900,
- "MaxPlayers": 9,
- "MinDistToFreePoint": 10,
- "MinPlayerLvlAccessKeys": 0,
- "MinPlayers": 6,
- "Name": "Town",
- "NewSpawn": false,
- "NewSpawnForPlayers": false,
- "NonWaveGroupScenario": {
- "Chance": 50,
- "Enabled": true,
- "MaxToBeGroup": 3,
- "MinToBeGroup": 2
- },
- "OcculsionCullingEnabled": false,
- "OfflineNewSpawn": true,
- "OfflineOldSpawn": true,
- "OldSpawn": true,
- "OpenZones": "",
- "PlayersRequestCount": -1,
- "PmcMaxPlayersInGroup": 5,
- "RequiredPlayerLevelMax": 100,
- "RequiredPlayerLevelMin": 0,
- "Rules": "Normal",
- "ScavMaxPlayersInGroup": 4,
- "Scene": {
- "path": "",
- "rcid": ""
- },
- "UnixDateTime": 0,
- "doors": [],
- "limits": [],
- "waves": [
- {
- "BotPreset": "hard",
- "BotSide": "Usec",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 0,
- "slots_max": 6,
- "slots_min": 3,
- "time_max": 2,
- "time_min": 1
- },
- {
- "BotPreset": "normal",
- "BotSide": "Savage",
- "KeepZoneOnSpawn": false,
- "SpawnMode": [],
- "SpawnPoints": "",
- "WildSpawnType": "assault",
- "isPlayers": false,
- "number": 1,
- "slots_max": 5,
- "slots_min": 3,
- "time_max": 12,
- "time_min": 10
- }
- ],
- "BotLocationModifier": {
- "AccuracySpeed": 0,
- "DistToActivatePvE": 0,
- "DistToSleepPvE": 0,
- "FogVisibilityDistanceCoef": 0,
- "FogVisibilitySpeedCoef": 0,
- "GainSight": 0,
- "MarksmanAccuratyCoef": 0,
- "RainVisibilityDistanceCoef": 0,
- "RainVisibilitySpeedCoef": 0,
- "Scattering": 0,
- "VisibleDistance": 0,
- "DistToActivate": 0,
- "DistToSleep": 0
- },
- "DisabledForScav": false,
- "MinMaxBots": [],
- "SpawnPointParams": [],
- "exits": [],
- "maxItemCountInLocation": [],
- "Id": "Town",
- "_Id": "5704e47ed2720bb35b8b4568",
- "Loot": [],
- "Banners": [
- {
- "id": "5464e0454bdc2d06708b4567",
- "pic": {
- "file": "67e4045225a1aca9270117e7.jpg",
- "path": "banners/67e4045225a1aca9270117e7.jpg",
- "rcid": "",
- "type": "banners"
- }
- },
- {
- "id": "5c1b857086f77465f465faa4",
- "pic": {
- "file": "67e404c5bec96f5d8e09732f.jpg",
- "path": "banners/67e404c5bec96f5d8e09732f.jpg",
- "rcid": "",
- "type": "banners"
- }
- }
- ],
- "BossLocationSpawn": []
- }
\ No newline at end of file
+ "AccessKeys": [],
+ "AccessKeysPvE": [],
+ "Area": 0,
+ "AveragePlayTime": 100,
+ "AveragePlayerLevel": 10,
+ "BotAssault": 0,
+ "BotEasy": 0,
+ "BotHard": 0,
+ "BotImpossible": 0,
+ "BotMarksman": 0,
+ "BotMax": 0,
+ "BotMaxPvE": 0,
+ "BotNormal": 0,
+ "BotSpawnCountStep": 3,
+ "BotSpawnPeriodCheck": 15,
+ "BotSpawnTimeOffMax": 0,
+ "BotSpawnTimeOffMin": 0,
+ "BotSpawnTimeOnMax": 0,
+ "BotSpawnTimeOnMin": 0,
+ "BotStart": 0,
+ "BotStartPlayer": 0,
+ "BotStop": 0,
+ "DisabledScavExits": "",
+ "EnableCoop": true,
+ "Enabled": false,
+ "EscapeTimeLimit": 0,
+ "EscapeTimeLimitCoop": 0,
+ "ForceOnlineRaidInPVE": false,
+ "GlobalContainerChanceModifier": 1,
+ "HeatmapCellSize": {
+ "x": 1,
+ "y": 2,
+ "z": 1
+ },
+ "HeatmapLayers": [
+ "AllCharactersPositions",
+ "AllBotsPositions",
+ "AllRealPlayersPositions",
+ "RealPlayersSavagesPositions",
+ "RealPlayersSavagesDeads",
+ "RealPlayersSavagesDamages",
+ "RealPlayersPmcPositions",
+ "RealPlayersPmcDeads",
+ "RealPlayersPmcDamages",
+ "RealPlayersPmcLaydownPositions",
+ "RealPlayersPmcEquipmentDropPositions",
+ "RealPlayersPmcHealingPositions",
+ "BotsBossPositions",
+ "BotsBossDeads",
+ "BotsBossDamages",
+ "BotsSavagesPositions",
+ "BotsSavagesDeads",
+ "BotsSavagesDamages",
+ "AllCharactersDamageSources",
+ "RealPlayerDamageSources",
+ "BotsDamageSources",
+ "LootPositions"
+ ],
+ "IconX": 72,
+ "IconY": 413,
+ "IsSecret": false,
+ "Locked": true,
+ "MaxBotPerZone": 0,
+ "MaxCoopGroup": 9,
+ "MaxDistToFreePoint": 900,
+ "MaxPlayers": 9,
+ "MinDistToFreePoint": 10,
+ "MinPlayerLvlAccessKeys": 0,
+ "MinPlayers": 6,
+ "Name": "Town",
+ "NewSpawn": false,
+ "NewSpawnForPlayers": false,
+ "NonWaveGroupScenario": {
+ "Chance": 50,
+ "Enabled": true,
+ "MaxToBeGroup": 3,
+ "MinToBeGroup": 2
+ },
+ "OcculsionCullingEnabled": false,
+ "OfflineNewSpawn": true,
+ "OfflineOldSpawn": true,
+ "OldSpawn": true,
+ "OpenZones": "",
+ "PlayersRequestCount": -1,
+ "PmcMaxPlayersInGroup": 5,
+ "RequiredPlayerLevelMax": 100,
+ "RequiredPlayerLevelMin": 0,
+ "Rules": "Normal",
+ "ScavMaxPlayersInGroup": 4,
+ "Scene": {
+ "path": "",
+ "rcid": ""
+ },
+ "UnixDateTime": 0,
+ "doors": [],
+ "limits": [],
+ "waves": [
+ {
+ "BotPreset": "hard",
+ "BotSide": "Usec",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 0,
+ "slots_max": 6,
+ "slots_min": 3,
+ "time_max": 2,
+ "time_min": 1
+ },
+ {
+ "BotPreset": "normal",
+ "BotSide": "Savage",
+ "KeepZoneOnSpawn": false,
+ "SpawnMode": [],
+ "SpawnPoints": "",
+ "WildSpawnType": "assault",
+ "isPlayers": false,
+ "number": 1,
+ "slots_max": 5,
+ "slots_min": 3,
+ "time_max": 12,
+ "time_min": 10
+ }
+ ],
+ "BotLocationModifier": {
+ "AccuracySpeed": 0,
+ "DistToActivatePvE": 0,
+ "DistToSleepPvE": 0,
+ "FogVisibilityDistanceCoef": 0,
+ "FogVisibilitySpeedCoef": 0,
+ "GainSight": 0,
+ "MarksmanAccuratyCoef": 0,
+ "RainVisibilityDistanceCoef": 0,
+ "RainVisibilitySpeedCoef": 0,
+ "Scattering": 0,
+ "VisibleDistance": 0,
+ "DistToActivate": 0,
+ "DistToSleep": 0
+ },
+ "DisabledForScav": false,
+ "MinMaxBots": [],
+ "SpawnPointParams": [],
+ "exits": [],
+ "maxItemCountInLocation": [],
+ "Id": "Town",
+ "_Id": "5704e47ed2720bb35b8b4568",
+ "Loot": [],
+ "Banners": [
+ {
+ "id": "5464e0454bdc2d06708b4567",
+ "pic": {
+ "file": "67e4045225a1aca9270117e7.jpg",
+ "path": "banners/67e4045225a1aca9270117e7.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ },
+ {
+ "id": "5c1b857086f77465f465faa4",
+ "pic": {
+ "file": "67e404c5bec96f5d8e09732f.jpg",
+ "path": "banners/67e404c5bec96f5d8e09732f.jpg",
+ "rcid": "",
+ "type": "banners"
+ }
+ }
+ ],
+ "BossLocationSpawn": []
+}
From 34291481f25d003c36b7710c7243606d94a13daf Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 22:38:01 +0100
Subject: [PATCH 43/48] Weather adjustments: Rain preset has thicker minimum
cloud + higher chance to be windy Sunny preset has less chance to be clear
(higher chance for fog)
---
.../SPTarkov.Server.Assets/SPT_Data/configs/weather.json | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
index 307e03aa..df33f930 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
@@ -37,7 +37,7 @@
"max": 0
},
"fog": {
- "0.0013": 35,
+ "0.0013": 30,
"0.0018": 6,
"0.002": 4,
"0.004": 3,
@@ -60,12 +60,13 @@
},
"RAINY": {
"clouds": {
- "0.4": 5,
+ "0.7": 2,
+ "0.9": 4,
"1": 4
},
"windSpeed": {
- "0": 6,
- "1": 3,
+ "0": 3,
+ "1": 2,
"2": 2,
"3": 1,
"4": 1
From 76b8111cf61ebdfbcdef08fb5f51f7c9ea851e54 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Thu, 16 Oct 2025 22:45:53 +0100
Subject: [PATCH 44/48] Added full cloud coverage during rain weight
---
Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
index df33f930..c097f584 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/weather.json
@@ -62,7 +62,8 @@
"clouds": {
"0.7": 2,
"0.9": 4,
- "1": 4
+ "1": 4,
+ "1.2": 1
},
"windSpeed": {
"0": 3,
From a98a5ce8a160c5fe3eb6e5470a9de2349ca51572 Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Thu, 16 Oct 2025 18:19:08 -0700
Subject: [PATCH 45/48] Discard duplicate item locale entry instead of throwing
an exception
---
.../Services/Mod/CustomItemService.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs b/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
index 6c1bc4c5..0540ca96 100644
--- a/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
@@ -252,9 +252,15 @@ public class CustomItemService(
{
lazyLoad.AddTransformer(localeData =>
{
- localeData.Add($"{newItemId} Name", newLocaleDetails.Name);
- localeData.Add($"{newItemId} ShortName", newLocaleDetails.ShortName);
- localeData.Add($"{newItemId} Description", newLocaleDetails.Description);
+ if (!localeData.TryAdd($"{newItemId} Name", newLocaleDetails.Name))
+ {
+ logger.Error($"Error adding locale `{newItemId} Name` to {shortNameKey.Key}, duplicate key");
+ }
+ else
+ {
+ localeData.TryAdd($"{newItemId} ShortName", newLocaleDetails.ShortName);
+ localeData.TryAdd($"{newItemId} Description", newLocaleDetails.Description);
+ }
return localeData;
});
From 2604db86e60117584344b7bca309985bb7777d84 Mon Sep 17 00:00:00 2001
From: Chomp
Date: Fri, 17 Oct 2025 09:05:09 +0100
Subject: [PATCH 46/48] Fixed nullref error in
`FixProfileBreakingInventoryItemIssues` due to BSG typo
---
Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs b/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs
index 49a309c5..2fc9bcbb 100644
--- a/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs
@@ -198,7 +198,7 @@ public class ProfileFixerService(
if (customizationDb.ContainsKey(pmcProfile.Customization.Feet.Value))
{
var defaultFeet = playerIsUsec
- ? customizationDbArray.FirstOrDefault(x => x.Name == "DefaultUsecFeet")
+ ? customizationDbArray.FirstOrDefault(x => x.Name == "DefaulUsecFeet")
: customizationDbArray.FirstOrDefault(x => x.Name == "DefaultBearFeet");
pmcProfile.Customization.Feet = defaultFeet.Id;
}
From a2a06dc9a2a54de1ae8ba39118cf1d85d48b7864 Mon Sep 17 00:00:00 2001
From: Cj <161484149+CJ-SPT@users.noreply.github.com>
Date: Fri, 17 Oct 2025 04:28:18 -0400
Subject: [PATCH 47/48] Update log paths on issue template for new format
---
.github/ISSUE_TEMPLATE/1-bug-report.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml
index a9c358fd..c9373da6 100644
--- a/.github/ISSUE_TEMPLATE/1-bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml
@@ -12,7 +12,7 @@ body:
- You must be able to replicate the issue with a fresh profile, running no mods. If you can't, we can't fix it.
- If you are using a profile from an older version, please make a fresh profile and replicate the issue before submitting.
- You must upload all the required log files, even if you think they are useless.
- - Failure to comply with any of the above requirements will result in your issue being closed without notice.
+ - Failure to comply with any of the above requirements will result in your issue being closed without notice.
- type: dropdown
id: version
attributes:
@@ -59,7 +59,7 @@ body:
id: log_server
attributes:
label: "Server Log"
- description: "Upload a copy of your *entire* server log: `/user/logs/spt/spt.txt`."
+ description: "Upload a copy of your *entire* server log: `SPT/user/logs/spt/spt.txt`."
placeholder: "Attach the log file. Do not paste the contents."
validations:
required: true
@@ -83,7 +83,7 @@ body:
id: profile
attributes:
label: "Player Profile"
- description: "If helpful, upload a copy of your *entire* player profile: `/user/profiles/.json`."
+ description: "If helpful, upload a copy of your *entire* player profile: `SPT/user/profiles/.json`."
placeholder: "Attach the profile file. Do not paste the contents."
validations:
required: false
From 4ce5512d7dd52c8e05a8dcf4a7c84556b6d3714b Mon Sep 17 00:00:00 2001
From: Chomp
Date: Fri, 17 Oct 2025 10:53:25 +0100
Subject: [PATCH 48/48] Added `BotConfig.ReplaceScavWith` to allow adjustment
of scavs into other bot types
---
.../SPT_Data/configs/bot.json | 3 ++-
.../Models/Spt/Config/BotConfig.cs | 6 +++++
.../Services/PostDbLoadService.cs | 24 +++++++++++++++++++
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/bot.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/bot.json
index c482fae2..7bc5ea6b 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/bot.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/bot.json
@@ -2838,5 +2838,6 @@
"bossKnight"
],
"resetDay": "Monday"
- }
+ },
+ "replaceScavWith": "assault"
}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
index 690111d9..fb11db48 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
@@ -131,6 +131,12 @@ public record BotConfig : BaseConfig
///
[JsonPropertyName("weeklyBoss")]
public required WeeklyBossSettings WeeklyBoss { get; set; }
+
+ ///
+ /// Replace all scavs across all maps with the provided WildSpawnType
+ ///
+ [JsonPropertyName("replaceScavWith")]
+ public required WildSpawnType ReplaceScavWith { get; set; }
}
public record WeeklyBossSettings
diff --git a/Libraries/SPTarkov.Server.Core/Services/PostDbLoadService.cs b/Libraries/SPTarkov.Server.Core/Services/PostDbLoadService.cs
index 71e2c04f..528c5d29 100644
--- a/Libraries/SPTarkov.Server.Core/Services/PostDbLoadService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/PostDbLoadService.cs
@@ -131,6 +131,30 @@ public class PostDbLoadService(
var chosenBoss = GetWeeklyBoss(BotConfig.WeeklyBoss.BossPool, BotConfig.WeeklyBoss.ResetDay);
FlagMapAsGuaranteedBoss(chosenBoss);
}
+
+ if (BotConfig.ReplaceScavWith != WildSpawnType.assault)
+ {
+ ReplaceScavWavesWithRole(BotConfig.ReplaceScavWith);
+ }
+ }
+
+ protected void ReplaceScavWavesWithRole(WildSpawnType newScavRole)
+ {
+ foreach (var location in databaseService.GetLocations().GetDictionary().Values)
+ {
+ if (location.Base?.Waves is null)
+ {
+ continue;
+ }
+
+ foreach (var wave in location.Base.Waves)
+ {
+ if (wave.WildSpawnType == WildSpawnType.assault)
+ {
+ wave.WildSpawnType = newScavRole;
+ }
+ }
+ }
}
///