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

C++ TFS 1.3 Store In Game

SUMEKAZEKI

ADM Custom Rook
Joined
Sep 10, 2016
Messages
39
Reaction score
4
Hello, i have problem wiith store in game. Look on gif

C++:
void ProtocolGame::sendStoreError(StoreError_t errorType, const std::string& message) {
    NetworkMessage msg;
    msg.addByte(0xE0);
    msg.addByte(errorType);
    msg.addString(message);

    writeToOutputBuffer(msg);
}

void ProtocolGame::requestPurchaseData(uint32_t offerId, StoreOfferType_t offerType) {
    NetworkMessage msg;
    msg.addByte(0xE1);
    msg.add<uint32_t>(offerId);
    msg.addByte(offerType);

    writeToOutputBuffer(msg);
}

void ProtocolGame::sendCoinBalance() {
    NetworkMessage msg;
    msg.addByte(0xF2); // updating balance
    msg.addByte(0x01);

    msg.addByte(0xDF); // coins balance
    msg.addByte(0x01);

    msg.add<uint32_t>(player->coinBalance); //total coins
    msg.add<uint32_t>(player->coinBalance); //transferable coins

    writeToOutputBuffer(msg);
}

void ProtocolGame::updateCoinBalance() {
    NetworkMessage msg;
    msg.addByte(0xF2);
    msg.addByte(0x00);

    writeToOutputBuffer(msg);

    g_dispatcher.addTask(
        createTask(std::bind([](ProtocolGame_ptr client) {
        auto coinBalance = IOAccount::getCoinBalance(client->player->getAccount());
        client->player->coinBalance = coinBalance;

        client->sendCoinBalance();
    }, getThis()))
    );
}

void ProtocolGame::sendStore() {
    NetworkMessage msg;
    msg.addByte(0xFB);
    msg.addByte(0x00);

    msg.add<uint16_t>(g_store->getCategories().size());
    for (auto& category : g_store->getCategories()) {
        msg.addString(category.getName());
        msg.addString(category.getDescription());

        msg.addByte(category.getCategoryState());

        msg.addByte(category.getIcons().size());
        for (const auto& icon : category.getIcons()) {
            msg.addString(icon);
        }

        msg.addString(category.getParent());
    }

    writeToOutputBuffer(msg);

    updateCoinBalance();
}

void ProtocolGame::sendStoreOffers(StoreCategory& category) {
    NetworkMessage msg;
    msg.addByte(0xFC);
    msg.addString(category.getName());

    msg.add<uint16_t>(category.getOffers().size());
    for (auto& offer : category.getOffers()) {
        msg.add<uint32_t>(offer.getId());
        msg.addString(offer.getName());
        msg.addString(offer.getDescription());

        msg.add<uint32_t>(offer.getPrice());

        msg.addByte(offer.getOfferState());

        std::string reason = "";
        bool enabled = g_store->executeOnRender(player, &offer, reason);
        msg.addByte(!enabled);
        if (!enabled) {
            msg.addString(reason + "\n");
        }

        msg.addByte(offer.getIcons().size());
        for (const auto& icon : offer.getIcons()) {
            msg.addString(icon);
        }

        msg.add<uint16_t>(offer.getSubOffers().size());
        for (auto& subOffer : offer.getSubOffers()) {
            msg.addString(subOffer.getName());
            msg.addString(subOffer.getDescription());

            msg.addByte(subOffer.getIcons().size());
            for (const auto& icon : subOffer.getIcons()) {
                msg.addString(icon);
            }
            msg.addString(subOffer.getParent());
        }
    }

    writeToOutputBuffer(msg);
}

void ProtocolGame::sendStoreHistory(uint32_t page, uint32_t entriesPerPage) {
    // dispatcher thread
    std::vector<StoreTransaction> storeHistory;
    g_store->getTransactionHistory(player->getAccount(), page, entriesPerPage, storeHistory);

    if (storeHistory.size() == 0) {
        return sendStoreError(STORE_ERROR_HISTORY, "No entries yet.");
    }

    NetworkMessage msg;
    msg.addByte(0xFD);
    msg.add<uint32_t>(page);

    int pages = storeHistory.size() / entriesPerPage + ((storeHistory.size() % entriesPerPage) > 0 ? 1 : 0);
    msg.add<uint32_t>(pages);

    msg.addByte((storeHistory.size() > entriesPerPage) ? entriesPerPage : storeHistory.size());

    size_t count = 0;
    for (const auto& entry : storeHistory) {
        if (count++ >= entriesPerPage) {
            break;
        }

        msg.add<uint32_t>(entry.timestamp);
        msg.addByte(STORE_OFFERTYPE_OTHER); // offer type
        msg.add<int32_t>(entry.coins);
        msg.addString(entry.description);
    }

    writeToOutputBuffer(msg);
}

void ProtocolGame::sendStorePurchaseCompleted(const std::string& message) {
    NetworkMessage msg;
    msg.addByte(0xFE);
    msg.addByte(0x00);
    msg.addString(message);
    msg.add<uint32_t>(player->coinBalance);
    msg.add<uint32_t>(player->coinBalance);

    writeToOutputBuffer(msg);
}
 
Back
Top