Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5168,8 +5168,8 @@ void Game::playerBrowseMarket(uint32_t playerId, uint16_t spriteId)
return;
}

const MarketOfferList& buyOffers = IOMarket::getActiveOffers(MARKETACTION_BUY, it.id);
const MarketOfferList& sellOffers = IOMarket::getActiveOffers(MARKETACTION_SELL, it.id);
const MarketOfferList& buyOffers = tfs::iomarket::getActiveOffers(MARKETACTION_BUY, it.id);
const MarketOfferList& sellOffers = tfs::iomarket::getActiveOffers(MARKETACTION_SELL, it.id);
player->sendMarketBrowseItem(it.id, buyOffers, sellOffers);
tfs::events::player::onLookInMarket(player, &it);
}
Expand All @@ -5185,8 +5185,8 @@ void Game::playerBrowseMarketOwnOffers(uint32_t playerId)
return;
}

const MarketOfferList& buyOffers = IOMarket::getOwnOffers(MARKETACTION_BUY, player->getGUID());
const MarketOfferList& sellOffers = IOMarket::getOwnOffers(MARKETACTION_SELL, player->getGUID());
const MarketOfferList& buyOffers = tfs::iomarket::getOwnOffers(MARKETACTION_BUY, player->getGUID());
const MarketOfferList& sellOffers = tfs::iomarket::getOwnOffers(MARKETACTION_SELL, player->getGUID());
player->sendMarketBrowseOwnOffers(buyOffers, sellOffers);
}

Expand All @@ -5201,8 +5201,8 @@ void Game::playerBrowseMarketOwnHistory(uint32_t playerId)
return;
}

const HistoryMarketOfferList& buyOffers = IOMarket::getOwnHistory(MARKETACTION_BUY, player->getGUID());
const HistoryMarketOfferList& sellOffers = IOMarket::getOwnHistory(MARKETACTION_SELL, player->getGUID());
const HistoryMarketOfferList& buyOffers = tfs::iomarket::getOwnHistory(MARKETACTION_BUY, player->getGUID());
const HistoryMarketOfferList& sellOffers = tfs::iomarket::getOwnHistory(MARKETACTION_SELL, player->getGUID());
player->sendMarketBrowseOwnHistory(buyOffers, sellOffers);
}

Expand Down Expand Up @@ -5250,7 +5250,7 @@ void Game::playerCreateMarketOffer(uint32_t playerId, uint8_t type, uint16_t spr
}

const uint32_t maxOfferCount = getNumber(ConfigManager::MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER);
if (maxOfferCount != 0 && IOMarket::getPlayerOfferCount(player->getGUID()) >= maxOfferCount) {
if (maxOfferCount != 0 && tfs::iomarket::getPlayerOfferCount(player->getGUID()) >= maxOfferCount) {
return;
}

Expand Down Expand Up @@ -5306,11 +5306,11 @@ void Game::playerCreateMarketOffer(uint32_t playerId, uint8_t type, uint16_t spr
player->bankBalance -= debitBank;
}

IOMarket::createOffer(player->getGUID(), static_cast<MarketAction_t>(type), it.id, amount, price, anonymous);
tfs::iomarket::createOffer(player->getGUID(), static_cast<MarketAction_t>(type), it.id, amount, price, anonymous);

player->sendMarketEnter();
const MarketOfferList& buyOffers = IOMarket::getActiveOffers(MARKETACTION_BUY, it.id);
const MarketOfferList& sellOffers = IOMarket::getActiveOffers(MARKETACTION_SELL, it.id);
const MarketOfferList& buyOffers = tfs::iomarket::getActiveOffers(MARKETACTION_BUY, it.id);
const MarketOfferList& sellOffers = tfs::iomarket::getActiveOffers(MARKETACTION_SELL, it.id);
player->sendMarketBrowseItem(it.id, buyOffers, sellOffers);
}

Expand All @@ -5325,7 +5325,7 @@ void Game::playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16
return;
}

MarketOfferEx offer = IOMarket::getOfferByCounter(timestamp, counter);
MarketOfferEx offer = tfs::iomarket::getOfferByCounter(timestamp, counter);
if (offer.id == 0 || offer.playerId != player->getGUID()) {
return;
}
Expand Down Expand Up @@ -5371,7 +5371,7 @@ void Game::playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16
}
}

IOMarket::moveOfferToHistory(offer.id, OFFERSTATE_CANCELLED);
tfs::iomarket::moveOfferToHistory(offer.id, OFFERSTATE_CANCELLED);
offer.amount = 0;
offer.timestamp += getNumber(ConfigManager::MARKET_OFFER_DURATION);
player->sendMarketCancelOffer(offer);
Expand All @@ -5393,7 +5393,7 @@ void Game::playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16
return;
}

