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

CleanLegend

Известный
Всефорумный модератор
476
928
Почему крашит?


Код:
std::cmatch res;

bool CALLBACK incomingRPC(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана, если от сервера был получен новый RPC.
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        uint32_t    len, color;
        char        msg[144];

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

        if (color == 4283445418 && std::regex_match(msg, res, std::regex("Администратор (.*) выдал бан чата игроку"))){
            SF->getSAMP()->getChat()->AddChatMessage(-1, "%s", res);
        }
    };

    return true; // успешно завершаем обработку RPC.
};
Попробуй так R"(^Администратор (.+) выдал бан чата игроку$)"
res[1].str().c_str()
 

BratokHR

Известный
3
0
Я думаю len может быть больше размера msg и происходит уход за границы. Увеличь размер msg и добавь проверку.
C++:
char msg[256];
...
if ( len >= sizeof( msg ) )
    return true;

params->bitStream->Read(msg, len);
msg[len] = 0;
.....
Ну да, res в AddChatMessage замени на res[1].str().c_str()
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Я думаю len может быть больше размера msg и происходит уход за границы. Увеличь размер msg и добавь проверку.
C++:
char msg[256];
...
if ( len >= sizeof( msg ) )
    return true;

params->bitStream->Read(msg, len);
msg[len] = 0;
.....
Размер сообщения в данном RPC -- 144 символа. Действие твое не имеет смысла.

Почему крашит?
regex_match не поддерживает чар.
C++:
#include <regex>
#include <string>
using namespace std;

bool CALLBACK incomingRPC(stRakNetHookParams *params) {
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) {
        DWORD        len, color;
        char        msg[144];
        BitStream *bs = params->bitStream;
        bs->Read(color);
        bs->Read(len);
        bs->Read(msg, len);
        msg[len] = '\0';
        string str = msg;
        try {
            if (color == 0xFF5030AA &&
                regex_search(msg, res, regex(R"(Администратор (.*) выдал бан чата игроку)"))){
                SF->getSAMP()->getChat()->AddChatMessage(-1, "%s", res[1].str().c_str());
            }
        }
        catch (const exceptions &e){
            SF->Log("%s | %s", __FUCTION__, e.what());
        }
    };
    return true; // успешно завершаем обработку RPC.
};
 

_Vine_

Активный
154
57
Как перезаписать данные в битстриме?
К примеру, пришел рпс ClientMessage и в нём мне нужно изменить лишь само сообщение.
Заного перезаполнять битстрим нельзя.
 

_Vine_

Активный
154
57
Ох блять, теперь понял почему не работало..
Ставил оффсет записи ток на размер строки, а на саму строку не ставил, получалось что записывал размер строки и саму строку по одному и тому же оффсету, думал автоматически оффсет смещается.
Спасибо!
 

jenekbueno

Известный
157
69
немогу адрес найти чет, который за дальность прорисовки отвечает, подскажет кто то?
как в этом видосе.
 

for (;;)

Участник
71
31
Как получить id водителя машины имея car handle
C++:
int carhandle;
carhandle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(vehId);