Ragfair code formatting
This commit is contained in:
@@ -1,23 +1,20 @@
|
|||||||
using SptCommon.Annotations;
|
using Core.Generators;
|
||||||
|
using Core.Helpers;
|
||||||
|
using Core.Models.Common;
|
||||||
using Core.Models.Eft.Common;
|
using Core.Models.Eft.Common;
|
||||||
using Core.Models.Eft.Common.Tables;
|
using Core.Models.Eft.Common.Tables;
|
||||||
using Core.Models.Eft.ItemEvent;
|
using Core.Models.Eft.ItemEvent;
|
||||||
|
using Core.Models.Eft.Profile;
|
||||||
using Core.Models.Eft.Ragfair;
|
using Core.Models.Eft.Ragfair;
|
||||||
|
using Core.Models.Eft.Trade;
|
||||||
|
using Core.Models.Enums;
|
||||||
|
using Core.Models.Spt.Config;
|
||||||
using Core.Models.Utils;
|
using Core.Models.Utils;
|
||||||
|
using Core.Routers;
|
||||||
using Core.Servers;
|
using Core.Servers;
|
||||||
using Core.Services;
|
using Core.Services;
|
||||||
using Core.Helpers;
|
|
||||||
using Core.Models.Eft.Profile;
|
|
||||||
using Core.Models.Enums;
|
|
||||||
using Core.Routers;
|
|
||||||
using Core.Utils;
|
using Core.Utils;
|
||||||
using Core.Models.Spt.Config;
|
using SptCommon.Annotations;
|
||||||
using Core.Models.Common;
|
|
||||||
using Core.Models.Eft.Trade;
|
|
||||||
using Core.Generators;
|
|
||||||
using System.Xml.Linq;
|
|
||||||
using System;
|
|
||||||
using Core.Models.Spt.Services;
|
|
||||||
using LogLevel = Core.Models.Spt.Logging.LogLevel;
|
using LogLevel = Core.Models.Spt.Logging.LogLevel;
|
||||||
|
|
||||||
namespace Core.Controllers;
|
namespace Core.Controllers;
|
||||||
@@ -117,9 +114,12 @@ public class RagfairController
|
|||||||
// Check profile is capable of creating offers
|
// Check profile is capable of creating offers
|
||||||
var pmcProfile = profile.CharacterData.PmcData;
|
var pmcProfile = profile.CharacterData.PmcData;
|
||||||
if (
|
if (
|
||||||
pmcProfile.RagfairInfo is not null && pmcProfile.Info.Level >= _databaseService.GetGlobals().Configuration.RagFair.MinUserLevel
|
pmcProfile.RagfairInfo is not null &&
|
||||||
|
pmcProfile.Info.Level >= _databaseService.GetGlobals().Configuration.RagFair.MinUserLevel
|
||||||
)
|
)
|
||||||
|
{
|
||||||
_ragfairOfferHelper.ProcessOffersOnProfile(sessionId);
|
_ragfairOfferHelper.ProcessOffersOnProfile(sessionId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,7 +147,9 @@ public class RagfairController
|
|||||||
|
|
||||||
// Client requested a category refresh
|
// Client requested a category refresh
|
||||||
if (searchRequest.UpdateOfferCount.GetValueOrDefault(false))
|
if (searchRequest.UpdateOfferCount.GetValueOrDefault(false))
|
||||||
|
{
|
||||||
result.Categories = GetSpecificCategories(profile.CharacterData.PmcData, searchRequest, result.Offers);
|
result.Categories = GetSpecificCategories(profile.CharacterData.PmcData, searchRequest, result.Offers);
|
||||||
|
}
|
||||||
|
|
||||||
AddIndexValueToOffers(result.Offers);
|
AddIndexValueToOffers(result.Offers);
|
||||||
|
|
||||||
@@ -163,7 +165,10 @@ public class RagfairController
|
|||||||
{
|
{
|
||||||
// For the items, check the barter schemes. The method getDisplayableAssorts sets a flag sptQuestLocked
|
// For the items, check the barter schemes. The method getDisplayableAssorts sets a flag sptQuestLocked
|
||||||
// to true if the quest is not completed yet
|
// to true if the quest is not completed yet
|
||||||
if (_ragfairOfferHelper.TraderOfferItemQuestLocked(traderOffer, traderAssorts)) traderOffer.Locked = true;
|
if (_ragfairOfferHelper.TraderOfferItemQuestLocked(traderOffer, traderAssorts))
|
||||||
|
{
|
||||||
|
traderOffer.Locked = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Update offers BuyRestrictionCurrent/BuyRestrictionMax values
|
// Update offers BuyRestrictionCurrent/BuyRestrictionMax values
|
||||||
SetTraderOfferPurchaseLimits(traderOffer, profile);
|
SetTraderOfferPurchaseLimits(traderOffer, profile);
|
||||||
@@ -223,7 +228,10 @@ public class RagfairController
|
|||||||
var assortId = offerRootItem.Id;
|
var assortId = offerRootItem.Id;
|
||||||
|
|
||||||
// No trader found in profile, create a blank record for them
|
// No trader found in profile, create a blank record for them
|
||||||
var existsInProfile = !fullProfile.TraderPurchases.TryAdd(offer.User.Id, new Dictionary<string, TraderPurchaseData>());
|
var existsInProfile = !fullProfile.TraderPurchases.TryAdd(
|
||||||
|
offer.User.Id,
|
||||||
|
new Dictionary<string, TraderPurchaseData>()
|
||||||
|
);
|
||||||
if (!existsInProfile)
|
if (!existsInProfile)
|
||||||
{
|
{
|
||||||
// Not purchased by player before, use value from assort data
|
// Not purchased by player before, use value from assort data
|
||||||
@@ -256,7 +264,10 @@ public class RagfairController
|
|||||||
{
|
{
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
foreach (var offer in offers) offer.InternalId = ++counter;
|
foreach (var offer in offers)
|
||||||
|
{
|
||||||
|
offer.InternalId = ++counter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -265,7 +276,8 @@ public class RagfairController
|
|||||||
* @param offers Ragfair offers to get categories for
|
* @param offers Ragfair offers to get categories for
|
||||||
* @returns record with templates + counts
|
* @returns record with templates + counts
|
||||||
*/
|
*/
|
||||||
private Dictionary<string, int>? GetSpecificCategories(PmcData pmcProfile, SearchRequestData searchRequest, List<RagfairOffer> offers)
|
private Dictionary<string, int>? GetSpecificCategories(PmcData pmcProfile, SearchRequestData searchRequest,
|
||||||
|
List<RagfairOffer> offers)
|
||||||
{
|
{
|
||||||
// Linked/required search categories
|
// Linked/required search categories
|
||||||
var playerHasFleaUnlocked =
|
var playerHasFleaUnlocked =
|
||||||
@@ -283,7 +295,11 @@ public class RagfairController
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Error(_localisationService.GetText("ragfair-unable_to_get_categories"));
|
_logger.Error(_localisationService.GetText("ragfair-unable_to_get_categories"));
|
||||||
if (_logger.IsLogEnabled(LogLevel.Debug)) _logger.Debug(_jsonUtil.Serialize(searchRequest));
|
if (_logger.IsLogEnabled(LogLevel.Debug))
|
||||||
|
{
|
||||||
|
_logger.Debug(_jsonUtil.Serialize(searchRequest));
|
||||||
|
}
|
||||||
|
|
||||||
return new Dictionary<string, int>();
|
return new Dictionary<string, int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,13 +334,20 @@ public class RagfairController
|
|||||||
* @param pmcProfile Player profile
|
* @param pmcProfile Player profile
|
||||||
* @returns array of offers
|
* @returns array of offers
|
||||||
*/
|
*/
|
||||||
private List<RagfairOffer> GetOffersForSearchType(SearchRequestData searchRequest, List<string> itemsToAdd, Dictionary<string, TraderAssort> traderAssorts,
|
private List<RagfairOffer> GetOffersForSearchType(SearchRequestData searchRequest, List<string> itemsToAdd,
|
||||||
|
Dictionary<string, TraderAssort> traderAssorts,
|
||||||
PmcData pmcProfile)
|
PmcData pmcProfile)
|
||||||
{
|
{
|
||||||
// Searching for items in preset menu
|
// Searching for items in preset menu
|
||||||
if (searchRequest.BuildCount > 0) return _ragfairOfferHelper.GetOffersForBuild(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
|
if (searchRequest.BuildCount > 0)
|
||||||
|
{
|
||||||
|
return _ragfairOfferHelper.GetOffersForBuild(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
|
||||||
|
}
|
||||||
|
|
||||||
if (searchRequest.NeededSearchId?.Length > 0) return _ragfairOfferHelper.GetOffersThatRequireItem(searchRequest, pmcProfile);
|
if (searchRequest.NeededSearchId?.Length > 0)
|
||||||
|
{
|
||||||
|
return _ragfairOfferHelper.GetOffersThatRequireItem(searchRequest, pmcProfile);
|
||||||
|
}
|
||||||
|
|
||||||
// Searching for general items
|
// Searching for general items
|
||||||
return _ragfairOfferHelper.GetValidOffers(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
|
return _ragfairOfferHelper.GetValidOffers(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
|
||||||
@@ -336,7 +359,8 @@ public class RagfairController
|
|||||||
* @param ignoreTraderOffers Should trader offers be ignored in the calculation
|
* @param ignoreTraderOffers Should trader offers be ignored in the calculation
|
||||||
* @returns min/avg/max values for an item based on flea offers available
|
* @returns min/avg/max values for an item based on flea offers available
|
||||||
*/
|
*/
|
||||||
public GetItemPriceResult GetItemMinAvgMaxFleaPriceValues(GetMarketPriceRequestData getPriceRequest, bool ignoreTraderOffers = true)
|
public GetItemPriceResult GetItemMinAvgMaxFleaPriceValues(GetMarketPriceRequestData getPriceRequest,
|
||||||
|
bool ignoreTraderOffers = true)
|
||||||
{
|
{
|
||||||
// Get all items of tpl
|
// Get all items of tpl
|
||||||
var offers = _ragfairOfferService.GetOffersOfType(getPriceRequest.TemplateId);
|
var offers = _ragfairOfferService.GetOffersOfType(getPriceRequest.TemplateId);
|
||||||
@@ -356,7 +380,10 @@ public class RagfairController
|
|||||||
// No offers listed, get price from live ragfair price list prices.json
|
// No offers listed, get price from live ragfair price list prices.json
|
||||||
// No flea price, get handbook price
|
// No flea price, get handbook price
|
||||||
var fleaPrices = _databaseService.GetPrices();
|
var fleaPrices = _databaseService.GetPrices();
|
||||||
if (!fleaPrices.TryGetValue(getPriceRequest.TemplateId, out var tplPrice)) tplPrice = _handbookHelper.GetTemplatePrice(getPriceRequest.TemplateId);
|
if (!fleaPrices.TryGetValue(getPriceRequest.TemplateId, out var tplPrice))
|
||||||
|
{
|
||||||
|
tplPrice = _handbookHelper.GetTemplatePrice(getPriceRequest.TemplateId);
|
||||||
|
}
|
||||||
|
|
||||||
return new GetItemPriceResult { Avg = tplPrice, Min = tplPrice, Max = tplPrice };
|
return new GetItemPriceResult { Avg = tplPrice, Min = tplPrice, Max = tplPrice };
|
||||||
}
|
}
|
||||||
@@ -369,9 +396,15 @@ public class RagfairController
|
|||||||
foreach (var offer in offers)
|
foreach (var offer in offers)
|
||||||
{
|
{
|
||||||
// Exclude barter items, they tend to have outrageous equivalent prices
|
// Exclude barter items, they tend to have outrageous equivalent prices
|
||||||
if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.Template))) continue;
|
if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.Template)))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ignoreTraderOffers && _ragfairOfferHelper.OfferIsFromTrader(offer)) continue;
|
if (ignoreTraderOffers && _ragfairOfferHelper.OfferIsFromTrader(offer))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Figure out how many items the requirementsCost is applying to, and what the per-item price is
|
// Figure out how many items the requirementsCost is applying to, and what the per-item price is
|
||||||
var offerItemCount = offer.SellInOnePiece.GetValueOrDefault(false)
|
var offerItemCount = offer.SellInOnePiece.GetValueOrDefault(false)
|
||||||
@@ -381,14 +414,22 @@ public class RagfairController
|
|||||||
|
|
||||||
// Handle min/max calculations based on the per-item price
|
// Handle min/max calculations based on the per-item price
|
||||||
if (perItemPrice < minMax.Min)
|
if (perItemPrice < minMax.Min)
|
||||||
|
{
|
||||||
minMax.Min = perItemPrice;
|
minMax.Min = perItemPrice;
|
||||||
else if (perItemPrice > minMax.Max) minMax.Max = perItemPrice;
|
}
|
||||||
|
else if (perItemPrice > minMax.Max)
|
||||||
|
{
|
||||||
|
minMax.Max = perItemPrice;
|
||||||
|
}
|
||||||
|
|
||||||
sum += perItemPrice.Value;
|
sum += perItemPrice.Value;
|
||||||
totalOfferCount++;
|
totalOfferCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totalOfferCount == 0) return -1d;
|
if (totalOfferCount == 0)
|
||||||
|
{
|
||||||
|
return -1d;
|
||||||
|
}
|
||||||
|
|
||||||
return sum / totalOfferCount;
|
return sum / totalOfferCount;
|
||||||
}
|
}
|
||||||
@@ -406,11 +447,19 @@ public class RagfairController
|
|||||||
var fullProfile = _profileHelper.GetFullProfile(sessionID);
|
var fullProfile = _profileHelper.GetFullProfile(sessionID);
|
||||||
|
|
||||||
var validationMessage = "";
|
var validationMessage = "";
|
||||||
if (!IsValidPlayerOfferRequest(offerRequest, validationMessage)) return _httpResponseUtil.AppendErrorToOutput(output, validationMessage);
|
if (!IsValidPlayerOfferRequest(offerRequest, validationMessage))
|
||||||
|
{
|
||||||
|
return _httpResponseUtil.AppendErrorToOutput(output, validationMessage);
|
||||||
|
}
|
||||||
|
|
||||||
var typeOfOffer = GetOfferType(offerRequest);
|
var typeOfOffer = GetOfferType(offerRequest);
|
||||||
if (typeOfOffer == FleaOfferType.UNKNOWN)
|
if (typeOfOffer == FleaOfferType.UNKNOWN)
|
||||||
return _httpResponseUtil.AppendErrorToOutput(output, $"Unknown offer type: {typeOfOffer}, cannot list item on flea");
|
{
|
||||||
|
return _httpResponseUtil.AppendErrorToOutput(
|
||||||
|
output,
|
||||||
|
$"Unknown offer type: {typeOfOffer}, cannot list item on flea"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
switch (typeOfOffer)
|
switch (typeOfOffer)
|
||||||
{
|
{
|
||||||
@@ -422,7 +471,10 @@ public class RagfairController
|
|||||||
return CreatePackOffer(sessionID, offerRequest, fullProfile, output);
|
return CreatePackOffer(sessionID, offerRequest, fullProfile, output);
|
||||||
case FleaOfferType.UNKNOWN:
|
case FleaOfferType.UNKNOWN:
|
||||||
default:
|
default:
|
||||||
return _httpResponseUtil.AppendErrorToOutput(output, $"Unknown offer type: {typeOfOffer}, cannot list item on flea");
|
return _httpResponseUtil.AppendErrorToOutput(
|
||||||
|
output,
|
||||||
|
$"Unknown offer type: {typeOfOffer}, cannot list item on flea"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,12 +515,21 @@ public class RagfairController
|
|||||||
|
|
||||||
if (!sellInOncePiece)
|
if (!sellInOncePiece)
|
||||||
{
|
{
|
||||||
if (offerRequest.Items.Count == 1) return FleaOfferType.SINGLE;
|
if (offerRequest.Items.Count == 1)
|
||||||
|
{
|
||||||
|
return FleaOfferType.SINGLE;
|
||||||
|
}
|
||||||
|
|
||||||
if (offerRequest.Items.Count > 1) return FleaOfferType.MULTI;
|
if (offerRequest.Items.Count > 1)
|
||||||
|
{
|
||||||
|
return FleaOfferType.MULTI;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sellInOncePiece) return FleaOfferType.PACK;
|
if (sellInOncePiece)
|
||||||
|
{
|
||||||
|
return FleaOfferType.PACK;
|
||||||
|
}
|
||||||
|
|
||||||
return FleaOfferType.UNKNOWN;
|
return FleaOfferType.UNKNOWN;
|
||||||
}
|
}
|
||||||
@@ -483,7 +544,8 @@ public class RagfairController
|
|||||||
* @param output Response to send to client
|
* @param output Response to send to client
|
||||||
* @returns IItemEventRouterResponse
|
* @returns IItemEventRouterResponse
|
||||||
*/
|
*/
|
||||||
private ItemEventRouterResponse CreateMultiOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile, ItemEventRouterResponse output)
|
private ItemEventRouterResponse CreateMultiOffer(string sessionID, AddOfferRequestData offerRequest,
|
||||||
|
SptProfile fullProfile, ItemEventRouterResponse output)
|
||||||
{
|
{
|
||||||
var pmcData = fullProfile.CharacterData.PmcData;
|
var pmcData = fullProfile.CharacterData.PmcData;
|
||||||
// var itemsToListCount = offerRequest.Items.Count; // Wasnt used to commented out for now // Does not count stack size, only items
|
// var itemsToListCount = offerRequest.Items.Count; // Wasnt used to commented out for now // Does not count stack size, only items
|
||||||
@@ -497,7 +559,10 @@ public class RagfairController
|
|||||||
|
|
||||||
// Find items to be listed on flea (+ children) from player inventory
|
// Find items to be listed on flea (+ children) from player inventory
|
||||||
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
||||||
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
|
||||||
|
{
|
||||||
|
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
// Total count of items summed using their stack counts
|
// Total count of items summed using their stack counts
|
||||||
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
||||||
@@ -505,7 +570,7 @@ public class RagfairController
|
|||||||
// When listing identical items on flea, condense separate items into one stack with a merged stack count
|
// When listing identical items on flea, condense separate items into one stack with a merged stack count
|
||||||
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
|
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
|
||||||
|
|
||||||
firstListingAndChidren[0].Upd ??= new Upd { };
|
firstListingAndChidren[0].Upd ??= new Upd();
|
||||||
|
|
||||||
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
|
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
|
||||||
|
|
||||||
@@ -516,11 +581,15 @@ public class RagfairController
|
|||||||
var newRootOfferItem = offer.Items[0];
|
var newRootOfferItem = offer.Items[0];
|
||||||
|
|
||||||
// Average offer price for single item (or whole weapon)
|
// Average offer price for single item (or whole weapon)
|
||||||
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = offer.Items[0].Template });
|
var averages =
|
||||||
|
GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = offer.Items[0].Template });
|
||||||
var averageOfferPrice = averages.Avg;
|
var averageOfferPrice = averages.Avg;
|
||||||
|
|
||||||
// Check for and apply item price modifer if it exists in config
|
// Check for and apply item price modifer if it exists in config
|
||||||
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer)) averageOfferPrice *= itemPriceModifer;
|
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer))
|
||||||
|
{
|
||||||
|
averageOfferPrice *= itemPriceModifer;
|
||||||
|
}
|
||||||
|
|
||||||
// Get average of item+children quality
|
// Get average of item+children quality
|
||||||
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
||||||
@@ -553,7 +622,10 @@ public class RagfairController
|
|||||||
offerRequest,
|
offerRequest,
|
||||||
output
|
output
|
||||||
);
|
);
|
||||||
if (taxFeeChargeFailed) return output;
|
if (taxFeeChargeFailed)
|
||||||
|
{
|
||||||
|
return output;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add offer to players profile + add to client response
|
// Add offer to players profile + add to client response
|
||||||
@@ -561,7 +633,10 @@ public class RagfairController
|
|||||||
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
||||||
|
|
||||||
// Remove items from inventory after creating offer
|
// Remove items from inventory after creating offer
|
||||||
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
foreach (var itemToRemove in offerRequest.Items)
|
||||||
|
{
|
||||||
|
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@@ -576,7 +651,8 @@ public class RagfairController
|
|||||||
* @param output Response to send to client
|
* @param output Response to send to client
|
||||||
* @returns IItemEventRouterResponse
|
* @returns IItemEventRouterResponse
|
||||||
*/
|
*/
|
||||||
private ItemEventRouterResponse CreatePackOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile, ItemEventRouterResponse output)
|
private ItemEventRouterResponse CreatePackOffer(string sessionID, AddOfferRequestData offerRequest,
|
||||||
|
SptProfile fullProfile, ItemEventRouterResponse output)
|
||||||
{
|
{
|
||||||
var pmcData = fullProfile.CharacterData.PmcData;
|
var pmcData = fullProfile.CharacterData.PmcData;
|
||||||
// var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items
|
// var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items
|
||||||
@@ -590,14 +666,17 @@ public class RagfairController
|
|||||||
|
|
||||||
// Find items to be listed on flea (+ children) from player inventory
|
// Find items to be listed on flea (+ children) from player inventory
|
||||||
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
||||||
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
|
||||||
|
{
|
||||||
|
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
// Total count of items summed using their stack counts
|
// Total count of items summed using their stack counts
|
||||||
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
||||||
|
|
||||||
// When listing identical items on flea, condense separate items into one stack with a merged stack count
|
// When listing identical items on flea, condense separate items into one stack with a merged stack count
|
||||||
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
|
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
|
||||||
firstListingAndChidren[0].Upd ??= new Upd { };
|
firstListingAndChidren[0].Upd ??= new Upd();
|
||||||
|
|
||||||
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
|
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
|
||||||
|
|
||||||
@@ -608,11 +687,16 @@ public class RagfairController
|
|||||||
var newRootOfferItem = offer.Items[0];
|
var newRootOfferItem = offer.Items[0];
|
||||||
|
|
||||||
// Single price for an item
|
// Single price for an item
|
||||||
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = firstListingAndChidren[0].Template });
|
var averages = GetItemMinAvgMaxFleaPriceValues(
|
||||||
|
new GetMarketPriceRequestData { TemplateId = firstListingAndChidren[0].Template }
|
||||||
|
);
|
||||||
var singleItemPrice = averages.Avg;
|
var singleItemPrice = averages.Avg;
|
||||||
|
|
||||||
// Check for and apply item price modifer if it exists in config
|
// Check for and apply item price modifer if it exists in config
|
||||||
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer)) singleItemPrice *= itemPriceModifer;
|
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer))
|
||||||
|
{
|
||||||
|
singleItemPrice *= itemPriceModifer;
|
||||||
|
}
|
||||||
|
|
||||||
// Get average of item+children quality
|
// Get average of item+children quality
|
||||||
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
||||||
@@ -645,7 +729,10 @@ public class RagfairController
|
|||||||
offerRequest,
|
offerRequest,
|
||||||
output
|
output
|
||||||
);
|
);
|
||||||
if (taxFeeChargeFailed) return output;
|
if (taxFeeChargeFailed)
|
||||||
|
{
|
||||||
|
return output;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add offer to players profile + add to client response
|
// Add offer to players profile + add to client response
|
||||||
@@ -653,7 +740,10 @@ public class RagfairController
|
|||||||
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
||||||
|
|
||||||
// Remove items from inventory after creating offer
|
// Remove items from inventory after creating offer
|
||||||
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
foreach (var itemToRemove in offerRequest.Items)
|
||||||
|
{
|
||||||
|
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@@ -667,7 +757,8 @@ public class RagfairController
|
|||||||
* @param output Response to send to client
|
* @param output Response to send to client
|
||||||
* @returns IItemEventRouterResponse
|
* @returns IItemEventRouterResponse
|
||||||
*/
|
*/
|
||||||
private ItemEventRouterResponse CreateSingleOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile,
|
private ItemEventRouterResponse CreateSingleOffer(string sessionID, AddOfferRequestData offerRequest,
|
||||||
|
SptProfile fullProfile,
|
||||||
ItemEventRouterResponse output)
|
ItemEventRouterResponse output)
|
||||||
{
|
{
|
||||||
var pmcData = fullProfile.CharacterData.PmcData;
|
var pmcData = fullProfile.CharacterData.PmcData;
|
||||||
@@ -675,7 +766,10 @@ public class RagfairController
|
|||||||
|
|
||||||
// Find items to be listed on flea from player inventory
|
// Find items to be listed on flea from player inventory
|
||||||
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
|
||||||
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
|
||||||
|
{
|
||||||
|
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
// Total count of items summed using their stack counts
|
// Total count of items summed using their stack counts
|
||||||
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
|
||||||
@@ -694,12 +788,15 @@ public class RagfairController
|
|||||||
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
|
||||||
|
|
||||||
// Average offer price for single item (or whole weapon)
|
// Average offer price for single item (or whole weapon)
|
||||||
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = rootItem.Template });
|
var averages =
|
||||||
|
GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = rootItem.Template });
|
||||||
var averageOfferPriceSingleItem = averages.Avg;
|
var averageOfferPriceSingleItem = averages.Avg;
|
||||||
|
|
||||||
// Check for and apply item price modifer if it exists in config
|
// Check for and apply item price modifer if it exists in config
|
||||||
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootItem.Template, out var itemPriceModifer))
|
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootItem.Template, out var itemPriceModifer))
|
||||||
|
{
|
||||||
averageOfferPriceSingleItem *= itemPriceModifer;
|
averageOfferPriceSingleItem *= itemPriceModifer;
|
||||||
|
}
|
||||||
|
|
||||||
// Multiply single item price by quality
|
// Multiply single item price by quality
|
||||||
averageOfferPriceSingleItem *= qualityMultiplier;
|
averageOfferPriceSingleItem *= qualityMultiplier;
|
||||||
@@ -724,7 +821,10 @@ public class RagfairController
|
|||||||
offerRequest,
|
offerRequest,
|
||||||
output
|
output
|
||||||
);
|
);
|
||||||
if (taxFeeChargeFailed) return output;
|
if (taxFeeChargeFailed)
|
||||||
|
{
|
||||||
|
return output;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add offer to players profile + add to client response
|
// Add offer to players profile + add to client response
|
||||||
@@ -732,7 +832,10 @@ public class RagfairController
|
|||||||
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
|
||||||
|
|
||||||
// Remove items from inventory after creating offer
|
// Remove items from inventory after creating offer
|
||||||
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
foreach (var itemToRemove in offerRequest.Items)
|
||||||
|
{
|
||||||
|
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@@ -769,7 +872,10 @@ public class RagfairController
|
|||||||
offerRequest.SellInOnePiece.GetValueOrDefault(false)
|
offerRequest.SellInOnePiece.GetValueOrDefault(false)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (_logger.IsLogEnabled(LogLevel.Debug)) _logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue.Count is not null}");
|
if (_logger.IsLogEnabled(LogLevel.Debug))
|
||||||
|
{
|
||||||
|
_logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue.Count is not null}");
|
||||||
|
}
|
||||||
|
|
||||||
// cleanup of cache now we've used the tax value from it
|
// cleanup of cache now we've used the tax value from it
|
||||||
_ragfairTaxService.ClearStoredOfferTaxById(offerRequest.Items.First());
|
_ragfairTaxService.ClearStoredOfferTaxById(offerRequest.Items.First());
|
||||||
@@ -788,13 +894,14 @@ public class RagfairController
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RagfairOffer CreatePlayerOffer(string sessionId, List<Requirement> requirements, List<Item> items, bool sellInOnePiece)
|
private RagfairOffer CreatePlayerOffer(string sessionId, List<Requirement> requirements, List<Item> items,
|
||||||
|
bool sellInOnePiece)
|
||||||
{
|
{
|
||||||
var loyalLevel = 1;
|
var loyalLevel = 1;
|
||||||
var formattedItems = items.Select(
|
var formattedItems = items.Select(
|
||||||
item =>
|
item =>
|
||||||
{
|
{
|
||||||
var isChild = items.Any((subItem) => subItem.Id == item.ParentId);
|
var isChild = items.Any(subItem => subItem.Id == item.ParentId);
|
||||||
|
|
||||||
return new Item
|
return new Item
|
||||||
{
|
{
|
||||||
@@ -839,15 +946,20 @@ public class RagfairController
|
|||||||
var requestedItemTpl = item.Template;
|
var requestedItemTpl = item.Template;
|
||||||
|
|
||||||
if (_paymentHelper.IsMoneyTpl(requestedItemTpl))
|
if (_paymentHelper.IsMoneyTpl(requestedItemTpl))
|
||||||
|
{
|
||||||
requirementsPriceInRub += _handbookHelper.InRUB(item.Count.Value, requestedItemTpl);
|
requirementsPriceInRub += _handbookHelper.InRUB(item.Count.Value, requestedItemTpl);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
requirementsPriceInRub += _itemHelper.GetDynamicItemPrice(requestedItemTpl).Value * item.Count.Value;
|
requirementsPriceInRub += _itemHelper.GetDynamicItemPrice(requestedItemTpl).Value * item.Count.Value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return requirementsPriceInRub;
|
return requirementsPriceInRub;
|
||||||
}
|
}
|
||||||
|
|
||||||
private GetItemsToListOnFleaFromInventoryResult GetItemsToListOnFleaFromInventory(PmcData pmcData, List<string> itemIdsFromFleaOfferRequest)
|
private GetItemsToListOnFleaFromInventoryResult GetItemsToListOnFleaFromInventory(PmcData pmcData,
|
||||||
|
List<string> itemIdsFromFleaOfferRequest)
|
||||||
{
|
{
|
||||||
List<List<Item>> itemsToReturn = [];
|
List<List<Item>> itemsToReturn = [];
|
||||||
var errorMessage = string.Empty;
|
var errorMessage = string.Empty;
|
||||||
@@ -855,13 +967,17 @@ public class RagfairController
|
|||||||
// Count how many items are being sold and multiply the requested amount accordingly
|
// Count how many items are being sold and multiply the requested amount accordingly
|
||||||
foreach (var itemId in itemIdsFromFleaOfferRequest)
|
foreach (var itemId in itemIdsFromFleaOfferRequest)
|
||||||
{
|
{
|
||||||
var item = pmcData.Inventory?.Items?.FirstOrDefault((i) => i.Id == itemId);
|
var item = pmcData.Inventory?.Items?.FirstOrDefault(i => i.Id == itemId);
|
||||||
if (item is null)
|
if (item is null)
|
||||||
{
|
{
|
||||||
errorMessage = _localisationService.GetText("ragfair-unable_to_find_item_in_inventory", new { id = itemId });
|
errorMessage = _localisationService.GetText(
|
||||||
|
"ragfair-unable_to_find_item_in_inventory",
|
||||||
|
new { id = itemId }
|
||||||
|
);
|
||||||
_logger.Error(errorMessage);
|
_logger.Error(errorMessage);
|
||||||
|
|
||||||
return new GetItemsToListOnFleaFromInventoryResult { Items = itemsToReturn, ErrorMessage = errorMessage };
|
return new GetItemsToListOnFleaFromInventoryResult
|
||||||
|
{ Items = itemsToReturn, ErrorMessage = errorMessage };
|
||||||
}
|
}
|
||||||
|
|
||||||
item = _itemHelper.FixItemStackCount(item);
|
item = _itemHelper.FixItemStackCount(item);
|
||||||
@@ -942,7 +1058,7 @@ public class RagfairController
|
|||||||
|
|
||||||
var pmcData = _profileHelper.GetPmcProfile(sessionId);
|
var pmcData = _profileHelper.GetPmcProfile(sessionId);
|
||||||
var playerOffers = pmcData.RagfairInfo.Offers;
|
var playerOffers = pmcData.RagfairInfo.Offers;
|
||||||
var playerOfferIndex = playerOffers.FindIndex((offer) => offer.Id == extendRequest.OfferId);
|
var playerOfferIndex = playerOffers.FindIndex(offer => offer.Id == extendRequest.OfferId);
|
||||||
var secondsToAdd = extendRequest.RenewalTime * TimeUtil.OneHourAsSeconds;
|
var secondsToAdd = extendRequest.RenewalTime * TimeUtil.OneHourAsSeconds;
|
||||||
|
|
||||||
if (playerOfferIndex == -1)
|
if (playerOfferIndex == -1)
|
||||||
@@ -956,7 +1072,10 @@ public class RagfairController
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return _httpResponseUtil.AppendErrorToOutput(output, _localisationService.GetText("ragfair-offer_not_found_in_profile_short"));
|
return _httpResponseUtil.AppendErrorToOutput(
|
||||||
|
output,
|
||||||
|
_localisationService.GetText("ragfair-offer_not_found_in_profile_short")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
var playerOffer = playerOffers[playerOfferIndex];
|
var playerOffer = playerOffers[playerOfferIndex];
|
||||||
@@ -966,7 +1085,10 @@ public class RagfairController
|
|||||||
{
|
{
|
||||||
var count = 1;
|
var count = 1;
|
||||||
var sellInOncePiece = playerOffer.SellInOnePiece.GetValueOrDefault(false);
|
var sellInOncePiece = playerOffer.SellInOnePiece.GetValueOrDefault(false);
|
||||||
if (!sellInOncePiece) count = (int)playerOffer.Items.Sum(offerItem => offerItem.Upd?.StackObjectsCount ?? 0);
|
if (!sellInOncePiece)
|
||||||
|
{
|
||||||
|
count = (int)playerOffer.Items.Sum(offerItem => offerItem.Upd?.StackObjectsCount ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
var tax = _ragfairTaxService.CalculateTax(
|
var tax = _ragfairTaxService.CalculateTax(
|
||||||
playerOffer.Items.First(),
|
playerOffer.Items.First(),
|
||||||
@@ -979,10 +1101,12 @@ public class RagfairController
|
|||||||
var request = CreateBuyTradeRequestObject(CurrencyType.RUB, tax);
|
var request = CreateBuyTradeRequestObject(CurrencyType.RUB, tax);
|
||||||
_paymentService.PayMoney(pmcData, request, sessionId, output);
|
_paymentService.PayMoney(pmcData, request, sessionId, output);
|
||||||
if (output.Warnings.Count > 0)
|
if (output.Warnings.Count > 0)
|
||||||
|
{
|
||||||
return _httpResponseUtil.AppendErrorToOutput(
|
return _httpResponseUtil.AppendErrorToOutput(
|
||||||
output,
|
output,
|
||||||
_localisationService.GetText("ragfair-unable_to_pay_commission_fee")
|
_localisationService.GetText("ragfair-unable_to_pay_commission_fee")
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add extra time to offer
|
// Add extra time to offer
|
||||||
@@ -1024,7 +1148,7 @@ public class RagfairController
|
|||||||
public RagfairOffer? GetOfferById(string sessionId, GetRagfairOfferByIdRequest request)
|
public RagfairOffer? GetOfferById(string sessionId, GetRagfairOfferByIdRequest request)
|
||||||
{
|
{
|
||||||
var offers = _ragfairOfferService.GetOffers();
|
var offers = _ragfairOfferService.GetOffers();
|
||||||
var offerToReturn = offers.FirstOrDefault((offer) => offer.InternalId == request.Id);
|
var offerToReturn = offers.FirstOrDefault(offer => offer.InternalId == request.Id);
|
||||||
|
|
||||||
return offerToReturn;
|
return offerToReturn;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,9 +53,13 @@ public class RagfairOfferService(
|
|||||||
ragfairOfferHolder.AddOffer(offer);
|
ragfairOfferHolder.AddOffer(offer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddOfferToExpired(RagfairOffer staleOffer)
|
/// <summary>
|
||||||
|
/// Add a stale offers id to collection for later use
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="staleOfferId">Id of offer to add to stale collection</param>
|
||||||
|
public void AddOfferIdToExpired(string staleOfferId)
|
||||||
{
|
{
|
||||||
_expiredOfferIds.Add(staleOffer.Id);
|
_expiredOfferIds.Add(staleOfferId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,7 +83,7 @@ public class RagfairOfferService(
|
|||||||
foreach (var expiredOfferId in _expiredOfferIds)
|
foreach (var expiredOfferId in _expiredOfferIds)
|
||||||
{
|
{
|
||||||
var offer = ragfairOfferHolder.GetOfferById(expiredOfferId);
|
var offer = ragfairOfferHolder.GetOfferById(expiredOfferId);
|
||||||
if (offer?.Items is null)
|
if (offer?.Items?.Count == 0)
|
||||||
{
|
{
|
||||||
logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items");
|
logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items");
|
||||||
|
|
||||||
@@ -95,7 +99,7 @@ public class RagfairOfferService(
|
|||||||
/**
|
/**
|
||||||
* Clear out internal expiredOffers dictionary of all items
|
* Clear out internal expiredOffers dictionary of all items
|
||||||
*/
|
*/
|
||||||
public void ResetExpiredOffers()
|
public void ResetExpiredOfferIds()
|
||||||
{
|
{
|
||||||
_expiredOfferIds.Clear();
|
_expiredOfferIds.Clear();
|
||||||
}
|
}
|
||||||
@@ -129,8 +133,13 @@ public class RagfairOfferService(
|
|||||||
var offer = ragfairOfferHolder.GetOfferById(offerId);
|
var offer = ragfairOfferHolder.GetOfferById(offerId);
|
||||||
if (offer != null)
|
if (offer != null)
|
||||||
{
|
{
|
||||||
offer.Items[0].Upd.StackObjectsCount -= amount;
|
var rootItem = offer.Items[0];
|
||||||
if (offer.Items[0].Upd.StackObjectsCount <= 0) ProcessStaleOffer(offer);
|
rootItem.Upd.StackObjectsCount -= amount;
|
||||||
|
if (rootItem.Upd.StackObjectsCount <= 0)
|
||||||
|
{
|
||||||
|
// Reducing stack size has made it 0, offer is now 'stale'
|
||||||
|
ProcessStaleOffer(offer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +178,9 @@ public class RagfairOfferService(
|
|||||||
|
|
||||||
if (pmcData?.RagfairInfo == null || pmcData.RagfairInfo.Offers == null)
|
if (pmcData?.RagfairInfo == null || pmcData.RagfairInfo.Offers == null)
|
||||||
// Profile is wiped
|
// Profile is wiped
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ragfairOfferHolder.AddOffers(pmcData.RagfairInfo.Offers);
|
ragfairOfferHolder.AddOffers(pmcData.RagfairInfo.Offers);
|
||||||
}
|
}
|
||||||
@@ -181,7 +192,10 @@ public class RagfairOfferService(
|
|||||||
public void ExpireStaleOffers()
|
public void ExpireStaleOffers()
|
||||||
{
|
{
|
||||||
var time = timeUtil.GetTimeStamp();
|
var time = timeUtil.GetTimeStamp();
|
||||||
foreach (var staleOffer in ragfairOfferHolder.GetStaleOffers(time)) ProcessStaleOffer(staleOffer);
|
foreach (var staleOffer in ragfairOfferHolder.GetStaleOffers(time))
|
||||||
|
{
|
||||||
|
ProcessStaleOffer(staleOffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -190,17 +204,24 @@ public class RagfairOfferService(
|
|||||||
*/
|
*/
|
||||||
protected void ProcessStaleOffer(RagfairOffer staleOffer)
|
protected void ProcessStaleOffer(RagfairOffer staleOffer)
|
||||||
{
|
{
|
||||||
|
var staleOfferId = staleOffer.Id;
|
||||||
var staleOfferUserId = staleOffer.User.Id;
|
var staleOfferUserId = staleOffer.User.Id;
|
||||||
|
|
||||||
var isTrader = ragfairServerHelper.IsTrader(staleOfferUserId);
|
var isTrader = ragfairServerHelper.IsTrader(staleOfferUserId);
|
||||||
var isPlayer = profileHelper.IsPlayer(staleOfferUserId.RegexReplace("^pmc", ""));
|
var isPlayer = profileHelper.IsPlayer(staleOfferUserId.RegexReplace("^pmc", ""));
|
||||||
|
|
||||||
// Skip trader offers, managed by RagfairServer.update()
|
// Skip trader offers, managed by RagfairServer.update()
|
||||||
if (isTrader) return;
|
if (isTrader)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Handle dynamic offer
|
// Handle dynamic offer
|
||||||
if (!(isTrader || isPlayer))
|
if (!(isTrader || isPlayer))
|
||||||
// Dynamic offer
|
// Dynamic offer
|
||||||
AddOfferToExpired(staleOffer);
|
{
|
||||||
|
AddOfferIdToExpired(staleOfferId);
|
||||||
|
}
|
||||||
|
|
||||||
// Handle player offer - items need returning/XP adjusting. Checking if offer has actually expired or not.
|
// Handle player offer - items need returning/XP adjusting. Checking if offer has actually expired or not.
|
||||||
if (isPlayer && staleOffer.EndTime <= timeUtil.GetTimeStamp())
|
if (isPlayer && staleOffer.EndTime <= timeUtil.GetTimeStamp())
|
||||||
@@ -210,7 +231,7 @@ public class RagfairOfferService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove expired existing offer from global offers
|
// Remove expired existing offer from global offers
|
||||||
RemoveOfferById(staleOffer.Id);
|
RemoveOfferById(staleOfferId);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void ReturnPlayerOffer(RagfairOffer playerOffer)
|
protected void ReturnPlayerOffer(RagfairOffer playerOffer)
|
||||||
@@ -223,7 +244,7 @@ public class RagfairOfferService(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var offerinProfileIndex = profile.RagfairInfo.Offers.FindIndex((o) => o.Id == playerOffer.Id);
|
var offerinProfileIndex = profile.RagfairInfo.Offers.FindIndex(o => o.Id == playerOffer.Id);
|
||||||
if (offerinProfileIndex == -1)
|
if (offerinProfileIndex == -1)
|
||||||
{
|
{
|
||||||
logger.Warning(localisationService.GetText("ragfair-unable_to_find_offer_to_remove", playerOffer.Id));
|
logger.Warning(localisationService.GetText("ragfair-unable_to_find_offer_to_remove", playerOffer.Id));
|
||||||
@@ -240,7 +261,9 @@ public class RagfairOfferService(
|
|||||||
|
|
||||||
var firstOfferItem = playerOffer.Items[0];
|
var firstOfferItem = playerOffer.Items[0];
|
||||||
if (firstOfferItem.Upd.StackObjectsCount > firstOfferItem.Upd.OriginalStackObjectsCount)
|
if (firstOfferItem.Upd.StackObjectsCount > firstOfferItem.Upd.OriginalStackObjectsCount)
|
||||||
|
{
|
||||||
playerOffer.Items[0].Upd.StackObjectsCount = firstOfferItem.Upd.OriginalStackObjectsCount;
|
playerOffer.Items[0].Upd.StackObjectsCount = firstOfferItem.Upd.OriginalStackObjectsCount;
|
||||||
|
}
|
||||||
|
|
||||||
playerOffer.Items[0].Upd.OriginalStackObjectsCount = null;
|
playerOffer.Items[0].Upd.OriginalStackObjectsCount = null;
|
||||||
// Remove player offer from flea
|
// Remove player offer from flea
|
||||||
@@ -253,8 +276,12 @@ public class RagfairOfferService(
|
|||||||
var newParentId = hashUtil.Generate();
|
var newParentId = hashUtil.Generate();
|
||||||
foreach (var item in unstackedItems)
|
foreach (var item in unstackedItems)
|
||||||
// Refresh root items' parentIds
|
// Refresh root items' parentIds
|
||||||
|
{
|
||||||
if (item.ParentId == "hideout")
|
if (item.ParentId == "hideout")
|
||||||
|
{
|
||||||
item.ParentId = newParentId;
|
item.ParentId = newParentId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ragfairServerHelper.ReturnItems(profile.SessionId, unstackedItems);
|
ragfairServerHelper.ReturnItems(profile.SessionId, unstackedItems);
|
||||||
profile.RagfairInfo.Offers.Splice(offerinProfileIndex, 1);
|
profile.RagfairInfo.Offers.Splice(offerinProfileIndex, 1);
|
||||||
@@ -280,13 +307,19 @@ public class RagfairOfferService(
|
|||||||
if (totalItemCount <= itemMaxStackSize)
|
if (totalItemCount <= itemMaxStackSize)
|
||||||
{
|
{
|
||||||
// Edge case - Ensure items stack count isnt < 1
|
// Edge case - Ensure items stack count isnt < 1
|
||||||
if (items[0]?.Upd?.StackObjectsCount < 1) items[0].Upd.StackObjectsCount = 1;
|
if (items[0]?.Upd?.StackObjectsCount < 1)
|
||||||
|
{
|
||||||
|
items[0].Upd.StackObjectsCount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Single item with no children e.g. ammo, use existing de-stacking code
|
// Single item with no children e.g. ammo, use existing de-stacking code
|
||||||
if (items.Count == 1) return itemHelper.SplitStack(rootItem);
|
if (items.Count == 1)
|
||||||
|
{
|
||||||
|
return itemHelper.SplitStack(rootItem);
|
||||||
|
}
|
||||||
|
|
||||||
// Item with children, needs special handling
|
// Item with children, needs special handling
|
||||||
// Force new item to have stack size of 1
|
// Force new item to have stack size of 1
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ public class RagfairOfferHolder(
|
|||||||
|
|
||||||
var result = _offersById
|
var result = _offersById
|
||||||
.Where(x => offerIds.Contains(x.Key))
|
.Where(x => offerIds.Contains(x.Key))
|
||||||
.Select(x => x.Value).ToList();
|
.Select(x => x.Value)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -70,7 +71,10 @@ public class RagfairOfferHolder(
|
|||||||
{
|
{
|
||||||
lock (_offersByIdLock)
|
lock (_offersByIdLock)
|
||||||
{
|
{
|
||||||
if (_offersById.Count > 0) return _offersById.Values.ToList();
|
if (_offersById.Count > 0)
|
||||||
|
{
|
||||||
|
return _offersById.Values.ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
@@ -78,7 +82,10 @@ public class RagfairOfferHolder(
|
|||||||
|
|
||||||
public void AddOffers(List<RagfairOffer> offers)
|
public void AddOffers(List<RagfairOffer> offers)
|
||||||
{
|
{
|
||||||
foreach (var offer in offers) AddOffer(offer);
|
foreach (var offer in offers)
|
||||||
|
{
|
||||||
|
AddOffer(offer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddOffer(RagfairOffer offer)
|
public void AddOffer(RagfairOffer offer)
|
||||||
@@ -87,19 +94,16 @@ public class RagfairOfferHolder(
|
|||||||
{
|
{
|
||||||
var sellerId = offer.User.Id;
|
var sellerId = offer.User.Id;
|
||||||
// Keep generating IDs until we get a unique one
|
// Keep generating IDs until we get a unique one
|
||||||
while (_offersById.ContainsKey(offer.Id))
|
while (_offersById.ContainsKey(offer.Id)) offer.Id = hashUtil.Generate();
|
||||||
{
|
|
||||||
offer.Id = hashUtil.Generate();
|
|
||||||
}
|
|
||||||
|
|
||||||
var offerId = offer.Id;
|
var offerId = offer.Id;
|
||||||
var itemTpl = offer.Items?.FirstOrDefault()?.Template;
|
var itemTpl = offer.Items?.FirstOrDefault()?.Template;
|
||||||
// If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers
|
// If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers
|
||||||
// for this template, just don't add in more
|
// for this template, just don't add in more
|
||||||
if (itemTpl != null
|
if (itemTpl != null &&
|
||||||
&& !(ragfairServerHelper.IsTrader(sellerId) || profileHelper.IsPlayer(sellerId))
|
!(ragfairServerHelper.IsTrader(sellerId) || profileHelper.IsPlayer(sellerId)) &&
|
||||||
&& _offersByTemplate.TryGetValue(itemTpl, out var offers)
|
_offersByTemplate.TryGetValue(itemTpl, out var offers) &&
|
||||||
&& offers?.Count >= _maxOffersPerTemplate
|
offers?.Count >= _maxOffersPerTemplate
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -136,7 +140,10 @@ public class RagfairOfferHolder(
|
|||||||
// the user ID from the cached offers after they dont have anything else
|
// the user ID from the cached offers after they dont have anything else
|
||||||
// on the flea placed. We regenerate the ID for the NPC users, making it
|
// on the flea placed. We regenerate the ID for the NPC users, making it
|
||||||
// continuously grow otherwise
|
// continuously grow otherwise
|
||||||
if (_offersByTrader[offer.User.Id].Count == 0) _offersByTrader.Remove(offer.User.Id);
|
if (_offersByTrader[offer.User.Id].Count == 0)
|
||||||
|
{
|
||||||
|
_offersByTrader.Remove(offer.User.Id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,9 +180,9 @@ public class RagfairOfferHolder(
|
|||||||
* Get an array of stale offers that are still shown to player
|
* Get an array of stale offers that are still shown to player
|
||||||
* @returns RagfairOffer array
|
* @returns RagfairOffer array
|
||||||
*/
|
*/
|
||||||
public List<RagfairOffer> GetStaleOffers(long time)
|
public IEnumerable<RagfairOffer> GetStaleOffers(long time)
|
||||||
{
|
{
|
||||||
return GetOffers().Where(o => IsStale(o, time)).ToList();
|
return GetOffers().Where(o => IsStale(o, time));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void AddOfferByTemplates(string template, RagfairOffer offer)
|
protected void AddOfferByTemplates(string template, RagfairOffer offer)
|
||||||
@@ -210,7 +217,10 @@ public class RagfairOfferHolder(
|
|||||||
|
|
||||||
protected bool IsStale(RagfairOffer? offer, long time)
|
protected bool IsStale(RagfairOffer? offer, long time)
|
||||||
{
|
{
|
||||||
if (offer is null) return false;
|
if (offer is null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return offer.EndTime < time || (offer.Items.FirstOrDefault().Upd?.StackObjectsCount ?? 0) < 1;
|
return offer.EndTime < time || (offer.Items.FirstOrDefault().Upd?.StackObjectsCount ?? 0) < 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user