Другое SAMPFUNCS | API C++

Revalto

Известный
532
225
Вроде, должно быть так.
C++:
bool CALLBACK testRPC(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана, если от сервера был получен новый RPC.
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
    {
        WORD ID;
        char text[256];
        uint16_t sLen;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(ID);
        params->bitStream->SetReadOffset(0x1F8);
        params->bitStream->Read(sLen);
        if (sLen)
            params->bitStream->Read(text, sLen);
        text[sLen] = 0;

        if (_house == true)
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "ID: %d | Text: %s", ID, text);
        }
    }

    return true; // успешно завершаем обработку RPC.
};
Краш при конекте на сервер
 

Karbun

Участник
112
3
Почему крашит?
C++:
void CALLBACK textdraw(std::string str)
{
    int num;
    for (int t = 0; t < SAMP_MAX_TEXTDRAWS; t++)
    {
        char* tdraw = SF->getSAMP()->getInfo()->pPools->pTextdraw->textdraw[t]->szText;
        if (sscanf(tdraw, "~r~FPS: ~w~%d", num))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Номер из текстдрава: %d", num);
        }
        else
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Нужного текстдрава нет.");
        }
    }
}
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,462
Почему крашит?
C++:
void CALLBACK textdraw(std::string str)
{
    int num;
    for (int t = 0; t < SAMP_MAX_TEXTDRAWS; t++)
    {
        char* tdraw = SF->getSAMP()->getInfo()->pPools->pTextdraw->textdraw[t]->szText;
        if (sscanf(tdraw, "~r~FPS: ~w~%d", num))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Номер из текстдрава: %d", num);
        }
        else
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Нужного текстдрава нет.");
        }
    }
}
Возможно то, что SF->getSAMP()->getInfo()->pPools->pTextdraw->textdraw[t] = 0 => пытаешься обратиться к недействительному указателю.
 

Shock1

Новичок
4
0
Как хукнуть сообщение сервера?Есть у кого пример?Через Rpc_ClientMessage...
Нужно,чтобы при сообщении,выполнялось действие
 

mkrn

Известный
67
61
Как хукнуть сообщение сервера?Есть у кого пример?Через Rpc_ClientMessage...
Нужно,чтобы при сообщении,выполнялось действие

C++:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        DWORD len, color;
        char msg[144];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(len);
        params->bitStream->Read(msg, len);
        msg[len] = '\0';

        if (strstr(msg, "сообщение"))
        {
           // действия
        }
    };
 
  • Нравится
Реакции: jenekbueno

Karbun

Участник
112
3
C++:
int l;
if (sscanf(Text, "~r~FPS: ~w~%d", &l))
Почему переменная "l" принимает астрономические значения вроде "27546456", вместо цифр, которые присылает сервер? Текст читается правильно.
 

Woofing Giraffe

Активный
402
49
C++:
int l;
if (sscanf(Text, "~r~FPS: ~w~%d", &l))
Почему переменная "l" принимает астрономические значения вроде "27546456", вместо цифр, которые присылает сервер? Текст читается правильно.
потому что ты её не инициализировал, и скорее всего потому что у тебя sscanf не работает
 
  • Нравится
Реакции: Karbun

memir

🇷🇺
Всефорумный модератор
333
599
мб там тип не инт
:facepalm2:
sscanf работает, проверял выводом текста, что ты имел под «ты не инициализировал переменную»?
Код:
int l = 0
Когда переменную объявляешь ее надо проинициализировать, то-есть присвоить переменной значение, ибо выделенная под нее память может быть замусорена другими данными
 
  • Нравится
Реакции: Karbun