Исходник sa:mp query mechanism

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805
Описание: Получает инфу о сервере сампа. это мой вариант реализации. предлагайте свои идеи по улучшению и ругайте мой код!!
GitHub: https://github.com/Receiver1/re_samp_query_mechanism
Использование:
C++:
auto sqm = c_sqm::singleton();
sqm->initialize("176.32.37.93", 7777);

auto srv_info = sqm->handle<s_server_info>(sqm->query(QUERYTYPE_SERVERINFO, 1));
// Now srv_info contains: is_locked, players, max_players, host_name, game_mode, language
Пакеты:
1623838777125.png

Враперры можно найти в wrappers.hpp
 
Последнее редактирование:

Vintik

Мечтатель
Проверенный
1,410
851
Ники с Arizona RP сможет получать?
C++:
// Now srv_info contains: is_locked, players, max_players, host_name, game_mode, language
  • Закрытый ли сервер
  • Количество игроков
  • Максимальное количество игроков
  • Имя хоста
  • Гейммод
  • Язык
Значит не может, логично?
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805
C++:
// Now srv_info contains: is_locked, players, max_players, host_name, game_mode, language
  • Закрытый ли сервер
  • Количество игроков
  • Максимальное количество игроков
  • Имя хоста
  • Гейммод
  • Язык
Значит не может, логично?
для получения списка игроков другой пакет есть: QUERYTYPE_PLAYERLIST, - но сервер не вернёт ничего, если игроков больше 100
 
  • Нравится
Реакции: Vintik

gaZmanoV

Участник
31
3
Форк этого же проекта, но с реализацией через boost::asio: https://github.com/Tim4ukys/re_samp_query_mechanism
+ не обязательно вводить IP (80.66.82.249 и 01.gtarp.ru одно и тоже выйдет в итоге)
Сорьки, что аппую тему. Зря старался чтоль?=((

example.cpp:
#include <iostream>
#include <random>

#include "SQM.h"

// https://www.blast.hk/threads/781/post-128505
int randomInteger(int min, int max)
{
    static std::random_device rd;
    static std::default_random_engine e1(rd());
    std::uniform_int_distribution<int> uniform_dist(min, max);
    return uniform_dist(e1);
}

int main(int argc, char* argv[])
{
    SQM sm{"01.gtarp.ru", "7777"};

    std::cout << "----- INFO SERVER -----" << std::endl;
    sm.sendRequest(SQM::eRequestType::SERVERINFO);
    auto inf = sm.receive<SQM::stServerInfo>();
    std::cout << "Host name: " << inf.m_sHostName << std::endl
        << "Player: " << inf.m_nPlayers << "/" << inf.m_nMaxPlayers << std::endl;

    std::cout << "----- RULES -----" << std::endl;
    sm.sendRequest(SQM::eRequestType::SERVERRULES);
    auto rul = sm.receive<SQM::stServerRules>();
    for (const auto& [rkey, rr] : rul.m_arrRules) {
        std::cout << rkey.c_str() << ": " << rr.c_str() << std::endl;
    }

    std::cout << "----- PLAYERS -----" << std::endl;
    sm.sendRequest(SQM::eRequestType::PLAYERLIST);
    auto players = sm.receive<SQM::stPlayerList>();
    size_t i_player{};
    for (const auto& pl : players.m_arrPlayer) {
        std::cout << "Nick: " << pl.m_sName << "; Score: " << pl.m_nScore << std::endl;
        if (++i_player > 5) {
            std::cout << "..." << std::endl;
            break;
        }
    }

    std::cout << "----- PING -----" << std::endl;
    int rand = randomInteger(INT_MIN, INT_MAX);
    UINT64 tick = GetTickCount64();
    sm.sendRequest(SQM::eRequestType::SERVERPING, &rand, 4);
    sm.receive<SQM::stServerPing>();
    tick = GetTickCount64() - tick;
    std::cout << "Ping: " << (int)tick << std::endl;

    return EXIT_SUCCESS;
}



Вывод:
1650782679879.png