- 0
pedido Lua:dostarttrade(Player, Tradepartner, Transferitem)
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.
-
Conteúdo Similar
-
- 0 respostas
- 2163 visualizações
-
- 0 respostas
- 1401 visualizações
-
[TFS 0.4/8.60] NPC que aumenta a velocidade de upar todas as skill no trainer em 40% durante 7 dias!
Por BrunoBrilha,
- 1 resposta
- 2057 visualizações
-
- 1 resposta
- 1689 visualizações
-
- 0 respostas
- 1402 visualizações
-

Pergunta
bepokemon 101
Seria bem legal se alguem tomasse a iniciativa de postar o code da funcão doStartTrade(), que já existe em alguns OTs porém nao está aberta para todos. Em geral pode-se usar como base a funcão interna utilizada no comando !sellhouse, que utiliza deste mecanismo.
Aqui está os fragmentos do !sellhouse:
commands.cpp:
bool Commands::sellHouse(Creature* creature, const std::string& cmd, const std::string& param) { Player* player = creature->getPlayer(); if(player){ House* house = Houses::getInstance().getHouseByPlayerId(player->getGUID()); if(!house){ player->sendCancel("You do not own any house."); return false; } Player* tradePartner = game->getPlayerByName(param); if(!(tradePartner && tradePartner != player)){ player->sendCancel("Trade player not found."); return false; } if(tradePartner->getPlayerInfo(PLAYERINFO_LEVEL) < 1){ player->sendCancel("Trade player level is too low."); return false; } if(Houses::getInstance().getHouseByPlayerId(tradePartner->getGUID())){ player->sendCancel("Trade player already owns a house."); return false; } if(!Position::areInRange<2,2,0>(tradePartner->getPosition(), player->getPosition())){ player->sendCancel("Trade player is too far away."); return false; } Item* transferItem = house->getTransferItem(); if(!transferItem){ player->sendCancel("You can not trade this house."); return false; } transferItem->getParent()->setParent(player); if(game->internalStartTrade(player, tradePartner, transferItem)){ return true; } else{ house->resetTransferItem(); } } return false; }talkactions.cpp:
bool TalkAction::houseSell(Creature* creature, const std::string& cmd, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::HOUSE_BUY_AND_SELL)) return false; House* house = Houses::getInstance()->getHouseByPlayerId(player->getGUID()); if(!house && (!player->getGuildId() || !(house = Houses::getInstance()->getHouseByGuildId(player->getGuildId())))) { player->sendCancel("You do not rent any flat."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(house->isGuild() && player->getGuildLevel() != GUILDLEVEL_LEADER) { player->sendCancel("You have to be at least a guild leader to sell this hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Player* tradePartner = NULL; ReturnValue ret = g_game.getPlayerByNameWildcard(param, tradePartner); if(ret != RET_NOERROR) { player->sendCancelMessage(ret); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(tradePartner == player) { player->sendCancel("You cannot trade with yourself."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!house->isGuild()) { if(Houses::getInstance()->getHouseByPlayerId(tradePartner->getGUID())) { player->sendCancel("Trade player already rents another house."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint16_t housesPerAccount = g_config.getNumber(ConfigManager::HOUSES_PER_ACCOUNT); if(housesPerAccount > 0 && Houses::getInstance()->getHousesCount(tradePartner->getAccount()) >= housesPerAccount) { char buffer[100]; sprintf(buffer, "Trade player has reached limit of %d house%s per account.", housesPerAccount, (housesPerAccount != 1 ? "s" : "")); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!tradePartner->isPremium() && !g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM)) { player->sendCancel("Trade player does not have a premium account."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint32_t levelToBuyHouse = g_config.getNumber(ConfigManager::LEVEL_TO_BUY_HOUSE); if(tradePartner->getLevel() < levelToBuyHouse) { char buffer[100]; sprintf(buffer, "Trade player has to be at least Level %d to buy house.", levelToBuyHouse); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } else { if(!tradePartner->getGuildId() || tradePartner->getGuildLevel() != GUILDLEVEL_LEADER) { player->sendCancel("Trade player has to be at least a guild leader to buy a hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(Houses::getInstance()->getHouseByGuildId(tradePartner->getGuildId())) { player->sendCancel("Trade player's guild already rents another hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } if(!Position::areInRange<3,3,0>(tradePartner->getPosition(), player->getPosition())) { player->sendCancel("Trade player is too far away."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!Houses::getInstance()->payRent(player, house, 0)) { player->sendCancel("You have to pay a pre-rent first."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Item* transferItem = TransferItem::createTransferItem(house); player->transferContainer.__addThing(NULL, transferItem); player->transferContainer.setParent(player); if(!g_game.internalStartTrade(player, tradePartner, transferItem)) transferItem->onTradeEvent(ON_TRADE_CANCEL, player, NULL); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); return false; }OBS: Seria legal algo que funcionasse assim:
A comunidade inteira agradece desde já.
Editado por ByerneLink para o comentário
https://xtibia.com/forum/topic/187786-luadostarttradeplayer-tradepartner-transferitem/Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados