From 126d979939ea13a33af2a4d2046b775182f72eba Mon Sep 17 00:00:00 2001 From: VinPropane Date: Sat, 23 May 2026 19:54:27 -0400 Subject: [PATCH] NEO-54: dedupe slot cloning on PlayerInventorySnapshot --- .../Game/Items/InMemoryPlayerInventoryStore.cs | 16 ++-------------- .../Game/Items/PlayerInventoryOperations.cs | 16 ++-------------- .../Game/Items/PlayerInventorySnapshot.cs | 12 ++++++++++++ 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/server/NeonSprawl.Server/Game/Items/InMemoryPlayerInventoryStore.cs b/server/NeonSprawl.Server/Game/Items/InMemoryPlayerInventoryStore.cs index 6a67d79..e240a96 100644 --- a/server/NeonSprawl.Server/Game/Items/InMemoryPlayerInventoryStore.cs +++ b/server/NeonSprawl.Server/Game/Items/InMemoryPlayerInventoryStore.cs @@ -98,22 +98,10 @@ public sealed class InMemoryPlayerInventoryStore(IOptions 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(); diff --git a/server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs b/server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs index d6b1b97..8accf06 100644 --- a/server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs +++ b/server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs @@ -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; - } } diff --git a/server/NeonSprawl.Server/Game/Items/PlayerInventorySnapshot.cs b/server/NeonSprawl.Server/Game/Items/PlayerInventorySnapshot.cs index 23a2858..089c9e3 100644 --- a/server/NeonSprawl.Server/Game/Items/PlayerInventorySnapshot.cs +++ b/server/NeonSprawl.Server/Game/Items/PlayerInventorySnapshot.cs @@ -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;