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

Savchik Blazer

Но я, мечту свою лелея...
Проверенный
668
294
в чем ошибка?
C++:
    uint16_t playerId = 3;
    const char* Name = "noname";
    BitStream bsClass;
    bsClass.Write(playerId);
    bsClass.Write(Name);
    SF->getRakNet()->emulateRecvRPC(11, &bsClass);
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Перед любой строкой надо еще её длину записывать. Так же строка должна заканчиваться нулевым символом(могу ошибаться). Так же длинна строки может быть в разных РПЦ в разных типах данных. Найти можно тут.
Если найду сообщение, то покажу пример как с std::string можно удобно записывать строки в рпц
Вот пример. Дума разберешься. Хоть тупых вопросов от тебя нет, как от одного окуня.
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
Если найду сообщение, то покажу пример как с std::string можно удобно записывать строки в рпц
лайфхак: добавляем эти строки в BitStream.h куда-нибудь вниз, и кайфуем
C++:
template<>
inline void BitStream::Write(std::string var) {
    Write(var.size());
    Write(var.c_str(), var.size());
}

#if __cpp_lib_string_view >= 201606
template<>
inline void BitStream::Write(std::string_view var) {
    Write(var.size());
    Write(var.data(), var.size());
}
#endif

Ну и пример:

C++:
std::string aye_string = "АУЕ";
bs.Write(aye_string);
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
лайфхак: добавляем эти строки в BitStream.h куда-нибудь вниз, и кайфуем
C++:
template<>
inline void BitStream::Write(std::string var) {
    Write(var.size());
    Write(var.c_str(), var.size());
}

#if __cpp_lib_string_view >= 201606
template<>
inline void BitStream::Write(std::string_view var) {
    Write(var.size());
    Write(var.data(), var.size());
}
#endif

Ну и пример:

C++:
std::string aye_string = "АУЕ";
bs.Write(aye_string);
Хороший вариант, но size вроде 4 байта занимает, а для некоторых РПЦ такое не подойдет. У RPC_ScrShowDialog параметры строк идут в одном байте. Хотя можно еще добавить в каком типе длины записывать строку.
 

loganhackerdff

Известный
868
519
нашёл кароче функцию, думал она будет удалять масло на дорогах, типо в деревне там, но она нихуя не делает походу
C++:
void CShadows::RemoveOilInArea(float x1, float y1, float x2, float y2) {
    ((void(__cdecl *)(float, float, float, float))0x7074F0)(x1, y1, x2, y2);
}

а масло удалить я хочу
 
  • Ха-ха
Реакции: legendabrn

horacy

Известный
102
92
Итак, я расшифровал текст диалога с помощью компрессора строк, но по какой-то причине текст обрезается, как мне это исправить?
Samp 0.3dl, Взял компрессор по этой ссылке https://github.com/imring/RakHook/tree/master/RakNet

