Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool Game::playerLeaveMarket(uint32_t playerId)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- player->setMarketDepotId(-1);
- player->setInMarket(false);
- return true;
- }
- bool Game::playerBrowseMarket(uint32_t playerId, uint16_t spriteId)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- if ((getMoney(player) > 2000000000)) {
- return false;
- }
- const ItemType& it = Item::items.getItemIdByClientId(spriteId);
- if(it.id == 0)
- return false;
- const MarketOfferList& buyOffers = IOMarket::getInstance()->getActiveOffers(MARKETACTION_BUY);
- const MarketOfferList& sellOffers = IOMarket::getInstance()->getActiveOffers(MARKETACTION_SELL);
- player->sendMarketBrowseItem(it.id, buyOffers, sellOffers);
- player->sendMarketDetail(it.id);
- return true;
- }
- bool Game::playerBrowseMarketOwnOffers(uint32_t playerId)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- if (getMoney(player) > 2000000000) {
- return false;
- }
- const MarketOfferList& buyOffers = IOMarket::getInstance()->getOwnOffers(MARKETACTION_BUY, player->getGUID());
- const MarketOfferList& sellOffers = IOMarket::getInstance()->getOwnOffers(MARKETACTION_SELL, player->getGUID());
- player->sendMarketBrowseOwnOffers(buyOffers, sellOffers);
- return true;
- }
- bool Game::playerBrowseMarketOwnHistory(uint32_t playerId)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- if (!player->isInMarket()) {
- return false;
- }
- const HistoryMarketOfferList& buyOffers = IOMarket::getInstance()->getOwnHistory(MARKETACTION_BUY, player->getGUID());
- const HistoryMarketOfferList& sellOffers = IOMarket::getInstance()->getOwnHistory(MARKETACTION_SELL, player->getGUID());
- player->sendMarketBrowseOwnHistory(buyOffers, sellOffers);
- return true;
- }
- bool Game::playerItemDescMarket(uint32_t playerId, uint32_t timestamp, uint16_t counter)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- uint32_t offerId = IOMarket::getInstance()->getOfferIdByCounter(timestamp, counter);
- if(offerId == 0)
- return false;
- MarketOfferEx offer = IOMarket::getInstance()->getOfferById(offerId);
- const ItemType& it = Item::items[offer.itemId];
- Item* item = Item::CreateItem(it.id, -1);
- std::stringstream test(offer.Attrs);
- std::string segment;
- std::vector<std::string> seglist;
- if(offer.Attrs != "false"){
- while(std::getline(test, segment, 'º'))
- {
- seglist.push_back(segment);
- }
- for(int i = 0; i < seglist.size(); i++) {
- std::stringstream test2(seglist[i]);
- std::string segment2;
- std::vector<std::string> seglist2;
- while(std::getline(test2, segment2, '#'))
- {
- seglist2.push_back(segment2);
- }
- if(std::isdigit(atoi((char*)seglist2[1].c_str())) || atoi((char*)seglist2[1].c_str()) >= 1){
- item->setAttribute(seglist2[0], atoi((char*)seglist2[1].c_str()));
- }else{
- item->setAttribute(seglist2[0], seglist2[1]);
- }
- }
- }
- if(item->hasStringAttribute("description")){
- player->sendMarketItemDesc(item->getSpecialDescription(), offer.itemId);
- }else{
- player->sendMarketItemDesc(item->getDescription(1), offer.itemId);
- }
- delete item;
- return true;
- }
- bool Game::playerCreateMarketOffer(uint32_t playerId, uint8_t type, const Position& pos, int16_t stackpos, uint16_t spriteId, uint16_t amount, uint32_t price, bool anonymous)
- {
- if(amount == 0 || amount > 100)
- return false;
- if(price < 0 || price > 999999999)
- return false;
- if(type != MARKETACTION_BUY && type != MARKETACTION_SELL)
- return false;
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- if (!player->isInMarket()) {
- return false;
- }
- if (getMoney(player) > 2000000000) {
- return false;
- }
- const int32_t maxOfferCount = 100;
- if(maxOfferCount > 0)
- {
- const int32_t offerCount = IOMarket::getInstance()->getPlayerOfferCount(player->getGUID());
- if(offerCount == -1 || offerCount >= maxOfferCount)
- return false;
- }
- uint64_t fee = (price / 100.) * amount;
- if(fee < 20)
- fee = 20;
- std::stringstream parseAttrs;
- Thing* thing = internalGetThing(player, pos, stackpos, spriteId, STACKPOS_NORMAL);
- if(!thing)
- return false;
- Item* item = thing->getItem();
- if(!item)
- return false;
- if(item->hasStringAttribute("unique"))
- return false;
- if(item->hasBooleanAttribute("unique"))
- return false;
- if(type == MARKETACTION_SELL)
- {
- if(fee > getMoney(player))
- return false;
- uint32_t count = item->getItemCount();
- if (amount > count)
- return false;
- std::string Attrs[] = {"poke", "nick", "memory", "xHeldItem", "megaID", "copyName", "SmeargleID", "addon", "ball", "yHeldItem","reverseIcon","gender", "boost", "happy", "hp", "transBegin", "hunger", "transLeft", "transTurn", "transOutfit", "transName", "trans", "light", "blink", "move1", "move2", "move3", "move4", "move5", "move6", "move7", "move8", "move9", "move10", "move11", "move12", "ballorder", "hands", "aura", "burn", "burndmg", "poison", "poisondmg", "confuse", "sleep", "miss", "missSpell", "missEff", "fear", "fearSkill", "silence", "silenceEff", "stun", "stunEff", "stunSpell", "paralyze", "paralyzeEff", "slow", "slowEff", "leech", "leechdmg", "Buff1", "Buff2", "Buff3", "Buff1skill","Buff2skill", "Buff3skill", "control", "task", "lock"};
- bool first = true;
- for (int i = 0; i < ((sizeof Attrs) / (sizeof Attrs[0])); i++)
- {
- std::string sep = "";
- if(i != ((sizeof Attrs) / (sizeof Attrs[0]))){
- sep = "º";
- }
- if(item->hasIntegerAttribute(Attrs[i])){
- const int32_t* value = ((item)->getIntegerAttribute(Attrs[i]));
- parseAttrs << Attrs[i] << "#" << *value << sep ;
- }
- if(item->hasStringAttribute(Attrs[i])){
- const std::string* value = ((item)->getStringAttribute(Attrs[i]));
- parseAttrs << Attrs[i] << "#" << *value << sep ;
- }
- if(item->hasBooleanAttribute(Attrs[i])){
- const bool* value = ((item)->getBooleanAttribute(Attrs[i]));
- parseAttrs << Attrs[i] << "#" << *value << sep ;
- }
- if(item->hasFloatAttribute(Attrs[i])){
- const float* value = ((item)->getFloatAttribute(Attrs[i]));
- parseAttrs << Attrs[i] << "#" << *value << sep ;
- }
- }
- if(item->isStackable())
- {
- internalRemoveItem(NULL, item, amount);
- }
- else
- {
- internalRemoveItem(NULL, item->getItem());
- }
- removeMoney(player, fee);
- }
- else
- {
- uint64_t totalPrice = (uint64_t)price * amount;
- totalPrice += fee;
- parseAttrs << false;
- if(totalPrice > getMoney(player))
- return false;
- removeMoney(player, totalPrice);
- }
- IOMarket::getInstance()->createOffer(player->getGUID(), (MarketAction_t)type, item->getID(), amount, price, anonymous, parseAttrs.str());
- player->sendMarketEnter(1);
- const MarketOfferList& buyOffers = IOMarket::getInstance()->getActiveOffers(MARKETACTION_BUY);
- const MarketOfferList& sellOffers = IOMarket::getInstance()->getActiveOffers(MARKETACTION_SELL);
- player->sendMarketBrowseItem(item->getID(), buyOffers, sellOffers);
- return true;
- }
- bool Game::playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter)
- {
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- Depot* depotChest = player->getDepot(2, false);
- uint32_t offerId = IOMarket::getInstance()->getOfferIdByCounter(timestamp, counter);
- if(offerId == 0)
- return false;
- MarketOfferEx offer = IOMarket::getInstance()->getOfferById(offerId);
- if(offer.playerId != player->getGUID())
- return false;
- if(offer.type == MARKETACTION_BUY)
- {
- addMoney(player->getDepot(2, false), (uint64_t)offer.price * offer.amount, FLAG_NOLIMIT);
- player->sendMarketEnter(1);
- }
- else
- {
- const ItemType& it = Item::items[offer.itemId];
- if(it.id == 0)
- return false;
- if(it.stackable)
- {
- uint16_t tmpAmount = offer.amount;
- while(tmpAmount > 0)
- {
- int32_t stackCount = std::min<int32_t>(100, tmpAmount);
- Item* item = Item::CreateItem(it.id, stackCount);
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- tmpAmount -= stackCount;
- }
- }
- else
- {
- int32_t subType = -1;
- if(it.charges != 0)
- subType = it.charges;
- for(uint16_t i = 0; i < offer.amount; ++i)
- {
- Item* item = Item::CreateItem(it.id, subType);
- std::stringstream test(offer.Attrs);
- std::string segment;
- std::vector<std::string> seglist;
- if(offer.Attrs != "false" && subType == -1){
- while(std::getline(test, segment, 'º'))
- {
- seglist.push_back(segment);
- }
- for(int i = 0; i < seglist.size(); i++) {
- std::stringstream test2(seglist[i]);
- std::string segment2;
- std::vector<std::string> seglist2;
- while(std::getline(test2, segment2, '#'))
- {
- seglist2.push_back(segment2);
- }
- if(std::isdigit(atoi((char*)seglist2[1].c_str())) || atoi((char*)seglist2[1].c_str()) >= 1){
- item->setAttribute(seglist2[0], atoi((char*)seglist2[1].c_str()));
- }else{
- item->setAttribute(seglist2[0], seglist2[1]);
- }
- }
- }
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- }
- }
- }
- IOMarket::getInstance()->moveOfferToHistory(offerId, OFFERSTATE_CANCELLED);
- offer.amount = 0;
- offer.timestamp += (30 * 24 * 60 * 60);
- player->sendMarketCancelOffer(offer);
- return true;
- }
- bool Game::playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter, uint16_t amount)
- {
- if(amount == 0 || amount > 100)
- return false;
- Player* player = getPlayerByID(playerId);
- if(!player || player->isRemoved())
- return false;
- uint32_t offerId = IOMarket::getInstance()->getOfferIdByCounter(timestamp, counter);
- if(offerId == 0)
- return false;
- if (!player->isInMarket()) {
- return false;
- }
- if (getMoney(player) > 2000000000) {
- return false;
- }
- MarketOfferEx offer = IOMarket::getInstance()->getOfferById(offerId);
- if(amount > offer.amount)
- return false;
- if(offer.price == 0)
- return false;
- const ItemType& it = Item::items[offer.itemId];
- if(it.id == 0)
- return false;
- uint64_t totalPrice = (uint64_t)offer.price * amount;
- if(offer.type == MARKETACTION_BUY)
- {
- Depot* depotChest = player->getDepot(2, false);
- if(!depotChest)
- return false;
- ItemList itemList;
- uint32_t count = 0;
- std::list<Container*> containerList;
- containerList.push_back(depotChest);
- bool enough = false;
- do
- {
- Container* container = containerList.front();
- containerList.pop_front();
- for(ItemList::const_iterator iter = container->getItems(), end = container->getEnd(); iter != end; ++iter)
- {
- Item* item = (*iter);
- Container* c = item->getContainer();
- if(c && !c->empty())
- {
- containerList.push_back(c);
- continue;
- }
- if(item->getID() != it.id)
- continue;
- const ItemType& itemType = Item::items[item->getID()];
- if(!itemType.isRune() && item->getCharges() != itemType.charges)
- continue;
- if(item->getDuration() != itemType.decayTime)
- continue;
- itemList.push_back(item);
- count += Item::countByType(item, -1);
- if(count >= amount)
- {
- enough = true;
- break;
- }
- }
- if(enough)
- break;
- }
- while(!containerList.empty());
- if(!enough)
- return false;
- if(it.stackable)
- {
- uint16_t tmpAmount = amount;
- for(ItemList::const_iterator iter = itemList.begin(), end = itemList.end(); iter != end; ++iter)
- {
- uint16_t removeCount = std::min(tmpAmount, (*iter)->getItemCount());
- tmpAmount -= removeCount;
- internalRemoveItem(NULL,*iter, removeCount);
- if(tmpAmount == 0)
- break;
- }
- }
- else
- {
- for(ItemList::const_iterator iter = itemList.begin(), end = itemList.end(); iter != end; ++iter)
- internalRemoveItem(NULL,*iter);
- }
- addMoney(player->getDepot(2, true), totalPrice, FLAG_NOLIMIT);
- Player* buyerPlayer = getPlayerByGuid(offer.playerId);
- if(!buyerPlayer)
- {
- std::string buyerName;
- if(!IOLoginData::getInstance()->getNameByGuid(offer.playerId, buyerName))
- return false;
- buyerPlayer = new Player(buyerName, NULL);
- if(!IOLoginData::getInstance()->loadPlayer(buyerPlayer, buyerName))
- {
- delete buyerPlayer;
- return false;
- }
- }
- if(it.stackable)
- {
- uint16_t tmpAmount = amount;
- while(tmpAmount > 0)
- {
- uint16_t stackCount = std::min<uint16_t>(100, tmpAmount);
- Item* item = Item::CreateItem(it.id, stackCount);
- if(internalAddItem(NULL, buyerPlayer->getDepot(2, false), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- tmpAmount -= stackCount;
- }
- }
- else
- {
- int32_t subType = -1;
- if(it.charges != 0)
- subType = it.charges;
- for(uint16_t i = 0; i < amount; ++i)
- {
- Item* item = Item::CreateItem(it.id, subType);
- std::stringstream test(offer.Attrs);
- std::string segment;
- std::vector<std::string> seglist;
- if(offer.Attrs != "false" && subType == -1){
- while(std::getline(test, segment, 'º'))
- {
- seglist.push_back(segment);
- }
- for(int i = 0; i < seglist.size(); i++) {
- std::stringstream test2(seglist[i]);
- std::string segment2;
- std::vector<std::string> seglist2;
- while(std::getline(test2, segment2, '#'))
- {
- seglist2.push_back(segment2);
- }
- if(std::isdigit(atoi((char*)seglist2[1].c_str())) || atoi((char*)seglist2[1].c_str()) >= 1){
- item->setAttribute(seglist2[0], atoi((char*)seglist2[1].c_str()));
- }else{
- item->setAttribute(seglist2[0], seglist2[1]);
- }
- }
- }
- if(internalAddItem(NULL, buyerPlayer->getDepot(2, false), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- }
- }
- if(buyerPlayer->isOffline())
- {
- IOLoginData::getInstance()->savePlayer(buyerPlayer);
- delete buyerPlayer;
- }
- else
- buyerPlayer->onReceiveMail();
- }
- else
- {
- if(totalPrice > getMoney(player))
- return false;
- removeMoney(player, totalPrice);
- if(it.stackable)
- {
- uint16_t tmpAmount = amount;
- while(tmpAmount > 0)
- {
- uint16_t stackCount = std::min<uint16_t>(100, tmpAmount);
- Item* item = Item::CreateItem(it.id, stackCount);
- Depot* depotChest = player->getDepot(2, false);
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- tmpAmount -= stackCount;
- }
- }
- else
- {
- int32_t subType = -1;
- if(it.charges != 0)
- subType = it.charges;
- for(uint16_t i = 0; i < amount; ++i)
- {
- Item* item = Item::CreateItem(it.id, subType);
- Depot* depotChest = player->getDepot(2, false);
- std::stringstream test(offer.Attrs);
- std::string segment;
- std::vector<std::string> seglist;
- if(offer.Attrs != "false" && subType == -1){
- while(std::getline(test, segment, 'º'))
- {
- seglist.push_back(segment);
- }
- for(int i = 0; i < seglist.size(); i++) {
- std::stringstream test2(seglist[i]);
- std::string segment2;
- std::vector<std::string> seglist2;
- while(std::getline(test2, segment2, '#'))
- {
- seglist2.push_back(segment2);
- }
- if(std::isdigit(atoi((char*)seglist2[1].c_str())) || atoi((char*)seglist2[1].c_str()) >= 1){
- item->setAttribute(seglist2[0], atoi((char*)seglist2[1].c_str()));
- }else{
- item->setAttribute(seglist2[0], seglist2[1]);
- }
- }
- }
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- else{
- player->onReceiveMail();
- }
- }
- }
- Player* sellerPlayer = getPlayerByGuid(offer.playerId);
- if(sellerPlayer)
- addMoney(sellerPlayer->getDepot(2, true), totalPrice);
- else{
- std::string sellerName;
- if(!IOLoginData::getInstance()->getNameByGuid(offer.playerId, sellerName))
- return false;
- int32_t money = totalPrice;
- IntegerMap teste = Item::items.getMoneyMap();
- int32_t tmp = 0;
- for(IntegerMap::reverse_iterator it = teste.rbegin(); it != teste.rend(); ++it)
- {
- tmp = money / it->first;
- money -= tmp * it->first;
- if(tmp != 0)
- {
- do
- {
- Item* remaindItem = Item::CreateItem(it->second-1, std::min(100, tmp));
- IOLoginData::getInstance()->playerMail(player, sellerName, 2, remaindItem);
- tmp -= std::min(100, tmp);
- }
- while(tmp > 0);
- }
- }
- }
- player->onReceiveMail();
- }
- const int32_t marketOfferDuration = (30 * 24 * 60 * 60);
- IOMarket::getInstance()->appendHistory(player->getGUID(), (offer.type == MARKETACTION_BUY ? MARKETACTION_SELL : MARKETACTION_BUY), offer.itemId, amount, offer.price, offer.timestamp + marketOfferDuration, OFFERSTATE_ACCEPTEDEX, offer.Attrs);
- IOMarket::getInstance()->appendHistory(offer.playerId, offer.type, offer.itemId, amount, offer.price, offer.timestamp + marketOfferDuration, OFFERSTATE_ACCEPTED, offer.Attrs);
- offer.amount -= amount;
- if(offer.amount == 0)
- IOMarket::getInstance()->deleteOffer(offerId);
- else
- IOMarket::getInstance()->acceptOffer(offerId, amount);
- player->sendMarketEnter(1);
- offer.timestamp += marketOfferDuration;
- player->sendMarketAcceptOffer(offer);
- return true;
- }
- void Game::checkExpiredMarketOffers()
- {
- IOMarket::getInstance()->clearOldHistory();
- const ExpiredMarketOfferList& expiredBuyOffers = IOMarket::getInstance()->getExpiredOffers(MARKETACTION_BUY);
- for(ExpiredMarketOfferList::const_iterator it = expiredBuyOffers.begin(), end = expiredBuyOffers.end(); it != end; ++it)
- {
- ExpiredMarketOffer offer = *it;
- Player* player = getPlayerByGuid(offer.playerId);
- uint64_t totalPrice = (uint64_t)offer.price * offer.amount;
- if(player)
- addMoney(player->getDepot(2, false), totalPrice, FLAG_NOLIMIT);
- else
- IOLoginData::getInstance()->increaseBankBalance(offer.playerId, totalPrice);
- IOMarket::getInstance()->moveOfferToHistory(offer.id, OFFERSTATE_EXPIRED);
- }
- const ExpiredMarketOfferList& expiredSellOffers = IOMarket::getInstance()->getExpiredOffers(MARKETACTION_SELL);
- for(ExpiredMarketOfferList::const_iterator it = expiredSellOffers.begin(), end = expiredSellOffers.end(); it != end; ++it)
- {
- ExpiredMarketOffer offer = *it;
- Player* player = getPlayerByGuid(offer.playerId);
- if(!player)
- {
- std::string name;
- if(!IOLoginData::getInstance()->getNameByGuid(offer.playerId, name))
- continue;
- player = new Player(name, NULL);
- if(!IOLoginData::getInstance()->loadPlayer(player, name))
- {
- delete player;
- continue;
- }
- }
- const ItemType& itemType = Item::items[offer.itemId];
- Depot* depotChest = player->getDepot(2, false);
- if(itemType.id == 0)
- continue;
- if(itemType.stackable)
- {
- uint16_t tmpAmount = offer.amount;
- while(tmpAmount > 0)
- {
- uint16_t stackCount = std::min<uint16_t>(100, tmpAmount);
- Item* item = Item::CreateItem(itemType.id, stackCount);
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- else{
- player->onReceiveMail();
- }
- tmpAmount -= stackCount;
- }
- }
- else
- {
- int32_t subType = -1;
- if(itemType.charges != 0)
- subType = itemType.charges;
- for(uint16_t i = 0; i < offer.amount; ++i)
- {
- Item* item = Item::CreateItem(itemType.id, subType);
- MarketOfferEx offer2 = IOMarket::getInstance()->getOfferById(offer.id);
- std::stringstream test(offer2.Attrs);
- std::string segment;
- std::vector<std::string> seglist;
- if(offer2.Attrs != "false" && subType == -1){
- while(std::getline(test, segment, 'º'))
- {
- seglist.push_back(segment);
- }
- for(int i = 0; i < seglist.size(); i++) {
- std::stringstream test2(seglist[i]);
- std::string segment2;
- std::vector<std::string> seglist2;
- while(std::getline(test2, segment2, '#'))
- {
- seglist2.push_back(segment2);
- }
- if(std::isdigit(atoi((char*)seglist2[1].c_str())) || atoi((char*)seglist2[1].c_str()) >= 1){
- item->setAttribute(seglist2[0], atoi((char*)seglist2[1].c_str()));
- }else{
- item->setAttribute(seglist2[0], seglist2[1]);
- }
- }
- }
- if(internalAddItem(NULL, depotChest, item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RET_NOERROR)
- {
- delete item;
- break;
- }
- }
- }
- if(player->isOffline())
- {
- IOLoginData::getInstance()->savePlayer(player);
- delete player;
- }
- IOMarket::getInstance()->moveOfferToHistory(offer.id, OFFERSTATE_EXPIRED);
- }
- int32_t checkExpiredMarketOffersEachMinutes = 30;
- if(checkExpiredMarketOffersEachMinutes <= 0)
- return;
- Scheduler::getInstance().addEvent(createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, boost::bind(&Game::checkExpiredMarketOffers, this)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement