Merge branch 'develop' of https://github.com/sp-tarkov/server-csharp into develop

# Conflicts:
#	ModExamples/TempReferences/Core.dll
#	ModExamples/TempReferences/SptCommon.dll
#	ModExamples/TempReferences/SptDependencyInjection.dll
This commit is contained in:
CWX
2025-02-10 21:25:10 +00:00
4 changed files with 205 additions and 193 deletions
@@ -15,12 +15,12 @@ namespace _13._1AddTraderWithDynamicAssorts
* @param refreshTimeSecondsMin How many seconds between trader stock refresh min time
* @param refreshTimeSecondsMax How many seconds between trader stock refresh max time
*/
public void SetTraderUpdateTime(TraderConfig traderConfig, dynamic baseJson, int refreshTimeSecondsMin, int refreshTimeSecondsMax)
public void SetTraderUpdateTime(TraderConfig traderConfig, TraderBase baseJson, int refreshTimeSecondsMin, int refreshTimeSecondsMax)
{
// Add refresh time in seconds to config
var traderRefreshRecord = new UpdateTime
{
TraderId = baseJson.id,
TraderId = baseJson.Id,
Seconds = new MinMax<int>(refreshTimeSecondsMin, refreshTimeSecondsMax)
};
@@ -34,7 +34,7 @@ namespace _13._1AddTraderWithDynamicAssorts
* @param tables database
* @param jsonUtil json utility class
*/
public void AddTraderToDb(dynamic traderDetailsToAdd, DatabaseTables tables, JsonUtil jsonUtil, object assortJson)
public void AddTraderToDb(TraderBase traderDetailsToAdd, DatabaseTables tables, JsonUtil jsonUtil, object assortJson)
{
// Create trader data ready to add to database
var traderDataToAdd = new Trader
@@ -54,7 +54,7 @@ namespace _13._1AddTraderWithDynamicAssorts
};
// Add trader to trader table, key is the traders id
tables.Traders.Add(traderDetailsToAdd._id, traderDataToAdd);
tables.Traders.Add(traderDetailsToAdd.Id, traderDataToAdd);
}
/**
@@ -67,17 +67,17 @@ namespace _13._1AddTraderWithDynamicAssorts
* @param location Location of trader (e.g. "Here in the cat shop")
* @param description Description of trader
*/
public void AddTraderToLocales(dynamic baseJson, DatabaseTables tables, string fullName, string firstName, string nickName, string location, string description)
public void AddTraderToLocales(TraderBase baseJson, DatabaseTables tables, string fullName, string firstName, string nickName, string location, string description)
{
// For each language, add locale for the new trader
var locales = tables.Locales.Global;
foreach (var (key, value) in locales) {
value.Value[$"{baseJson._id} FullName"] = fullName;
value.Value[$"{baseJson._id} FirstName"] = firstName;
value.Value[$"{baseJson._id} Nickname"] = nickName;
value.Value[$"{baseJson._id} Location"] = location;
value.Value[$"{baseJson._id} Description"] = description;
value.Value[$"{baseJson.Id} FullName"] = fullName;
value.Value[$"{baseJson.Id} FirstName"] = firstName;
value.Value[$"{baseJson.Id} Nickname"] = nickName;
value.Value[$"{baseJson.Id} Location"] = location;
value.Value[$"{baseJson.Id} Description"] = description;
}
}
@@ -89,7 +89,7 @@ namespace _13._1AddTraderWithDynamicAssorts
// Add the base first
glock.Add(new Item { // Add the base weapon first
Id =
NewItemIds.GLOCK_BASE, // Ids matter, MUST BE UNIQUE See mod.ts for more details
NewItemIds.GLOCK_BASE, // Ids matter, MUST BE UNIQUE
Template =
"5a7ae0c351dfba0017554310", // This is the weapons tpl, found on: https://db.sp-tarkov.com/search
});
@@ -7,119 +7,130 @@ using Core.Routers;
using Core.Servers;
using Core.Services;
using Core.Utils;
using SptCommon.Annotations;
namespace _13._1AddTraderWithDynamicAssorts
namespace _13._1AddTraderWithDynamicAssorts;
[Injectable]
public class AddTraderWithDynamicAssorts : IPostDBLoadMod
{
public class AddTraderWithDynamicAssorts : IPostDBLoadMod
private readonly ISptLogger<AddTraderWithDynamicAssorts> _logger;
private readonly HashUtil _hashUtil;
private readonly JsonUtil _jsonUtil;
private readonly FileUtil _fileUtil;
private readonly DatabaseService _databaseService;
private readonly ImageRouter _imageRouter;
private readonly ConfigServer _configServer;
private readonly TraderConfig _traderConfig;
private readonly RagfairConfig _ragfairConfig;
// This MUST match the folder name of the mod in the user/mods folder
private const string _modName = "13.1AddTraderWithDynamicAssorts";
public AddTraderWithDynamicAssorts(
ISptLogger<AddTraderWithDynamicAssorts> logger,
HashUtil hashUtil,
JsonUtil jsonUtil,
FileUtil fileUtil,
DatabaseService databaseService,
ImageRouter imageRouter,
ConfigServer configServer)
{
private readonly ISptLogger<AddTraderWithDynamicAssorts> _logger;
private readonly HashUtil _hashUtil;
private readonly JsonUtil _jsonUtil;
private readonly FileUtil _fileUtil;
private readonly DatabaseService _databaseService;
private readonly ImageRouter _imageRouter;
private readonly ConfigServer _configServer;
private readonly TraderConfig _traderConfig;
private readonly RagfairConfig _ragfairConfig;
_logger = logger;
_hashUtil = hashUtil;
_jsonUtil = jsonUtil;
_fileUtil = fileUtil;
_databaseService = databaseService;
_imageRouter = imageRouter;
_configServer = configServer;
public AddTraderWithDynamicAssorts(
ISptLogger<AddTraderWithDynamicAssorts> logger,
HashUtil hashUtil,
JsonUtil jsonUtil,
FileUtil fileUtil,
DatabaseService databaseService,
ImageRouter imageRouter,
ConfigServer configServer)
{
_logger = logger;
_hashUtil = hashUtil;
_jsonUtil = jsonUtil;
_fileUtil = fileUtil;
_databaseService = databaseService;
_imageRouter = imageRouter;
_configServer = configServer;
_traderConfig = _configServer.GetConfig<TraderConfig>();
_ragfairConfig = _configServer.GetConfig<RagfairConfig>();
}
public void PostDBLoad()
{
var traderImagePath = "./db/cat.jpg";
var baseJson = _fileUtil.ReadFile("./db/base.json");
var traderBase = _jsonUtil.Deserialize<TraderBase>(baseJson);
// Create helper class and use it to register our traders image/icon + set its stock refresh time
var addTraderHelper = new AddTraderHelper();
_imageRouter.AddRoute(traderBase.Avatar.Replace(".jpg", ""), System.IO.Path.GetFullPath(traderImagePath));
addTraderHelper.SetTraderUpdateTime(_traderConfig, traderBase, 3600, 4000);
// Add trader to flea market
_ragfairConfig.Traders[traderBase.Id] = true;
// Get a reference to the database tables
var tables = _databaseService.GetTables();
var fluentAssortCreator = new FluentTraderAssortCreator(_logger, _hashUtil);
// Add milk
var milkAssort = fluentAssortCreator
.CreateSingleAssortItem(ItemTpl.DRINK_PACK_OF_MILK)
.AddStackCount(200)
.AddBuyRestriction(10)
.AddMoneyCost(Money.ROUBLES, 2000)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add 3x bitcoin + salewa for milk barter
fluentAssortCreator
.CreateSingleAssortItem(ItemTpl.DRINK_PACK_OF_MILK)
.AddStackCount(100)
.AddBarterCost(ItemTpl.BARTER_PHYSICAL_BITCOIN, 3)
.AddBarterCost(ItemTpl.MEDKIT_SALEWA_FIRST_AID_KIT, 1)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add glock as a money purchase
fluentAssortCreator
.CreateComplexAssortItem(addTraderHelper.CreateGlock())
.AddUnlimitedStackCount()
.AddMoneyCost(Money.ROUBLES, 20000)
.AddBuyRestriction(3)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add mp133 preset as a barter for mayonase
fluentAssortCreator
.CreateComplexAssortItem(tables.Globals.ItemPresets["584148f2245977598f1ad387"].Items) // Weapon preset id comes from globals.json
.AddStackCount(200)
.AddBarterCost(ItemTpl.FOOD_JAR_OF_DEVILDOG_MAYO, 1)
.AddBuyRestriction(3)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
addTraderHelper.AddTraderToLocales(
baseJson,
_databaseService.GetTables(),
traderBase.Name,
"Cat",
traderBase.Nickname,
traderBase.Location,
"This is the cat shop. Meow.");
}
_traderConfig = _configServer.GetConfig<TraderConfig>();
_ragfairConfig = _configServer.GetConfig<RagfairConfig>();
}
public static class NewItemIds
public void PostDBLoad()
{
public static string GLOCK_BASE = "66eeef3b2a166b73d2066a74";
public static string GLOCK_BARREL = "66eeef3b2a166b73d2066a75";
public static string GLOCK_RECIEVER = "66eeef3b2a166b73d2066a76";
public static string GLOCK_COMPENSATOR = "66eeef3b2a166b73d2066a77";
public static string GLOCK_PISTOL_GRIP = "66eeef3b2a166b73d2066a78";
public static string GLOCK_REAR_SIGHT = "66eeef3b2a166b73d2066a79";
public static string GLOCK_FRONT_SIGHT = "66eeef3b2a166b73d2066a7a";
public static string GLOCK_MAGAZINE = "66eeef3b2a166b73d2066a7b";
var modPath = _fileUtil.GetModPath(_modName);
var traderImagePath = $"{modPath}/db/cat.jpg";
var baseJson = _fileUtil.ReadFile($"{modPath}/db/base.json");
var traderBase = _jsonUtil.Deserialize<TraderBase>(baseJson);
// Create helper class and use it to register our traders image/icon + set its stock refresh time
var addTraderHelper = new AddTraderHelper();
_imageRouter.AddRoute(traderBase.Avatar.Replace(".jpg", ""), System.IO.Path.GetFullPath(traderImagePath));
addTraderHelper.SetTraderUpdateTime(_traderConfig, traderBase, 3600, 4000);
// Add trader to flea market
_ragfairConfig.Traders[traderBase.Id] = true;
// Get a reference to the database tables
var tables = _databaseService.GetTables();
addTraderHelper.AddTraderToDb(
traderBase,
_databaseService.GetTables(),
_jsonUtil,
new TraderAssort() {Items = new List<Item>(), BarterScheme = new Dictionary<string, List<List<BarterScheme>>>(), LoyalLevelItems = new Dictionary<string, int>()});
_logger.Success("added trader base");
var fluentAssortCreator = new FluentTraderAssortCreator(_logger, _hashUtil);
// Add milk
fluentAssortCreator
.CreateSingleAssortItem(ItemTpl.DRINK_PACK_OF_MILK)
.AddStackCount(200)
.AddBuyRestriction(10)
.AddMoneyCost(Money.ROUBLES, 2000)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add 3x bitcoin + salewa for milk barter
fluentAssortCreator
.CreateSingleAssortItem(ItemTpl.DRINK_PACK_OF_MILK)
.AddStackCount(100)
.AddBarterCost(ItemTpl.BARTER_PHYSICAL_BITCOIN, 3)
.AddBarterCost(ItemTpl.MEDKIT_SALEWA_FIRST_AID_KIT, 1)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add glock as a money purchase
fluentAssortCreator
.CreateComplexAssortItem(addTraderHelper.CreateGlock())
.AddUnlimitedStackCount()
.AddMoneyCost(Money.ROUBLES, 20000)
.AddBuyRestriction(3)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
// Add mp133 preset as a barter for mayonase
fluentAssortCreator
.CreateComplexAssortItem(tables.Globals.ItemPresets["584148f2245977598f1ad387"].Items) // Weapon preset id comes from globals.json
.AddStackCount(200)
.AddBarterCost(ItemTpl.FOOD_JAR_OF_DEVILDOG_MAYO, 1)
.AddBuyRestriction(3)
.AddLoyaltyLevel(1)
.Export(tables.Traders[traderBase.Id]);
addTraderHelper.AddTraderToLocales(
traderBase,
_databaseService.GetTables(),
traderBase.Name,
"Cat",
traderBase.Nickname,
traderBase.Location,
"This is the cat shop. Meow.");
}
}
public static class NewItemIds
{
public static string GLOCK_BASE = "66eeef3b2a166b73d2066a74";
public static string GLOCK_BARREL = "66eeef3b2a166b73d2066a75";
public static string GLOCK_RECIEVER = "66eeef3b2a166b73d2066a76";
public static string GLOCK_COMPENSATOR = "66eeef3b2a166b73d2066a77";
public static string GLOCK_PISTOL_GRIP = "66eeef3b2a166b73d2066a78";
public static string GLOCK_REAR_SIGHT = "66eeef3b2a166b73d2066a79";
public static string GLOCK_FRONT_SIGHT = "66eeef3b2a166b73d2066a7a";
public static string GLOCK_MAGAZINE = "66eeef3b2a166b73d2066a7b";
}
@@ -15,12 +15,12 @@ namespace _13AddTraderWithAssortJson
* @param refreshTimeSecondsMin How many seconds between trader stock refresh min time
* @param refreshTimeSecondsMax How many seconds between trader stock refresh max time
*/
public void SetTraderUpdateTime(TraderConfig traderConfig, dynamic baseJson, int refreshTimeSecondsMin, int refreshTimeSecondsMax)
public void SetTraderUpdateTime(TraderConfig traderConfig, TraderBase baseJson, int refreshTimeSecondsMin, int refreshTimeSecondsMax)
{
// Add refresh time in seconds to config
var traderRefreshRecord = new UpdateTime
{
TraderId = baseJson.id,
TraderId = baseJson.Id,
Seconds = new MinMax<int>(refreshTimeSecondsMin, refreshTimeSecondsMax)
};
@@ -34,7 +34,7 @@ namespace _13AddTraderWithAssortJson
* @param tables database
* @param jsonUtil json utility class
*/
public void AddTraderToDb(dynamic traderDetailsToAdd, DatabaseTables tables, JsonUtil jsonUtil, object assortJson)
public void AddTraderToDb(TraderBase traderDetailsToAdd, DatabaseTables tables, JsonUtil jsonUtil, object assortJson)
{
// Create trader data ready to add to database
var traderDataToAdd = new Trader
@@ -54,7 +54,7 @@ namespace _13AddTraderWithAssortJson
};
// Add trader to trader table, key is the traders id
tables.Traders.Add(traderDetailsToAdd._id, traderDataToAdd);
tables.Traders.Add(traderDetailsToAdd.Id, traderDataToAdd);
}
/**
@@ -67,17 +67,17 @@ namespace _13AddTraderWithAssortJson
* @param location Location of trader (e.g. "Here in the cat shop")
* @param description Description of trader
*/
public void AddTraderToLocales(dynamic baseJson, DatabaseTables tables, string fullName, string firstName, string nickName, string location, string description)
public void AddTraderToLocales(TraderBase baseJson, DatabaseTables tables, string fullName, string firstName, string nickName, string location, string description)
{
// For each language, add locale for the new trader
var locales = tables.Locales.Global;
foreach (var (key, value) in locales) {
value.Value[$"{baseJson._id} FullName"] = fullName;
value.Value[$"{baseJson._id} FirstName"] = firstName;
value.Value[$"{baseJson._id} Nickname"] = nickName;
value.Value[$"{baseJson._id} Location"] = location;
value.Value[$"{baseJson._id} Description"] = description;
value.Value[$"{baseJson.Id} FullName"] = fullName;
value.Value[$"{baseJson.Id} FirstName"] = firstName;
value.Value[$"{baseJson.Id} Nickname"] = nickName;
value.Value[$"{baseJson.Id} Location"] = location;
value.Value[$"{baseJson.Id} Description"] = description;
}
}
}
@@ -6,81 +6,82 @@ using Core.Routers;
using Core.Servers;
using Core.Services;
using Core.Utils;
using SptCommon.Annotations;
namespace _13AddTraderWithAssortJson
namespace _13AddTraderWithAssortJson;
[Injectable]
public class AddTraderWithAssortJson : IPostDBLoadMod
{
public class AddTraderWithAssortJson : IPostDBLoadMod
private readonly ISptLogger<AddTraderWithAssortJson> _logger;
private readonly JsonUtil _jsonUtil;
private readonly FileUtil _fileUtil;
private readonly DatabaseService _databaseService;
private readonly ImageRouter _imageRouter;
private readonly ConfigServer _configServer;
private readonly TraderConfig _traderConfig;
private readonly RagfairConfig _ragfairConfig;
public AddTraderWithAssortJson(
ISptLogger<AddTraderWithAssortJson> logger,
JsonUtil jsonUtil,
FileUtil fileUtil,
DatabaseService databaseService,
ImageRouter imageRouter,
ConfigServer configServer)
{
private readonly ISptLogger<AddTraderWithAssortJson> _logger;
private readonly JsonUtil _jsonUtil;
private readonly FileUtil _fileUtil;
private readonly DatabaseService _databaseService;
private readonly ImageRouter _imageRouter;
private readonly ConfigServer _configServer;
private readonly TraderConfig _traderConfig;
private readonly RagfairConfig _ragfairConfig;
_logger = logger;
_jsonUtil = jsonUtil;
_fileUtil = fileUtil;
_databaseService = databaseService;
_imageRouter = imageRouter;
_configServer = configServer;
public AddTraderWithAssortJson(
ISptLogger<AddTraderWithAssortJson> logger,
JsonUtil jsonUtil,
FileUtil fileUtil,
DatabaseService databaseService,
ImageRouter imageRouter,
ConfigServer configServer)
{
_logger = logger;
_jsonUtil = jsonUtil;
_fileUtil = fileUtil;
_databaseService = databaseService;
_imageRouter = imageRouter;
_configServer = configServer;
_traderConfig = _configServer.GetConfig<TraderConfig>();
_ragfairConfig = _configServer.GetConfig<RagfairConfig>();
}
_traderConfig = _configServer.GetConfig<TraderConfig>();
_ragfairConfig = _configServer.GetConfig<RagfairConfig>();
}
public void PostDBLoad()
{
var traderImagePath = "./db/cat.jpg";
public void PostDBLoad()
{
var traderImagePath = "./db/cat.jpg";
var baseJson = _fileUtil.ReadFile("./db/base.json");
var traderBase = _jsonUtil.Deserialize<TraderBase>(baseJson);
var baseJson = _fileUtil.ReadFile("./db/base.json");
var traderBase = _jsonUtil.Deserialize<TraderBase>(baseJson);
var assortJson = _fileUtil.ReadFile("./db/assort.json");
var assort = _jsonUtil.Deserialize<TraderAssort>(assortJson);
var assortJson = _fileUtil.ReadFile("./db/assort.json");
var assort = _jsonUtil.Deserialize<TraderAssort>(assortJson);
// Create helper class and use it to register our traders image/icon + set its stock refresh time
var addTraderHelper = new AddTraderHelper();
_imageRouter.AddRoute(traderBase.Avatar.Replace(".jpg", ""), System.IO.Path.GetFullPath(traderImagePath));
addTraderHelper.SetTraderUpdateTime(_traderConfig, traderBase, 3600, 4000);
// Create helper class and use it to register our traders image/icon + set its stock refresh time
var addTraderHelper = new AddTraderHelper();
_imageRouter.AddRoute(traderBase.Avatar.Replace(".jpg", ""), System.IO.Path.GetFullPath(traderImagePath));
addTraderHelper.SetTraderUpdateTime(_traderConfig, traderBase, 3600, 4000);
// Add trader to flea market
_ragfairConfig.Traders[traderBase.Id] = true;
// Add trader to flea market
_ragfairConfig.Traders[traderBase.Id] = true;
// Add new trader to the trader dictionary in DatabaseServer - this is where the assort json is loaded
/*
* The assortJSON includes the following:
* Milk available for roubles at LL1
* Milk available for item barter at LL1
* Helmet w/ soft armour available for roubles at LL1
* Helmet w/ soft armour available for item barter at LL1
*
* It is *REQUIRED* to use MongoIDs for IDs in the assort
*/
addTraderHelper.AddTraderToDb(
baseJson,
_databaseService.GetTables(),
_jsonUtil,
assortJson);
// Add new trader to the trader dictionary in DatabaseServer - this is where the assort json is loaded
/*
* The assortJSON includes the following:
* Milk available for roubles at LL1
* Milk available for item barter at LL1
* Helmet w/ soft armour available for roubles at LL1
* Helmet w/ soft armour available for item barter at LL1
*
* It is *REQUIRED* to use MongoIDs for IDs in the assort
*/
addTraderHelper.AddTraderToDb(
traderBase,
_databaseService.GetTables(),
_jsonUtil,
assortJson);
addTraderHelper.AddTraderToLocales(
baseJson,
_databaseService.GetTables(),
traderBase.Name,
"Cat",
traderBase.Nickname,
traderBase.Location,
"This is the cat shop. Meow.");
}
addTraderHelper.AddTraderToLocales(
traderBase,
_databaseService.GetTables(),
traderBase.Name,
"Cat",
traderBase.Nickname,
traderBase.Location,
"This is the cat shop. Meow.");
}
}