Merge tag '4.0.5'

This commit is contained in:
Archangel
2025-11-17 16:49:54 +01:00
34 changed files with 205 additions and 267 deletions
+2 -4
View File
@@ -1,13 +1,11 @@
<Project>
<PropertyGroup>
<!-- SPT specific -->
<SptVersion Condition="'$(SptVersion)' == ''">4.0.3</SptVersion>
<SptVersion Condition="'$(SptVersion)' == ''">4.0.4</SptVersion>
<SptCommit Condition="'$(SptCommit)' == ''">a12b34</SptCommit>
<SptBuildTime Condition="'$(SptBuildTime)' == ''">0000000000</SptBuildTime>
<SptBuildType Condition="'$(SptBuildType)' == ''">LOCAL</SptBuildType>
<!-- BuildType options - LOCAL, DEBUG, RELEASE, BLEEDINGEDGE, BLEEDINGEDGEMODS - *must be all caps*-->
<!-- SemVer-compliant version -->
<!-- Format: 4.0.1-LOCAL+a12b34.0000000000 -->
<!-- BuildType options - LOCAL, DEBUG, RELEASE, BLEEDINGEDGE, BLEEDINGEDGEMODS - *must be all caps*--><!-- SemVer-compliant version --><!-- Format: 4.0.1-LOCAL+a12b34.0000000000 -->
<Version>$(SptVersion)-$(SptBuildType)+$(SptCommit).$(SptBuildTime)</Version>
<AssemblyVersion>$(SptVersion)</AssemblyVersion>
<FileVersion>$(SptVersion)</FileVersion>
@@ -25,7 +25,8 @@
],
"removeModItemsFromProfile": false,
"removeInvalidTradersFromProfile": false,
"fixProfileBreakingInventoryItemIssues": false
"fixProfileBreakingInventoryItemIssues": false,
"renamePreRaidLocales": true
},
"survey": {
"locale": {
@@ -378,6 +378,16 @@
],
"craftTimeSeconds": 66,
"repeatable": true
},
{
"reward": [
"6866665cdf54e1190902df55"
],
"requiredItems": [
"686665484c6f39163e076c3d"
],
"craftTimeSeconds": 66,
"repeatable": true
}
],
"directRewardStackSize": {
@@ -20,7 +20,7 @@ public class AchievementCallbacks(AchievementController achievementController, H
}
/// <summary>
/// Handle client/achievement/statistic
/// Handle client/achievement/statistic
/// </summary>
/// <returns></returns>
public ValueTask<string> Statistic(string url, EmptyRequestData _, MongoId sessionID)
@@ -1019,7 +1019,7 @@ public class RagfairController(
var playerOffer = playerProfileOffers?.FirstOrDefault(x => x.Id == offerId);
if (playerOffer is null)
{
logger.Error(localisationService.GetText("ragfair-offer_not_found_in_profile", new { offerId }));
logger.Error(localisationService.GetText("ragfair-offer_not_found_in_profile", new { offerId, profileId = sessionId }));
return httpResponseUtil.AppendErrorToOutput(output, localisationService.GetText("ragfair-offer_not_found_in_profile_short"));
}
@@ -687,14 +687,12 @@ public class BotLootGenerator(
Dictionary<string, double> modChances
)
{
var chosenWeaponType = randomUtil.GetArrayValue<string>(
[
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.Holster),
]
);
var chosenWeaponType = randomUtil.GetArrayValue<string>([
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.FirstPrimaryWeapon),
nameof(EquipmentSlots.Holster),
]);
var randomisedWeaponCount = randomUtil.GetInt(
PMCConfig.LooseWeaponInBackpackLootMinMax.Min,
PMCConfig.LooseWeaponInBackpackLootMinMax.Max
@@ -53,16 +53,14 @@ public class LootGenerator(
{
// Choose one at random + add to results array
var chosenSealedContainer = randomUtil.GetArrayValue(sealedWeaponContainerPool);
result.Add(
[
new Item
{
Id = new MongoId(),
Template = chosenSealedContainer.Id,
Upd = new Upd { StackObjectsCount = 1, SpawnedInSession = true },
},
]
);
result.Add([
new Item
{
Id = new MongoId(),
Template = chosenSealedContainer.Id,
Upd = new Upd { StackObjectsCount = 1, SpawnedInSession = true },
},
]);
}
}
@@ -349,9 +349,10 @@ public class CompletionQuestGenerator(
{
var onlyFoundInRaid = completionConfig.RequiredItemsAreFiR;
var minDurability = itemHelper.IsOfBaseclasses(itemTpl, [BaseClasses.WEAPON, BaseClasses.ARMOR])
? randomUtil.GetArrayValue(
[completionConfig.RequiredItemMinDurabilityMinMax.Min, completionConfig.RequiredItemMinDurabilityMinMax.Max]
)
? randomUtil.GetArrayValue([
completionConfig.RequiredItemMinDurabilityMinMax.Min,
completionConfig.RequiredItemMinDurabilityMinMax.Max,
])
: 0;
// Dog tags MUST NOT be FiR for them to work
@@ -34,9 +34,9 @@ public class ForceChristmasMessageHandler(
_mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
_randomUtil.GetArrayValue(
[_serverLocalisationService.GetText("chatbot-forced_event_enabled", SeasonalEventType.Christmas)]
),
_randomUtil.GetArrayValue([
_serverLocalisationService.GetText("chatbot-forced_event_enabled", SeasonalEventType.Christmas),
]),
[],
null
);
@@ -34,9 +34,9 @@ public class ForceHalloweenMessageHandler(
_mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
_randomUtil.GetArrayValue(
[_serverLocalisationService.GetText("chatbot-forced_event_enabled", SeasonalEventType.Halloween)]
),
_randomUtil.GetArrayValue([
_serverLocalisationService.GetText("chatbot-forced_event_enabled", SeasonalEventType.Halloween),
]),
[],
null
);
@@ -29,21 +29,19 @@ public class HelloMessageHandler(MailSendService mailSendService, RandomUtil ran
mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
randomUtil.GetArrayValue(
[
"Howdy",
"Hi",
"Greetings",
"Hello",
"Bonjor",
"Yo",
"Sup",
"Heyyyyy",
"Hey there",
"OH its you",
$"Hello {sender?.Info?.Nickname}",
]
),
randomUtil.GetArrayValue([
"Howdy",
"Hi",
"Greetings",
"Hello",
"Bonjor",
"Yo",
"Sup",
"Heyyyyy",
"Hey there",
"OH its you",
$"Hello {sender?.Info?.Nickname}",
]),
[],
null
);
@@ -25,14 +25,12 @@ public class LoveYouChatMessageHandler(MailSendService _mailSendService, RandomU
_mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
_randomUtil.GetArrayValue(
[
"That's quite forward but i love you too in a purely chatbot-human way",
"I love you too buddy :3!",
"uwu",
$"love you too {sender?.Info?.Nickname}",
]
),
_randomUtil.GetArrayValue([
"That's quite forward but i love you too in a purely chatbot-human way",
"I love you too buddy :3!",
"uwu",
$"love you too {sender?.Info?.Nickname}",
]),
[],
null
);
@@ -25,15 +25,13 @@ public class NikitaMessageHandler(MailSendService _mailSendService, RandomUtil _
_mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
_randomUtil.GetArrayValue(
[
"I know that guy!",
"Cool guy, he made EFT!",
"Legend",
"The mastermind of my suffering",
"Remember when he said webel-webel-webel-webel, classic Nikita moment",
]
),
_randomUtil.GetArrayValue([
"I know that guy!",
"Cool guy, he made EFT!",
"Legend",
"The mastermind of my suffering",
"Remember when he said webel-webel-webel-webel, classic Nikita moment",
]),
[],
null
);
@@ -47,15 +47,13 @@ public class SendGiftMessageHandler(
mailSendService.SendUserMessageToPlayer(
sessionId,
sptFriendUser,
randomUtil.GetArrayValue(
[
"Hey! you got the right code!",
"A secret code, how exciting!",
"You found a gift code!",
"A gift code! incredible",
"A gift! what could it be!",
]
),
randomUtil.GetArrayValue([
"Hey! you got the right code!",
"A secret code, how exciting!",
"You found a gift code!",
"A gift code! incredible",
"A gift! what could it be!",
]),
[],
null
);
@@ -1371,16 +1371,14 @@ public class HideoutHelper(
List<List<Item>> itemsToAdd = [];
for (var index = 0; index < craftedCoinCount; index++)
{
itemsToAdd.Add(
[
new Item
{
Id = new MongoId(),
Template = ItemTpl.BARTER_PHYSICAL_BITCOIN,
Upd = new Upd { StackObjectsCount = 1 },
},
]
);
itemsToAdd.Add([
new Item
{
Id = new MongoId(),
Template = ItemTpl.BARTER_PHYSICAL_BITCOIN,
Upd = new Upd { StackObjectsCount = 1 },
},
]);
}
// Create request for what we want to add to stash
@@ -616,8 +616,8 @@ public class ItemHelper(
else if (item.Upd.Key?.NumberOfUsages > 0 && itemDetails.Properties?.MaximumNumberOfUsage > 0)
{
// keys - keys count upwards, not down like everything else
var maxNumOfUsages = itemDetails.Properties.MaximumNumberOfUsage;
result = (maxNumOfUsages ?? 0 - item.Upd.Key.NumberOfUsages) / maxNumOfUsages ?? 0;
double maxNumOfUsages = itemDetails.Properties.MaximumNumberOfUsage.GetValueOrDefault(0);
result = (maxNumOfUsages - item.Upd.Key.NumberOfUsages!.Value) / maxNumOfUsages;
}
else if (item.Upd.Resource?.UnitsConsumed > 0) // Item is less than 100% usage
{
@@ -45,7 +45,7 @@ public class NotifierHelper(HttpServerHelper httpServerHelper)
return new WsNotificationPopup
{
EventType = NotificationEventType.NotificationPopup,
EventId = new MongoId(),
EventIdentifier = new MongoId(),
Image = config.BigImage,
Message = messageId,
};
@@ -65,9 +65,9 @@ public class PrestigeHelper(
}
else
{
newProfile.CharacterData!.PmcData!.Skills!.Mastering = newProfile.CharacterData.PmcData.Skills.Mastering?.Union(
[skillToCopy]
);
newProfile.CharacterData!.PmcData!.Skills!.Mastering = newProfile.CharacterData.PmcData.Skills.Mastering?.Union([
skillToCopy,
]);
}
}
}
@@ -37,7 +37,7 @@ public class RagfairSellHelper(
// Modifier gets applied twice to either penalize or incentivize over/under pricing (Probably a cleaner way to do this)
var sellModifier = averageOfferPriceRub / playerListedPriceRub * sellConfig.SellMultiplier;
var sellChance = Math.Round(baseSellChancePercent * sellModifier * (Math.Pow(sellModifier, 3) + 10)); // Power of 3
var sellChance = Math.Round(baseSellChancePercent * sellModifier * Math.Pow(sellModifier, 3)); // Power of 3
// Adjust sell chance if below config value
if (sellChance < sellConfig.MinSellChancePercent)
@@ -5,9 +5,6 @@ namespace SPTarkov.Server.Core.Models.Eft.Ws;
public record WsNotificationPopup : WsNotificationEvent
{
[JsonPropertyName("eventId")]
public MongoId EventId { get; set; }
[JsonPropertyName("image")]
public string Image { get; set; }
@@ -244,6 +244,12 @@ public record GameFixes
/// </summary>
[JsonPropertyName("fixProfileBreakingInventoryItemIssues")]
public bool FixProfileBreakingInventoryItemIssues { get; set; }
/// <summary>
/// Should pre-raid english locales be renamed during raid start
/// </summary>
[JsonPropertyName("renamePreRaidLocales")]
public bool RenamePreRaidLocales { get; set; }
}
public record ServerFeatures
@@ -10,6 +10,7 @@ using LogLevel = SPTarkov.Server.Core.Models.Spt.Logging.LogLevel;
namespace SPTarkov.Server.Core.Servers;
[Injectable(InjectionType.Singleton)]
[Obsolete("This class will be removed in SPT 4.2 in favor for directly injecting the configuration into classes")]
public class ConfigServer
{
protected readonly FrozenSet<string> acceptableFileExtensions = ["json", "jsonc"];
@@ -30,6 +31,7 @@ public class ConfigServer
}
}
[Obsolete("This method will be removed in SPT 4.2 in favor for directly injecting the configuration into classes")]
public T GetConfig<T>()
where T : BaseConfig
{
@@ -202,13 +202,13 @@ public class SptWebSocketConnectionHandler(
{
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug(serverLocalisationService.GetText("websocket-not_ready_message_not_sent", sessionID));
logger.Debug(serverLocalisationService.GetText("websocket-not_ready_message_not_sent", sessionID.ToString()));
}
}
}
catch (Exception err)
{
logger.Error(serverLocalisationService.GetText("websocket-message_send_failed_with_error"), err);
logger.Error(serverLocalisationService.GetText("websocket-message_send_failed_with_error", err.Message), err);
}
}
@@ -41,7 +41,7 @@ public class BundleHashCacheService(ISptLogger<BundleHashCacheService> logger, J
protected async Task StoreValue(string bundlePath, uint hash)
{
_bundleHashes.Add(bundlePath, hash);
_bundleHashes[bundlePath] = hash;
var bundleHashesSerialized = jsonUtil.Serialize(_bundleHashes);
@@ -689,19 +689,21 @@ public class CircleOfCultistService(
var questData = questHelper.GetQuestFromDb(task.QId, pmcData);
var handoverConditions = questData.Conditions.AvailableForFinish.Where(condition => condition.ConditionType == "HandoverItem");
foreach (var condition in handoverConditions)
foreach (var neededItem in condition.Target.List)
{
if (itemRewardBlacklist.Contains(neededItem) || !itemHelper.IsValidItem(neededItem))
foreach (var neededItem in condition.Target.List)
{
continue;
}
if (itemRewardBlacklist.Contains(neededItem) || !itemHelper.IsValidItem(neededItem))
{
continue;
}
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug($"Added Task Loot: {itemHelper.GetItemName(neededItem)}");
}
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug($"Added Task Loot: {itemHelper.GetItemName(neededItem)}");
}
rewardPool.Add(neededItem);
rewardPool.Add(neededItem);
}
}
}
}
@@ -31,7 +31,7 @@ public class ItemBaseClassService(
public void HydrateItemBaseClassCache()
{
// Clear existing cache
_itemBaseClassesCache = new Dictionary<MongoId, HashSet<MongoId>>();
_itemBaseClassesCache = [];
var items = databaseService.GetItems();
foreach (var item in items)
@@ -104,7 +104,7 @@ public class ItemBaseClassService(
// Not found
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug(serverLocalisationService.GetText("baseclass-item_not_found", itemTpl));
logger.Debug(serverLocalisationService.GetText("baseclass-item_not_found", itemTpl.ToString()));
}
// Not found in cache, Hydrate again - some mods add items late in server startup lifecycle
@@ -118,7 +118,7 @@ public class ItemBaseClassService(
return baseClassList.Overlaps(baseClasses);
}
logger.Warning(serverLocalisationService.GetText("baseclass-item_not_found_failed", itemTpl));
logger.Warning(serverLocalisationService.GetText("baseclass-item_not_found_failed", itemTpl.ToString()));
return false;
}
@@ -156,7 +156,7 @@ public class ItemBaseClassService(
// Not found
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug(serverLocalisationService.GetText("baseclass-item_not_found", itemTpl));
logger.Debug(serverLocalisationService.GetText("baseclass-item_not_found", itemTpl.ToString()));
}
// Not found in cache, Hydrate again - some mods add items late in server startup lifecycle
@@ -170,7 +170,7 @@ public class ItemBaseClassService(
return baseClassList.Contains(baseClasses);
}
logger.Warning(serverLocalisationService.GetText("baseclass-item_not_found_failed", itemTpl));
logger.Warning(serverLocalisationService.GetText("baseclass-item_not_found_failed", itemTpl.ToString()));
return false;
}
@@ -370,8 +370,9 @@ public class PaymentService(
moneyItemsInInventory = noLocked.ToList();
}
// Prioritise items in stash to top of array
moneyItemsInInventory.Sort((a, b) => PrioritiseStashSort(a, b, pmcData.Inventory.Items, itemsInStashCache));
// Sort money stacks to prioritise items in stash and not in secure to top of array
var inventoryParent = pmcData.Inventory.Items.ToDictionary(item => item.Id.ToString(), item => item.Template);
moneyItemsInInventory.Sort((a, b) => PrioritiseStashSort(a, b, inventoryParent, itemsInStashCache));
return moneyItemsInInventory;
}
@@ -401,13 +402,13 @@ public class PaymentService(
/// </summary>
/// <param name="a"> First money stack item </param>
/// <param name="b"> Second money stack item </param>
/// <param name="inventoryItems"> Players inventory items</param>
/// <param name="itemIdToTplCache"> item id (as string) and template id KvP</param>
/// <param name="itemInStashCache">Cache of item IDs and if they're in stash</param>
/// <returns> Sort order, -1 if A has priority, 1 if B has priority, 0 if they match </returns>
protected int PrioritiseStashSort(
Item a,
Item b,
List<Item> inventoryItems,
Dictionary<string, MongoId> itemIdToTplCache,
IReadOnlyDictionary<MongoId, InventoryLocation> itemInStashCache
)
{
@@ -441,11 +442,18 @@ public class PaymentService(
if (aInContainer && bInContainer)
{
// Containers where taking money from would inconvenience player
var aImmediateParent = inventoryItems.FirstOrDefault(item => item.Id == a.ParentId);
var bImmediateParent = inventoryItems.FirstOrDefault(item => item.Id == b.ParentId);
var aInDeprioContainer = InventoryConfig.DeprioritisedMoneyContainers.Contains(aImmediateParent.Template);
var bInDeprioContainer = InventoryConfig.DeprioritisedMoneyContainers.Contains(bImmediateParent.Template);
// Get template Id of items' parent so we can see if items in a container we want to de prioritise
var aImmediateParentTemplate = itemIdToTplCache.FirstOrDefault(item =>
string.Equals(item.Key, a.ParentId, StringComparison.OrdinalIgnoreCase)
);
var bImmediateParentTemplate = itemIdToTplCache.FirstOrDefault(item =>
string.Equals(item.Key, b.ParentId, StringComparison.OrdinalIgnoreCase)
);
// e.g. secure container
var aInDeprioContainer = InventoryConfig.DeprioritisedMoneyContainers.Contains(aImmediateParentTemplate.Value);
var bInDeprioContainer = InventoryConfig.DeprioritisedMoneyContainers.Contains(bImmediateParentTemplate.Value);
// Prioritize B
if (!aInDeprioContainer && bInDeprioContainer)
@@ -136,6 +136,27 @@ public class PostDbLoadService(
{
ReplaceScavWavesWithRole(BotConfig.ReplaceScavWith);
}
if (CoreConfig.Fixes.RenamePreRaidLocales)
{
RenamePreraidLocales();
}
}
protected void RenamePreraidLocales()
{
if (databaseService.GetLocales().Global.TryGetValue("en", out var lazyloadedValue))
{
// We have to add a transformer here, because locales are lazy loaded due to them taking up huge space in memory
// The transformer will make sure that each time the locales are requested, the ones changed or added below are included
lazyloadedValue.AddTransformer(lazyloadedLocaleData =>
{
lazyloadedLocaleData["Offline raid test mode"] = "SPT";
lazyloadedLocaleData["Offline raid description"] = " ";
return lazyloadedLocaleData;
});
}
}
protected void ReplaceScavWavesWithRole(WildSpawnType newScavRole)
@@ -247,13 +247,13 @@ public class RepairService(
// You can both crit fail and succeed at the same time, for fun (Balances out to 0 with default settings)
// Add a random chance to crit-fail
if (random.Next() <= RepairConfig.WeaponTreatment.CritFailureChance)
if (random.NextDouble() <= RepairConfig.WeaponTreatment.CritFailureChance)
{
skillPoints -= RepairConfig.WeaponTreatment.CritFailureAmount;
}
// Add a random chance to crit-succeed
if (random.Next() <= RepairConfig.WeaponTreatment.CritSuccessChance)
if (random.NextDouble() <= RepairConfig.WeaponTreatment.CritSuccessChance)
{
skillPoints += RepairConfig.WeaponTreatment.CritSuccessAmount;
}
@@ -587,7 +587,7 @@ public class RepairService(
var doBuff = commonBuffMinChanceValue + commonBuffChanceLevelBonus * skillLevel * durabilityMultiplier;
var random = new Random();
return random.Next() <= doBuff;
return random.NextDouble() <= doBuff;
}
/// <summary>
@@ -279,7 +279,7 @@ public class SeasonalEventService(
/// </summary>
public void CacheActiveEvents()
{
var currentDate = DateTimeOffset.UtcNow.DateTime;
var currentDate = DateTimeOffset.Now.DateTime;
var seasonalEvents = GetEventDetails();
// reset existing data
+18 -1
View File
@@ -42,9 +42,26 @@ public static class Program
}
catch (Exception e)
{
if (e.Message.Contains("could not load file or assembly", StringComparison.InvariantCultureIgnoreCase))
{
var requirementName = e.Message;
Console.WriteLine(
"========================================================================================================="
);
Console.BackgroundColor = ConsoleColor.DarkRed;
Console.ForegroundColor = ConsoleColor.Black;
Console.WriteLine(
"You may have forgotten to install a requirement for one of your mods, please check the mod page again and install any requirements listed. Read the error message below CAREFULLY for the name of the mod you need to install"
);
Console.ResetColor();
Console.WriteLine(
"========================================================================================================="
);
}
Console.WriteLine("=========================================================================================================");
Console.WriteLine(
"The server has unexpectedly stopped, reach out to #spt-support in discord, create a support thread by following the instructions found in #support-guidelines. Also include a screenshot of this message + the below error"
"The server has unexpectedly stopped, reach out to #spt-support in our Discord server. Include a screenshot of this message + the below error"
);
Console.WriteLine(e);
Console.WriteLine("=========================================================================================================");
+3 -5
View File
@@ -38,11 +38,9 @@ public class DI
var diHandler = new DependencyInjectionHandler(services);
diHandler.AddInjectableTypesFromTypeAssembly(typeof(App));
diHandler.AddInjectableTypesFromTypeList(
[
typeof(MockLogger<>), // TODO: this needs to be enabled but the randomizer needs to NOT be random, typeof(MockRandomUtil)
]
);
diHandler.AddInjectableTypesFromTypeList([
typeof(MockLogger<>), // TODO: this needs to be enabled but the randomizer needs to NOT be random, typeof(MockRandomUtil)
]);
diHandler.InjectAll();
-137
View File
@@ -1,137 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Server", "SPTarkov.Server\SPTarkov.Server.csproj", "{1F5ED9C6-8B1F-4776-85AB-B387CBBC5557}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Server.Core", "Libraries\SPTarkov.Server.Core\SPTarkov.Server.Core.csproj", "{AC8643DC-8779-4B4A-BBDA-2D4CC466F765}"
ProjectSection(ProjectDependencies) = postProject
{20A5EBD3-75D1-4E06-8240-09EEF874017A} = {20A5EBD3-75D1-4E06-8240-09EEF874017A}
{5D09182A-B0B3-406C-AE88-EE0929F9260C} = {5D09182A-B0B3-406C-AE88-EE0929F9260C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{587959C2-5AFA-4B77-B327-566610F9A289}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.DI", "Libraries\SPTarkov.DI\SPTarkov.DI.csproj", "{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoIdTplGenerator", "Tools\MongoIdTplGenerator\MongoIdTplGenerator.csproj", "{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Common", "Libraries\SPTarkov.Common\SPTarkov.Common.csproj", "{DB049C81-DEC0-490D-AC06-7AF4DC8C0571}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Server.Assets", "Libraries\SPTarkov.Server.Assets\SPTarkov.Server.Assets.csproj", "{4B973AC0-0C60-4853-9AF7-7CB69127473E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HideoutCraftQuestIdGenerator", "Tools\HideoutCraftQuestIdGenerator\HideoutCraftQuestIdGenerator.csproj", "{C24B1FEB-F8AC-434E-998D-5DA4D1687295}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Reflection", "Libraries\SPTarkov.Reflection\SPTarkov.Reflection.csproj", "{9073A593-A2F5-471E-9678-B896A7226FD4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonExtensionDataGenerator", "Tools\JsonExtensionDataGenerator\JsonExtensionDataGenerator.csproj", "{6F4670CD-6861-47A8-9A02-2B63AD73A929}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Patches", "Patches", "{9E41CD5A-271C-4294-AAF9-8EB379311416}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ceciler.Virtualizer", "Patches\Ceciler.Virtualizer\Ceciler.Virtualizer.csproj", "{20A5EBD3-75D1-4E06-8240-09EEF874017A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Testing", "Testing", "{07B50C44-6D38-474E-87AF-68672D241EEB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Testing\Benchmarks\Benchmarks.csproj", "{3E342BAC-EE44-44E4-8E99-393F0C9F787C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "Testing\UnitTests\UnitTests.csproj", "{28B90486-1436-4CD7-88D0-122B6963AB58}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestMod", "Testing\TestMod\TestMod.csproj", "{755E473C-14F2-40BC-9377-2FAB11CA91DC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ceciler.JsonExtensionData", "Patches\Ceciler.JsonExtensionData\Ceciler.JsonExtensionData.csproj", "{5D09182A-B0B3-406C-AE88-EE0929F9260C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPTarkov.Server.Web", "Libraries\SPTarkov.Server.Web\SPTarkov.Server.Web.csproj", "{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1F5ED9C6-8B1F-4776-85AB-B387CBBC5557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F5ED9C6-8B1F-4776-85AB-B387CBBC5557}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F5ED9C6-8B1F-4776-85AB-B387CBBC5557}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F5ED9C6-8B1F-4776-85AB-B387CBBC5557}.Release|Any CPU.Build.0 = Release|Any CPU
{AC8643DC-8779-4B4A-BBDA-2D4CC466F765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC8643DC-8779-4B4A-BBDA-2D4CC466F765}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC8643DC-8779-4B4A-BBDA-2D4CC466F765}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC8643DC-8779-4B4A-BBDA-2D4CC466F765}.Release|Any CPU.Build.0 = Release|Any CPU
{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1}.Release|Any CPU.Build.0 = Release|Any CPU
{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF}.Release|Any CPU.Build.0 = Release|Any CPU
{DB049C81-DEC0-490D-AC06-7AF4DC8C0571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DB049C81-DEC0-490D-AC06-7AF4DC8C0571}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DB049C81-DEC0-490D-AC06-7AF4DC8C0571}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DB049C81-DEC0-490D-AC06-7AF4DC8C0571}.Release|Any CPU.Build.0 = Release|Any CPU
{4B973AC0-0C60-4853-9AF7-7CB69127473E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B973AC0-0C60-4853-9AF7-7CB69127473E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B973AC0-0C60-4853-9AF7-7CB69127473E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B973AC0-0C60-4853-9AF7-7CB69127473E}.Release|Any CPU.Build.0 = Release|Any CPU
{C24B1FEB-F8AC-434E-998D-5DA4D1687295}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C24B1FEB-F8AC-434E-998D-5DA4D1687295}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C24B1FEB-F8AC-434E-998D-5DA4D1687295}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C24B1FEB-F8AC-434E-998D-5DA4D1687295}.Release|Any CPU.Build.0 = Release|Any CPU
{9073A593-A2F5-471E-9678-B896A7226FD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9073A593-A2F5-471E-9678-B896A7226FD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9073A593-A2F5-471E-9678-B896A7226FD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9073A593-A2F5-471E-9678-B896A7226FD4}.Release|Any CPU.Build.0 = Release|Any CPU
{6F4670CD-6861-47A8-9A02-2B63AD73A929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F4670CD-6861-47A8-9A02-2B63AD73A929}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F4670CD-6861-47A8-9A02-2B63AD73A929}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F4670CD-6861-47A8-9A02-2B63AD73A929}.Release|Any CPU.Build.0 = Release|Any CPU
{20A5EBD3-75D1-4E06-8240-09EEF874017A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20A5EBD3-75D1-4E06-8240-09EEF874017A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20A5EBD3-75D1-4E06-8240-09EEF874017A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20A5EBD3-75D1-4E06-8240-09EEF874017A}.Release|Any CPU.Build.0 = Release|Any CPU
{3E342BAC-EE44-44E4-8E99-393F0C9F787C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3E342BAC-EE44-44E4-8E99-393F0C9F787C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3E342BAC-EE44-44E4-8E99-393F0C9F787C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3E342BAC-EE44-44E4-8E99-393F0C9F787C}.Release|Any CPU.Build.0 = Release|Any CPU
{28B90486-1436-4CD7-88D0-122B6963AB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{28B90486-1436-4CD7-88D0-122B6963AB58}.Debug|Any CPU.Build.0 = Debug|Any CPU
{28B90486-1436-4CD7-88D0-122B6963AB58}.Release|Any CPU.ActiveCfg = Release|Any CPU
{28B90486-1436-4CD7-88D0-122B6963AB58}.Release|Any CPU.Build.0 = Release|Any CPU
{755E473C-14F2-40BC-9377-2FAB11CA91DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{755E473C-14F2-40BC-9377-2FAB11CA91DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{755E473C-14F2-40BC-9377-2FAB11CA91DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{755E473C-14F2-40BC-9377-2FAB11CA91DC}.Release|Any CPU.Build.0 = Release|Any CPU
{5D09182A-B0B3-406C-AE88-EE0929F9260C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5D09182A-B0B3-406C-AE88-EE0929F9260C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D09182A-B0B3-406C-AE88-EE0929F9260C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D09182A-B0B3-406C-AE88-EE0929F9260C}.Release|Any CPU.Build.0 = Release|Any CPU
{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AC8643DC-8779-4B4A-BBDA-2D4CC466F765} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
{4B4AF50D-B2C6-47D1-B567-EA4560D8CBA1} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
{00897F10-1AB3-4DC7-8DF9-5EA1D0289ACF} = {587959C2-5AFA-4B77-B327-566610F9A289}
{DB049C81-DEC0-490D-AC06-7AF4DC8C0571} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
{4B973AC0-0C60-4853-9AF7-7CB69127473E} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
{C24B1FEB-F8AC-434E-998D-5DA4D1687295} = {587959C2-5AFA-4B77-B327-566610F9A289}
{9073A593-A2F5-471E-9678-B896A7226FD4} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
{6F4670CD-6861-47A8-9A02-2B63AD73A929} = {587959C2-5AFA-4B77-B327-566610F9A289}
{20A5EBD3-75D1-4E06-8240-09EEF874017A} = {9E41CD5A-271C-4294-AAF9-8EB379311416}
{3E342BAC-EE44-44E4-8E99-393F0C9F787C} = {07B50C44-6D38-474E-87AF-68672D241EEB}
{28B90486-1436-4CD7-88D0-122B6963AB58} = {07B50C44-6D38-474E-87AF-68672D241EEB}
{755E473C-14F2-40BC-9377-2FAB11CA91DC} = {07B50C44-6D38-474E-87AF-68672D241EEB}
{5D09182A-B0B3-406C-AE88-EE0929F9260C} = {9E41CD5A-271C-4294-AAF9-8EB379311416}
{BB1EB56E-9D40-8497-5A6D-B2E35E83FA89} = {F084DDFD-89F3-44F9-89C3-5CA11F4CDEEF}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6F730FC0-94A8-40B8-8E0E-5D6558E8422A}
EndGlobalSection
EndGlobal
+28
View File
@@ -0,0 +1,28 @@
<Solution>
<Folder Name="/Libraries/">
<Project Path="Libraries/SPTarkov.Common/SPTarkov.Common.csproj" />
<Project Path="Libraries/SPTarkov.DI/SPTarkov.DI.csproj" />
<Project Path="Libraries/SPTarkov.Reflection/SPTarkov.Reflection.csproj" />
<Project Path="Libraries/SPTarkov.Server.Assets/SPTarkov.Server.Assets.csproj" />
<Project Path="Libraries/SPTarkov.Server.Core/SPTarkov.Server.Core.csproj">
<BuildDependency Project="Patches/Ceciler.JsonExtensionData/Ceciler.JsonExtensionData.csproj" />
<BuildDependency Project="Patches/Ceciler.Virtualizer/Ceciler.Virtualizer.csproj" />
</Project>
<Project Path="Libraries/SPTarkov.Server.Web/SPTarkov.Server.Web.csproj" />
</Folder>
<Folder Name="/Patches/">
<Project Path="Patches/Ceciler.JsonExtensionData/Ceciler.JsonExtensionData.csproj" />
<Project Path="Patches/Ceciler.Virtualizer/Ceciler.Virtualizer.csproj" />
</Folder>
<Folder Name="/Testing/">
<Project Path="Testing/Benchmarks/Benchmarks.csproj" />
<Project Path="Testing/TestMod/TestMod.csproj" />
<Project Path="Testing/UnitTests/UnitTests.csproj" />
</Folder>
<Folder Name="/Tools/">
<Project Path="Tools/HideoutCraftQuestIdGenerator/HideoutCraftQuestIdGenerator.csproj" />
<Project Path="Tools/JsonExtensionDataGenerator/JsonExtensionDataGenerator.csproj" />
<Project Path="Tools/MongoIdTplGenerator/MongoIdTplGenerator.csproj" />
</Folder>
<Project Path="SPTarkov.Server/SPTarkov.Server.csproj" />
</Solution>