• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Solved C++ Help script

Sigoles

Discord: @sigoles
Joined
Nov 20, 2015
Messages
1,209
Solutions
2
Reaction score
154
Hello, I'm trying to block if player try to transfer coins to rook sample, sorcerer sample, druid sample...

Original function:
C++:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if (!tmpPlayer) {
        tmpPlayer = new Player(nullptr);
        if (!IOLoginData::loadPlayerByName(tmpPlayer, recipient)) {
            delete tmpPlayer;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
       
    if (tmpPlayer->getAccount() == player->getAccount()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer coins to the same account.");
    }

    std::string description(player->getName() + " transferred to " + recipient);

    IOAccount::addCoins(player->getAccount(), -static_cast<int32_t>(amount));
    player->coinBalance -= amount;
    g_store->onTransactionCompleted(player->getAccount(), -static_cast<int32_t>(amount), description);

    IOAccount::addCoins(tmpPlayer->getAccount(), amount);
    g_store->onTransactionCompleted(tmpPlayer->getAccount(), amount, description);

    if (tmpPlayer->isOffline()) {
        delete tmpPlayer;
    }

    return player->sendStorePurchaseCompleted("You have successfully gifted Tibia Coins.");
}

I tryed this but not have sucess:

C++:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if (!tmpPlayer) {
        tmpPlayer = new Player(nullptr);
        if (!IOLoginData::loadPlayerByName(tmpPlayer, recipient)) {
            delete tmpPlayer;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
       
    Player *tmpPlayerManager = g_game.getPlayerByName(recipient);
    if (!tmpPlayerManager) {
        tmpPlayerManager = g_game.getPlayerByName("Rook Sample");
        if (!IOLoginData::loadPlayerByName(tmpPlayerManager, recipient)) {
            delete tmpPlayerManager;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
   
   
   
    if (tmpPlayer->getAccount() == player->getAccount()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer coins to the same account.");
    }

    std::string description(player->getName() + " transferred to " + recipient);

    IOAccount::addCoins(player->getAccount(), -static_cast<int32_t>(amount));
    player->coinBalance -= amount;
    g_store->onTransactionCompleted(player->getAccount(), -static_cast<int32_t>(amount), description);

    IOAccount::addCoins(tmpPlayer->getAccount(), amount);
    g_store->onTransactionCompleted(tmpPlayer->getAccount(), amount, description);

    if (tmpPlayer->isOffline()) {
        delete tmpPlayer;
    }

    return player->sendStorePurchaseCompleted("You have successfully gifted Tibia Coins.");
}
 
Last edited by a moderator:
Solution
Hello, I'm trying to block if player try to transfer coins to rook sample, sorcerer sample, druid sample...

Original function:
Code:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if...
i don't get what you mean with rook sample, if you are trying to block by player name you could do
C++:
if ( tmpPlayer->getName() == "some name" )
{
    return player->sendStoreError(STORE_ERROR_TRANSFER, "error msg");
}
it should works but a vector with names are way better
 
Last edited by a moderator:
i don't get what you mean with rook sample, if you are trying to block by player name you could do
Code:
if ( tmpPlayer->getName() == "some name" )
{
    return player->sendStoreError(STORE_ERROR_TRANSFER, "error msg");
}
it should works but a vector with names are way better

I can put
if ( tmpPlayer->getName() == "some name" ) or ( tmpPlayer->getName() == "some name2" ) or...... ?
 
Hello, I'm trying to block if player try to transfer coins to rook sample, sorcerer sample, druid sample...

Original function:
Code:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if (!tmpPlayer) {
        tmpPlayer = new Player(nullptr);
        if (!IOLoginData::loadPlayerByName(tmpPlayer, recipient)) {
            delete tmpPlayer;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
     
    if (tmpPlayer->getAccount() == player->getAccount()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer coins to the same account.");
    }

    std::string description(player->getName() + " transferred to " + recipient);

    IOAccount::addCoins(player->getAccount(), -static_cast<int32_t>(amount));
    player->coinBalance -= amount;
    g_store->onTransactionCompleted(player->getAccount(), -static_cast<int32_t>(amount), description);

    IOAccount::addCoins(tmpPlayer->getAccount(), amount);
    g_store->onTransactionCompleted(tmpPlayer->getAccount(), amount, description);

    if (tmpPlayer->isOffline()) {
        delete tmpPlayer;
    }

    return player->sendStorePurchaseCompleted("You have successfully gifted Tibia Coins.");
}

I tryed this but not have sucess:

Code:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if (!tmpPlayer) {
        tmpPlayer = new Player(nullptr);
        if (!IOLoginData::loadPlayerByName(tmpPlayer, recipient)) {
            delete tmpPlayer;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
     
    Player *tmpPlayerManager = g_game.getPlayerByName(recipient);
    if (!tmpPlayerManager) {
        tmpPlayerManager = g_game.getPlayerByName("Rook Sample");
        if (!IOLoginData::loadPlayerByName(tmpPlayerManager, recipient)) {
            delete tmpPlayerManager;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
 
 
 
    if (tmpPlayer->getAccount() == player->getAccount()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer coins to the same account.");
    }

    std::string description(player->getName() + " transferred to " + recipient);

    IOAccount::addCoins(player->getAccount(), -static_cast<int32_t>(amount));
    player->coinBalance -= amount;
    g_store->onTransactionCompleted(player->getAccount(), -static_cast<int32_t>(amount), description);

    IOAccount::addCoins(tmpPlayer->getAccount(), amount);
    g_store->onTransactionCompleted(tmpPlayer->getAccount(), amount, description);

    if (tmpPlayer->isOffline()) {
        delete tmpPlayer;
    }

    return player->sendStorePurchaseCompleted("You have successfully gifted Tibia Coins.");
}
Place that above everything:
C++:
    static std::vector<std::string> samples {"Druid Sample", "Sorcerer Sample"};
    if (std::find_if(samples.begin(), samples.end(), [&](const std::string& s) { return strcasecmp(s.c_str(), recipient.c_str()) == 0; }) != samples.end()) {
        return;
    }
 
Last edited by a moderator:
Solution
Place that above everything:
Code:
    static std::vector<std::string> samples {"Druid Sample", "Sorcerer Sample"};
    if (std::find_if(samples.begin(), samples.end(), [&](const std::string& s) { return strcasecmp(s.c_str(), recipient.c_str()) == 0; }) != samples.end()) {
        return;
    }

Thnaks, work, solved =))

I have another question if you can help too :')

https://otland.net/threads/c-debbug.249001/
 
@MatheusMkalo hey bro, how I can put delay 10 seconds for each transfer on this function? can you help ? o_O

C++:
void Game::playerTransferCoins(uint32_t playerId, const std::string& recipient, uint16_t amount)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    if (player->coinBalance < amount) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You don't have enough coins to transfer.");
    }

    if (amount % g_config.getNumber(ConfigManager::STORE_COINS_PACKET_SIZE) != 0) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer this amount of coins.");
    }

    Player *tmpPlayer = g_game.getPlayerByName(recipient);
    if (!tmpPlayer) {
        tmpPlayer = new Player(nullptr);
        if (!IOLoginData::loadPlayerByName(tmpPlayer, recipient)) {
            delete tmpPlayer;
            return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not found");
        }
    }
   
    static std::vector<std::string> samples {"Druid Sample", "Sorcerer Sample", "Rook Sample", "Knight Sample", "Paladin Sample", "Account Manager" };
    if (std::find_if(samples.begin(), samples.end(), [&](const std::string& s) { return strcasecmp(s.c_str(), recipient.c_str()) == 0; }) != samples.end()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "Recipient player not exist");
    }
       
    if (tmpPlayer->getAccount() == player->getAccount()) {
        return player->sendStoreError(STORE_ERROR_TRANSFER, "You can't transfer coins to the same account.");
    }

    std::string description(player->getName() + " transferred to " + recipient);

    IOAccount::addCoins(player->getAccount(), -static_cast<int32_t>(amount));
    player->coinBalance -= amount;
    g_store->onTransactionCompleted(player->getAccount(), -static_cast<int32_t>(amount), description);

    IOAccount::addCoins(tmpPlayer->getAccount(), amount);
    g_store->onTransactionCompleted(tmpPlayer->getAccount(), amount, description);

    if (tmpPlayer->isOffline()) {
        delete tmpPlayer;
    }

    return player->sendStorePurchaseCompleted("You have successfully gifted Tibia Coins.");
}
 
Last edited by a moderator:
Under this line add this:
C++:
int64_t lastCoinTransfer = 0;

Under this line add this:
C++:
bool canTransferCoins(int32_t delay) {
    if ((OTSYS_TIME() - lastCoinTransfer) < delay) {
        return false;
    }
    lastCoinTransfer = OTSYS_TIME();
    return true;
}

Then add this check inside playerTransferCoins:

C++:
if (!player->canTransferCoins(10000)) {
    return player->sendStoreError(STORE_ERROR_TRANSFER, "Some message.");
}
 
Last edited by a moderator:
Under this line add this:
Code:
int64_t lastCoinTransfer = 0;

Under this line add this:
Code:
bool canTransferCoins(int32_t delay) {
    if ((OTSYS_TIME() - lastCoinTransfer) < delay) {
        return false;
    }
    lastCoinTransfer = OTSYS_TIME();
    return true;
}

Then add this check inside playerTransferCoins:

Code:
if (!player->canTransferCoins(10000)) {
    return player->sendStoreError(STORE_ERROR_TRANSFER, "Some message.");
}

thanks
Have problem if I put without =0; ? print: http://prntscr.com/e34trq

Tested here, solved works :p
 
Last edited by a moderator:
Back
Top