Merge branch 'main' into develop
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Generators;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
@@ -1215,10 +1216,12 @@ public class HideoutController(
|
||||
var countOfItemsToReward = recipe.Count;
|
||||
for (var index = 1; index < countOfItemsToReward; index++)
|
||||
{
|
||||
var itemAndMods = _itemHelper.ReplaceIDs(
|
||||
_cloner.Clone(itemAndChildrenToSendToPlayer.FirstOrDefault())
|
||||
);
|
||||
itemAndChildrenToSendToPlayer.AddRange([itemAndMods]);
|
||||
var firstItemWithChildrenClone = _cloner
|
||||
.Clone(itemAndChildrenToSendToPlayer.FirstOrDefault())
|
||||
.ReplaceIDs()
|
||||
.ToList();
|
||||
|
||||
itemAndChildrenToSendToPlayer.AddRange([firstItemWithChildrenClone]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1231,12 +1234,12 @@ public class HideoutController(
|
||||
var defaultPreset = _presetHelper.GetDefaultPreset(recipe.EndProduct);
|
||||
|
||||
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(defaultPreset.Items));
|
||||
var presetAndModsClone = _cloner.Clone(defaultPreset.Items).ReplaceIDs().ToList();
|
||||
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
presetAndModsClone.RemapRootItemId();
|
||||
|
||||
// Store preset items in array
|
||||
return [presetAndMods];
|
||||
return [presetAndModsClone];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -382,5 +382,71 @@ namespace SPTarkov.Server.Core.Extensions
|
||||
// Return all items returned and exclude the secure container item itself
|
||||
return itemsInSecureContainer.Where(x => x != secureContainer.Id).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Regenerate all GUIDs with new IDs, except special item types (e.g. quest, sorting table, etc.)
|
||||
/// </summary>
|
||||
/// <param name="items"></param>
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<Item> ReplaceIDs(this IEnumerable<Item> items)
|
||||
{
|
||||
foreach (var item in items)
|
||||
{
|
||||
// Generate new id
|
||||
var newId = new MongoId();
|
||||
|
||||
// Keep copy of original id
|
||||
var originalId = item.Id;
|
||||
|
||||
// Update items id to new one we generated
|
||||
item.Id = newId;
|
||||
|
||||
// Find all children of item and update their parent ids to match
|
||||
var childItems = items.Where(x =>
|
||||
string.Equals(x.ParentId, originalId, StringComparison.OrdinalIgnoreCase)
|
||||
);
|
||||
foreach (var childItem in childItems)
|
||||
{
|
||||
childItem.ParentId = newId;
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update a root items _id property value to be unique
|
||||
/// </summary>
|
||||
/// <param name="itemWithChildren">Item to update root items _id property</param>
|
||||
/// <param name="newId">Optional: new id to use</param>
|
||||
/// <returns>New root id</returns>
|
||||
public static string RemapRootItemId(
|
||||
this List<Item> itemWithChildren,
|
||||
MongoId? newId = null
|
||||
)
|
||||
{
|
||||
newId ??= new MongoId();
|
||||
|
||||
var rootItemExistingId = itemWithChildren.FirstOrDefault().Id;
|
||||
|
||||
foreach (var item in itemWithChildren)
|
||||
{
|
||||
// Root, update id
|
||||
if (item.Id.Equals(rootItemExistingId))
|
||||
{
|
||||
item.Id = newId.Value;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Child with parent of root, update
|
||||
if (item.ParentId == rootItemExistingId)
|
||||
{
|
||||
item.ParentId = newId.Value;
|
||||
}
|
||||
}
|
||||
|
||||
return newId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
|
||||
@@ -118,7 +119,7 @@ public class FenceBaseAssortGenerator(
|
||||
}
|
||||
|
||||
// Ensure IDs are unique
|
||||
itemHelper.RemapRootItemId(itemWithChildrenToAdd);
|
||||
itemWithChildrenToAdd.RemapRootItemId();
|
||||
if (itemWithChildrenToAdd.Count > 1)
|
||||
{
|
||||
itemHelper.ReparentItemAndChildren(itemWithChildrenToAdd[0], itemWithChildrenToAdd);
|
||||
@@ -162,7 +163,7 @@ public class FenceBaseAssortGenerator(
|
||||
}
|
||||
|
||||
// Construct preset + mods
|
||||
var itemAndChildren = itemHelper.ReplaceIDs(_cloner.Clone(defaultPreset.Items));
|
||||
var itemAndChildren = _cloner.Clone(defaultPreset.Items).ReplaceIDs().ToList();
|
||||
|
||||
// Find root item and add some properties to it
|
||||
for (var i = 0; i < itemAndChildren.Count; i++)
|
||||
|
||||
@@ -1171,7 +1171,7 @@ public class LocationLootGenerator(
|
||||
var itemWithChildren = lootItems.FindAndReturnChildrenAsItems(chosenItem.Id);
|
||||
|
||||
// Ensure all IDs are unique
|
||||
itemWithChildren = _itemHelper.ReplaceIDs(_cloner.Clone(itemWithChildren));
|
||||
itemWithChildren = _cloner.Clone(itemWithChildren).ReplaceIDs().ToList();
|
||||
|
||||
if (_locationConfig.TplsToStripChildItemsFrom.Contains(chosenItem.Template))
|
||||
// Strip children from parent before adding
|
||||
@@ -1280,12 +1280,12 @@ public class LocationLootGenerator(
|
||||
var defaultPreset = _presetHelper.GetDefaultPreset(chosenTpl);
|
||||
if (defaultPreset is not null)
|
||||
{
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(defaultPreset.Items));
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndModsClone = _cloner.Clone(defaultPreset.Items).ReplaceIDs().ToList();
|
||||
presetAndModsClone.RemapRootItemId();
|
||||
|
||||
// Use original items parentId otherwise item doesn't get added to container correctly
|
||||
presetAndMods.FirstOrDefault().ParentId = rootItem.ParentId;
|
||||
items = presetAndMods;
|
||||
presetAndModsClone.FirstOrDefault().ParentId = rootItem.ParentId;
|
||||
items = presetAndModsClone;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
using SPTarkov.Server.Core.Models.Eft.Common;
|
||||
@@ -200,12 +201,13 @@ public class LootGenerator(
|
||||
for (var i = 0; i < randomisedItemCount; i++)
|
||||
{
|
||||
// Clone preset and alter Ids to be unique
|
||||
var presetWithUniqueIds = _itemHelper.ReplaceIDs(
|
||||
_cloner.Clone(preset.Items)
|
||||
);
|
||||
var presetWithUniqueIdsClone = _cloner
|
||||
.Clone(preset.Items)
|
||||
.ReplaceIDs()
|
||||
.ToList();
|
||||
|
||||
// Add to results
|
||||
result.Add(presetWithUniqueIds);
|
||||
result.Add(presetWithUniqueIdsClone);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,13 +499,13 @@ public class LootGenerator(
|
||||
return false;
|
||||
}
|
||||
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(chosenPreset.Items));
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndModsClone = _cloner.Clone(chosenPreset.Items).ReplaceIDs().ToList();
|
||||
presetAndModsClone.RemapRootItemId();
|
||||
|
||||
_itemHelper.SetFoundInRaid(presetAndMods);
|
||||
_itemHelper.SetFoundInRaid(presetAndModsClone);
|
||||
|
||||
// Add chosen preset tpl to result array
|
||||
result.Add(presetAndMods);
|
||||
result.Add(presetAndModsClone);
|
||||
|
||||
if (itemLimitCount is not null)
|
||||
// Increment item count as item has been chosen and its inside itemLimitCount dictionary
|
||||
@@ -565,13 +567,13 @@ public class LootGenerator(
|
||||
}
|
||||
|
||||
// Clean up Ids to ensure they're all unique and prevent collisions
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(chosenWeaponPreset.Items));
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndModsClone = _cloner.Clone(chosenWeaponPreset.Items).ReplaceIDs().ToList();
|
||||
presetAndModsClone.RemapRootItemId();
|
||||
|
||||
// Add preset to return object
|
||||
itemsToReturn.Add(presetAndMods);
|
||||
itemsToReturn.Add(presetAndModsClone);
|
||||
|
||||
// Get a random collection of weapon mods related to chosen weawpon and add them to result array
|
||||
// Get a random collection of weapon mods related to chosen weapon and add them to result array
|
||||
var linkedItemsToWeapon = _ragfairLinkedItemService.GetLinkedDbItems(chosenWeaponTpl);
|
||||
itemsToReturn.AddRange(
|
||||
GetSealedContainerWeaponModRewards(
|
||||
@@ -763,9 +765,9 @@ public class LootGenerator(
|
||||
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 = _itemHelper.ReplaceIDs(preset.Items);
|
||||
var presetAndMods = preset.Items.ReplaceIDs().ToList();
|
||||
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
presetAndMods.RemapRootItemId();
|
||||
itemsToReturn.Add(presetAndMods);
|
||||
|
||||
continue;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
using SPTarkov.Server.Core.Models.Eft.Common;
|
||||
@@ -65,22 +66,22 @@ public class RagfairAssortGenerator(
|
||||
foreach (var preset in presets)
|
||||
{
|
||||
// Update Ids and clone
|
||||
var presetAndMods = itemHelper.ReplaceIDs(cloner.Clone(preset.Items));
|
||||
itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndModsClone = cloner.Clone(preset.Items).ReplaceIDs().ToList();
|
||||
presetAndModsClone.RemapRootItemId();
|
||||
|
||||
// Add presets base item tpl to the processed list so its skipped later on when processing items
|
||||
processedArmorItems.Add(preset.Items[0].Template);
|
||||
|
||||
presetAndMods[0].ParentId = "hideout";
|
||||
presetAndMods[0].SlotId = "hideout";
|
||||
presetAndMods[0].Upd = new Upd
|
||||
presetAndModsClone[0].ParentId = "hideout";
|
||||
presetAndModsClone[0].SlotId = "hideout";
|
||||
presetAndModsClone[0].Upd = new Upd
|
||||
{
|
||||
StackObjectsCount = 99999999,
|
||||
UnlimitedCount = true,
|
||||
SptPresetId = preset.Id,
|
||||
};
|
||||
|
||||
results.Add(presetAndMods);
|
||||
results.Add(presetAndModsClone);
|
||||
}
|
||||
|
||||
foreach (var item in dbItemsClone)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using SPTarkov.Common.Extensions;
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
|
||||
@@ -403,8 +404,8 @@ public class ScavCaseRewardGenerator(
|
||||
}
|
||||
|
||||
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(preset.Items));
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndMods = _cloner.Clone(preset.Items).ReplaceIDs().ToList();
|
||||
presetAndMods.RemapRootItemId();
|
||||
|
||||
resultItem = presetAndMods;
|
||||
}
|
||||
|
||||
+1
-1
@@ -234,7 +234,7 @@ public class GiveSptCommand(
|
||||
for (var i = 0; i < quantity; i++)
|
||||
{
|
||||
var items = _cloner.Clone(preset.Items);
|
||||
items = _itemHelper.ReplaceIDs(items);
|
||||
items = items.ReplaceIDs().ToList();
|
||||
itemsToSend.AddRange(items);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -837,7 +837,7 @@ public class ItemHelper(
|
||||
while (remainingCount.Value != 0)
|
||||
{
|
||||
// Clone item and make IDs unique
|
||||
var itemWithChildrenClone = ReplaceIDs(_cloner.Clone(itemWithChildren));
|
||||
var itemWithChildrenClone = _cloner.Clone(itemWithChildren).ReplaceIDs().ToList();
|
||||
|
||||
// Set stack count to new value
|
||||
var amount = Math.Min(remainingCount ?? 0, maxStackSize ?? 0);
|
||||
@@ -1017,37 +1017,6 @@ public class ItemHelper(
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Regenerate all GUIDs with new IDs, except special item types (e.g. quest, sorting table, etc.)
|
||||
/// </summary>
|
||||
/// <param name="items"></param>
|
||||
/// <returns></returns>
|
||||
public List<Item> ReplaceIDs(List<Item> items)
|
||||
{
|
||||
foreach (var item in items)
|
||||
{
|
||||
// Generate new id
|
||||
var newId = new MongoId();
|
||||
|
||||
// Keep copy of original id
|
||||
var originalId = item.Id;
|
||||
|
||||
// Update items id to new one we generated
|
||||
item.Id = newId;
|
||||
|
||||
// Find all children of item and update their parent ids to match
|
||||
var childItems = items.Where(x =>
|
||||
string.Equals(x.ParentId, originalId, StringComparison.OrdinalIgnoreCase)
|
||||
);
|
||||
foreach (var childItem in childItems)
|
||||
{
|
||||
childItem.ParentId = newId;
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Regenerate all GUIDs with new IDs, except special item types (e.g. quest, sorting table, etc.) This
|
||||
/// function will not mutate the original items list, but will return a new list with new GUIDs.
|
||||
@@ -1947,39 +1916,6 @@ public class ItemHelper(
|
||||
return itemWithChildren;
|
||||
}
|
||||
|
||||
// Update a root items _id property value to be unique
|
||||
// Item to update root items _id property
|
||||
// Optional: new id to use
|
||||
// Returns New root id
|
||||
|
||||
public string RemapRootItemId(List<Item> itemWithChildren, MongoId? newId = null)
|
||||
{
|
||||
newId ??= new MongoId();
|
||||
|
||||
var rootItemExistingId = itemWithChildren[0].Id;
|
||||
|
||||
foreach (var item in itemWithChildren)
|
||||
{
|
||||
// Root, update id
|
||||
if (item.Id.Equals(rootItemExistingId))
|
||||
{
|
||||
item.Id = newId.Value;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Child with parent of root, update
|
||||
if (
|
||||
string.Equals(item.ParentId, rootItemExistingId, StringComparison.OrdinalIgnoreCase)
|
||||
)
|
||||
{
|
||||
item.ParentId = newId;
|
||||
}
|
||||
}
|
||||
|
||||
return newId;
|
||||
}
|
||||
|
||||
// Add a blank upd object to passed in item if it does not exist already
|
||||
// item to add upd to
|
||||
// text to write to log when upd object was not found
|
||||
|
||||
@@ -383,8 +383,8 @@ public class RewardHelper(
|
||||
if (defaultPreset is not null)
|
||||
{
|
||||
// Found preset, use mods to hydrate reward item
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(_cloner.Clone(defaultPreset.Items));
|
||||
var newRootId = _itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndMods = _cloner.Clone(defaultPreset.Items).ReplaceIDs().ToList();
|
||||
var newRootId = presetAndMods.RemapRootItemId();
|
||||
|
||||
reward.Items = presetAndMods;
|
||||
|
||||
|
||||
@@ -249,7 +249,7 @@ public class TradeHelper(
|
||||
offerClone.FirstOrDefault().Upd.StackObjectsCount = itemCountToSend;
|
||||
|
||||
// Prevent any collisions
|
||||
_itemHelper.RemapRootItemId(offerClone);
|
||||
offerClone.RemapRootItemId();
|
||||
if (offerClone.Count > 1)
|
||||
{
|
||||
_itemHelper.ReparentItemAndChildren(offerClone.FirstOrDefault(), offerClone);
|
||||
|
||||
@@ -66,7 +66,7 @@ public record SealedAirdropContainerSettings
|
||||
public Dictionary<string, object>? ExtensionData { get; set; }
|
||||
|
||||
[JsonPropertyName("weaponRewardWeight")]
|
||||
public required Dictionary<string, double> WeaponRewardWeight { get; set; }
|
||||
public required Dictionary<MongoId, double> WeaponRewardWeight { get; set; }
|
||||
|
||||
[JsonPropertyName("defaultPresetsOnly")]
|
||||
public bool DefaultPresetsOnly { get; set; }
|
||||
|
||||
@@ -399,8 +399,8 @@ public class CircleOfCultistService(
|
||||
}
|
||||
|
||||
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(defaultPreset.Items);
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndMods = defaultPreset.Items.ReplaceIDs().ToList();
|
||||
presetAndMods.RemapRootItemId();
|
||||
|
||||
// Set item as FiR
|
||||
_itemHelper.SetFoundInRaid(presetAndMods);
|
||||
@@ -494,8 +494,8 @@ public class CircleOfCultistService(
|
||||
}
|
||||
|
||||
// Ensure preset has unique ids and is cloned so we don't alter the preset data stored in memory
|
||||
var presetAndMods = _itemHelper.ReplaceIDs(defaultPreset.Items);
|
||||
_itemHelper.RemapRootItemId(presetAndMods);
|
||||
var presetAndMods = defaultPreset.Items.ReplaceIDs().ToList();
|
||||
presetAndMods.RemapRootItemId();
|
||||
|
||||
// Set item as FiR
|
||||
_itemHelper.SetFoundInRaid(presetAndMods);
|
||||
@@ -546,18 +546,18 @@ public class CircleOfCultistService(
|
||||
/// <param name="sessionId">sessionId</param>
|
||||
/// <param name="sacrificedItems">Items sacrificed</param>
|
||||
/// <returns>Direct reward items to send to player</returns>
|
||||
protected DirectRewardSettings CheckForDirectReward(
|
||||
protected DirectRewardSettings? CheckForDirectReward(
|
||||
string sessionId,
|
||||
List<Item> sacrificedItems,
|
||||
Dictionary<string, DirectRewardSettings> directRewardsCache
|
||||
)
|
||||
{
|
||||
// Get sacrificed tpls
|
||||
IEnumerable<MongoId> sacrificedItemTpls = sacrificedItems
|
||||
var sacrificedItemTpls = sacrificedItems
|
||||
.Select(item => item.Template)
|
||||
.Where(item => item != null);
|
||||
// Create md5 key of the items player sacrificed so we can compare against the direct reward cache
|
||||
string sacrificedItemsKey = CreateSacrificeCacheKey(sacrificedItemTpls);
|
||||
var sacrificedItemsKey = CreateSacrificeCacheKey(sacrificedItemTpls);
|
||||
|
||||
var matchingDirectReward = directRewardsCache.GetValueOrDefault(sacrificedItemsKey);
|
||||
if (matchingDirectReward is null)
|
||||
|
||||
@@ -858,10 +858,11 @@ public class FenceService(
|
||||
}
|
||||
|
||||
// MUST randomise Ids as its possible to add the same base fence assort twice = duplicate IDs = dead client
|
||||
desiredAssortItemAndChildrenClone = itemHelper.ReplaceIDs(
|
||||
_cloner.Clone(desiredAssortItemAndChildrenClone)
|
||||
);
|
||||
itemHelper.RemapRootItemId(desiredAssortItemAndChildrenClone);
|
||||
desiredAssortItemAndChildrenClone = _cloner
|
||||
.Clone(desiredAssortItemAndChildrenClone)
|
||||
.ReplaceIDs()
|
||||
.ToList();
|
||||
desiredAssortItemAndChildrenClone.RemapRootItemId();
|
||||
|
||||
var rootItemBeingAdded = desiredAssortItemAndChildrenClone[0];
|
||||
|
||||
@@ -1152,7 +1153,7 @@ public class FenceService(
|
||||
presetWithChildrenClone[0],
|
||||
presetWithChildrenClone
|
||||
);
|
||||
itemHelper.RemapRootItemId(presetWithChildrenClone);
|
||||
presetWithChildrenClone.RemapRootItemId();
|
||||
|
||||
// Remapping IDs causes parentId to be altered, fix
|
||||
presetWithChildrenClone[0].ParentId = "hideout";
|
||||
@@ -1221,7 +1222,7 @@ public class FenceService(
|
||||
|
||||
// MUST randomise Ids as its possible to add the same base fence assort twice = duplicate IDs = dead client
|
||||
itemHelper.ReparentItemAndChildren(presetWithChildrenClone[0], presetWithChildrenClone);
|
||||
itemHelper.RemapRootItemId(presetWithChildrenClone);
|
||||
presetWithChildrenClone.RemapRootItemId();
|
||||
|
||||
// Remapping IDs causes parentId to be altered
|
||||
presetWithChildrenClone[0].ParentId = "hideout";
|
||||
|
||||
@@ -24,7 +24,6 @@ public class InsuranceService(
|
||||
TimeUtil _timeUtil,
|
||||
SaveServer _saveServer,
|
||||
TraderHelper _traderHelper,
|
||||
ProfileHelper _profileHelper,
|
||||
ServerLocalisationService _serverLocalisationService,
|
||||
MailSendService _mailSendService,
|
||||
ConfigServer _configServer
|
||||
|
||||
@@ -516,7 +516,7 @@ public class MailSendService(
|
||||
};
|
||||
|
||||
// Ensure Ids are unique and cont collide with items in player inventory later
|
||||
messageDetails.Items = _itemHelper.ReplaceIDs(_cloner.Clone(messageDetails.Items));
|
||||
messageDetails.Items = _cloner.Clone(messageDetails.Items).ReplaceIDs().ToList();
|
||||
|
||||
// Ensure item exits in items db
|
||||
foreach (var reward in messageDetails.Items)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using SPTarkov.Common.Extensions;
|
||||
using SPTarkov.DI.Annotations;
|
||||
using SPTarkov.Server.Core.Extensions;
|
||||
using SPTarkov.Server.Core.Helpers;
|
||||
using SPTarkov.Server.Core.Models.Common;
|
||||
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
|
||||
@@ -345,7 +346,7 @@ public class RagfairOfferService(
|
||||
itemAndChildrenClone.FirstOrDefault(),
|
||||
itemAndChildrenClone
|
||||
);
|
||||
itemHelper.RemapRootItemId(reparentedItemAndChildren);
|
||||
reparentedItemAndChildren.RemapRootItemId();
|
||||
|
||||
result.AddRange(reparentedItemAndChildren);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ public class RagfairTaxService(
|
||||
DatabaseService _databaseService,
|
||||
RagfairPriceService _ragfairPriceService,
|
||||
ItemHelper _itemHelper,
|
||||
ProfileHelper _profileHelper,
|
||||
ICloner _cloner
|
||||
)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user