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;
}