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

Woofing Giraffe

Активный
402
49
Подскажите, как получить никнейм игрока при RPC_ClientJoin.
Код:
Пример перехвата входящего (пришедшего от сервера) RPC_ScrServerJoin:

bool CALLBACK incomingRPC( stRakNetHookParams *params ) // определение callback-функции, которая будет вызвана, если от сервера был получен новый RPC.
{
    if( params->packetId == ScriptRPCEnumeration::RPC_ScrServerJoin ) // если это RPC_ScrServerJoin
    {
        short int sPlayerID;   
        D3DCOLOR D3DPlayerColor;
        byte isNPC, nameLen;
        char szPlayerName[25];
        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения.
        params->bitStream->Read( sPlayerID ); // читаем ID игрока.
        params->bitStream->Read( D3DPlayerColor ); // цвет ника игрока.
        params->bitStream->Read( isNPC ); // флаг, говорящий о том, NPC это или нет.
        params->bitStream->Read( nameLen ); // длина ника.
        params->bitStream->Read( szPlayerName, nameLen ); // ник.
        szPlayerName[ nameLen ]= '\0'; // обрезаем, чтоб не было мусора
        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения
        SF->getSAMP()->getChat()->AddChatMessage( D3DPlayerColor, "%s[%d] Подключился к серверу.",
            szPlayerName, sPlayerID ); // добавляем сообщение в чат.           
    };
    return true; // успешно завершаем обработку RPC.
};
SF->getRakNet()->registerRakNetCallback( RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC ); // регистрируем callback
 

barspinoff

Известный
126
33
Код:
Пример перехвата входящего (пришедшего от сервера) RPC_ScrServerJoin:

bool CALLBACK incomingRPC( stRakNetHookParams *params ) // определение callback-функции, которая будет вызвана, если от сервера был получен новый RPC.
{
    if( params->packetId == ScriptRPCEnumeration::RPC_ScrServerJoin ) // если это RPC_ScrServerJoin
    {
        short int sPlayerID;  
        D3DCOLOR D3DPlayerColor;
        byte isNPC, nameLen;
        char szPlayerName[25];
        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения.
        params->bitStream->Read( sPlayerID ); // читаем ID игрока.
        params->bitStream->Read( D3DPlayerColor ); // цвет ника игрока.
        params->bitStream->Read( isNPC ); // флаг, говорящий о том, NPC это или нет.
        params->bitStream->Read( nameLen ); // длина ника.
        params->bitStream->Read( szPlayerName, nameLen ); // ник.
        szPlayerName[ nameLen ]= '\0'; // обрезаем, чтоб не было мусора
        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения
        SF->getSAMP()->getChat()->AddChatMessage( D3DPlayerColor, "%s[%d] Подключился к серверу.",
            szPlayerName, sPlayerID ); // добавляем сообщение в чат.          
    };
    return true; // успешно завершаем обработку RPC.
};
SF->getRakNet()->registerRakNetCallback( RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC ); // регистрируем callback
А как получить только свой никнейм?
 

iAmerican

Известный
Друг
615
257
А как получить только свой никнейм?
C++:
if (strstr(szPlayerName, "nickname") != NULL) {
            SF->getSAMP()->getChat()->AddChatMessage(D3DPlayerColor, "%s[%d] Подключился к серверу.", szPlayerName, sPlayerID); // добавляем сообщение в чат.
        }

хотя вроде будет правильнее strcmp , ну сам погугли, поймешь
 

barspinoff

Известный
126
33
C++:
if (strstr(szPlayerName, "nickname") != NULL) {
            SF->getSAMP()->getChat()->AddChatMessage(D3DPlayerColor, "%s[%d] Подключился к серверу.", szPlayerName, sPlayerID); // добавляем сообщение в чат.
        }

хотя вроде будет правильнее strcmp , ну сам погугли, поймешь
"nickname"? не понял. Мне нужен именно мой ник, под которым я зайду, а LocalPlayerName у меня иногда с кривыми символами отображается.
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Как читаешь? После упрочнения надо записывать ноль в конце строки.
char text[123];
auto len = strlen(text);
text[len] = '\0';
 

p1cador

cerf
Проверенный
220
359
Хочу собрать в .asi все свои наработки. По /командам все раскидывать уже не вариант, хочу сделать простую менюшку.
Начал делать
Но почему-то кажется, что у меня адский говнокод, размер файла растет пиздец как быстро, хотелось бы подглядывать куда-нибудь. Дайте пож. ссылки на соурсы каких-нибудь ПРОСТЫХ менюшек, чтобы можно было изучить, как там все устроено, классы там, всякое такое.
 
  • Нравится
