• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 0.X I got a problem with sellhouse

kaiqu3gabriel

New Member
Joined
Nov 9, 2017
Messages
27
Reaction score
4
Hello guys, I using sellhouse from function "houseSell" on my talkactions.xml

But I got a problem. On my server, only premium accounts can buy houses, but when one player trade a house with a free account, the free account can buy this house.

I don't know how to add a get premium function for solve it.

Halp please.
 
This one is probably pretty easy.

In your script that is triggered by the !sellhouse command, you will need to find the appropriate place to insert:

Code:
if targetPlayer:isPremium() then
    -- Here goes code to transfer house
end

Try something like that.
 
I found my code from sellhouse commands, its on talkaction.cpp but I don't know what is wrong here.
Code:
bool TalkAction::houseSell(Creature* creature, const std::string&, 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;
    }

    Tile* tile = g_game.getTile(player->getPosition());
    if(!tile || !tile->getHouseTile() || tile->getHouseTile()->getHouse() != house)
    {
        player->sendCancel("You have to be inside a house that you would like to sell.");
        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;
}
 
Code:
if( tradePartner->isPremium() == false )
{
    player->sendCancel("You cannot trade with a non-premium user");
    g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
    return false;
}

Edit: Sorry I keep changing the snippet over and over again with small changes to adapt it.

Add that snippet at line 44 in talkactions.cpp.
 
Back
Top