MarketOfferEx offer = IOMarket::getOfferByCounter(timestamp, counter);
MarketOfferEx offer = tfs::iomarket::getOfferByCounter(timestamp, counter);
if (offer.id == 0) {
return;
}
Expand Down Expand Up @@ -5540,19 +5540,19 @@ void Game::playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16

const int32_t marketOfferDuration = getNumber(ConfigManager::MARKET_OFFER_DURATION);

IOMarket::appendHistory(player->getGUID(), (offer.type == MARKETACTION_BUY ? MARKETACTION_SELL : MARKETACTION_BUY),
tfs::iomarket::appendHistory(player->getGUID(), (offer.type == MARKETACTION_BUY ? MARKETACTION_SELL : MARKETACTION_BUY),
offer.itemId, amount, offer.price, offer.timestamp + marketOfferDuration,
OFFERSTATE_ACCEPTEDEX);

IOMarket::appendHistory(offer.playerId, offer.type, offer.itemId, amount, offer.price,
tfs::iomarket::appendHistory(offer.playerId, offer.type, offer.itemId, amount, offer.price,
offer.timestamp + marketOfferDuration, OFFERSTATE_ACCEPTED);

offer.amount -= amount;

if (offer.amount == 0) {
IOMarket::deleteOffer(offer.id);
tfs::iomarket::deleteOffer(offer.id);
} else {
IOMarket::acceptOffer(offer.id, amount);
tfs::iomarket::acceptOffer(offer.id, amount);
}

player->sendMarketEnter();
Expand Down
47 changes: 29 additions & 18 deletions src/iomarket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,16 @@

extern Game g_game;

MarketOfferList IOMarket::getActiveOffers(MarketAction_t action, uint16_t itemId)
namespace {

std::map<uint16_t, MarketStatistics> purchaseStatistics;
std::map<uint16_t, MarketStatistics> saleStatistics;

} // namespace

namespace tfs::iomarket {

MarketOfferList getActiveOffers(MarketAction_t action, uint16_t itemId)
{
MarketOfferList offerList;

Expand Down Expand Up @@ -44,7 +53,7 @@ MarketOfferList IOMarket::getActiveOffers(MarketAction_t action, uint16_t itemId
return offerList;
}

MarketOfferList IOMarket::getOwnOffers(MarketAction_t action, uint32_t playerId)
MarketOfferList getOwnOffers(MarketAction_t action, uint32_t playerId)
{
MarketOfferList offerList;

Expand All @@ -69,7 +78,7 @@ MarketOfferList IOMarket::getOwnOffers(MarketAction_t action, uint32_t playerId)
return offerList;
}

HistoryMarketOfferList IOMarket::getOwnHistory(MarketAction_t action, uint32_t playerId)
HistoryMarketOfferList getOwnHistory(MarketAction_t action, uint32_t playerId)
{
HistoryMarketOfferList offerList;

Expand Down Expand Up @@ -99,14 +108,14 @@ HistoryMarketOfferList IOMarket::getOwnHistory(MarketAction_t action, uint32_t p
return offerList;
}

void IOMarket::processExpiredOffers(DBResult_ptr result, bool)
void processExpiredOffers(DBResult_ptr result, bool)
{
if (!result) {
return;
}

do {
if (!IOMarket::moveOfferToHistory(result->getNumber<uint32_t>("id"), OFFERSTATE_EXPIRED)) {
if (!moveOfferToHistory(result->getNumber<uint32_t>("id"), OFFERSTATE_EXPIRED)) {
continue;
}

Expand Down Expand Up @@ -175,26 +184,26 @@ void IOMarket::processExpiredOffers(DBResult_ptr result, bool)
} while (result->next());
}

void IOMarket::checkExpiredOffers()
void checkExpiredOffers()
{
const time_t lastExpireDate = time(nullptr) - getNumber(ConfigManager::MARKET_OFFER_DURATION);

g_databaseTasks.addTask(
fmt::format(
"SELECT `id`, `amount`, `price`, `itemtype`, `player_id`, `sale` FROM `market_offers` WHERE `created` <= {:d}",
lastExpireDate),
IOMarket::processExpiredOffers, true);
processExpiredOffers, true);

int32_t checkExpiredMarketOffersEachMinutes = getNumber(ConfigManager::CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES);
if (checkExpiredMarketOffersEachMinutes <= 0) {
return;
}

g_scheduler.addEvent(
createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, &IOMarket::checkExpiredOffers));
createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, &checkExpiredOffers));
}

uint32_t IOMarket::getPlayerOfferCount(uint32_t playerId)
uint32_t getPlayerOfferCount(uint32_t playerId)
{
DBResult_ptr result = Database::getInstance().storeQuery(
fmt::format("SELECT COUNT(*) AS `count` FROM `market_offers` WHERE `player_id` = {:d}", playerId));
Expand All @@ -204,7 +213,7 @@ uint32_t IOMarket::getPlayerOfferCount(uint32_t playerId)
return result->getNumber<int32_t>("count");
}

MarketOfferEx IOMarket::getOfferByCounter(uint32_t timestamp, uint16_t counter)
MarketOfferEx getOfferByCounter(uint32_t timestamp, uint16_t counter)
{
MarketOfferEx offer;

Expand Down Expand Up @@ -235,26 +244,26 @@ MarketOfferEx IOMarket::getOfferByCounter(uint32_t timestamp, uint16_t counter)
return offer;
}

void IOMarket::createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price,
void createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price,
bool anonymous)
{
Database::getInstance().executeQuery(fmt::format(
"INSERT INTO `market_offers` (`player_id`, `sale`, `itemtype`, `amount`, `price`, `created`, `anonymous`) VALUES ({:d}, {:d}, {:d}, {:d}, {:d}, {:d}, {:d})",
playerId, tfs::to_underlying(action), itemId, amount, price, time(nullptr), anonymous));
}

void IOMarket::acceptOffer(uint32_t offerId, uint16_t amount)
void acceptOffer(uint32_t offerId, uint16_t amount)
{
Database::getInstance().executeQuery(
fmt::format("UPDATE `market_offers` SET `amount` = `amount` - {:d} WHERE `id` = {:d}", amount, offerId));
}

void IOMarket::deleteOffer(uint32_t offerId)
void deleteOffer(uint32_t offerId)
{
Database::getInstance().executeQuery(fmt::format("DELETE FROM `market_offers` WHERE `id` = {:d}", offerId));
}

void IOMarket::appendHistory(uint32_t playerId, MarketAction_t action, uint16_t itemId, uint16_t amount, uint64_t price,
void appendHistory(uint32_t playerId, MarketAction_t action, uint16_t itemId, uint16_t amount, uint64_t price,
time_t timestamp, MarketOfferState_t state)
{
g_databaseTasks.addTask(fmt::format(
Expand All @@ -263,7 +272,7 @@ void IOMarket::appendHistory(uint32_t playerId, MarketAction_t action, uint16_t
tfs::to_underlying(state)));
}

bool IOMarket::moveOfferToHistory(uint32_t offerId, MarketOfferState_t state)
bool moveOfferToHistory(uint32_t offerId, MarketOfferState_t state)
{
const int32_t marketOfferDuration = getNumber(ConfigManager::MARKET_OFFER_DURATION);

Expand All @@ -287,7 +296,7 @@ bool IOMarket::moveOfferToHistory(uint32_t offerId, MarketOfferState_t state)
return true;
}

void IOMarket::updateStatistics()
void updateStatistics()
{
DBResult_ptr result = Database::getInstance().storeQuery(fmt::format(
"SELECT `sale` AS `sale`, `itemtype` AS `itemtype`, COUNT(`price`) AS `num`, MIN(`price`) AS `min`, MAX(`price`) AS `max`, SUM(`price`) AS `sum` FROM `market_history` WHERE `state` = {:d} GROUP BY `itemtype`, `sale`",
Expand All @@ -311,7 +320,7 @@ void IOMarket::updateStatistics()
} while (result->next());
}

MarketStatistics* IOMarket::getPurchaseStatistics(uint16_t itemId)
MarketStatistics* getPurchaseStatistics(uint16_t itemId)
{
auto it = purchaseStatistics.find(itemId);
if (it == purchaseStatistics.end()) {
Expand All @@ -320,11 +329,13 @@ MarketStatistics* IOMarket::getPurchaseStatistics(uint16_t itemId)
return &it->second;
}

MarketStatistics* IOMarket::getSaleStatistics(uint16_t itemId)
MarketStatistics* getSaleStatistics(uint16_t itemId)
{
auto it = saleStatistics.find(itemId);
if (it == saleStatistics.end()) {
return nullptr;
}
return &it->second;
}

} // namespace tfs::iomarket
48 changes: 18 additions & 30 deletions src/iomarket.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,44 +7,32 @@
#include "database.h"
#include "enums.h"

class IOMarket
{
public:
static IOMarket& getInstance()
{
static IOMarket instance;
return instance;
}

static MarketOfferList getActiveOffers(MarketAction_t action, uint16_t itemId);
static MarketOfferList getOwnOffers(MarketAction_t action, uint32_t playerId);
static HistoryMarketOfferList getOwnHistory(MarketAction_t action, uint32_t playerId);

static void processExpiredOffers(DBResult_ptr result, bool);
static void checkExpiredOffers();

static uint32_t getPlayerOfferCount(uint32_t playerId);
static MarketOfferEx getOfferByCounter(uint32_t timestamp, uint16_t counter);

static void createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price,
namespace tfs::iomarket {

MarketOfferList getActiveOffers(MarketAction_t action, uint16_t itemId);
MarketOfferList getOwnOffers(MarketAction_t action, uint32_t playerId);
HistoryMarketOfferList getOwnHistory(MarketAction_t action, uint32_t playerId);

void processExpiredOffers(DBResult_ptr result, bool);
void checkExpiredOffers();

uint32_t getPlayerOfferCount(uint32_t playerId);
MarketOfferEx getOfferByCounter(uint32_t timestamp, uint16_t counter);

void createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price,
bool anonymous);
static void acceptOffer(uint32_t offerId, uint16_t amount);
static void deleteOffer(uint32_t offerId);
void acceptOffer(uint32_t offerId, uint16_t amount);
void deleteOffer(uint32_t offerId);

static void appendHistory(uint32_t playerId, MarketAction_t type, uint16_t itemId, uint16_t amount, uint64_t price,
void appendHistory(uint32_t playerId, MarketAction_t type, uint16_t itemId, uint16_t amount, uint64_t price,
time_t timestamp, MarketOfferState_t state);
static bool moveOfferToHistory(uint32_t offerId, MarketOfferState_t state);
bool moveOfferToHistory(uint32_t offerId, MarketOfferState_t state);

void updateStatistics();

MarketStatistics* getPurchaseStatistics(uint16_t itemId);
MarketStatistics* getSaleStatistics(uint16_t itemId);

private:
IOMarket() = default;

std::map<uint16_t, MarketStatistics> purchaseStatistics;
std::map<uint16_t, MarketStatistics> saleStatistics;
};
} // namespace tfs::iomarket

#endif // FS_IOMARKET_H
4 changes: 2 additions & 2 deletions src/luascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13654,7 +13654,7 @@ int LuaScriptInterface::luaItemTypeGetMarketBuyStatistics(lua_State* L)
// itemType:getMarketBuyStatistics()
const ItemType* itemType = tfs::lua::getUserdata<const ItemType>(L, 1);
if (itemType) {
MarketStatistics* statistics = IOMarket::getInstance().getPurchaseStatistics(itemType->id);
MarketStatistics* statistics = tfs::iomarket::getPurchaseStatistics(itemType->id);
if (statistics) {
lua_createtable(L, 4, 0);
setField(L, "numTransactions", statistics->numTransactions);
Expand All @@ -13675,7 +13675,7 @@ int LuaScriptInterface::luaItemTypeGetMarketSellStatistics(lua_State* L)
// itemType:getMarketSellStatistics()
const ItemType* itemType = tfs::lua::getUserdata<const ItemType>(L, 1);
if (itemType) {
MarketStatistics* statistics = IOMarket::getInstance().getSaleStatistics(itemType->id);
MarketStatistics* statistics = tfs::iomarket::getSaleStatistics(itemType->id);
if (statistics) {
lua_createtable(L, 4, 0);
setField(L, "numTransactions", statistics->numTransactions);
Expand Down
4 changes: 2 additions & 2 deletions src/otserv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,8 @@ void mainLoader(ServiceManager* services)

g_game.map.houses.payHouses(rentPeriod);

IOMarket::checkExpiredOffers();
IOMarket::getInstance().updateStatistics();
tfs::iomarket::checkExpiredOffers();
tfs::iomarket::updateStatistics();

std::cout << ">> Loaded all modules, server starting up..." << std::endl;

Expand Down
2 changes: 1 addition & 1 deletion src/protocolgame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2097,7 +2097,7 @@ void ProtocolGame::sendMarketEnter()
NetworkMessage msg;
msg.addByte(0xF6);
msg.addByte(
std::min<uint32_t>(IOMarket::getPlayerOfferCount(player->getGUID()), std::numeric_limits<uint8_t>::max()));
std::min<uint32_t>(tfs::iomarket::getPlayerOfferCount(player->getGUID()), std::numeric_limits<uint8_t>::max()));

player->setInMarket(true);

Expand Down
Loading