From 8837c26584dde5d7cc19762a0c08defd7e747312 Mon Sep 17 00:00:00 2001 From: Chomp Date: Fri, 4 Jul 2025 14:10:12 +0100 Subject: [PATCH] Fixed traders purchases not working --- .../Extensions/ContainerExtensions.cs | 34 +++++++++++-------- .../Helpers/InventoryHelper.cs | 18 +++++----- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Extensions/ContainerExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/ContainerExtensions.cs index c181d681..daee912b 100644 --- a/Libraries/SPTarkov.Server.Core/Extensions/ContainerExtensions.cs +++ b/Libraries/SPTarkov.Server.Core/Extensions/ContainerExtensions.cs @@ -34,29 +34,29 @@ namespace SPTarkov.Server.Core.Extensions } // Down = y, iterate over rows - for (var y = 0; y < limitY; y++) + for (var row = 0; row < limitY; row++) { - if (RowIsFull(container2D, y)) + if (RowIsFull(container2D, row)) { continue; } // Left to right across columns, look for free position - for (var x = 0; x < limitX; x++) + for (var column = 0; column < limitX; column++) { // Does item fit if ( CanItemBePlacedInContainerAtPosition( container2D, - x, - y, + column, + row, itemWidthX.Value, itemHeightY.Value ) ) { // Success, found a spot it fits - return new FindSlotResult(true, x, y, rotation); + return new FindSlotResult(true, column, row, rotation); } if (!ItemBiggerThan1X1(itemWidthX.Value, itemHeightY.Value)) @@ -69,8 +69,8 @@ namespace SPTarkov.Server.Core.Extensions if ( CanItemBePlacedInContainerAtPosition( container2D, - x, - y, + column, + row, itemHeightY.Value, // Swapped itemWidthX.Value // Swapped ) @@ -78,7 +78,7 @@ namespace SPTarkov.Server.Core.Extensions { // Found a position for the item when rotated rotation = true; - return new FindSlotResult(true, x, y, rotation); + return new FindSlotResult(true, column, row, rotation); } } } @@ -91,15 +91,15 @@ namespace SPTarkov.Server.Core.Extensions /// Find a free slot for an item to be placed at /// /// Container to place item in - /// Container x size /// Container y size + /// Container x size /// Items width /// Items height /// is item rotated public static void FillContainerMapWithItem( this int[,] container2D, - int desiredRowPositionY, int desiredColumnPositionX, + int desiredRowPositionY, int? itemXWidth, int? itemYHeight, bool isRotated @@ -112,9 +112,9 @@ namespace SPTarkov.Server.Core.Extensions var itemWidth = isRotated ? itemYHeight : itemXWidth; var itemHeight = isRotated ? itemXWidth : itemYHeight; - for (var tmpY = desiredRowPositionY; tmpY < containerY + itemHeight; tmpY++) + for (var tmpY = desiredRowPositionY; tmpY < itemHeight; tmpY++) { - for (var tmpX = desiredColumnPositionX; tmpX < containerX + itemWidth; tmpX++) + for (var tmpX = desiredColumnPositionX; tmpX < itemWidth; tmpX++) { if (container2D[tmpY, tmpX] == 0) { @@ -223,12 +223,18 @@ namespace SPTarkov.Server.Core.Extensions return false; } + // Single slot item, do direct check + if (itemXWidth == 1 && itemYHeight == 1) + { + return container[startXPos, startYPos] == 0; + } + // Check each slot, is any filled for (var checkY = startYPos; checkY < startYPos + itemYHeight; checkY++) { for (var checkX = startXPos; checkX < startXPos + itemXWidth; checkX++) { - if (container[checkX, checkY] == 1) + if (container[checkY, checkX] == 1) { // Occupied by something return false; diff --git a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs index 8aea7703..e1b0d9b1 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs @@ -899,23 +899,23 @@ public class InventoryHelper( continue; } - // Get x/y size of item - var (itemXWidth, itemYHeight) = GetSizeByInventoryItemHash( + // Get x/y size of item (without rotation) + var (rawItemXWidth, rawItemYHeight) = GetSizeByInventoryItemHash( rootItem.Template, rootItem.Id, inventoryItemHash ); // Items horizontal size - var itemHSize = itemLocation.IsVertical() ? itemXWidth : itemYHeight; + var itemHeight = itemLocation.IsVertical() ? rawItemXWidth : rawItemYHeight; // Items vertical size - var itemWSize = itemLocation.IsVertical() ? itemYHeight : itemXWidth; + var itemWidth = itemLocation.IsVertical() ? rawItemYHeight : rawItemXWidth; - // vertical - for (var yOffset = 0; yOffset < itemHSize; yOffset++) + // vertical (row) + for (var yOffset = 0; yOffset < itemHeight; yOffset++) { - // horizontal - for (var xOffset = 0; xOffset < itemWSize; xOffset++) + // horizontal (column) + for (var xOffset = 0; xOffset < itemWidth; xOffset++) { var currentY = itemLocation.Y.Value + yOffset; var currentX = itemLocation.X.Value + xOffset; @@ -935,7 +935,7 @@ public class InventoryHelper( { // Out of bounds var message = - $"Item: {rootItem.Id} at: {itemLocation.X}, {itemLocation.Y} size: {itemHSize}x{itemWSize} extends outside the containers bounds"; + $"Item: {rootItem.Id} at: {itemLocation.X}, {itemLocation.Y} size: {itemHeight}x{itemWidth} extends outside the containers bounds"; _logger.Error( _serverLocalisationService.GetText(