diff --git a/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderHelper.cs b/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderHelper.cs index 106e30d8..c2f52a49 100644 --- a/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderHelper.cs +++ b/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderHelper.cs @@ -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(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 }); diff --git a/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderWithDynamicAssorts.cs b/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderWithDynamicAssorts.cs index 0ce41686..382a1bec 100644 --- a/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderWithDynamicAssorts.cs +++ b/ModExamples/13.1AddTraderWithDynamicAssorts/AddTraderWithDynamicAssorts.cs @@ -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 _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 logger, + HashUtil hashUtil, + JsonUtil jsonUtil, + FileUtil fileUtil, + DatabaseService databaseService, + ImageRouter imageRouter, + ConfigServer configServer) { - private readonly ISptLogger _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 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(); - _ragfairConfig = _configServer.GetConfig(); - } - - public void PostDBLoad() - { - var traderImagePath = "./db/cat.jpg"; - - var baseJson = _fileUtil.ReadFile("./db/base.json"); - var traderBase = _jsonUtil.Deserialize(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(); + _ragfairConfig = _configServer.GetConfig(); } - 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(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(), BarterScheme = new Dictionary>>(), LoyalLevelItems = new Dictionary()}); + _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"; +} diff --git a/ModExamples/13AddTraderWithAssortJson/AddTraderHelper.cs b/ModExamples/13AddTraderWithAssortJson/AddTraderHelper.cs index c0cc3b36..5ebab46b 100644 --- a/ModExamples/13AddTraderWithAssortJson/AddTraderHelper.cs +++ b/ModExamples/13AddTraderWithAssortJson/AddTraderHelper.cs @@ -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(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; } } } diff --git a/ModExamples/13AddTraderWithAssortJson/AddTraderWithAssortJson.cs b/ModExamples/13AddTraderWithAssortJson/AddTraderWithAssortJson.cs index d3065790..886e720f 100644 --- a/ModExamples/13AddTraderWithAssortJson/AddTraderWithAssortJson.cs +++ b/ModExamples/13AddTraderWithAssortJson/AddTraderWithAssortJson.cs @@ -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 _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 logger, + JsonUtil jsonUtil, + FileUtil fileUtil, + DatabaseService databaseService, + ImageRouter imageRouter, + ConfigServer configServer) { - private readonly ISptLogger _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 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(); + _ragfairConfig = _configServer.GetConfig(); + } - _traderConfig = _configServer.GetConfig(); - _ragfairConfig = _configServer.GetConfig(); - } - - 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(baseJson); + var baseJson = _fileUtil.ReadFile("./db/base.json"); + var traderBase = _jsonUtil.Deserialize(baseJson); - var assortJson = _fileUtil.ReadFile("./db/assort.json"); - var assort = _jsonUtil.Deserialize(assortJson); + var assortJson = _fileUtil.ReadFile("./db/assort.json"); + var assort = _jsonUtil.Deserialize(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."); } }