• 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!

C++ Boss Reward System (Working in 1.4.2)

OTcreator

Well-Known Member
Joined
Feb 14, 2022
Messages
509
Solutions
1
Reaction score
59
Welcome.
The script was created by @ohman and customized for BlackTek, which is based on TFS 1.4.2.
Unfortunately , some of the changes to BlackTek in C++ caused , that the code can not be compiled (error).
Is anyone able to help so that the code is functional in the base TFS 1.4.2?

LINK:
Added Reward Container & Boss System (#14) · Black-Tek/BlackTek-Server@0da6263 (https://github.com/Black-Tek/BlackTek-Server/commit/0da6263793355166765cfba7cd4f09144584b1a3)

Error:

C++:
[  1%] Building CXX object CMakeFiles/tfs.dir/src/iologindata.cpp.o
/var/www/tfs_old/compiled/src/iologindata.cpp: In static member function ‘static bool IOLoginData::addRewardItems(uint32_t, const ItemBlockList&, DBInsert&, PropWriteStream&)’:
/var/www/tfs_old/compiled/src/iologindata.cpp:683:200: error: no matching function for call to ‘PropWriteStream::getStream()’
  683 | , item->getSubType(), db.escapeString(propWriteStream.getStream())))) {
      |                                       ~~~~~~~~~~~~~~~~~~~~~~~~~^~

In file included from /var/www/tfs_old/compiled/src/itemloader.h:7,
                 from /var/www/tfs_old/compiled/src/items.h:9,
                 from /var/www/tfs_old/compiled/src/item.h:9,
                 from /var/www/tfs_old/compiled/src/map.h:8,
                 from /var/www/tfs_old/compiled/src/creature.h:7,
                 from /var/www/tfs_old/compiled/src/player.h:7,
                 from /var/www/tfs_old/compiled/src/iologindata.h:8,
                 from /var/www/tfs_old/compiled/src/iologindata.cpp:6:
/var/www/tfs_old/compiled/src/fileloader.h:121:29: note: candidate: ‘const char* PropWriteStream::getStream(size_t&) const’
  121 |                 const char* getStream(size_t& size) const {
      |                             ^~~~~~~~~
/var/www/tfs_old/compiled/src/fileloader.h:121:29: note:   candidate expects 1 argument, 0 provided
/var/www/tfs_old/compiled/src/iologindata.cpp:704:207: error: no matching function for call to ‘PropWriteStream::getStream()’
  704 | , item->getSubType(), db.escapeString(propWriteStream.getStream())))) {
      |                                       ~~~~~~~~~~~~~~~~~~~~~~~~~^~

In file included from /var/www/tfs_old/compiled/src/itemloader.h:7,
                 from /var/www/tfs_old/compiled/src/items.h:9,
                 from /var/www/tfs_old/compiled/src/item.h:9,
                 from /var/www/tfs_old/compiled/src/map.h:8,
                 from /var/www/tfs_old/compiled/src/creature.h:7,
                 from /var/www/tfs_old/compiled/src/player.h:7,
                 from /var/www/tfs_old/compiled/src/iologindata.h:8,
                 from /var/www/tfs_old/compiled/src/iologindata.cpp:6:
/var/www/tfs_old/compiled/src/fileloader.h:121:29: note: candidate: ‘const char* PropWriteStream::getStream(size_t&) const’
  121 |                 const char* getStream(size_t& size) const {
      |                             ^~~~~~~~~
/var/www/tfs_old/compiled/src/fileloader.h:121:29: note:   candidate expects 1 argument, 0 provided
make[2]: *** [CMakeFiles/tfs.dir/build.make:541: CMakeFiles/tfs.dir/src/iologindata.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/tfs.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
 
LUA:
bool IOLoginData::addRewardItems(uint32_t playerId, const ItemBlockList& itemList, DBInsert& query_insert, PropWriteStream& propWriteStream)
{
    using ContainerBlock = std::pair<Container*, int32_t>;
    std::list<ContainerBlock> queue;

    Database& db = Database::getInstance();

    DBResult_ptr result = db.storeQuery(fmt::format("SELECT MAX(pid) as max_pid FROM `player_rewarditems` WHERE `player_id` = {:d}", playerId));
    int32_t runningId = 1;
    int32_t pidCounter = 1;

    if (result) {
        int32_t maxPid = result->getNumber<int32_t>("max_pid");
        if (maxPid > 0) {
            pidCounter = maxPid + 1;
        }
    }

    int32_t parentPid = pidCounter;

    for (const auto& it : itemList) {
        Item* item = it.second;

        propWriteStream.clear();
        item->serializeAttr(propWriteStream);

        size_t streamSize;
        const char* stream = propWriteStream.getStream(streamSize);
        if (!query_insert.addRow(fmt::format("{:d}, {:d}, {:d}, {:d}, {:d}, {:s}",
            playerId, parentPid, runningId, item->getID(), item->getSubType(),
            db.escapeString(stream)))) {
            return false;
        }

        if (Container* container = item->getContainer()) {
            queue.emplace_back(container, runningId);
        }

        ++runningId;
    }

    while (!queue.empty()) {
        const ContainerBlock& cb = queue.front();
        Container* container = cb.first;
        int32_t parentId = cb.second;
        queue.pop_front();

        for (Item* item : container->getItemList()) {
            propWriteStream.clear();
            item->serializeAttr(propWriteStream);

            size_t streamSize;
            const char* stream = propWriteStream.getStream(streamSize);
            if (!query_insert.addRow(fmt::format("{:d}, {:d}, {:d}, {:d}, {:d}, {:s}",
                playerId, parentId, runningId, item->getID(), item->getSubType(),
                db.escapeString(stream)))) {
                return false;
            }

            if (Container* subContainer = item->getContainer()) {
                queue.emplace_back(subContainer, runningId);
            }

            ++runningId;
        }
    }
    return query_insert.execute();
}
 
Back
Top