C++:
        case RPC_ShowDialog:
        {
            traceLastFunc("RPC_ShowDialog");
            if (cheat_state->_generic.cheat_panic_enabled)
                break;


                traceLastFunc("RPC_ShowDialog");
                /*
                {'onShowDialog',
                {dialogId = 'uint16'},
                {style = 'uint8'},
                {title = 'string8'},
                {input = 'string8'},
                {button2 = 'string8'},
                {text = 'encodedString4096'}}
                */
                
                BitStream    bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
                WORD dialogId;
                uint8_t style, titleLen, button1Len, button2Len, textLen;
                char title[257], button1[257], button2[257], text[4096];
                bsData.Read(dialogId);
                bsData.Read(style);
                bsData.Read(titleLen);
                bsData.Read(title, titleLen);
                title[titleLen] = '\0';
                bsData.Read(button1Len);
                bsData.Read(button1, button1Len);
                button1[button1Len] = '\0';
                bsData.Read(button2Len);
                bsData.Read(button2, button2Len);
                button2[button2Len] = '\0';
            
                
               bsData.Read(textLen);
               bsData.Read(text, textLen);
                text[textLen] = '\0';
                addMessageToChatWindow("Coded: %s", text);
                stringCompressor->DecodeString(text, 0x1000, &bsData, 0);
                addMessageToChatWindow("Decoded: %s", text);
x.png
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Все ты правильно сделал по чтению. Одно сообщение в чате может быть до 144 символов и если при добавлении строки в чат в ней будут переносы, то автоматического разделение не будет
 

sc6ut

неизвестный
Модератор
382
1,089
Все ты правильно сделал по чтению. Одно сообщение в чате может быть до 144 символов и если при добавлении строки в чат в ней будут переносы, то автоматического разделение не будет
ниче правильно он читает.
bsData.Read(textLen); bsData.Read(text, textLen);
в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.
 

horacy

Известный
102
92
ниче правильно он читает.

в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.

У меня нет RPC_ScrShowDialog, только RPC_ShowDialog, поэтому я могу читать только через bsData.read, а не через params->bitStream->Read.
C++:
void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
    StringCompressor::AddReference();
    StringTable::AddReference();
   
    if (!isCheatPanicEnabled())
    {
        if (set.netPatchAssoc[id][INCOMING_RPC] != nullptr && set.netPatchAssoc[id][INCOMING_RPC]->enabled)
            return;
    }



    if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
Кроме того, у меня нет структуры stSAMPDialog, но есть stDialogInfo, который содержит это:
C++:
struct stDialogInfo
{
    IDirect3DDevice9    *m_pD3DDevice;
    int    iTextPoxX;
    int    iTextPoxY;
    uint32_t    uiDialogSizeX;
    uint32_t    uiDialogSizeY;
    int    iBtnOffsetX;
    int    iBtnOffsetY;
    class _CDXUTDialog                        *pDialog;
    class _CDXUTListBox                        *pList;
    class _CDXUTIMEEditBox                        *pEditBox;
    int    iIsActive;
    int    iType;
    uint32_t    DialogID;
    char        pText[1000];
    uint32_t    uiTextWidth;
    uint32_t    uiTextHeight;
    char        szCaption[65];
    int        bServerside;
};
Я пытался сделать это на своей структуре, но это ничего не изменило, и при вставке структуры stSampdialog я мог только читать пустой текст.
Мне нужен текст диалога, так как никнеймы в списке игроков анонимны и были перемещены в диалог вместе с id, поэтому мне нужен текст диалога, чтобы прочитать, какой id имеет какой ник, а затем заменить никнеймы игроки.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

после загрузки samp происходит вылет игры, sampfuncs 0.3dl, отладчик выдал эти адреса. На mod_sa по умолчанию нет сбоя, что может быть причиной такого сбоя?
Код:
Exception thrown at location 0x03B1B396 (samp.dll) in gta_sa.exe: 0xC0000005: Access violation while reading at location 0x0029E868.
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,078
2,095
ниче правильно он читает.

в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.
Точно. Там чтение в одну строку всего лишь) Оказался не прав) Но на счет вывода сообщений он весь текст с диалога в чат не выведет.
 

SobFoX;

Известный
110
65
У меня нет RPC_ScrShowDialog, только RPC_ShowDialog, поэтому я могу читать только через bsData.read, а не через params->bitStream->Read.
C++:
void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
    StringCompressor::AddReference();
    StringTable::AddReference();
  
    if (!isCheatPanicEnabled())
    {
        if (set.netPatchAssoc[id][INCOMING_RPC] != nullptr && set.netPatchAssoc[id][INCOMING_RPC]->enabled)
            return;
    }



    if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
Кроме того, у меня нет структуры stSAMPDialog, но есть stDialogInfo, который содержит это:
C++:
struct stDialogInfo
{
    IDirect3DDevice9    *m_pD3DDevice;
    int    iTextPoxX;
    int    iTextPoxY;
    uint32_t    uiDialogSizeX;
    uint32_t    uiDialogSizeY;
    int    iBtnOffsetX;
    int    iBtnOffsetY;
    class _CDXUTDialog                        *pDialog;
    class _CDXUTListBox                        *pList;
    class _CDXUTIMEEditBox                        *pEditBox;
    int    iIsActive;
    int    iType;
    uint32_t    DialogID;
    char        pText[1000];
    uint32_t    uiTextWidth;
    uint32_t    uiTextHeight;
    char        szCaption[65];
    int        bServerside;
};
Я пытался сделать это на своей структуре, но это ничего не изменило, и при вставке структуры stSampdialog я мог только читать пустой текст.
Мне нужен текст диалога, так как никнеймы в списке игроков анонимны и были перемещены в диалог вместе с id, поэтому мне нужен текст диалога, чтобы прочитать, какой id имеет какой ник, а затем заменить никнеймы игроки.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

после загрузки samp происходит вылет игры, sampfuncs 0.3dl, отладчик выдал эти адреса. На mod_sa по умолчанию нет сбоя, что может быть причиной такого сбоя?
Код:
Exception thrown at location 0x03B1B396 (samp.dll) in gta_sa.exe: 0xC0000005: Access violation while reading at location 0x0029E868.
You need to hook up to some functions including the RPC call you get from a server in a different way and not of sobeit
 

Alvaro Hold

Новичок
4
2
Как сделать произведение определённой музыки во время показа загрузочного экрана ГТА на ASI (C++)?
 

Savchik Blazer

Но я, мечту свою лелея...
Проверенный
668
294
Как достать onfoot syns другого игрока и получить оттуда информацию?