mirror of
https://github.com/EQEmu/Server.git
synced 2026-01-04 11:33:52 +00:00
* Add RoF2 Bazaar Support Enable RoF2 bazaar features * Add augments to Trader Items * Cleanup Cleanup of formatting and unused functions * Update PlayerProfile for correct char_id in trader transactions. Further cleanup. * Add parcel delivery price functionality Add parcel delivery price functionality via rules and new delivery cost struct. * Add RoF support for bazaar window outside of bazaar with parcel delivery * Further Testing and ActiveTransaction added Further testing and a few fixes and messages added. Add active transaction check to ensure two clients cannot purchase from the bazaar window at the same time * Cleanup and Formatting updates Cleanup and Formatting updates * Update database manifest for the trader table against default peq trader table * Logs and formatting * Update bazaarsearch to be content_db aware * Fix crash * Simplify search * Search fixes * Push up more search logging * More search fixes * Formatting * Update trader_repository.h * Add Rule for Bazaar Parcel Delivery Add a rule Bazaar:EnableParcelDelivery to enable/disable bazaar parcel delivery. Default is True. * Fix crash * Update Bazaar Search Adds/Tested bazaar search with move to content_db - race, class, money, number of returned items, stats, name, slot, level, traders, local traders, specific trader. Outstanding - type, more stats to add (heroic, etc) * Formatting * Push * Update bazaarsearch to include all stats that are available in RoF2 * Update BazaarSearch Updates the bazaar search for item types. They should be working as per RoF2+ types. * Formatting * Final updates to BazaarSearch Add search by augmentation slots available on the item. This enables all but Prestige, which I believe are not implemented yet. * Add Titanium functionality correct ItemType Search Add Titanium /trader /bazaar functionality. Added itemtype=armor bazaar search. It was missed in the search work * Close off for loops --------- Co-authored-by: Akkadius <akkadius1@gmail.com>
225 lines
5.1 KiB
C++
225 lines
5.1 KiB
C++
#ifndef EQEMU_TRADER_REPOSITORY_H
|
|
#define EQEMU_TRADER_REPOSITORY_H
|
|
|
|
#include "../../common/shareddb.h"
|
|
#include "../strings.h"
|
|
#include "base/base_trader_repository.h"
|
|
#include "items_repository.h"
|
|
#include "../../common/item_data.h"
|
|
#include "../../common/races.h"
|
|
#include "../cereal/include/cereal/archives/binary.hpp"
|
|
#include "../cereal/include/cereal/types/string.hpp"
|
|
|
|
class TraderRepository : public BaseTraderRepository {
|
|
public:
|
|
|
|
struct DistinctTraders_Struct {
|
|
uint32 trader_id;
|
|
uint32 zone_id;
|
|
uint32 entity_id;
|
|
std::string trader_name;
|
|
};
|
|
|
|
struct BulkTraders_Struct {
|
|
uint32 count{0};
|
|
uint32 name_length{0};
|
|
std::vector<DistinctTraders_Struct> traders{};
|
|
};
|
|
|
|
struct WelcomeData_Struct {
|
|
uint32 count_of_traders;
|
|
uint32 count_of_items;
|
|
};
|
|
|
|
static std::vector<BazaarSearchResultsFromDB_Struct>
|
|
GetBazaarSearchResults(
|
|
SharedDatabase &db,
|
|
BazaarSearchCriteria_Struct search,
|
|
uint32 char_zone_id
|
|
);
|
|
|
|
static BulkTraders_Struct GetDistinctTraders(Database &db)
|
|
{
|
|
BulkTraders_Struct all_entries{};
|
|
std::vector<DistinctTraders_Struct> distinct_traders;
|
|
|
|
auto results = db.QueryDatabase(
|
|
"SELECT DISTINCT(t.char_id), t.char_zone_id, t.char_entity_id, c.name "
|
|
"FROM trader AS t "
|
|
"JOIN character_data AS c ON t.char_id = c.id;"
|
|
);
|
|
|
|
distinct_traders.reserve(results.RowCount());
|
|
|
|
for (auto row: results) {
|
|
DistinctTraders_Struct e{};
|
|
|
|
e.trader_id = Strings::ToInt(row[0]);
|
|
e.zone_id = Strings::ToInt(row[1]);
|
|
e.entity_id = Strings::ToInt(row[2]);
|
|
e.trader_name = row[3] ? row[3] : "";
|
|
all_entries.name_length += e.trader_name.length() + 1;
|
|
|
|
all_entries.traders.push_back(e);
|
|
}
|
|
all_entries.count = results.RowCount();
|
|
return all_entries;
|
|
}
|
|
|
|
static WelcomeData_Struct GetWelcomeData(Database &db)
|
|
{
|
|
WelcomeData_Struct e{};
|
|
|
|
auto results = db.QueryDatabase("SELECT COUNT(DISTINCT char_id), count(char_id) FROM trader;");
|
|
|
|
if (!results.RowCount()) {
|
|
return e;
|
|
}
|
|
|
|
auto r = results.begin();
|
|
e.count_of_traders = Strings::ToInt(r[0]);
|
|
e.count_of_items = Strings::ToInt(r[1]);
|
|
return e;
|
|
}
|
|
|
|
static int UpdateItem(Database &db, uint32 char_id, uint32 new_price, uint32 item_id, uint32 item_charges)
|
|
{
|
|
std::vector<BaseTraderRepository::Trader> items{};
|
|
if (item_charges == 0) {
|
|
items = GetWhere(
|
|
db,
|
|
fmt::format(
|
|
"char_id = '{}' AND item_id = '{}'",
|
|
char_id,
|
|
item_id
|
|
)
|
|
);
|
|
}
|
|
else {
|
|
items = GetWhere(
|
|
db,
|
|
fmt::format(
|
|
"char_id = '{}' AND item_id = '{}' AND item_charges = '{}'",
|
|
char_id,
|
|
item_id,
|
|
item_charges
|
|
)
|
|
);
|
|
}
|
|
|
|
if (items.empty()) {
|
|
return 0;
|
|
}
|
|
|
|
for (auto &i: items) {
|
|
i.item_cost = new_price;
|
|
}
|
|
|
|
return ReplaceMany(db, items);
|
|
}
|
|
|
|
static Trader GetTraderItem(Database &db, uint32 trader_id, uint32 item_id, uint32 item_cost)
|
|
{
|
|
Trader item{};
|
|
|
|
auto query = fmt::format(
|
|
"SELECT t.char_id, t.item_id, t.serialnumber, t.charges, t.item_cost, t.slot_id, t.entity_id FROM trader AS t "
|
|
"WHERE t.entity_id = {} AND t.item_id = {} AND t.item_cost = {} "
|
|
"LIMIT 1;",
|
|
trader_id,
|
|
item_id,
|
|
item_cost
|
|
);
|
|
auto results = db.QueryDatabase(query);
|
|
|
|
if (results.RowCount() == 0) {
|
|
return item;
|
|
}
|
|
|
|
auto row = results.begin();
|
|
item.char_id = Strings::ToInt(row[0]);
|
|
item.item_id = Strings::ToInt(row[1]);
|
|
item.item_sn = Strings::ToInt(row[2]);
|
|
item.item_charges = Strings::ToInt(row[3]);
|
|
item.item_cost = Strings::ToInt(row[4]);
|
|
item.slot_id = Strings::ToInt(row[5]);
|
|
|
|
return item;
|
|
}
|
|
|
|
static int UpdateQuantity(Database &db, uint32 char_id, uint32 serial_number, int16 quantity)
|
|
{
|
|
const auto trader_item = GetWhere(
|
|
db,
|
|
fmt::format("char_id = '{}' AND item_sn = '{}' ", char_id, serial_number)
|
|
);
|
|
|
|
if (trader_item.empty() || trader_item.size() > 1) {
|
|
return 0;
|
|
}
|
|
|
|
auto m = trader_item[0];
|
|
m.item_charges = quantity;
|
|
|
|
return UpdateOne(db, m);
|
|
}
|
|
|
|
static Trader GetItemBySerialNumber(Database &db, uint32 serial_number)
|
|
{
|
|
Trader e{};
|
|
const auto trader_item = GetWhere(
|
|
db,
|
|
fmt::format("`item_sn` = '{}' LIMIT 1", serial_number)
|
|
);
|
|
|
|
if (trader_item.empty()) {
|
|
return e;
|
|
}
|
|
else {
|
|
return trader_item.at(0);
|
|
}
|
|
}
|
|
|
|
static Trader GetItemBySerialNumber(Database &db, std::string serial_number)
|
|
{
|
|
Trader e{};
|
|
auto sn = Strings::ToUnsignedBigInt(serial_number);
|
|
const auto trader_item = GetWhere(
|
|
db,
|
|
fmt::format("`item_sn` = '{}' LIMIT 1", sn)
|
|
);
|
|
|
|
if (trader_item.empty()) {
|
|
return e;
|
|
}
|
|
else {
|
|
return trader_item.at(0);
|
|
}
|
|
}
|
|
|
|
static int UpdateActiveTransaction(Database &db, uint32 id, bool status)
|
|
{
|
|
auto e = FindOne(db, id);
|
|
if (!e.id) {
|
|
return 0;
|
|
}
|
|
|
|
e.active_transaction = status == true ? 1 : 0;
|
|
|
|
return UpdateOne(db, e);
|
|
}
|
|
|
|
static int DeleteMany(Database &db, const std::vector<Trader> &entries)
|
|
{
|
|
std::vector<std::string> delete_ids;
|
|
|
|
for (auto const &e: entries) {
|
|
delete_ids.push_back(std::to_string(e.id));
|
|
}
|
|
|
|
return DeleteWhere(db, fmt::format("`id` IN({})", Strings::Implode(",", delete_ids)));
|
|
}
|
|
};
|
|
|
|
#endif //EQEMU_TRADER_REPOSITORY_H
|