update mongoIds, remove underscores from injections in generators (#460)

This commit is contained in:
Cj
2025-07-07 04:46:51 -04:00
committed by GitHub
parent 96290b7cb5
commit 448c258600
12 changed files with 224 additions and 236 deletions
@@ -481,7 +481,7 @@ public class RagfairController
foreach (var offer in offers)
{
// Exclude barter items, they tend to have outrageous equivalent prices
if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.Template)))
if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.TemplateId)))
{
continue;
}
@@ -18,17 +18,17 @@ namespace SPTarkov.Server.Core.Generators;
[Injectable]
public class LootGenerator(
ISptLogger<LootGenerator> _logger,
RandomUtil _randomUtil,
ItemHelper _itemHelper,
PresetHelper _presetHelper,
DatabaseService _databaseService,
ItemFilterService _itemFilterService,
ServerLocalisationService _serverLocalisationService,
WeightedRandomHelper _weightedRandomHelper,
RagfairLinkedItemService _ragfairLinkedItemService,
SeasonalEventService _seasonalEventService,
ICloner _cloner
ISptLogger<LootGenerator> logger,
RandomUtil randomUtil,
ItemHelper itemHelper,
PresetHelper presetHelper,
DatabaseService databaseService,
ItemFilterService itemFilterService,
ServerLocalisationService serverLocalisationService,
WeightedRandomHelper weightedRandomHelper,
RagfairLinkedItemService ragfairLinkedItemService,
SeasonalEventService seasonalEventService,
ICloner cloner
)
{
/// <summary>
@@ -42,14 +42,14 @@ public class LootGenerator(
var itemTypeCounts = InitItemLimitCounter(options.ItemLimits);
// Handle sealed weapon containers
var sealedWeaponCrateCount = _randomUtil.GetInt(
var sealedWeaponCrateCount = randomUtil.GetInt(
options.WeaponCrateCount.Min,
options.WeaponCrateCount.Max
);
if (sealedWeaponCrateCount > 0)
{
// Get list of all sealed containers from db - they're all the same, just for flavor
var itemsDb = _itemHelper.GetItems();
var itemsDb = itemHelper.GetItems();
var sealedWeaponContainerPool = itemsDb.Where(item =>
item.Name.Contains("event_container_airdrop")
);
@@ -57,7 +57,7 @@ public class LootGenerator(
for (var index = 0; index < sealedWeaponCrateCount; index++)
{
// Choose one at random + add to results array
var chosenSealedContainer = _randomUtil.GetArrayValue(sealedWeaponContainerPool);
var chosenSealedContainer = randomUtil.GetArrayValue(sealedWeaponContainerPool);
result.Add(
[
new Item
@@ -83,7 +83,7 @@ public class LootGenerator(
// Pool has items we could add as loot, proceed
if (rewardPoolResults.ItemPool.Count > 0)
{
var randomisedItemCount = _randomUtil.GetInt(
var randomisedItemCount = randomUtil.GetInt(
options.ItemCount.Min,
options.ItemCount.Max
);
@@ -104,17 +104,17 @@ public class LootGenerator(
}
}
var globalDefaultPresets = _presetHelper.GetDefaultPresets().Values;
var globalDefaultPresets = presetHelper.GetDefaultPresets().Values;
// Filter default presets to just weapons
var randomisedWeaponPresetCount = _randomUtil.GetInt(
var randomisedWeaponPresetCount = randomUtil.GetInt(
options.WeaponPresetCount.Min,
options.WeaponPresetCount.Max
);
if (randomisedWeaponPresetCount > 0)
{
var weaponDefaultPresets = globalDefaultPresets
.Where(preset => _itemHelper.IsOfBaseclass(preset.Encyclopedia, BaseClasses.WEAPON))
.Where(preset => itemHelper.IsOfBaseclass(preset.Encyclopedia, BaseClasses.WEAPON))
.ToList();
if (weaponDefaultPresets.Any())
@@ -138,14 +138,14 @@ public class LootGenerator(
}
// Filter default presets to just armors and then filter again by protection level
var randomisedArmorPresetCount = _randomUtil.GetInt(
var randomisedArmorPresetCount = randomUtil.GetInt(
options.ArmorPresetCount.Min,
options.ArmorPresetCount.Max
);
if (randomisedArmorPresetCount > 0)
{
var armorDefaultPresets = globalDefaultPresets.Where(preset =>
_itemHelper.ArmorItemCanHoldMods(preset.Encyclopedia)
itemHelper.ArmorItemCanHoldMods(preset.Encyclopedia)
);
var levelFilteredArmorPresets = armorDefaultPresets
.Where(armor => IsArmorOfDesiredProtectionLevel(armor, options))
@@ -185,11 +185,11 @@ public class LootGenerator(
{
var result = new List<List<Item>>();
var defaultPresets = _presetHelper.GetDefaultPresetsByTplKey();
var defaultPresets = presetHelper.GetDefaultPresetsByTplKey();
foreach (var (itemTpl, details) in forcedLootToAdd)
{
// How many of this item we want
var randomisedItemCount = _randomUtil.GetInt(details.Min, details.Max);
var randomisedItemCount = randomUtil.GetInt(details.Min, details.Max);
// Check if item being added has a preset and use that instead
if (defaultPresets.ContainsKey(itemTpl))
@@ -201,7 +201,7 @@ public class LootGenerator(
for (var i = 0; i < randomisedItemCount; i++)
{
// Clone preset and alter Ids to be unique
var presetWithUniqueIdsClone = _cloner
var presetWithUniqueIdsClone = cloner
.Clone(preset.Items)
.ReplaceIDs()
.ToList();
@@ -221,7 +221,7 @@ public class LootGenerator(
Template = itemTpl,
Upd = new Upd { StackObjectsCount = randomisedItemCount, SpawnedInSession = true },
};
var splitResults = _itemHelper.SplitStack(newLootItem);
var splitResults = itemHelper.SplitStack(newLootItem);
foreach (var splitItem in splitResults)
{
// Add as separate lists
@@ -249,20 +249,20 @@ public class LootGenerator(
bool blockSeasonalItemsOutOfSeason
)
{
var itemsDb = _databaseService.GetItems().Values;
var itemsDb = databaseService.GetItems().Values;
var itemBlacklist = new HashSet<MongoId>();
itemBlacklist.UnionWith([.. _itemFilterService.GetBlacklistedItems(), .. itemTplBlacklist]);
itemBlacklist.UnionWith([.. itemFilterService.GetBlacklistedItems(), .. itemTplBlacklist]);
if (useRewardItemBlacklist)
{
var rewardItemBlacklist = _itemFilterService.GetItemRewardBlacklist();
var rewardItemBlacklist = itemFilterService.GetItemRewardBlacklist();
// Get all items that match the blacklisted types and fold into item blacklist
var itemTypeBlacklist = _itemFilterService.GetItemRewardBaseTypeBlacklist();
var itemTypeBlacklist = itemFilterService.GetItemRewardBaseTypeBlacklist();
var itemsMatchingTypeBlacklist = itemsDb
.Where(templateItem => !string.IsNullOrEmpty(templateItem.Parent)) // Ignore items without parents
.Where(templateItem =>
_itemHelper.IsOfBaseclasses(templateItem.Parent, itemTypeBlacklist)
itemHelper.IsOfBaseclasses(templateItem.Parent, itemTypeBlacklist)
)
.Select(templateItem => templateItem.Id);
@@ -271,12 +271,12 @@ public class LootGenerator(
if (!allowBossItems)
{
itemBlacklist.UnionWith(_itemFilterService.GetBossItems());
itemBlacklist.UnionWith(itemFilterService.GetBossItems());
}
if (blockSeasonalItemsOutOfSeason)
{
itemBlacklist.UnionWith(_seasonalEventService.GetInactiveSeasonalEventItems());
itemBlacklist.UnionWith(seasonalEventService.GetInactiveSeasonalEventItems());
}
var items = itemsDb
@@ -308,7 +308,7 @@ public class LootGenerator(
continue;
}
var armorDetails = _itemHelper.GetItem(armorItem.Template).Value;
var armorDetails = itemHelper.GetItem(armorItem.Template).Value;
var armorClass = armorDetails.Properties.ArmorClass;
return options.ArmorLevelWhitelist.Contains(armorClass.Value);
@@ -352,7 +352,7 @@ public class LootGenerator(
List<List<Item>> result
)
{
var randomItem = _randomUtil.GetArrayValue(items);
var randomItem = randomUtil.GetArrayValue(items);
var itemLimitCount = itemTypeCounts.TryGetValue(
randomItem.Parent,
@@ -364,7 +364,7 @@ public class LootGenerator(
}
// Skip armors as they need to come from presets
if (_itemHelper.ArmorItemCanHoldMods(randomItem.Id))
if (itemHelper.ArmorItemCanHoldMods(randomItem.Id))
{
return false;
}
@@ -412,7 +412,7 @@ public class LootGenerator(
max = itemLimits.Max;
}
return _randomUtil.GetInt(min ?? 1, max ?? 1);
return randomUtil.GetInt(min ?? 1, max ?? 1);
}
/// <summary>
@@ -432,21 +432,21 @@ public class LootGenerator(
{
if (presetPool.Count == 0)
{
_logger.Warning(_serverLocalisationService.GetText("loot-preset_pool_is_empty"));
logger.Warning(serverLocalisationService.GetText("loot-preset_pool_is_empty"));
return false;
}
// Choose random preset and get details from item db using encyclopedia value (encyclopedia === tplId)
var chosenPreset = _randomUtil.GetArrayValue(presetPool);
var chosenPreset = randomUtil.GetArrayValue(presetPool);
// No `_encyclopedia` property, not possible to reliably get root item tpl
if (chosenPreset?.Encyclopedia is null)
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Warning(
_serverLocalisationService.GetText(
logger.Warning(
serverLocalisationService.GetText(
"loot-chosen_preset_missing_encyclopedia_value",
chosenPreset?.Id
)
@@ -457,12 +457,12 @@ public class LootGenerator(
}
// Get preset root item db details via its `_encyclopedia` property
var itemDbDetails = _itemHelper.GetItem(chosenPreset.Encyclopedia);
var itemDbDetails = itemHelper.GetItem(chosenPreset.Encyclopedia);
if (!itemDbDetails.Key)
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug(
logger.Debug(
$"$Unable to find preset with tpl: {chosenPreset.Encyclopedia}, skipping"
);
}
@@ -479,8 +479,8 @@ public class LootGenerator(
// Some custom mod items lack a parent property
if (itemDbDetails.Value?.Parent is null)
{
_logger.Error(
_serverLocalisationService.GetText(
logger.Error(
serverLocalisationService.GetText(
"loot-item_missing_parentid",
itemDbDetails.Value?.Name
)
@@ -499,10 +499,10 @@ public class LootGenerator(
return false;
}
var presetAndModsClone = _cloner.Clone(chosenPreset.Items).ReplaceIDs().ToList();
var presetAndModsClone = cloner.Clone(chosenPreset.Items).ReplaceIDs().ToList();
presetAndModsClone.RemapRootItemId();
_itemHelper.SetFoundInRaid(presetAndModsClone);
itemHelper.SetFoundInRaid(presetAndModsClone);
// Add chosen preset tpl to result array
result.Add(presetAndModsClone);
@@ -529,16 +529,16 @@ public class LootGenerator(
List<List<Item>> itemsToReturn = [];
// Choose a weapon to give to the player (weighted)
var chosenWeaponTpl = _weightedRandomHelper.GetWeightedValue(
var chosenWeaponTpl = weightedRandomHelper.GetWeightedValue(
containerSettings.WeaponRewardWeight
);
// Get itemDb details of weapon
var weaponDetailsDb = _itemHelper.GetItem(chosenWeaponTpl);
var weaponDetailsDb = itemHelper.GetItem(chosenWeaponTpl);
if (!weaponDetailsDb.Key)
{
_logger.Error(
_serverLocalisationService.GetText(
logger.Error(
serverLocalisationService.GetText(
"loot-non_item_picked_as_sealed_weapon_crate_reward",
chosenWeaponTpl
)
@@ -549,32 +549,30 @@ public class LootGenerator(
// Get weapon preset - default or choose a random one from globals.json preset pool
var chosenWeaponPreset = containerSettings.DefaultPresetsOnly
? _presetHelper.GetDefaultPreset(chosenWeaponTpl)
: _randomUtil.GetArrayValue(_presetHelper.GetPresets(chosenWeaponTpl));
? presetHelper.GetDefaultPreset(chosenWeaponTpl)
: randomUtil.GetArrayValue(presetHelper.GetPresets(chosenWeaponTpl));
// No default preset found for weapon, choose a random one
if (chosenWeaponPreset is null)
{
_logger.Warning(
_serverLocalisationService.GetText(
logger.Warning(
serverLocalisationService.GetText(
"loot-default_preset_not_found_using_random",
chosenWeaponTpl
)
);
chosenWeaponPreset = _randomUtil.GetArrayValue(
_presetHelper.GetPresets(chosenWeaponTpl)
);
chosenWeaponPreset = randomUtil.GetArrayValue(presetHelper.GetPresets(chosenWeaponTpl));
}
// Clean up Ids to ensure they're all unique and prevent collisions
var presetAndModsClone = _cloner.Clone(chosenWeaponPreset.Items).ReplaceIDs().ToList();
var presetAndModsClone = cloner.Clone(chosenWeaponPreset.Items).ReplaceIDs().ToList();
presetAndModsClone.RemapRootItemId();
// Add preset to return object
itemsToReturn.Add(presetAndModsClone);
// Get a random collection of weapon mods related to chosen weapon and add them to result array
var linkedItemsToWeapon = _ragfairLinkedItemService.GetLinkedDbItems(chosenWeaponTpl);
var linkedItemsToWeapon = ragfairLinkedItemService.GetLinkedDbItems(chosenWeaponTpl);
itemsToReturn.AddRange(
GetSealedContainerWeaponModRewards(
containerSettings,
@@ -606,7 +604,7 @@ public class LootGenerator(
foreach (var (rewardKey, settings) in containerSettings.RewardTypeLimits)
{
var rewardCount = _randomUtil.GetInt(settings.Min, settings.Max);
var rewardCount = randomUtil.GetInt(settings.Min, settings.Max);
if (rewardCount == 0)
{
continue;
@@ -618,7 +616,7 @@ public class LootGenerator(
// Get ammo boxes from db
var ammoBoxesDetails = containerSettings.AmmoBoxWhitelist.Select(tpl =>
{
var itemDetails = _itemHelper.GetItem(tpl);
var itemDetails = itemHelper.GetItem(tpl);
return itemDetails.Value;
});
@@ -629,9 +627,9 @@ public class LootGenerator(
);
if (!ammoBoxesMatchingCaliber.Any())
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"No ammo box with caliber {weaponCaliber} found, skipping");
logger.Debug($"No ammo box with caliber {weaponCaliber} found, skipping");
}
continue;
@@ -639,12 +637,12 @@ public class LootGenerator(
for (var index = 0; index < rewardCount; index++)
{
var chosenAmmoBox = _randomUtil.GetArrayValue(ammoBoxesMatchingCaliber);
var chosenAmmoBox = randomUtil.GetArrayValue(ammoBoxesMatchingCaliber);
var ammoBoxReward = new List<Item>
{
new() { Id = new MongoId(), Template = chosenAmmoBox.Id },
};
_itemHelper.AddCartridgesToAmmoBox(ammoBoxReward, chosenAmmoBox);
itemHelper.AddCartridgesToAmmoBox(ammoBoxReward, chosenAmmoBox);
rewards.Add(ammoBoxReward);
}
@@ -652,21 +650,21 @@ public class LootGenerator(
}
// Get all items of the desired type + not quest items + not globally blacklisted
var rewardItemPool = _databaseService
var rewardItemPool = databaseService
.GetItems()
.Values.Where(item =>
item.Parent == rewardKey
&& string.Equals(item.Type, "item", StringComparison.OrdinalIgnoreCase)
&& _itemFilterService.IsItemBlacklisted(item.Id)
&& !(containerSettings.AllowBossItems || _itemFilterService.IsBossItem(item.Id))
&& itemFilterService.IsItemBlacklisted(item.Id)
&& !(containerSettings.AllowBossItems || itemFilterService.IsBossItem(item.Id))
&& item.Properties.QuestItem is null
);
if (!rewardItemPool.Any())
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"No items with base type of {rewardKey} found, skipping");
logger.Debug($"No items with base type of {rewardKey} found, skipping");
}
continue;
@@ -675,7 +673,7 @@ public class LootGenerator(
for (var index = 0; index < rewardCount; index++)
{
// Choose a random item from pool
var chosenRewardItem = _randomUtil.GetArrayValue(rewardItemPool);
var chosenRewardItem = randomUtil.GetArrayValue(rewardItemPool);
var rewardItem = new List<Item>
{
new() { Id = new MongoId(), Template = chosenRewardItem.Id },
@@ -705,7 +703,7 @@ public class LootGenerator(
foreach (var (rewardKey, settings) in containerSettings.WeaponModRewardLimits)
{
var rewardCount = _randomUtil.GetInt(settings.Min, settings.Max);
var rewardCount = randomUtil.GetInt(settings.Min, settings.Max);
// Nothing to add, skip reward type
if (rewardCount == 0)
@@ -715,13 +713,13 @@ public class LootGenerator(
// Get items that fulfil reward type criteria from items that fit on gun
var relatedItems = linkedItemsToWeapon?.Where(item =>
item?.Parent == rewardKey && !_itemFilterService.IsItemBlacklisted(item.Id)
item?.Parent == rewardKey && !itemFilterService.IsItemBlacklisted(item.Id)
);
if (relatedItems is null || !relatedItems.Any())
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug(
logger.Debug(
$"No items found to fulfil reward type: {rewardKey} for weapon: {chosenWeaponPreset.Name}, skipping type"
);
}
@@ -732,7 +730,7 @@ public class LootGenerator(
// Find a random item of the desired type and add as reward
for (var index = 0; index < rewardCount; index++)
{
var chosenItem = _randomUtil.DrawRandomFromList(relatedItems.ToList());
var chosenItem = randomUtil.DrawRandomFromList(relatedItems.ToList());
var reward = new List<Item>
{
new() { Id = new MongoId(), Template = chosenItem[0].Id },
@@ -760,9 +758,9 @@ public class LootGenerator(
// Pick random reward from pool, add to request object
var chosenRewardItemTpl = PickRewardItem(rewardContainerDetails);
if (_presetHelper.HasPreset(chosenRewardItemTpl))
if (presetHelper.HasPreset(chosenRewardItemTpl))
{
var preset = _presetHelper.GetDefaultPreset(chosenRewardItemTpl);
var preset = presetHelper.GetDefaultPreset(chosenRewardItemTpl);
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
var presetAndMods = preset.Items.ReplaceIDs().ToList();
@@ -792,10 +790,10 @@ public class LootGenerator(
&& rewardContainerDetails.RewardTplPool.Count > 0
)
{
return _weightedRandomHelper.GetWeightedValue(rewardContainerDetails.RewardTplPool);
return weightedRandomHelper.GetWeightedValue(rewardContainerDetails.RewardTplPool);
}
return _randomUtil.GetArrayValue(
return randomUtil.GetArrayValue(
GetItemRewardPool([], rewardContainerDetails.RewardTypePool, true, true, false)
.ItemPool.Select(item => item.Id)
);
@@ -20,25 +20,25 @@ namespace SPTarkov.Server.Core.Generators;
[Injectable]
public class PlayerScavGenerator(
ISptLogger<PlayerScavGenerator> _logger,
RandomUtil _randomUtil,
DatabaseService _databaseService,
ItemHelper _itemHelper,
BotGeneratorHelper _botGeneratorHelper,
SaveServer _saveServer,
ProfileHelper _profileHelper,
BotHelper _botHelper,
FenceService _fenceService,
BotLootCacheService _botLootCacheService,
ServerLocalisationService _serverLocalisationService,
BotGenerator _botGenerator,
ConfigServer _configServer,
ICloner _cloner,
TimeUtil _timeUtil
ISptLogger<PlayerScavGenerator> logger,
RandomUtil randomUtil,
DatabaseService databaseService,
ItemHelper itemHelper,
BotGeneratorHelper botGeneratorHelper,
SaveServer saveServer,
ProfileHelper profileHelper,
BotHelper botHelper,
FenceService fenceService,
BotLootCacheService botLootCacheService,
ServerLocalisationService serverLocalisationService,
BotGenerator botGenerator,
ConfigServer configServer,
ICloner cloner,
TimeUtil timeUtil
)
{
protected readonly PlayerScavConfig _playerScavConfig =
_configServer.GetConfig<PlayerScavConfig>();
configServer.GetConfig<PlayerScavConfig>();
/// <summary>
/// Update a player profile to include a new player scav profile
@@ -48,10 +48,10 @@ public class PlayerScavGenerator(
public PmcData Generate(MongoId sessionID)
{
// get karma level from profile
var profile = _saveServer.GetProfile(sessionID);
var profileCharactersClone = _cloner.Clone(profile.CharacterData);
var pmcDataClone = _cloner.Clone(profileCharactersClone.PmcData);
var existingScavDataClone = _cloner.Clone(profileCharactersClone.ScavData);
var profile = saveServer.GetProfile(sessionID);
var profileCharactersClone = cloner.Clone(profile.CharacterData);
var pmcDataClone = cloner.Clone(profileCharactersClone.PmcData);
var existingScavDataClone = cloner.Clone(profileCharactersClone.ScavData);
var scavKarmaLevel = pmcDataClone.GetScavKarmaLevel();
@@ -63,12 +63,12 @@ public class PlayerScavGenerator(
)
)
{
_logger.Error(
_serverLocalisationService.GetText("scav-missing_karma_settings", scavKarmaLevel)
logger.Error(
serverLocalisationService.GetText("scav-missing_karma_settings", scavKarmaLevel)
);
}
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"Generated player scav load out with karma level: {scavKarmaLevel}");
}
@@ -78,7 +78,7 @@ public class PlayerScavGenerator(
AdjustBotTemplateWithKarmaSpecificSettings(playerScavKarmaSettings, baseBotNode);
var scavData = _botGenerator.GeneratePlayerScav(
var scavData = botGenerator.GeneratePlayerScav(
sessionID,
playerScavKarmaSettings.BotTypeForLoot.ToLowerInvariant(),
"easy",
@@ -87,7 +87,7 @@ public class PlayerScavGenerator(
);
// Remove cached bot data after scav was generated
_botLootCacheService.ClearCache();
botLootCacheService.ClearCache();
// Add scav metadata
scavData.Savage = null;
@@ -128,13 +128,13 @@ public class PlayerScavGenerator(
);
// Remove secure container
scavData = _profileHelper.RemoveSecureContainer(scavData);
scavData = profileHelper.RemoveSecureContainer(scavData);
// set cooldown timer
scavData = SetScavCooldownTimer(scavData, pmcDataClone);
// add scav to profile
_saveServer.GetProfile(sessionID).CharacterData.ScavData = scavData;
saveServer.GetProfile(sessionID).CharacterData.ScavData = scavData;
return scavData;
}
@@ -146,27 +146,24 @@ public class PlayerScavGenerator(
/// <param name="scavData"></param>
/// <param name="containersToAddTo">Possible slotIds to add loot to</param>
protected void AddAdditionalLootToPlayerScavContainers(
Dictionary<string, double> possibleItemsToAdd,
Dictionary<MongoId, double> possibleItemsToAdd,
BotBase scavData,
HashSet<EquipmentSlots> containersToAddTo
)
{
foreach (var tpl in possibleItemsToAdd)
{
var shouldAdd = _randomUtil.GetChance100(tpl.Value);
var shouldAdd = randomUtil.GetChance100(tpl.Value);
if (!shouldAdd)
{
continue;
}
var itemResult = _itemHelper.GetItem(tpl.Key);
var itemResult = itemHelper.GetItem(tpl.Key);
if (!itemResult.Key)
{
_logger.Warning(
_serverLocalisationService.GetText(
"scav-unable_to_add_item_to_player_scav",
tpl
)
logger.Warning(
serverLocalisationService.GetText("scav-unable_to_add_item_to_player_scav", tpl)
);
continue;
}
@@ -178,11 +175,11 @@ public class PlayerScavGenerator(
{
Id = new MongoId(),
Template = itemTemplate.Id,
Upd = _botGeneratorHelper.GenerateExtraPropertiesForItem(itemTemplate),
Upd = botGeneratorHelper.GenerateExtraPropertiesForItem(itemTemplate),
},
};
var result = _botGeneratorHelper.AddItemWithChildrenToEquipmentSlot(
var result = botGeneratorHelper.AddItemWithChildrenToEquipmentSlot(
containersToAddTo,
itemsToAdd[0].Id,
itemTemplate.Id,
@@ -192,9 +189,9 @@ public class PlayerScavGenerator(
if (result != ItemAddedResult.SUCCESS)
{
if (_logger.IsLogEnabled(LogLevel.Debug))
if (logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"Unable to add keycard to bot. Reason: {result.ToString()}");
logger.Debug($"Unable to add keycard to bot. Reason: {result.ToString()}");
}
}
}
@@ -209,7 +206,7 @@ public class PlayerScavGenerator(
protected BotType ConstructBotBaseTemplate(string botTypeForLoot)
{
const string baseScavType = "assault";
var asssaultBase = _cloner.Clone(_botHelper.GetBotTemplate(baseScavType));
var asssaultBase = cloner.Clone(botHelper.GetBotTemplate(baseScavType));
// Loot bot is same as base bot, return base with no modification
if (botTypeForLoot == baseScavType)
@@ -217,7 +214,7 @@ public class PlayerScavGenerator(
return asssaultBase;
}
var lootBase = _cloner.Clone(_botHelper.GetBotTemplate(botTypeForLoot));
var lootBase = cloner.Clone(botHelper.GetBotTemplate(botTypeForLoot));
asssaultBase.BotInventory = lootBase.BotInventory;
asssaultBase.BotChances = lootBase.BotChances;
asssaultBase.BotGeneration = lootBase.BotGeneration;
@@ -314,7 +311,7 @@ public class PlayerScavGenerator(
case "specialItems":
return botItemWeights.SpecialItems;
default:
_logger.Error($"Subtype: {key} not found");
logger.Error($"Subtype: {key} not found");
return null;
}
}
@@ -387,7 +384,7 @@ public class PlayerScavGenerator(
return scavProfile.Stats;
}
return _profileHelper.GetDefaultCounters();
return profileHelper.GetDefaultCounters();
}
protected int GetScavLevel(PmcData scavProfile)
@@ -428,14 +425,14 @@ public class PlayerScavGenerator(
.Bonuses.Where(x => x.Type == BonusType.ScavCooldownTimer)
.Sum(bonus => (bonus?.Value ?? 1) / 100);
var fenceInfo = _fenceService.GetFenceInfo(pmcData);
var fenceInfo = fenceService.GetFenceInfo(pmcData);
modifier *= fenceInfo.SavageCooldownModifier ?? 1d;
// Make sure to apply ScavCooldownTimer bonus from Hideout if the player has it.
var scavLockDuration =
_databaseService.GetGlobals().Configuration.SavagePlayCooldown * modifier;
databaseService.GetGlobals().Configuration.SavagePlayCooldown * modifier;
var fullProfile = _profileHelper.GetFullProfile(pmcData?.SessionId);
var fullProfile = profileHelper.GetFullProfile(pmcData?.SessionId);
if (
fullProfile?.ProfileInfo?.Edition?.StartsWith(
AccountTypes.SPT_DEVELOPER,
@@ -450,7 +447,7 @@ public class PlayerScavGenerator(
if (scavData?.Info != null)
{
scavData.Info.SavageLockTime = Math.Round(
_timeUtil.GetTimeStamp() + (scavLockDuration ?? 0)
timeUtil.GetTimeStamp() + (scavLockDuration ?? 0)
);
}
@@ -109,7 +109,7 @@ public class RagfairOfferGenerator(
{
var offerRequirement = new OfferRequirement
{
Template = barter.Template,
TemplateId = barter.Template,
Count = Math.Round(barter.Count.Value, 2),
OnlyFunctional = barter.OnlyFunctional ?? false,
};
@@ -230,9 +230,9 @@ public class RagfairOfferGenerator(
var roublePrice = 0d;
foreach (var requirement in offerRequirements)
{
roublePrice += paymentHelper.IsMoneyTpl(requirement.Template)
? Math.Round(CalculateRoublePrice(requirement.Count.Value, requirement.Template))
: ragfairPriceService.GetFleaPriceForItem(requirement.Template)
roublePrice += paymentHelper.IsMoneyTpl(requirement.TemplateId)
? Math.Round(CalculateRoublePrice(requirement.Count.Value, requirement.TemplateId))
: ragfairPriceService.GetFleaPriceForItem(requirement.TemplateId)
* requirement.Count.Value; // Get flea price for barter offer items
}
@@ -245,7 +245,7 @@ public class RagfairOfferGenerator(
/// <param name="isTrader"> Is user we're getting avatar for a trader </param>
/// <param name="userId"> Persons id to get avatar of </param>
/// <returns> Url of avatar as String </returns>
protected string GetAvatarUrl(bool isTrader, string userId)
protected string GetAvatarUrl(bool isTrader, MongoId userId)
{
if (isTrader)
{
@@ -261,7 +261,7 @@ public class RagfairOfferGenerator(
/// <param name="currencyCount"> Amount of currency to convert into roubles </param>
/// <param name="currencyType"> Type of currency (euro/dollar/rouble) </param>
/// <returns> Count of roubles </returns>
protected double CalculateRoublePrice(double currencyCount, string currencyType)
protected double CalculateRoublePrice(double currencyCount, MongoId currencyType)
{
if (currencyType == Money.ROUBLES)
{
@@ -276,7 +276,7 @@ public class RagfairOfferGenerator(
/// </summary>
/// <param name="userId"> Users ID to check </param>
/// <returns> Users ID </returns>
protected string GetTraderId(string userId)
protected string GetTraderId(MongoId userId)
{
if (profileHelper.IsPlayer(userId))
{
@@ -291,7 +291,7 @@ public class RagfairOfferGenerator(
/// </summary>
/// <param name="userId"> User to get flea rating of </param>
/// <returns> Flea rating value </returns>
protected double? GetRating(string userId)
protected double? GetRating(MongoId userId)
{
// Player offer
if (profileHelper.IsPlayer(userId))
@@ -317,7 +317,7 @@ public class RagfairOfferGenerator(
/// </summary>
/// <param name="userID"> User to check rating of</param>
/// <returns> True if growing </returns>
protected bool GetRatingGrowing(string userID)
protected bool GetRatingGrowing(MongoId userID)
{
if (profileHelper.IsPlayer(userID))
// player offer
@@ -344,7 +344,7 @@ public class RagfairOfferGenerator(
/// <param name="userID"> ID of the offer owner </param>
/// <param name="time"> Time the offer is posted in seconds </param>
/// <returns> Number of seconds until offer expires </returns>
protected long GetOfferEndTime(string userID, long time)
protected long GetOfferEndTime(MongoId userID, long time)
{
if (profileHelper.IsPlayer(userID))
{
@@ -364,15 +364,13 @@ public class RagfairOfferGenerator(
return (long)databaseService.GetTrader(userID).Base.NextResupply;
}
var randomSpread = randomUtil.GetDouble(
ragfairConfig.Dynamic.EndTimeSeconds.Min,
ragfairConfig.Dynamic.EndTimeSeconds.Max
);
// Generated fake-player offer
return (long)
Math.Round(
time
+ randomUtil.GetDouble(
ragfairConfig.Dynamic.EndTimeSeconds.Min,
ragfairConfig.Dynamic.EndTimeSeconds.Max
)
);
return (long)Math.Round(time + randomSpread);
}
/// <summary>
@@ -534,7 +532,7 @@ public class RagfairOfferGenerator(
/// <param name="itemToSellDetails"> Raw DB item details </param>
/// <param name="isExpiredOffer">Offer being created is to replace an expired, existing offer</param>
protected void CreateSingleOfferForItem(
string sellerId,
MongoId sellerId,
List<Item> itemWithChildren,
bool isPreset,
TemplateItem itemToSellDetails,
@@ -752,7 +750,7 @@ public class RagfairOfferGenerator(
/// <param name="itemWithMods"> Item and mods, get condition of first item (only first array item is modified) </param>
/// <param name="itemDetails"> DB details of first item</param>
protected void RandomiseOfferItemUpdProperties(
string userID,
MongoId userID,
List<Item> itemWithMods,
TemplateItem itemDetails
)
@@ -18,34 +18,34 @@ namespace SPTarkov.Server.Core.Generators;
[Injectable]
public class ScavCaseRewardGenerator(
ISptLogger<ScavCaseRewardGenerator> _logger,
RandomUtil _randomUtil,
ItemHelper _itemHelper,
PresetHelper _presetHelper,
DatabaseService _databaseService,
RagfairPriceService _ragfairPriceService,
SeasonalEventService _seasonalEventService,
ItemFilterService _itemFilterService,
ISptLogger<ScavCaseRewardGenerator> logger,
RandomUtil randomUtil,
ItemHelper itemHelper,
PresetHelper presetHelper,
DatabaseService databaseService,
RagfairPriceService ragfairPriceService,
SeasonalEventService seasonalEventService,
ItemFilterService itemFilterService,
ServerLocalisationService localisationService,
ConfigServer _configServer,
ICloner _cloner
ConfigServer configServer,
ICloner cloner
)
{
protected List<TemplateItem> _dbAmmoItemsCache = [];
protected List<TemplateItem> _dbItemsCache = [];
protected readonly ScavCaseConfig _scavCaseConfig = _configServer.GetConfig<ScavCaseConfig>();
protected readonly ScavCaseConfig _scavCaseConfig = configServer.GetConfig<ScavCaseConfig>();
/// <summary>
/// Create an array of rewards that will be given to the player upon completing their scav case build
/// </summary>
/// <param name="recipeId">recipe of the scav case craft</param>
/// <returns>Product array</returns>
public List<List<Item>> Generate(string recipeId)
public List<List<Item>> Generate(MongoId recipeId)
{
CacheDbItems();
// Get scavcase details from hideout/scavcase.json
var scavCaseDetails = _databaseService
var scavCaseDetails = databaseService
.GetHideout()
.Production.ScavRecipes.FirstOrDefault(r => r.Id == recipeId);
var rewardItemCounts = GetScavCaseRewardCountsAndPrices(scavCaseDetails);
@@ -107,10 +107,10 @@ public class ScavCaseRewardGenerator(
protected void CacheDbItems()
{
// Get an array of seasonal items that should not be shown right now as seasonal event is not active
var inactiveSeasonalItems = _seasonalEventService.GetInactiveSeasonalEventItems();
var inactiveSeasonalItems = seasonalEventService.GetInactiveSeasonalEventItems();
if (!_dbItemsCache.Any())
{
_dbItemsCache = _databaseService
_dbItemsCache = databaseService
.GetItems()
.Values.Where(item =>
{
@@ -134,21 +134,21 @@ public class ScavCaseRewardGenerator(
if (
item.Type != "Item"
|| _scavCaseConfig.RewardItemBlacklist.Contains(item.Id)
|| _itemFilterService.IsItemBlacklisted(item.Id)
|| itemFilterService.IsItemBlacklisted(item.Id)
)
{
return false;
}
// Globally reward-blacklisted
if (_itemFilterService.IsItemRewardBlacklisted(item.Id))
if (itemFilterService.IsItemRewardBlacklisted(item.Id))
{
return false;
}
if (
!_scavCaseConfig.AllowBossItemsAsRewards
&& _itemFilterService.IsBossItem(item.Id)
&& itemFilterService.IsBossItem(item.Id)
)
{
return false;
@@ -156,7 +156,7 @@ public class ScavCaseRewardGenerator(
// Skip item if parent id is blacklisted
if (
_itemHelper.IsOfBaseclasses(
itemHelper.IsOfBaseclasses(
item.Id,
_scavCaseConfig.RewardItemParentBlacklist
)
@@ -177,7 +177,7 @@ public class ScavCaseRewardGenerator(
if (!_dbAmmoItemsCache.Any())
{
_dbAmmoItemsCache = _databaseService
_dbAmmoItemsCache = databaseService
.GetItems()
.Values.Where(item =>
{
@@ -193,7 +193,7 @@ public class ScavCaseRewardGenerator(
}
// Not ammo, skip
if (!_itemHelper.IsOfBaseclass(item.Id, BaseClasses.AMMO))
if (!itemHelper.IsOfBaseclass(item.Id, BaseClasses.AMMO))
{
return false;
}
@@ -201,21 +201,21 @@ public class ScavCaseRewardGenerator(
// Skip item if item id is on blacklist
if (
_scavCaseConfig.RewardItemBlacklist.Contains(item.Id)
|| _itemFilterService.IsItemBlacklisted(item.Id)
|| itemFilterService.IsItemBlacklisted(item.Id)
)
{
return false;
}
// Globally reward-blacklisted
if (_itemFilterService.IsItemRewardBlacklisted(item.Id))
if (itemFilterService.IsItemRewardBlacklisted(item.Id))
{
return false;
}
if (
!_scavCaseConfig.AllowBossItemsAsRewards
&& _itemFilterService.IsBossItem(item.Id)
&& itemFilterService.IsBossItem(item.Id)
)
{
return false;
@@ -255,7 +255,7 @@ public class ScavCaseRewardGenerator(
var rewardWasMoney = false;
var rewardWasAmmo = false;
var randomCount = _randomUtil.GetInt((int)itemFilters.MinCount, (int)itemFilters.MaxCount);
var randomCount = randomUtil.GetInt((int)itemFilters.MinCount, (int)itemFilters.MaxCount);
for (var i = 0; i < randomCount; i++)
{
if (RewardShouldBeMoney() && !rewardWasMoney)
@@ -278,7 +278,7 @@ public class ScavCaseRewardGenerator(
}
else
{
result.Add(_randomUtil.GetArrayValue(items));
result.Add(randomUtil.GetArrayValue(items));
}
}
@@ -291,7 +291,7 @@ public class ScavCaseRewardGenerator(
/// <returns>true if reward should be money</returns>
protected bool RewardShouldBeMoney()
{
return _randomUtil.GetChance100(_scavCaseConfig.MoneyRewards.MoneyRewardChancePercent);
return randomUtil.GetChance100(_scavCaseConfig.MoneyRewards.MoneyRewardChancePercent);
}
/// <summary>
@@ -300,7 +300,7 @@ public class ScavCaseRewardGenerator(
/// <returns>true if reward should be ammo</returns>
protected bool RewardShouldBeAmmo()
{
return _randomUtil.GetChance100(_scavCaseConfig.AmmoRewards.AmmoRewardChancePercent);
return randomUtil.GetChance100(_scavCaseConfig.AmmoRewards.AmmoRewardChancePercent);
}
/// <summary>
@@ -309,13 +309,13 @@ public class ScavCaseRewardGenerator(
protected TemplateItem GetRandomMoney()
{
List<TemplateItem> money = [];
var items = _databaseService.GetItems();
var items = databaseService.GetItems();
money.Add(items[Money.ROUBLES]);
money.Add(items[Money.EUROS]);
money.Add(items[Money.DOLLARS]);
money.Add(items[Money.GP]);
return _randomUtil.GetArrayValue(money);
return randomUtil.GetArrayValue(money);
}
/// <summary>
@@ -328,7 +328,7 @@ public class ScavCaseRewardGenerator(
var possibleAmmoPool = _dbAmmoItemsCache.Where(ammo =>
{
// Is ammo handbook price between desired range
var handbookPrice = _ragfairPriceService.GetStaticPriceForItem(ammo.Id);
var handbookPrice = ragfairPriceService.GetStaticPriceForItem(ammo.Id);
if (
_scavCaseConfig.AmmoRewards.AmmoRewardValueRangeRub.TryGetValue(
rarity,
@@ -347,13 +347,13 @@ public class ScavCaseRewardGenerator(
if (!possibleAmmoPool.Any())
{
// Filtered pool is empty
_logger.Warning(
logger.Warning(
localisationService.GetText("scavcase-no_cartridges_found_matching_price")
);
}
// Get a random ammo and return it
return _randomUtil.GetArrayValue(possibleAmmoPool);
return randomUtil.GetArrayValue(possibleAmmoPool);
}
/// <summary>
@@ -383,20 +383,20 @@ public class ScavCaseRewardGenerator(
];
var rootItem = resultItem.FirstOrDefault();
if (_itemHelper.IsOfBaseclass(rewardItemDb.Id, BaseClasses.AMMO_BOX))
if (itemHelper.IsOfBaseclass(rewardItemDb.Id, BaseClasses.AMMO_BOX))
{
_itemHelper.AddCartridgesToAmmoBox(resultItem, rewardItemDb);
itemHelper.AddCartridgesToAmmoBox(resultItem, rewardItemDb);
}
// Armor or weapon = use default preset from globals.json
else if (
_itemHelper.ArmorItemHasRemovableOrSoftInsertSlots(rewardItemDb.Id)
|| _itemHelper.IsOfBaseclass(rewardItemDb.Id, BaseClasses.WEAPON)
itemHelper.ArmorItemHasRemovableOrSoftInsertSlots(rewardItemDb.Id)
|| itemHelper.IsOfBaseclass(rewardItemDb.Id, BaseClasses.WEAPON)
)
{
var preset = _presetHelper.GetDefaultPreset(rewardItemDb.Id);
var preset = presetHelper.GetDefaultPreset(rewardItemDb.Id);
if (preset is null)
{
_logger.Warning(
logger.Warning(
$"No preset for item: {rewardItemDb.Id} {rewardItemDb.Name}, skipping"
);
@@ -404,13 +404,13 @@ public class ScavCaseRewardGenerator(
}
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
var presetAndMods = _cloner.Clone(preset.Items).ReplaceIDs().ToList();
var presetAndMods = cloner.Clone(preset.Items).ReplaceIDs().ToList();
presetAndMods.RemapRootItemId();
resultItem = presetAndMods;
}
else if (
_itemHelper.IsOfBaseclasses(rewardItemDb.Id, [BaseClasses.AMMO, BaseClasses.MONEY])
itemHelper.IsOfBaseclasses(rewardItemDb.Id, [BaseClasses.AMMO, BaseClasses.MONEY])
)
{
rootItem.Upd = new Upd
@@ -438,7 +438,7 @@ public class ScavCaseRewardGenerator(
return dbItems
.Where(item =>
{
var handbookPrice = _ragfairPriceService.GetStaticPriceForItem(item.Id);
var handbookPrice = ragfairPriceService.GetStaticPriceForItem(item.Id);
if (
handbookPrice >= itemFilters.MinPriceRub
&& handbookPrice <= itemFilters.MaxPriceRub
@@ -519,7 +519,7 @@ public class ScavCaseRewardGenerator(
/// <returns>value to set stack count to</returns>
protected int GetRandomisedAmmoRewardStackSize(TemplateItem itemToCalculate)
{
return _randomUtil.GetInt(
return randomUtil.GetInt(
_scavCaseConfig.AmmoRewards.MinStackSize,
itemToCalculate.Properties.StackMaxSize ?? 0
);
@@ -537,28 +537,28 @@ public class ScavCaseRewardGenerator(
if (id == Money.ROUBLES)
{
return _randomUtil.GetInt(
return randomUtil.GetInt(
_scavCaseConfig.MoneyRewards.RubCount.GetByJsonProp<MinMax<int>>(rarity).Min,
_scavCaseConfig.MoneyRewards.RubCount.GetByJsonProp<MinMax<int>>(rarity).Max
);
}
else if (id == Money.EUROS)
{
return _randomUtil.GetInt(
return randomUtil.GetInt(
_scavCaseConfig.MoneyRewards.EurCount.GetByJsonProp<MinMax<int>>(rarity).Min,
_scavCaseConfig.MoneyRewards.EurCount.GetByJsonProp<MinMax<int>>(rarity).Max
);
}
else if (id == Money.DOLLARS)
{
return _randomUtil.GetInt(
return randomUtil.GetInt(
_scavCaseConfig.MoneyRewards.UsdCount.GetByJsonProp<MinMax<int>>(rarity).Min,
_scavCaseConfig.MoneyRewards.UsdCount.GetByJsonProp<MinMax<int>>(rarity).Max
);
}
else if (id == Money.GP)
{
return _randomUtil.GetInt(
return randomUtil.GetInt(
_scavCaseConfig.MoneyRewards.GpCount.GetByJsonProp<MinMax<int>>(rarity).Min,
_scavCaseConfig.MoneyRewards.GpCount.GetByJsonProp<MinMax<int>>(rarity).Max
);
@@ -12,15 +12,15 @@ namespace SPTarkov.Server.Core.Generators;
[Injectable]
public class WeatherGenerator(
TimeUtil _timeUtil,
SeasonalEventService _seasonalEventService,
WeatherHelper _weatherHelper,
ConfigServer _configServer,
WeightedRandomHelper _weightedRandomHelper,
RandomUtil _randomUtil
TimeUtil timeUtil,
SeasonalEventService seasonalEventService,
WeatherHelper weatherHelper,
ConfigServer configServer,
WeightedRandomHelper weightedRandomHelper,
RandomUtil randomUtil
)
{
protected readonly WeatherConfig _weatherConfig = _configServer.GetConfig<WeatherConfig>();
protected readonly WeatherConfig _weatherConfig = configServer.GetConfig<WeatherConfig>();
/// <summary>
/// Get current + raid datetime and format into correct BSG format.
@@ -29,14 +29,14 @@ public class WeatherGenerator(
/// <returns> WeatherData </returns>
public void CalculateGameTime(WeatherData data)
{
var computedDate = _timeUtil.GetDateTimeNow();
var computedDate = timeUtil.GetDateTimeNow();
var formattedDate = computedDate.FormatToBsgDate();
data.Date = formattedDate;
data.Time = GetBsgFormattedInRaidTime();
data.Acceleration = _weatherConfig.Acceleration;
data.Season = _seasonalEventService.GetActiveWeatherSeason();
data.Season = seasonalEventService.GetActiveWeatherSeason();
}
/// <summary>
@@ -46,7 +46,7 @@ public class WeatherGenerator(
/// <returns>Formatted time as String </returns>
protected string GetBsgFormattedInRaidTime()
{
return _weatherHelper.GetInRaidTime().GetBsgFormattedWeatherTime();
return weatherHelper.GetInRaidTime().GetBsgFormattedWeatherTime();
}
/// <summary>
@@ -122,11 +122,11 @@ public class WeatherGenerator(
{
// Convert timestamp to date so we can get current hour and check if its day or night
var currentRaidTime = new DateTime(inRaidTimestamp);
var minMax = _weatherHelper.IsHourAtNightTime(currentRaidTime.Hour)
var minMax = weatherHelper.IsHourAtNightTime(currentRaidTime.Hour)
? weather.Temp.Night
: weather.Temp.Day;
return Math.Round(_randomUtil.GetDouble(minMax.Min, minMax.Max), 2);
return Math.Round(randomUtil.GetDouble(minMax.Min, minMax.Max), 2);
}
/// <summary>
@@ -137,17 +137,17 @@ public class WeatherGenerator(
protected void SetCurrentDateTime(Weather weather, long? timestamp = null)
{
var inRaidTime = timestamp is null
? _weatherHelper.GetInRaidTime()
: _weatherHelper.GetInRaidTime(timestamp.Value);
? weatherHelper.GetInRaidTime()
: weatherHelper.GetInRaidTime(timestamp.Value);
var normalTime = inRaidTime.GetBsgFormattedWeatherTime();
var formattedDate = (
timestamp.HasValue
? _timeUtil.GetDateTimeFromTimeStamp(timestamp.Value)
? timeUtil.GetDateTimeFromTimeStamp(timestamp.Value)
: DateTime.UtcNow
).FormatToBsgDate();
var datetimeBsgFormat = $"{formattedDate} {normalTime}";
weather.Timestamp = timestamp ?? _timeUtil.GetTimeStamp(); // matches weather.date
weather.Timestamp = timestamp ?? timeUtil.GetTimeStamp(); // matches weather.date
weather.Date = formattedDate; // matches weather.timestamp
weather.Time = datetimeBsgFormat; // matches weather.timestamp
weather.SptInRaidTimestamp = weather.Timestamp;
@@ -155,37 +155,37 @@ public class WeatherGenerator(
protected WindDirection GetWeightedWindDirection(SeasonalValues weather)
{
return _weightedRandomHelper
return weightedRandomHelper
.WeightedRandom(weather.WindDirection.Values, weather.WindDirection.Weights)
.Item;
}
protected double GetWeightedClouds(SeasonalValues weather)
{
return _weightedRandomHelper
return weightedRandomHelper
.WeightedRandom(weather.Clouds.Values, weather.Clouds.Weights)
.Item;
}
protected double GetWeightedWindSpeed(SeasonalValues weather)
{
return _weightedRandomHelper
return weightedRandomHelper
.WeightedRandom(weather.WindSpeed.Values, weather.WindSpeed.Weights)
.Item;
}
protected double GetWeightedFog(SeasonalValues weather)
{
return _weightedRandomHelper.WeightedRandom(weather.Fog.Values, weather.Fog.Weights).Item;
return weightedRandomHelper.WeightedRandom(weather.Fog.Values, weather.Fog.Weights).Item;
}
protected double GetWeightedRain(SeasonalValues weather)
{
return _weightedRandomHelper.WeightedRandom(weather.Rain.Values, weather.Rain.Weights).Item;
return weightedRandomHelper.WeightedRandom(weather.Rain.Values, weather.Rain.Weights).Item;
}
protected double GetRandomDouble(double min, double max, int precision = 3)
{
return Math.Round(_randomUtil.GetDouble(min, max), precision);
return Math.Round(randomUtil.GetDouble(min, max), precision);
}
}
@@ -373,7 +373,7 @@ public class RagfairOfferHelper(
var offerRootItem = offer.Items.FirstOrDefault();
// Currency offer is sold for
var moneyTypeTpl = offer.Requirements.FirstOrDefault().Template;
var moneyTypeTpl = offer.Requirements.FirstOrDefault().TemplateId;
var isTraderOffer = databaseService.GetTraders().ContainsKey(offer.User.Id);
if (!isTraderOffer && playerIsFleaBanned)
@@ -392,7 +392,7 @@ public class RagfairOfferHelper(
if (
!string.IsNullOrEmpty(searchRequest.NeededSearchId)
&& !offer.Requirements.Any(requirement =>
requirement.Template == searchRequest.NeededSearchId
requirement.TemplateId == searchRequest.NeededSearchId
)
)
{
@@ -820,7 +820,7 @@ public class RagfairOfferHelper(
var requestedItem = new Item
{
Id = new MongoId(),
Template = requirement.Template,
Template = requirement.TemplateId,
Upd = new Upd { StackObjectsCount = requirement.Count * boughtAmount },
};
@@ -939,7 +939,7 @@ public class RagfairOfferHelper(
{
var isDefaultUserOffer = offer.User.MemberType == MemberCategory.Default;
var offerRootItem = offer.Items.FirstOrDefault();
var offerMoneyTypeTpl = offer.Requirements.FirstOrDefault().Template;
var offerMoneyTypeTpl = offer.Requirements.FirstOrDefault().TemplateId;
if (
pmcData.Info.Level < databaseService.GetGlobals().Configuration.RagFair.MinUserLevel
@@ -66,11 +66,11 @@ public class RagfairSortHelper(LocaleService localeService)
protected int SortOffersByBarter(RagfairOffer a, RagfairOffer b)
{
var aIsOnlyMoney =
a.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(a.Requirements[0].Template)
a.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(a.Requirements[0].TemplateId)
? 1
: 0;
var bIsOnlyMoney =
b.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(b.Requirements[0].Template)
b.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(b.Requirements[0].TemplateId)
? 1
: 0;
@@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
using SPTarkov.Server.Core.Models.Enums;
@@ -103,14 +104,8 @@ public record OfferRequirement
[JsonExtensionData]
public Dictionary<string, object>? ExtensionData { get; set; }
private string? _tpl;
[JsonPropertyName("_tpl")]
public string? Template
{
get { return _tpl; }
set { _tpl = string.Intern(value); }
}
public required MongoId TemplateId { get; set; }
[JsonPropertyName("count")]
public double? Count { get; set; }
@@ -35,7 +35,7 @@ public record KarmaLevel
public double? LabsAccessCardChancePercent { get; set; }
[JsonPropertyName("lootItemsToAddChancePercent")]
public required Dictionary<string, double> LootItemsToAddChancePercent { get; set; }
public required Dictionary<MongoId, double> LootItemsToAddChancePercent { get; set; }
}
public record Modifiers
@@ -47,7 +47,7 @@ public class RagfairCategoriesService(
&& searchRequestData.RemoveBartering.GetValueOrDefault(false)
&& (
offer.Requirements.Count > 1
|| !paymentHelper.IsMoneyTpl(offer.Requirements.FirstOrDefault().Template)
|| !paymentHelper.IsMoneyTpl(offer.Requirements.FirstOrDefault().TemplateId)
)
)
{
@@ -40,17 +40,17 @@ public class RagfairRequiredItemsService(
foreach (var offer in ragfairOfferService.GetOffers())
foreach (var requirement in offer.Requirements)
{
if (paymentHelper.IsMoneyTpl(requirement.Template))
if (paymentHelper.IsMoneyTpl(requirement.TemplateId))
// This would just be too noisy
{
continue;
}
// Ensure key is init
_requiredItemsCache.TryAdd(requirement.Template, []);
_requiredItemsCache.TryAdd(requirement.TemplateId, []);
// Add matching offer
_requiredItemsCache.GetValueOrDefault(requirement.Template)?.Add(offer.Id);
_requiredItemsCache.GetValueOrDefault(requirement.TemplateId)?.Add(offer.Id);
}
}
}