update mongoIds, remove underscores from injections in generators (#460)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user