Files
SPT-Server-Build/Core/Controllers/InventoryController.cs
T

141 lines
5.1 KiB
C#

using Core.Annotations;
using Core.Generators;
using Core.Helpers;
using Core.Models.Eft.Common;
using Core.Models.Eft.Inventory;
using Core.Models.Eft.ItemEvent;
using Core.Models.Enums;
using Core.Models.Utils;
using Core.Routers;
using Core.Services;
using Core.Utils;
using Core.Utils.Cloners;
namespace Core.Controllers;
[Injectable]
public class InventoryController
{
protected ISptLogger<InventoryController> _logger;
protected HashUtil _hashUtil;
protected RandomUtil _randomUtil;
protected HttpResponseUtil _httpResponseUtil;
protected PresetHelper _presetHelper;
protected InventoryHelper _inventoryHelper;
protected QuestHelper _questHelper;
protected HideoutHelper _hideoutHelper;
protected ProfileHelper _profileHelper;
protected PaymentHelper _paymentHelper;
protected TraderHelper _traderHelper;
protected DatabaseService _databaseService;
protected FenceService _fenceService;
protected RagfairOfferService _ragfairOfferService;
protected MapMarkerService _mapMarkerService;
protected LocalisationService _localisationService;
protected PlayerService _playerService;
protected LootGenerator _lootGenerator;
protected EventOutputHolder _eventOutputHolder;
public InventoryController(
ISptLogger<InventoryController> logger,
HashUtil hashUtil,
RandomUtil randomUtil,
HttpResponseUtil httpResponseUtil,
PresetHelper presetHelper,
InventoryHelper inventoryHelper,
QuestHelper questHelper,
HideoutHelper hideoutHelper,
ProfileHelper profileHelper,
PaymentHelper paymentHelper,
TraderHelper traderHelper,
DatabaseService databaseService,
FenceService fenceService,
RagfairOfferService ragfairOfferService,
MapMarkerService mapMarkerService,
LocalisationService localisationService,
PlayerService playerService,
LootGenerator lootGenerator,
EventOutputHolder eventOutputHolder,
ICloner cloner
)
{
_logger = logger;
_hashUtil = hashUtil;
_randomUtil = randomUtil;
_httpResponseUtil = httpResponseUtil;
_presetHelper = presetHelper;
_inventoryHelper = inventoryHelper;
_questHelper = questHelper;
_hideoutHelper = hideoutHelper;
_profileHelper = profileHelper;
_paymentHelper = paymentHelper;
_traderHelper = traderHelper;
_databaseService = databaseService;
_fenceService = fenceService;
_ragfairOfferService = ragfairOfferService;
_mapMarkerService = mapMarkerService;
_localisationService = localisationService;
_playerService = playerService;
_lootGenerator = lootGenerator;
_eventOutputHolder = eventOutputHolder;
}
public void MoveItem(PmcData pmcData, InventoryMoveRequestData moveRequest, string sessionID, ItemEventRouterResponse output)
{
if (output.Warnings.Count > 0)
{
return;
}
// Changes made to result apply to character inventory
var ownerInventoryItems = _inventoryHelper.GetOwnerInventoryItems(moveRequest, moveRequest.Item, sessionID);
if (ownerInventoryItems.SameInventory.GetValueOrDefault(false))
{
// Don't move items from trader to profile, this can happen when editing a traders preset weapons
if (moveRequest.FromOwner?.Type == "Trader" && !ownerInventoryItems.IsMail.GetValueOrDefault(false))
{
AppendTraderExploitErrorResponse(output);
return;
}
// Check for item in inventory before allowing internal transfer
var originalItemLocation = ownerInventoryItems.From.FirstOrDefault((item) => item.Id == moveRequest.Item);
if (originalItemLocation is null)
{
// Internal item move but item never existed, possible dupe glitch
AppendTraderExploitErrorResponse(output);
return;
}
var originalLocationSlotId = originalItemLocation?.SlotId;
var moveResult = _inventoryHelper.MoveItemInternal(pmcData, ownerInventoryItems.From, moveRequest, out var errorMessage);
if (!moveResult)
{
_httpResponseUtil.AppendErrorToOutput(output, errorMessage);
return;
}
// Item is moving into or out of place of fame dogtag slot
if (moveRequest.To.Container.StartsWith("dogtag") || originalLocationSlotId.StartsWith("dogtag"))
{
_hideoutHelper.ApplyPlaceOfFameDogtagBonus(pmcData);
}
}
else
{
_inventoryHelper.MoveItemToProfile(ownerInventoryItems.From, ownerInventoryItems.To, moveRequest);
}
}
private void AppendTraderExploitErrorResponse(ItemEventRouterResponse output)
{
_httpResponseUtil.AppendErrorToOutput(
output,
_localisationService.GetText("inventory-edit_trader_item"),
(BackendErrorCodes)228
);
}
}