Реакции: iAmerican

FYP

Известный
Администратор
1,758
5,722
Хочу собрать в .asi все свои наработки. По /командам все раскидывать уже не вариант, хочу сделать простую менюшку.
Начал делать
Но почему-то кажется, что у меня адский говнокод, размер файла растет пиздец как быстро, хотелось бы подглядывать куда-нибудь. Дайте пож. ссылки на соурсы каких-нибудь ПРОСТЫХ менюшек, чтобы можно было изучить, как там все устроено, классы там, всякое такое.
никогда не видел каких-то идеальных интерфейсов в опенсорсных читах, у всех всегда всё по-своему. думал, знаю один такой вариант, хотел предложить, но сейчас глянул - тоже дерьмо. в общем, либо делать тоже как умеешь, либо использовать готовые универсальные gui - они уж точно подойдут под любые нужды. но если всё же найдёшь что-то годное - поделись, если не затруднит.
 
  • Нравится
Реакции: iAmerican

iAmerican

Известный
Друг
615
257
Хочу собрать в .asi все свои наработки. По /командам все раскидывать уже не вариант, хочу сделать простую менюшку.
Начал делать
Но почему-то кажется, что у меня адский говнокод, размер файла растет пиздец как быстро, хотелось бы подглядывать куда-нибудь. Дайте пож. ссылки на соурсы каких-нибудь ПРОСТЫХ менюшек, чтобы можно было изучить, как там все устроено, классы там, всякое такое.
https://zhyk.ru/forum/showthread.php?t=840968
Мне вот эта статья когда-то помогла. Делал тоже самое что и ты.
 
  • Нравится
Реакции: p1cador

p1cador

cerf
Проверенный
220
359
https://zhyk.ru/forum/showthread.php?t=840968
Мне вот эта статья когда-то помогла. Делал тоже самое что и ты.
да-да, давно видел этот гайд на жуке, спасибо что напомнил
получается пока как-то так
это не столько сложно, сколько скучно и однообразно, столько всякого дерьма нужно учесть
 
  • Нравится
Реакции: iAmerican

p1cador

cerf
Проверенный
220
359
Жопа полыхает.
C++:
samp_dll = (uint32_t)LoadLibrary("samp.dll");
kek = (stScoreboardInfo *)(samp_dll + 0x21A0B4); //SAMP_SCOREBOARD_INFO 0x21A0B4
дебаг вывод (вдруг ошибка в получении):
sa-mp-345.png

(предпоследнее samp_dll, последнее kek->iIsEnabled )
проверка:
Безымянный2.png

все правильно. Идем дальше. Адрес 1b505d0, смотрим, ставим брекпоинт на запись
Безымянный4.png

разворачиваем, жмем tab, брекпоинт срабатывает
Безымянный5.png
Нубовопросы:
1) какого хуя в углу на 1 скрине рендерится адрес, а не само значение
2) является ли адрес структуры адресом первого поля? Просто тогда не добавлял бы целую структуру ради одного значения
 
Последнее редактирование:

FYP

Известный
Администратор
1,758
5,722
Жопа полыхает.
C++:
samp_dll = (uint32_t)LoadLibrary("samp.dll");
kek = (stScoreboardInfo *)(samp_dll + 0x21A0B4); //SAMP_SCOREBOARD_INFO 0x21A0B4
дебаг вывод (вдруг ошибка в получении):
Посмотреть вложение 5839
(предпоследнее samp_dll, последнее kek->iIsEnabled )
проверка:
Посмотреть вложение 5840
все правильно. Идем дальше. Адрес 1b505d0, смотрим, ставим брекпоинт на запись
Посмотреть вложение 5841
разворачиваем, жмем tab, брекпоинт срабатывает
Посмотреть вложение 5842
Нубовопросы:
1) какого хуя в углу на 1 скрине рендерится адрес, а не само значение
2) является ли адрес структуры адресом первого поля? Просто тогда не добавлял бы целую структуру ради одного значения
по этому адресу находится указатель на структуру, соответственно, его нужно разыменовать перед обращением к структуре.
C++:
kek = *(stScoreboardInfo **)(samp_dll + 0x21A0B4); //SAMP_SCOREBOARD_INFO 0x21A0B4