Другое С/С++ Вопрос - Ответ

astap_

Известный
Всефорумный модератор
626
597
C++:
bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        DWORD strlen;
        char string[2048];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(strlen);
        params->bitStream->Read(string, strlen);

        SF->getSAMP()->getChat()->AddChatMessage(-1, "дебаг");
        if (!strcmp(string, "Server closed the connection."))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Сервер закрыл соединение");
        }
    }
    return true;
}

В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
отлавливай через структуру чата либо через хук DISCONNECTION_NOTIFICATION
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
отлавливай через структуру чата либо через хук DISCONNECTION_NOTIFICATION
Даже если другой текст ввести туда, то всё равно не сравниваются строки

Как отловить сообщение и сравнить с помощью strcmp ?
 

ALF

Известный
Проверенный
320
537
C++:
bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        DWORD strlen;
        char string[2048];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(strlen);
        params->bitStream->Read(string, strlen);

        SF->getSAMP()->getChat()->AddChatMessage(-1, "дебаг");
        if (!strcmp(string, "Server closed the connection."))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Сервер закрыл соединение");
        }
    }
    return true;
}

В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
1. не правильно читаешь
2. Server closed the connection не приходит в RPC_ScrClientMessage
 

ALF

Известный
Проверенный
320
537
Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?
C++:
uint strLen, color;
char szMsg[144];

params->bitStream->ResetReadPointer();
params->bitStream->Read(color);
params->bitStream->Read(strLen);
if (strLen >= sizeof(szMsg)) strLen = sizeof(szMsg) - 1;
params->bitStream->Read(szMsg, strLen);
szMsg[strLen] = '\0';

if(strstr(szMsg, "text"))
{
    // ...
}
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
C++:
uint strLen, color;
char szMsg[144];

params->bitStream->ResetReadPointer();
params->bitStream->Read(color);
params->bitStream->Read(strLen);
if (strLen >= sizeof(szMsg)) strLen = sizeof(szMsg) - 1;
params->bitStream->Read(szMsg, strLen);
szMsg[strLen] = '\0';

if(strstr(szMsg, "text"))
{
    // ...
}
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
 

Cake_

Известный
Проверенный
263
313
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
C++:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
{
    size_t len;
    DWORD color;
    char message[256];
    params->bitStream->ResetReadPointer();
    params->bitStream->Read(color);
    params->bitStream->Read(len);
    params->bitStream->Read(message, len);
    params->bitStream->ResetReadPointer();
    message[len] = '\0';

    if (strcmp(message, "cakebou") == 0)
    {
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Got it!");
    }
};

не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
Если что функция strcmp проверяет целую строку, а strstr проверяет часть строки
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
C++:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
{
    size_t len;
    DWORD color;
    char message[256];
    params->bitStream->ResetReadPointer();
    params->bitStream->Read(color);
    params->bitStream->Read(len);
    params->bitStream->Read(message, len);
    params->bitStream->ResetReadPointer();
    message[len] = '\0';

    if (strcmp(message, "cakebou") == 0)
    {
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Got it!");
    }
};


Если что функция strcmp проверяет целую строку, а strstr проверяет часть строки
И так и так проверял, не работает, он читает другие строки чата, но почему-то не сравнивает.
Это проблема появилась после подключения имгуи к проекту.
Возможно это из-за того что сравнивает с текстом на кириллице.
 
Последнее редактирование:

2Shae

Известный
149
8
Как отобразить курсор при активном меню ImGui и спрятать его, когда оно закрыто?
 

Vandal™

Известный
55
4
Потому что ImGui работает только с UTF-8.
ImGui::Text(u8"Русский язык");
ImGui::Text(u8"Чек-Текст");
ImGui::Button(u8"Закрыть", ImVec2(75, 20)); - не пашет, все равно вопросы вместо текста.

UPD:

C++:
        ImFontConfig font_config;
        font_config.OversampleH = 1;
        font_config.OversampleV = 1;
        font_config.PixelSnapH = 1;

        static const ImWchar ranges[] =
        {
            0x0020, 0x00FF, // Basic Latin + Latin Supplement
            0x0400, 0x044F, // Cyrillic
            0,
        };

        io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Tahoma.ttf", 16.0f, &font_config, ranges);

Есть еще решения проблемы, кроме предложенных?
 
Последнее редактирование:

_Vine_

Активный
154
57
ImGui::Text(u8"Чек-Текст");
ImGui::Button(u8"Закрыть", ImVec2(75, 20)); - не пашет, все равно вопросы вместо текста.

UPD:

C++:
        ImFontConfig font_config;
        font_config.OversampleH = 1;
        font_config.OversampleV = 1;
        font_config.PixelSnapH = 1;

        static const ImWchar ranges[] =
        {
            0x0020, 0x00FF, // Basic Latin + Latin Supplement
            0x0400, 0x044F, // Cyrillic
            0,
        };

        io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Tahoma.ttf", 16.0f, &font_config, ranges);

Есть еще решения проблемы, кроме предложенных?
Должно работать, может, у тебя в коде есть еще загрузки шрифтов, убедись, что этот шрифт загружается последним или что установлен именно этот шрифт.
И попробуй сделать так
C++:
io.FontDefault = io.Fonts->AddFontFromFileTTF(fontPath, 16, &font_config, io.Fonts->GetGlyphRangesCyrillic());
 
  • Нравится
Реакции: Vandal™