Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "otpch.h"
- #include "market.h"
- #include "configmanager.h"
- #include "database.h"
- #include "game.h"
- #include "iologindata.h"
- extern ConfigManager g_config;
- extern Game g_game;
- void Market::startup()
- {
- Database* db = Database::getInstance();
- if(!db)
- return;
- DBQuery query;
- query << "SELECT `id`, `owner`, `buyer`, `itemid`, `time`, `count`, `price`, `premium_price`, `description`, `name`, `sold`, `attributes` FROM `game_market`";
- if(DBResult* result = db->storeQuery(query.str()))
- {
- do
- {
- uint16_t id = result->getDataInt("id");
- std::string owner = result->getDataString("owner"), buyer = result->getDataString("buyer");
- uint16_t itemid = result->getDataInt("itemid");
- uint64_t time = result->getDataInt("time");
- uint16_t count = result->getDataInt("count");
- uint64_t price = result->getDataInt("price");
- uint64_t premiumPrice = result->getDataInt("premium_price");
- std::string description = result->getDataString("description"), name = result->getDataString("name");
- bool sold = result->getDataInt("sold") == 1;
- const ItemType& it = Item::items.getItemIdByClientId(itemid);
- if(it.id == 0)
- {
- std::cout << "> ERROR: Item id == 0." << std::endl;
- continue;
- }
- uint64_t attrSize = 0;
- const char* attr = result->getDataStream("attributes", attrSize);
- PropStream propStream;
- propStream.init(attr, attrSize);
- if(!sold)
- {
- Item* item = Item::CreateItem(it.id, count);
- if(item && !item->unserializeAttr(propStream))
- std::cout << "[Warning - Market::startup()] Unserialize error for item with id " << item->getID() << std::endl;
- addItem(item, price, premiumPrice, owner, buyer, time, description, id, false);
- }
- else
- addSoldItem(itemid, price, count, owner, buyer, time, name, id);
- }
- while(result->next());
- result->free();
- }
- query.str("");
- query << "SELECT `player_id`, `offer_id`, `for_count`, `itemtype`, `count`, `attributes` FROM `game_market_offer`";
- if(DBResult* result = db->storeQuery(query.str()))
- {
- do
- {
- uint32_t player_id = result->getDataInt("player_id");
- uint16_t offer_id = result->getDataInt("offer_id");
- uint16_t for_count = result->getDataInt("for_count");
- uint16_t itemtype = result->getDataInt("itemtype");
- int32_t count = result->getDataInt("count");
- uint64_t attrSize = 0;
- const char* attr = result->getDataStream("attributes", attrSize);
- Offer* offer = getOfferById(offer_id);
- if(!offer)
- continue;
- PropStream propStream;
- propStream.init(attr, attrSize);
- Item* item = Item::CreateItem(itemtype, count);
- if(item && !item->unserializeAttr(propStream))
- std::cout << "[Warning - Market::startup()] Unserialize error for item with id " << item->getID() << std::endl;
- offer->addSubOfferItem(player_id, item);
- offer->setReofferCount(for_count);
- }
- while(result->next());
- result->free();
- }
- if(m_updateEvent != 0)
- {
- Scheduler::getInstance().stopEvent(m_updateEvent);
- m_updateEvent = 0;
- }
- m_updateEvent = Scheduler::getInstance().addEvent(createSchedulerTask(UPDATE_MARKET_INTERVAL,
- boost::bind(&Market::updateMarket, this)));
- }
- void Market::shutdown()
- {
- Database* db = Database::getInstance();
- if(!db)
- return;
- DBQuery query;
- DBInsert query_insert(db);
- query << "DELETE FROM `game_market`";
- if(!db->executeQuery(query.str()))
- return;
- query.str("");
- query_insert.setQuery("INSERT INTO `game_market` (`id`, `owner`, `buyer`, `itemid`, `time`, `count`, `price`, `premium_price`, `description`, `name`, `sold`, `attributes`) VALUES ");
- for(OfferVector::iterator it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- Item* item = NULL;
- (*it)->getItem(item);
- if(!item)
- continue;
- PropWriteStream propWriteStream;
- item->serializeAttr(propWriteStream);
- uint32_t attributesSize = 0;
- const char* attributes = propWriteStream.getStream(attributesSize);
- query << (*it)->getId() << "," << db->escapeString((*it)->getOwner()).c_str() << "," << db->escapeString((*it)->getBuyer()).c_str() << ","
- << (*it)->getItemId() << "," << (*it)->getTime() << "," << (*it)->getCount() << "," << (*it)->getPrice() << "," << (*it)->getPremiumPrice() << ","
- << db->escapeString((*it)->getDescription()).c_str() << "," << db->escapeString((*it)->getName()).c_str() << ",0,"
- << db->escapeBlob(attributes, attributesSize);
- if(!query_insert.addRow(query))
- {
- std::cout << "> ERROR: Cannot add item to database." << std::endl;
- return;
- }
- }
- for(OfferVector::iterator it = m_soldVector.begin(); it != m_soldVector.end(); ++it)
- {
- query << (*it)->getId() << "," << db->escapeString((*it)->getOwner()).c_str() << "," << db->escapeString((*it)->getBuyer()).c_str() << ","
- << (*it)->getItemId() << "," << (*it)->getTime() << "," << (*it)->getCount() << "," << (*it)->getPrice() << "," << (*it)->getPremiumPrice() << ","
- << db->escapeString((*it)->getDescription()).c_str() << "," << db->escapeString((*it)->getName()).c_str() << ",1,''";
- if(!query_insert.addRow(query))
- {
- std::cout << "> ERROR: Cannot add item to database." << std::endl;
- return;
- }
- }
- if(!query_insert.execute())
- std::cout << "> ERROR: Cannot update database." << std::endl;
- query << "DELETE FROM `game_market_offer`";
- if(!db->executeQuery(query.str()))
- return;
- query.str("");
- query_insert.setQuery("INSERT INTO `game_market_offer` (`player_id`, `offer_id`, `for_count`, `itemtype`, `count`, `attributes`) VALUES ");
- for(OfferVector::reverse_iterator it = m_offerVector.rbegin(); it != m_offerVector.rend(); ++it)
- {
- SubOfferVector offerVector = (*it)->getOfferItems();
- for(SubOfferVector::reverse_iterator uit = offerVector.rbegin(); uit != offerVector.rend(); ++uit)
- {
- for(ReofferList::reverse_iterator iit = uit->second.rbegin(); iit != uit->second.rend(); ++iit)
- {
- Item* item = *iit;
- if(!item)
- continue;
- PropWriteStream propWriteStream;
- item->serializeAttr(propWriteStream);
- uint32_t attributesSize = 0;
- const char* attributes = propWriteStream.getStream(attributesSize);
- query << uit->first << "," << (*it)->getId() << "," << (*it)->getReofferCount() << "," << item->getID() << "," << (int32_t)item->getSubType() << "," << db->escapeBlob(attributes, attributesSize);
- if(!query_insert.addRow(query))
- {
- std::cout << "> ERROR: 'game_market_offer' Cannot add item to database." << std::endl;
- return;
- }
- }
- }
- }
- if(!query_insert.execute())
- std::cout << "> ERROR: Cannot update database." << std::endl;
- }
- void Market::getReofferList(uint32_t playerId, uint16_t id, ReofferList& reofferList)
- {
- if(m_offerVector.empty())
- return;
- for(OfferVector::iterator it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- if((*it)->getId() != id)
- continue;
- SubOfferVector offerVector = (*it)->getOfferItems();
- if(offerVector.empty())
- continue;
- SubOfferVector::iterator _it = offerVector.find(playerId);
- if(_it == offerVector.end())
- continue;
- reofferList = _it->second;
- break;
- }
- }
- void Market::addSoldItem(uint16_t itemId, uint64_t price, uint16_t count, std::string ownerId, std::string buyerId, uint64_t time, std::string name, uint16_t id)
- {
- if((uint64_t)OTSYS_TIME() / 1000 >= time + (uint64_t)g_config.getNumber(ConfigManager::HISTORY_MARKET_TIME))
- return;
- Offer* offer = new Offer();
- if(!offer)
- {
- delete offer;
- return;
- }
- offer->setCount(count);
- offer->setOwner(ownerId);
- offer->setBuyer(buyerId);
- offer->setTime(time);
- offer->setName(name);
- offer->setItemId(itemId);
- offer->setPrice(price);
- if(id > m_lastId)
- m_lastId = id;
- else
- ++m_lastId;
- if(id != 0)
- offer->setId(id);
- else
- offer->setId(m_lastId);
- m_soldVector.push_back(offer);
- }
- Offer* Market::addItem(Item* item, uint64_t price, uint64_t premiumPrice, std::string ownerId, std::string buyerId, uint64_t time, std::string description,
- uint16_t id/* = 0*/, bool addToDatabase/* = true*/)
- {
- Offer* offer = new Offer();
- if(!offer)
- {
- delete offer;
- return NULL;
- }
- offer->setItemId(item->getClientID());
- offer->setCount(item->getItemCount());
- offer->setPrice(price);
- offer->setPremiumPrice(premiumPrice);
- offer->setOwner(ownerId);
- offer->setTime(time);
- offer->setDescription(description);
- offer->setName(item->getName());
- offer->setItem(item);
- if(id > m_lastId)
- m_lastId = id;
- else
- ++m_lastId;
- if(id != 0)
- offer->setId(id);
- else
- offer->setId(m_lastId);
- m_offerVector.push_back(offer);
- return offer;
- }
- Offer* Market::getOfferById(uint16_t id)
- {
- for(OfferVector::iterator it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- if((*it)->getId() == id)
- return *it;
- }
- return NULL;
- }
- bool Market::getOfferById(uint16_t id, OfferVector::iterator& it)
- {
- for(it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- if((*it)->getId() == id)
- return true;
- }
- return false;
- }
- void Market::onRemoveOffer(Player* player, uint16_t id)
- {
- if(!player)
- return;
- OfferVector::iterator offerIt;
- if(!getOfferById(id, offerIt))
- {
- std::cout << "> ERROR: Can't find offer with id = " << id << "." << std::endl;
- return;
- }
- Offer* offer = *offerIt;
- if(!offer)
- {
- std::cout << "> ERROR: Can't find offer with id = " << id << "." << std::endl;
- return;
- }
- if(offer->getOwner() != player->getName())
- {
- std::cout << "> ERROR: Corruption player try remove offer from market." << std::endl;
- return;
- }
- const ItemType& it = Item::items.getItemIdByClientId(offer->getItemId());
- if(it.id == 0)
- {
- std::cout << "> ERROR: Item id == 0." << std::endl;
- return;
- }
- player->sendRemoveOffer(id);
- Item* item = offer->getItem();
- if(item)
- sendOfferToPlayer(player, item);
- removeReofferList(offer);
- delete offer;
- m_offerVector.erase(offerIt);
- }
- void Market::onBuyOffer(Player* player, uint16_t id, uint16_t count, bool checkMoney)
- {
- if(!player)
- return;
- OfferVector::iterator offerIt;
- if(!getOfferById(id, offerIt))
- {
- std::cout << "> ERROR: Can't find offer with id = " << id << "." << std::endl;
- return;
- }
- Offer* offer = *offerIt;
- if(!offer)
- {
- std::cout << "> ERROR: Can't find offer with id = " << id << "." << std::endl;
- return;
- }
- const ItemType& it = Item::items.getItemIdByClientId(offer->getItemId());
- if(it.id == 0)
- {
- std::cout << "> ERROR: Item id == 0." << std::endl;
- return;
- }
- Player* owner = g_game.getPlayerByNameEx(offer->getOwner());
- if(!owner)
- {
- std::cout << "> ERROR: Offer hasn't an owner." << std::endl;
- return;
- }
- count = std::min(count, offer->getCount());
- if(checkMoney)
- {
- uint64_t price = offer->getPrice() * static_cast<uint64_t>(count);
- if(price == 0)
- return;
- if(player->getBalance() < price)
- {
- player->sendMarketStatus(UPDATE_NOT_ENOUGH_MONEY);
- return;
- }
- uint64_t premiumPrice = offer->getPremiumPrice() * static_cast<uint64_t>(count);
- if(premiumPrice > 0 && player->getPremiumBalance() < premiumPrice)
- {
- player->sendMarketStatus(UPDATE_NOT_ENOUGH_MONEY);
- return;
- }
- else
- {
- owner->updatePremiumPoints(premiumPrice, false);
- player->updatePremiumPoints(premiumPrice, true);
- }
- owner->doDepositMoney(price);
- player->doWithdrawMoney(price);
- Item* item = offer->getItem();
- if(item)
- item->setItemCount(count);
- sendOfferToPlayer(player, item);
- }
- if(count >= offer->getCount())
- {
- offer->setBuyer(player->getName());
- offer->setTime(OTSYS_TIME() / 1000);
- m_soldVector.push_back(offer);
- m_offerVector.erase(offerIt);
- player->sendRemoveOffer(id);
- if(!owner->isVirtual())
- owner->sendRemoveOffer(id);
- removeReofferList(offer);
- }
- else
- {
- ++m_lastId;
- Offer* soldOffer = offer->clone();
- if(soldOffer)
- {
- soldOffer->setId(m_lastId);
- soldOffer->setCount(count);
- soldOffer->setBuyer(player->getName());
- soldOffer->setTime(OTSYS_TIME() / 1000);
- }
- else
- delete soldOffer;
- count = offer->getCount() - count;
- offer->setCount(count);
- m_soldVector.push_back(soldOffer);
- player->sendUpdateOffer(id, count);
- if(!owner->isVirtual())
- owner->sendUpdateOffer(id, count);
- }
- if(owner->isVirtual())
- {
- IOLoginData::getInstance()->savePlayer(owner);
- delete owner;
- }
- else if(checkMoney)
- owner->sendMarketStatus(UPDATE_BALANCE);
- if(checkMoney)
- player->sendMarketStatus(UPDATE_BALANCE);
- }
- void Market::updateOffer(Player* player, uint16_t id, uint16_t count, MarketAction_t type)
- {
- switch(type)
- {
- case MARKET_REMOVE:
- onRemoveOffer(player, id);
- break;
- case MARKET_BUY:
- onBuyOffer(player, id, count);
- break;
- default:
- break;
- }
- }
- void Market::updateMarket(Player* player, UpdateType_t type, uint16_t page, uint16_t category, CategorySort_t sort, const std::string& search)
- {
- switch(type)
- {
- case UPDATE_TRADE:
- updateTrade(player, page, (CategoryItem_t)category, sort);
- break;
- case UPDATE_OFFER:
- updateOffer(player);
- break;
- case UPDATE_SEARCH:
- updateSearch(player, page, (CategoryItem_t)category, sort, search);
- break;
- case UPDATE_HISTORY:
- updateHistory(player);
- break;
- case UPDATE_REOFFER:
- updateReofferWindow(player, page, category);
- break;
- case UPDATE_REOFFERS:
- updateReoffersWindow(player, page, category);
- break;
- case UPDATE_REJECT_REOFFER:
- updateRejectReoffer(player, page);
- break;
- case UPDATE_ACCEPT_REOFFER:
- updateAcceptReoffer(player, page);
- break;
- default:
- break;
- }
- }
- void Market::updateRejectReoffer(Player* player, uint16_t id)
- {
- if(!player)
- return;
- Offer* offer = getOfferById(id);
- if(!offer)
- return;
- SubOfferVector offerVector = offer->getOfferItems();
- if(offerVector.empty())
- return;
- uint16_t i = 0, reofferId = player->getReofferPage();
- for(SubOfferVector::iterator it = offerVector.begin(); it != offerVector.end(); ++it)
- {
- ++i;
- if(i != reofferId)
- continue;
- Player* _player = g_game.getPlayerByGuidEx(it->first);
- if(!_player)
- break;
- for(ReofferList::reverse_iterator uit = it->second.rbegin(); uit != it->second.rend(); ++uit)
- {
- Item* item = *uit;
- if(!item)
- continue;
- sendOfferToPlayer(_player, item);
- }
- offer->clearReoffer(_player->getGUID());
- if(_player->isVirtual())
- {
- IOLoginData::getInstance()->savePlayer(_player);
- delete _player;
- }
- break;
- }
- updateReoffersWindow(player, id, 0);
- }
- void Market::updateAcceptReoffer(Player* player, uint16_t id)
- {
- if(!player)
- return;
- Offer* offer = getOfferById(id);
- if(!offer)
- return;
- SubOfferVector offerVector = offer->getOfferItems();
- if(offerVector.empty())
- return;
- Item* item = offer->getItem();
- uint16_t i = 0, reofferId = player->getReofferPage(), reofferCount = offer->getReofferCount();
- for(SubOfferVector::iterator it = offerVector.begin(); it != offerVector.end(); ++it)
- {
- Player* owner = g_game.getPlayerByGuidEx(it->first);
- if(!owner)
- break;
- ++i;
- for(ReofferList::reverse_iterator uit = it->second.rbegin(); uit != it->second.rend(); ++uit)
- {
- Item* _item = *uit;
- if(!_item)
- continue;
- if(i == reofferId)
- sendOfferToPlayer(player, _item);
- else
- sendOfferToPlayer(owner, _item);
- }
- if(i == reofferId)
- sendOfferToPlayer(owner, item);
- offer->clearReoffer(owner->getGUID());
- if(owner->isVirtual())
- {
- IOLoginData::getInstance()->savePlayer(owner);
- delete owner;
- }
- }
- onBuyOffer(player, id, reofferCount, false);
- }
- void Market::clearReofferListById(uint32_t playerId, uint16_t id)
- {
- Offer* offer = getOfferById(id);
- if(offer)
- offer->clearReoffer(playerId);
- }
- void Market::updateReofferWindow(Player* player, uint16_t id, uint16_t count)
- {
- if(!player)
- return;
- Offer* offer = getOfferById(id);
- if(!offer)
- return;
- ReofferList list;
- player->getReofferList(list);
- uint32_t playerId = player->getGUID();
- offer->clearReoffer(playerId);
- if(!list.empty())
- {
- for(ReofferList::iterator it = list.begin(); it != list.end(); ++it)
- {
- offer->addSubOfferItem(playerId, (*it)/*->clone()*/);
- //g_game.internalRemoveItem(NULL, *it);
- }
- offer->setReofferCount(count);
- }
- player->closeReofferWindow(false, id);
- }
- void Market::updateReoffersWindow(Player* player, uint16_t id, uint16_t page)
- {
- if(!player)
- return;
- Offer* offer = getOfferById(id);
- if(!offer)
- return;
- SubOfferVector offerVector = offer->getOfferItems();
- if(offerVector.empty())
- {
- player->closeReofferWindow(false, 0);
- return;
- }
- player->closeReofferWindow(false, 0);
- uint16_t _page = player->getReofferPage();
- if(page == 1)
- _page = _page - 1;
- else if(page == 2)
- _page = _page + 1;
- _page = std::max<uint16_t>(1, std::min<uint16_t>(offerVector.size(), _page));
- player->setReofferPage(_page);
- uint16_t i = 0;
- for(SubOfferVector::iterator it = offerVector.begin(); it != offerVector.end(); ++it)
- {
- ++i;
- if(i != _page)
- continue;
- g_game.openReofferWindow(player->getID(), false, id, it->second, true);
- break;
- }
- }
- void Market::updateHistory(Player* player)
- {
- if(!player)
- return;
- const std::string name = player->getName();
- OfferVector itemList;
- for(OfferVector::iterator it = m_soldVector.begin(); it != m_soldVector.end(); ++it)
- {
- if((*it)->getOwner() == name || (*it)->getBuyer() == name)
- itemList.push_back(*it);
- }
- player->sendMarketOffer(itemList, UPDATE_HISTORY, 0);
- }
- void Market::updateSearch(Player* player, uint16_t page, CategoryItem_t category, CategorySort_t sort, const std::string& search)
- {
- if(!player)
- return;
- if(search.empty())
- {
- updateTrade(player, page, category, sort);
- return;
- }
- OfferVector offerList(m_offerVector);
- std::sort(offerList.begin(), offerList.end(), MarketSort(player, sort));
- uint16_t maxOffer = g_config.getNumber(ConfigManager::MARKET_OFFER_PER_PAGE);
- uint16_t fromOffer = maxOffer * (page - 1);
- double i = 0;
- const std::string name = player->getName();
- OfferVector itemList;
- for(OfferVector::iterator it = offerList.begin(); it != offerList.end(); ++it)
- {
- if((*it)->getOwner() == name)
- continue;
- Item* item = NULL;
- (*it)->getItem(item);
- if(!item)
- continue;
- std::string name = item->getName();
- if(asLowerCaseString(name).find(asLowerCaseString(search)) != std::string::npos && isAllow(*it, category))
- {
- ++i;
- if(i > fromOffer && itemList.size() < maxOffer)
- itemList.push_back(*it);
- }
- }
- if(itemList.empty())
- return;
- player->sendMarketOffer(itemList, UPDATE_TRADE, i);
- }
- void Market::updateTrade(Player* player, uint16_t page, CategoryItem_t category, CategorySort_t sort)
- {
- if(!player)
- return;
- uint16_t maxOffer = g_config.getNumber(ConfigManager::MARKET_OFFER_PER_PAGE);
- uint16_t fromOffer = maxOffer * (page - 1);
- OfferVector offerList(m_offerVector);
- std::sort(offerList.begin(), offerList.end(), MarketSort(player, sort));
- OfferVector itemList;
- double i = 0;
- const std::string name = player->getName();
- for(OfferVector::iterator it = offerList.begin(); it != offerList.end(); ++it)
- {
- if((*it)->getOwner() == name || !isAllow(*it, category))
- continue;
- ++i;
- if(i > fromOffer && itemList.size() < maxOffer)
- itemList.push_back(*it);
- }
- if(itemList.empty())
- return;
- player->sendMarketOffer(itemList, UPDATE_TRADE, i);
- }
- void Market::updateOffer(Player* player)
- {
- if(!player)
- return;
- OfferVector itemList;
- for(OfferVector::iterator it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- if((*it)->getOwner() != player->getName())
- continue;
- itemList.push_back(*it);
- }
- if(itemList.empty())
- return;
- player->sendMarketOffer(itemList, UPDATE_OFFER, 0);
- }
- bool Market::canAdd(Player* player)
- {
- if(!player)
- return false;
- Tile* tile = player->getTile();
- if(!tile || !tile->hasFlag(TILESTATE_PROTECTIONZONE))
- return false;
- uint16_t offerCount = 0;
- for(OfferVector::iterator it = m_offerVector.begin(); it != m_offerVector.end(); ++it)
- {
- if((*it)->getOwner() != player->getName())
- continue;
- ++offerCount;
- }
- return offerCount < g_config.getNumber(ConfigManager::MARKET_OFFER_LIMIT);
- }
- void Market::sendOfferToPlayer(Player* player, Item* item, uint16_t count)
- {
- if(!item || !player)
- return;
- Depot* depot = player->getDepot(player->getTown(), true);
- if(!depot)
- return;
- Container* container = depot->getContainer();
- if(!container)
- return;
- for(uint32_t i = 0; i < container->size(); i++)
- {
- Item* _item = container->getItem(i);
- if(!_item || _item->getID() != ITEM_MARKET || !_item->getContainer())
- continue;
- Item* __item = item->clone();
- if(!__item)
- {
- delete __item;
- continue;
- }
- if(count > 1 && item->isStackable() && item->getItemCount() > count)
- {
- __item->setItemCount(count);
- item->setItemCount(item->getItemCount() - count);
- g_game.internalAddItem(NULL, _item->getContainer(), __item);
- }
- else
- {
- g_game.internalRemoveItem(NULL, item);
- g_game.internalAddItem(NULL, _item->getContainer(), __item);
- }
- break;
- }
- }
- void Market::removeReofferList(Offer* offer)
- {
- if(!offer)
- return;
- SubOfferVector offerVector = offer->getOfferItems();
- if(!offerVector.empty())
- {
- for(SubOfferVector::iterator it = offerVector.begin(); it != offerVector.end(); ++it)
- {
- Player* player = g_game.getPlayerByGuidEx(it->first);
- if(!player)
- continue;
- for(ReofferList::reverse_iterator uit = it->second.rbegin(); uit != it->second.rend(); ++uit)
- {
- Item* item = *uit;
- if(!item)
- continue;
- sendOfferToPlayer(player, item);
- }
- if(player->isVirtual())
- {
- IOLoginData::getInstance()->savePlayer(player);
- delete player;
- }
- }
- }
- }
- void Market::updateMarket()
- {
- for(OfferVector::reverse_iterator it = m_offerVector.rbegin(); it != m_offerVector.rend(); ++it)
- {
- if(uint64_t(OTSYS_TIME() / 1000) >= (*it)->getTime())
- {
- const ItemType& mit = Item::items.getItemIdByClientId((*it)->getItemId());
- if(mit.id == 0)
- {
- std::cout << "> ERROR: Item id == 0." << std::endl;
- continue;
- }
- removeReofferList(*it);
- Player* player = g_game.getPlayerByNameEx((*it)->getOwner());
- if(player)
- {
- Item* item = (*it)->getItem();
- sendOfferToPlayer(player, item);
- if(player->isVirtual())
- {
- IOLoginData::getInstance()->savePlayer(player);
- delete player;
- }
- }
- delete *it;
- m_offerVector.erase(--it.base());
- }
- }
- if(m_updateEvent != 0)
- {
- Scheduler::getInstance().stopEvent(m_updateEvent);
- m_updateEvent = 0;
- }
- m_updateEvent = Scheduler::getInstance().addEvent(createSchedulerTask(UPDATE_MARKET_INTERVAL,
- boost::bind(&Market::updateMarket, this)));
- }
- bool Market::isAllow(Offer* offer, CategoryItem_t category)
- {
- if(!offer)
- return false;
- const ItemType& it = Item::items.getItemIdByClientId(offer->getItemId());
- if(it.id == 0)
- {
- std::cout << "> ERROR[Market::isAllow]: Item id == 0." << std::endl;
- return false;
- }
- switch(category)
- {
- case CATEGORY_HELMET:
- return it.wieldPosition == SLOT_HEAD;
- case CATEGORY_ARMOR:
- return it.wieldPosition == SLOT_ARMOR;
- case CATEGORY_LEGS:
- return it.wieldPosition == SLOT_LEGS;
- case CATEGORY_BOOTS:
- return it.wieldPosition == SLOT_FEET;
- case CATEGORY_SHIELD:
- return it.weaponType == WEAPON_SHIELD;
- case CATEGORY_WEAPON:
- return it.weaponType == WEAPON_SWORD || it.weaponType == WEAPON_AXE || it.weaponType == WEAPON_CLUB;
- case CATEGORY_AMMO:
- return it.weaponType == WEAPON_AMMO;
- case CATEGORY_WAND:
- return it.weaponType == WEAPON_WAND;
- default:
- break;
- }
- return true;
- }
- Item* Market::getPlayerLookItem(uint16_t id)
- {
- Offer* offer = getOfferById(id);
- if(!offer)
- return NULL;
- return offer->getItem();
- }
Advertisement
Add Comment
Please, Sign In to add comment