NEO-54: dedupe slot cloning on PlayerInventorySnapshot

pull/89/head
VinPropane 2026-05-23 19:54:27 -04:00
parent 3f664261b7
commit 126d979939
3 changed files with 16 additions and 28 deletions

View File

@ -98,22 +98,10 @@ public sealed class InMemoryPlayerInventoryStore(IOptions<GamePositionOptions> o
private static PlayerInventorySnapshot Clone(PlayerInventorySnapshot source) =>
new()
{
BagSlots = CloneSlots(source.BagSlots),
EquipmentSlots = CloneSlots(source.EquipmentSlots),
BagSlots = PlayerInventorySnapshot.CloneSlots(source.BagSlots),
EquipmentSlots = PlayerInventorySnapshot.CloneSlots(source.EquipmentSlots),
};
private static InventorySlotState[] CloneSlots(InventorySlotState[] slots)
{
var copy = new InventorySlotState[slots.Length];
for (var i = 0; i < slots.Length; i++)
{
var s = slots[i];
copy[i] = new InventorySlotState(s.SlotIndex, s.ItemId, s.Quantity);
}
return copy;
}
private static string NormalizePlayerId(string? playerId)
{
var t = playerId?.Trim();

View File

@ -31,7 +31,7 @@ public static class PlayerInventoryOperations
before =>
{
var container = PlayerInventorySnapshot.ContainerFromSlotKind(def.InventorySlotKind);
var slots = CloneSlots(before.GetSlots(container));
var slots = PlayerInventorySnapshot.CloneSlots(before.GetSlots(container));
var remaining = quantity;
remaining = MergeIntoExistingStacks(slots, def.Id, remaining, def.StackMax);
remaining = FillEmptySlots(slots, def.Id, remaining, def.StackMax);
@ -82,7 +82,7 @@ public static class PlayerInventoryOperations
before =>
{
var container = PlayerInventorySnapshot.ContainerFromSlotKind(def.InventorySlotKind);
var slots = CloneSlots(before.GetSlots(container));
var slots = PlayerInventorySnapshot.CloneSlots(before.GetSlots(container));
var available = CountQuantity(slots, def.Id);
if (available < quantity)
{
@ -186,16 +186,4 @@ public static class PlayerInventoryOperations
return total;
}
private static InventorySlotState[] CloneSlots(InventorySlotState[] slots)
{
var copy = new InventorySlotState[slots.Length];
for (var i = 0; i < slots.Length; i++)
{
var s = slots[i];
copy[i] = new InventorySlotState(s.SlotIndex, s.ItemId, s.Quantity);
}
return copy;
}
}

View File

@ -29,6 +29,18 @@ public sealed class PlayerInventorySnapshot
return slots;
}
public static InventorySlotState[] CloneSlots(InventorySlotState[] slots)
{
var copy = new InventorySlotState[slots.Length];
for (var i = 0; i < slots.Length; i++)
{
var s = slots[i];
copy[i] = new InventorySlotState(s.SlotIndex, s.ItemId, s.Quantity);
}
return copy;
}
public InventorySlotState[] GetSlots(InventoryContainerKind container) =>
container == InventoryContainerKind.Equipment ? EquipmentSlots : BagSlots;