finish tradeController

This commit is contained in:
CWX
2025-01-22 12:03:59 +00:00
parent 536751e6c0
commit 8c832cb8cb
+101 -11
View File
@@ -23,6 +23,7 @@ public class TradeController(
EventOutputHolder _eventOutputHolder,
TradeHelper _tradeHelper,
TimeUtil _timeUtil,
RandomUtil _randomUtil,
HashUtil _hashUtil,
ItemHelper _itemHelper,
ProfileHelper _profileHelper,
@@ -32,6 +33,7 @@ public class TradeController(
HttpResponseUtil _httpResponseUtil,
LocalisationService _localisationService,
RagfairPriceService _ragfairPriceService,
MailSendService _mailSendService,
ConfigServer _configServer
)
{
@@ -147,7 +149,8 @@ public class TradeController(
ItemEventRouterResponse output)
{
// Skip buying items when player doesn't have needed loyalty
if (PlayerLacksTraderLoyaltyLevelToBuyOffer(fleaOffer, pmcData)) {
if (PlayerLacksTraderLoyaltyLevelToBuyOffer(fleaOffer, pmcData))
{
var errorMessage = $"Unable to buy item: {fleaOffer.Items[0].Template} from trader: {fleaOffer.User.Id} as loyalty level too low, skipping";
_logger.Debug(errorMessage);
@@ -156,7 +159,8 @@ public class TradeController(
return;
}
ProcessBuyTradeRequestData buyData = new ProcessBuyTradeRequestData {
ProcessBuyTradeRequestData buyData = new ProcessBuyTradeRequestData
{
Action = "TradingConfirm",
Type = "buy_from_ragfair",
TransactionId = fleaOffer.User.Id,
@@ -181,10 +185,42 @@ public class TradeController(
string sessionId,
PmcData pmcData,
RagfairOffer fleaOffer,
OfferRequest offerRequest,
OfferRequest requestOffer,
ItemEventRouterResponse output)
{
throw new NotImplementedException();
ProcessBuyTradeRequestData buyData = new ProcessBuyTradeRequestData
{
Action = "TradingConfirm",
Type = "buy_from_ragfair",
TransactionId = "ragfair",
ItemId = fleaOffer.Id, // Store ragfair offerId in buyRequestData.item_id
Count = requestOffer.Count,
SchemeId = 0,
SchemeItems = requestOffer.Items,
};
// buyItem() must occur prior to removing the offer stack, otherwise item inside offer doesn't exist for confirmTrading() to use
_tradeHelper.buyItem(pmcData, buyData, sessionId, _ragfairConfig.Dynamic.PurchasesAreFoundInRaid, output);
if (output.Warnings?.Count > 0)
{
return;
}
// resolve when a profile buy another profile's offer
var offerOwnerId = fleaOffer.User?.Id;
var offerBuyCount = requestOffer.Count;
var isPlayerOffer = IsPlayerOffer(fleaOffer.Id, fleaOffer.User?.Id);
if (isPlayerOffer)
{
// Complete selling the offer now its been purchased
_ragfairOfferHelper.CompleteOffer(offerOwnerId, fleaOffer, offerBuyCount ?? 0);
return;
}
// Remove/lower stack count of item purchased from PMC flea offer
_ragfairServer.RemoveOfferStack(fleaOffer.Id, requestOffer.Count ?? 0);
}
/// <summary>
@@ -195,9 +231,23 @@ public class TradeController(
/// <returns>true if offer was made by a player</returns>
private bool IsPlayerOffer(
string offerId,
string offerOwnerId)
string? offerOwnerId)
{
throw new NotImplementedException();
// No ownerid, not player offer
if (offerOwnerId is null)
{
return false;
}
var offerCreatorProfile = _profileHelper.GetPmcProfile(offerOwnerId);
if (offerCreatorProfile is null || offerCreatorProfile.RagfairInfo.Offers?.Count == 0)
{
// No profile or no offers
return false;
}
// Does offer id exist in profile
return offerCreatorProfile.RagfairInfo.Offers.Any(offer => offer.Id == offerId);
}
/// <summary>
@@ -210,7 +260,7 @@ public class TradeController(
RagfairOffer fleaOffer,
PmcData pmcData)
{
throw new NotImplementedException();
return fleaOffer.LoyaltyLevel > pmcData.TradersInfo[fleaOffer.User.Id].LoyaltyLevel;
}
/// <summary>
@@ -225,7 +275,11 @@ public class TradeController(
SellScavItemsToFenceRequestData request,
string sessionId)
{
throw new NotImplementedException();
var output = _eventOutputHolder.GetOutput(sessionId);
MailMoneyToPlayer(sessionId, (int)request.TotalValue, Traders.FENCE);
return output;
}
/// <summary>
@@ -239,7 +293,28 @@ public class TradeController(
int roublesToSend,
string trader)
{
throw new NotImplementedException();
_logger.Debug($"Selling scav items to fence for {roublesToSend} roubles");
// Create single currency item with all currency on it
Item rootCurrencyReward = new Item
{
Id = _hashUtil.Generate(),
Template = Money.ROUBLES,
Upd = new Upd { StackObjectsCount = roublesToSend },
};
// Ensure money is properly split to follow its max stack size limit
var curencyReward = _itemHelper.SplitStackIntoSeparateItems(rootCurrencyReward);
// Send mail from trader
_mailSendService.SendLocalisedNpcMessageToPlayer(
sessionId,
_traderHelper.GetTraderById(trader).ToString(),
MessageType.MESSAGE_WITH_ITEMS,
_randomUtil.GetArrayValue((_databaseService.GetTrader(trader).Dialogue.TryGetValue("SoldItems", out var items)) ? items : new List<string>()),
curencyReward.SelectMany(x => x).ToList(),
_timeUtil.GetHoursAsSeconds(72)
);
}
/// <summary>
@@ -253,9 +328,24 @@ public class TradeController(
private int GetPriceOfItemAndChildren(
string parentItemId,
List<Item> items,
Dictionary<string, int> handbookPrices,
Dictionary<string, int?> handbookPrices,
TraderBase traderDetails)
{
throw new NotImplementedException();
var itemWithChildren = _itemHelper.FindAndReturnChildrenAsItems(items, parentItemId);
var totalPrice = 0;
foreach (var itemToSell in itemWithChildren) {
var itemDetails = _itemHelper.GetItem(itemToSell.Template);
if (!(itemDetails.Key && _itemHelper.IsOfBaseclasses(itemDetails.Value.Id, traderDetails.ItemsBuy.Category)))
{
// Skip if tpl isn't item OR item doesn't fulfil match traders buy categories
continue;
}
// Get price of item multiplied by how many are in stack
totalPrice += (int)((handbookPrices[itemToSell.Template] ?? 0) * (itemToSell.Upd?.StackObjectsCount ?? 1));
}
return totalPrice;
}
}