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) => private static PlayerInventorySnapshot Clone(PlayerInventorySnapshot source) =>
new() new()
{ {
BagSlots = CloneSlots(source.BagSlots), BagSlots = PlayerInventorySnapshot.CloneSlots(source.BagSlots),
EquipmentSlots = CloneSlots(source.EquipmentSlots), 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) private static string NormalizePlayerId(string? playerId)
{ {
var t = playerId?.Trim(); var t = playerId?.Trim();

View File

@ -31,7 +31,7 @@ public static class PlayerInventoryOperations
before => before =>
{ {
var container = PlayerInventorySnapshot.ContainerFromSlotKind(def.InventorySlotKind); var container = PlayerInventorySnapshot.ContainerFromSlotKind(def.InventorySlotKind);
var slots = CloneSlots(before.GetSlots(container)); var slots = PlayerInventorySnapshot.CloneSlots(before.GetSlots(container));
var remaining = quantity; var remaining = quantity;
remaining = MergeIntoExistingStacks(slots, def.Id, remaining, def.StackMax); remaining = MergeIntoExistingStacks(slots, def.Id, remaining, def.StackMax);
remaining = FillEmptySlots(slots, def.Id, remaining, def.StackMax); remaining = FillEmptySlots(slots, def.Id, remaining, def.StackMax);
@ -82,7 +82,7 @@ public static class PlayerInventoryOperations
before => before =>
{ {
var container = PlayerInventorySnapshot.ContainerFromSlotKind(def.InventorySlotKind); 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); var available = CountQuantity(slots, def.Id);
if (available < quantity) if (available < quantity)
{ {
@ -186,16 +186,4 @@ public static class PlayerInventoryOperations
return total; 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; 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) => public InventorySlotState[] GetSlots(InventoryContainerKind container) =>
container == InventoryContainerKind.Equipment ? EquipmentSlots : BagSlots; container == InventoryContainerKind.Equipment ? EquipmentSlots : BagSlots;