SF Plugin [SRP\ERP] MembersChecker

Тема в разделе "Читы", создана пользователем Zhenya98, 8 янв 2018.

Метки:
  1. Zhenya98

    Zhenya98 Известный пользователь

    Регистрация:
    12.10.2014
    Сообщения:
    86
    Симпатии:
    29
    Репутация:
    10
    Чекер мемберс, делал для эвольва/срп, но может быть и работает на каких нибудь еще серверах.
    после запуска игры создатся ини файл

    AutoActivation=true (Параметр, отвечающий будет ли чекер сам включатся после запуска игры)
    CopyToBuffer=true (Копирует иды отсутствующих игроков в зоне стрима в буфер обмена)

    команды:
    /mcheck - выключить/включить чекер
    /mbuf - включить/выключить автоматическую запись идов в буфер.


    
    #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
    #define COLOR_LIGHTPINK    0XFFFFB6C1
    
    #include    "Zmain.h"
    #pragma comment(lib, "User32.lib")
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    bool CheckerStatus, CopyToBuffer;
    char buffer[1000];
    
    void copyToBuffer(char *text)
    {
        OpenClipboard(0);
        EmptyClipboard();
        void* hMem = GlobalAlloc(GMEM_DDESHARE, strlen(text) + 1);
        char* chBuffer = (char *)GlobalLock(hMem);
        strcpy(chBuffer, text);
        GlobalUnlock(hMem);
        SetClipboardData(CF_TEXT, chBuffer);
        CloseClipboard();
    }
    
    bool _stdcall incoming_rpc(stRakNetHookParams *params)
    {
        if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage && CheckerStatus)
        {
            uint32_t    len, color;
            char        msg[256];
    
            params->bitStream->ResetReadPointer();
            params->bitStream->Read(color);
            params->bitStream->Read(len);
            params->bitStream->Read(msg, len);
            msg[len] = '\0';
    
            if (color == 0x1c8dffc8 || color == 0x59bd3aa)
                {
                    for (int a = 0; a < SAMP_MAX_PLAYERS; a++)
                    {
                        if (SF->getSAMP()->getPlayers()->iIsListed[a] && strstr(msg, SF->getSAMP()->getPlayers()->GetPlayerName(a)))
                        {
                            char addstring[64], id[5];
                            if (SF->getSAMP()->getPlayers()->IsPlayerDefined(a, true))
                                sprintf(addstring, " {00ec96} в зоне стрима");
                            else
                            {
                                sprintf(id, "%d ", a);
                                strcat(buffer, id);
                                sprintf(addstring, " {ec3737} не в зоне прорисовки");
                                if (CopyToBuffer)    copyToBuffer(buffer);
                            }
    
                            strcat(msg, addstring);
                            len = strlen(msg);
                            params->bitStream->ResetWritePointer();
                            params->bitStream->Write(color);
                            params->bitStream->Write(len);
                            params->bitStream->Write(msg, len);
                            break;
                        }
                    }
                }
            if (strstr(msg, " Всего:") && color == 0x26931caa)
                {
                    color = 0xffff00aa;
                    params->bitStream->ResetWritePointer();
                    params->bitStream->Write(color);
                    params->bitStream->Write(len);
                    params->bitStream->Write(msg, len);
                }
            if (len == 1 && color == 0xffffffff)
                return false;
        }
        return true;
    }
    
    bool _stdcall outcoming_rpc(stRakNetHookParams *params)
    {
        if (params->packetId == RPCEnumeration::RPC_ServerCommand && CheckerStatus)
        {
            DWORD len;
            char command[256];
    
            params->bitStream->ResetReadPointer();
            params->bitStream->Read(len);
            params->bitStream->Read(command, len);
            command[len] = '\0';
    
            if (strstr(command, "members"))
                sprintf(buffer, "");
        }
        return true;
    }
    
    void _stdcall members_cmd(std::string)
    {
        CheckerStatus ^= true;
        SF->getSAMP()->getChat()->AddChatMessage(COLOR_LIGHTPINK, "MembersChecker %s", CheckerStatus ? "включен" : "выключен");
    }
    
    void _stdcall copybuffer_cmd(std::string)
    {
        CopyToBuffer ^= true;
        SF->getSAMP()->getChat()->AddChatMessage(COLOR_LIGHTPINK, "Копирование идов отсутствующих в зоне стрима игроков %s",
            CopyToBuffer ? "включено" : "выключено");
    }
    
    bool CheckIniFile()
    {
        if (ini_file_exist("SAMPFUNCS\\MembersChecker.ini"))
        {
            CheckerStatus    = get_bool_from_ini("SAMPFUNCS\\MembersChecker.ini", "Settings", "AutoActivation");
            CopyToBuffer    = get_bool_from_ini("SAMPFUNCS\\MembersChecker.ini", "Settings", "CopyToBuffer");
            return true;
        }
        else
        {
            create_ini_file("SAMPFUNCS\\MembersChecker.ini");
            set_string_to_ini("SAMPFUNCS\\MembersChecker.ini", "Settings", "AutoActivation", "true");
            set_string_to_ini("SAMPFUNCS\\MembersChecker.ini", "Settings", "CopyToBuffer", "true");
            CheckerStatus = true; CopyToBuffer = true;
            return false;
        }
    }
    
    void CALLBACK mainloop()
    {
        static bool init = false;
        if (!init)
        {
            if (GAME == nullptr)                                            return;
            if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)    return;
            if (!SF->getSAMP()->IsInitialized())                            return;
            if (!CheckIniFile())
                SF->getSAMP()->getChat()->AddChatMessage(COLOR_LIGHTPINK, "[MembersChecker] INI настройки по умолчанию");
            SF->getSAMP()->getChat()->AddChatMessage(COLOR_LIGHTPINK, "MembersChecker by {3ef1b2}Jenek Bueno {FFB6C1}loaded");
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incoming_rpc);
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_RPC, outcoming_rpc);
            SF->getSAMP()->registerChatCommand("mcheck", members_cmd);
            SF->getSAMP()->registerChatCommand("mbuf", copybuffer_cmd);
            init = true;
        }
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
    {
        if (dwReasonForCall == DLL_PROCESS_ATTACH)    SF->initPlugin(mainloop, hModule);
        return TRUE;
    }
    
     

    Вложения:

    samp is meme нравится это.
  2. koda

    koda Известный пользователь

    Регистрация:
    28.06.2016
    Сообщения:
    56
    Симпатии:
    4
    Репутация:
    2
    Подойдёт для руководства. Например в строю не все стоят
     
  3. D3.Pheonix

    D3.Pheonix biboran
    Проверенный

    Регистрация:
    21.03.2013
    Сообщения:
    461
    Симпатии:
    157
    Репутация:
    33
  4. Zhenya98

    Zhenya98 Известный пользователь

    Регистрация:
    12.10.2014
    Сообщения:
    86
    Симпатии:
    29
    Репутация:
    10
    ^ он работал только на евольве, сейчас нигде не робит.
    А этот работает на срп и ерп и мб где нибудь еще.
    кстати забыл сказать шо плагин перезаписывает цвет строки "Всего онлайн" и убирает пустую строку после мемберса (тупой Альберт не додумался сам это сделать)
     
  5. Banan921

    Banan921 Известный пользователь

    Регистрация:
    08.02.2015
    Сообщения:
    46
    Симпатии:
    6
    Репутация:
    -1
    А можно как то сделать, чтобы плагин парсил не со всего мемберса, а с онлайн таблицы гугл?
     
  6. Don_Homka

    Don_Homka Известный пользователь

    Регистрация:
    08.11.2017
    Сообщения:
    301
    Симпатии:
    73
    Репутация:
    19
    Можно, но в C++ не шарю. Тебе нужно будет подрубить google api и паристь список из таблицы. Такую тему можно и на Lua сделать.
     
  7. Zhenya98

    Zhenya98 Известный пользователь

    Регистрация:
    12.10.2014
    Сообщения:
    86
    Симпатии:
    29
    Репутация:
    10
    но перед этим ведь нужно заполнить таблицу гугл мемберсом, вопрос зачем?
     
  8. Banan921

    Banan921 Известный пользователь

    Регистрация:
    08.02.2015
    Сообщения:
    46
    Симпатии:
    6
    Репутация:
    -1
    Не правильно поняли друг друга и я наверное не так понял суть плагина, он просто показывает /members по красивому.
    Я имел ввиду, чтобы плагин выбирал ники из /members только те, которые есть в таблице гугл.
    Я так понял @Don_Homka дал ответ на мой вопрос, подумаю. Спасибо...