server-master/srcs/WingsAPI.Game.Extensions/PacketGeneration/NosBazaarPacketsExtensions.cs
2026-02-10 18:21:30 +01:00

127 lines
No EOL
7.3 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using System;
using System.Collections.Generic;
using System.Linq;
using WingsAPI.Game.Extensions.Bazaar;
using WingsAPI.Packets.Enums.Bazaar;
using WingsEmu.DTOs.Items;
using WingsEmu.Game.Algorithm;
using WingsEmu.Game.Bazaar;
using WingsEmu.Game.Bazaar.Configuration;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Items;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Networking;
namespace WingsAPI.Game.Extensions.PacketGeneration
{
public static class NosBazaarPacketsExtensions
{
public static string GenerateBazaarItemsPacket(this IClientSession session) => "rc_blist";
public static string GenerateRcScalc(bool returned, long pricePerUnit, int soldAmount, int totalAmount, long taxes, long totalProfit, long itemVNum)
=> $"rc_scalc {(returned ? 1 : 0).ToString()} {pricePerUnit.ToString()} {soldAmount.ToString()} {totalAmount.ToString()} {taxes.ToString()} {totalProfit.ToString()} {itemVNum.ToString()}";
//rc_scalc 1 233 0 1 0 0 2038
public static string GenerateRcBuy(bool returned, long itemVNum, string seller, short amount, long pricePerUnit, long upgrade, long rarity)
=> $"rc_buy {(returned ? 1 : 0).ToString()} {itemVNum.ToString()} {seller} {amount.ToString()} {pricePerUnit.ToString()} 0 {upgrade.ToString()} {rarity.ToString()}";
public static string GenerateCharacterBazaarItemsPacket(ushort index, IReadOnlyCollection<BazaarItem> items, BazaarListedItemType filter, IItemsManager itemsManager,
ICharacterAlgorithm characterAlgorithm, BazaarConfiguration bazaarConfiguration)
{
const string header = "rc_slist";
if (items == null || !items.Any())
{
return $"{header} 0";
}
string itemsPacket = string.Empty;
int ignoreCounter = index * bazaarConfiguration.ItemsPerIndex;
int sendCounter = 0;
foreach (BazaarItem bazaarItem in items.OrderByDescending(i => i.BazaarItemDto.Id))
{
BazaarListedItemType itemStatus = bazaarItem.BazaarItemDto.GetBazaarItemStatus();
if (filter != BazaarListedItemType.All && itemStatus != filter)
{
continue;
}
if (ignoreCounter > 0)
{
ignoreCounter--;
continue;
}
if (sendCounter >= bazaarConfiguration.ItemsPerIndex)
{
break;
}
sendCounter++;
string minutesPassed = (itemStatus == BazaarListedItemType.DeadlineExpired || (bazaarItem.BazaarItemDto.Amount - bazaarItem.BazaarItemDto.SoldAmount) == 0
? -1
: (int)(bazaarItem.BazaarItemDto.ExpiryDate - DateTime.UtcNow).TotalMinutes).ToString();
GameItemInstance itemInstance = bazaarItem.Item.Type != ItemInstanceType.NORMAL_ITEM ? bazaarItem.Item : null;
string eqPacket = itemInstance == null ? string.Empty : itemInstance.GenerateEInfo(itemsManager, characterAlgorithm).Replace("e_info ", string.Empty).Replace(" ", "^");
itemsPacket +=
$" {bazaarItem.BazaarItemDto.Id.ToString()}|{bazaarItem.BazaarItemDto.CharacterId.ToString()}|{bazaarItem.Item.ItemVNum.ToString()}|{bazaarItem.BazaarItemDto.SoldAmount.ToString()}" +
$"|{bazaarItem.BazaarItemDto.Amount.ToString()}|{(bazaarItem.BazaarItemDto.IsPackage ? 1 : 0).ToString()}|{bazaarItem.BazaarItemDto.PricePerItem.ToString()}|{((byte)itemStatus).ToString()}" +
$"|{minutesPassed}|{(bazaarItem.BazaarItemDto.UsedMedal ? 1 : 0).ToString()}|0|{bazaarItem.Item.Rarity.ToString()}|{bazaarItem.Item.Upgrade.ToString()}" +
$"|{(itemInstance?.GetInternalRunesCount() ?? 0).ToString()}|0|{eqPacket}";
}
return $"rc_slist {index.ToString()}{itemsPacket}"; //Space removed cause it will be added by the generation of the packet
}
public static string GenerateSearchResponseBazaarItemsPacket(int index, IReadOnlyCollection<BazaarItem> items, IItemsManager itemsManager, ICharacterAlgorithm characterAlgorithm,
BazaarConfiguration bazaarConfiguration)
{
const string header = "rc_blist";
if (items == null || !items.Any())
{
return $"{header} 0";
}
string itemsPacket = string.Empty;
foreach (BazaarItem bazaarItem in items)
{
string minutesPassed = ((int)(bazaarItem.BazaarItemDto.ExpiryDate - DateTime.UtcNow).TotalMinutes).ToString();
GameItemInstance itemInstance = bazaarItem.Item.Type != ItemInstanceType.NORMAL_ITEM ? bazaarItem.Item : null;
string eqPacket = itemInstance == null ? string.Empty : itemInstance.GenerateEInfo(itemsManager, characterAlgorithm).Replace("e_info ", string.Empty).Replace(" ", "^");
itemsPacket += $" {bazaarItem.BazaarItemDto.Id.ToString()}|{bazaarItem.BazaarItemDto.CharacterId.ToString()}|{bazaarItem.OwnerName}|{bazaarItem.Item.ItemVNum.ToString()}" +
$"|{(bazaarItem.BazaarItemDto.Amount - bazaarItem.BazaarItemDto.SoldAmount).ToString()}|{(bazaarItem.BazaarItemDto.IsPackage ? 1 : 0).ToString()}" +
$"|{bazaarItem.BazaarItemDto.PricePerItem.ToString()}|{minutesPassed}|2|0|{bazaarItem.Item.Rarity.ToString()}|{bazaarItem.Item.Upgrade.ToString()}" +
$"|{itemInstance?.GetRunesCount().ToString()}|0|{eqPacket}";
}
return $"rc_blist {index.ToString()}{itemsPacket}"; //Space removed cause it will be added by the generation of the packet
}
public static void SendBazaarItems(this IClientSession session) => session.SendPacket(session.GenerateBazaarItemsPacket());
public static void SendSearchResponseBazaarItems(this IClientSession session, int index, IReadOnlyCollection<BazaarItem> items, IItemsManager itemsManager,
ICharacterAlgorithm characterAlgorithm, BazaarConfiguration bazaarConfiguration)
=> session.SendPacket(GenerateSearchResponseBazaarItemsPacket(index, items, itemsManager, characterAlgorithm, bazaarConfiguration));
public static void SendCharacterListedBazaarItems(this IClientSession session, ushort index, IReadOnlyCollection<BazaarItem> items, BazaarListedItemType filter, IItemsManager itemsManager,
ICharacterAlgorithm characterAlgorithm, BazaarConfiguration bazaarConfiguration)
=> session.SendPacket(GenerateCharacterBazaarItemsPacket(index, items, filter, itemsManager, characterAlgorithm, bazaarConfiguration));
public static void SendBazaarResponseItemRemove(this IClientSession session, bool returned, long pricePerUnit, int soldAmount, int totalAmount, long taxes, long totalProfit, long itemVNum)
{
session.SendPacket(GenerateRcScalc(returned, pricePerUnit, soldAmount, totalAmount, taxes, totalProfit, itemVNum));
}
public static void SendBazaarResponseItemBuy(this IClientSession session, bool returned, long itemVNum, string seller, short amount, long pricePerUnit, long upgrade, long rarity)
{
session.SendPacket(GenerateRcBuy(returned, itemVNum, seller, amount, pricePerUnit, upgrade, rarity));
}
}
}