bool TalkAction::houseBuy(Creature* creature, const std::string&, const std::string&)
{
Player* player = creature->getPlayer();
if (!player || !g_config.getBool(ConfigManager::HOUSE_BUY_AND_SELL))
return false;
const Position& pos = getNextPosition(player->getDirection(), player->getPosition());
Tile* tile = g_game.getTile(pos);
if (!tile)
{
player->sendCancel("You have to be looking at door of flat you would like to purchase.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
HouseTile* houseTile = tile->getHouseTile();
if (!houseTile)
{
player->sendCancel("You have to be looking at door of flat you would like to purchase.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
House* house = houseTile->getHouse();
if (!house)
{
player->sendCancel("You have to be looking at door of flat you would like to purchase.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
if (!house->getDoorByPosition(pos))
{
player->sendCancel("You have to be looking at door of flat you would like to purchase.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
if (!house->isGuild())
{
if (Houses::getInstance()->getHouseByPlayerId(player->getGUID()))
{
player->sendCancel("You already rent another house.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
uint16_t accountHouses = g_config.getNumber(ConfigManager::HOUSES_PER_ACCOUNT);
if (accountHouses > 0 && Houses::getInstance()->getHousesCount(player->getAccount()) >= accountHouses)
{
char buffer[80];
sprintf(buffer, "You may own only %d house%s per account.", accountHouses, (accountHouses != 1 ? "s" : ""));
player->sendCancel(buffer);
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
if (g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM) && !player->isPremium())
{
player->sendCancelMessage(RET_YOUNEEDPREMIUMACCOUNT);
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
uint32_t levelToBuyHouse = g_config.getNumber(ConfigManager::LEVEL_TO_BUY_HOUSE);
if (player->getLevel() < levelToBuyHouse)
{
char buffer[90];
sprintf(buffer, "You have to be at least Level %d to purchase a house.", levelToBuyHouse);
player->sendCancel(buffer);
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
}
else
{
if (!player->getGuildId() || player->getGuildLevel() != GUILDLEVEL_LEADER)
{
player->sendCancel("You have to be at least a guild leader to purchase a hall.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
if (Houses::getInstance()->getHouseByGuildId(player->getGuildId()))
{
player->sendCancel("Your guild rents already another hall.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
}
if (house->getOwner())
{
player->sendCancel("This flat is already owned by someone else.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
if ((uint32_t)g_game.getMoney(player) < house->getPrice() || !g_game.removeMoney(player, house->getPrice()))
{
player->sendCancel("You do not have enough money.");
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
return false;
}
house->setOwnerEx(player->getGUID(), true);
std::string ret = "You have successfully bought this ";
if (house->isGuild())
ret += "hall";
else
ret += "house";
ret += ", remember to leave money at ";
if (house->isGuild())
ret += "guild owner ";
if (g_config.getBool(ConfigManager::BANK_SYSTEM))
ret += "bank or ";
ret += "depot of this town for rent.";
player->sendTextMessage(MSG_INFO_DESCR, ret.c_str());
g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE);
return false;
}