Исходник SF Плагин | Arizona-rp | Авто механик

Тема в разделе "C/C++", создана пользователем Stiopko, 3 окт 2018.

  1. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Auto Mehanic
    (Активация) Главная команда - /fmex [MODE] [timeout_1] [timeout_2]
    (Деактивация) + на NumPad
    (Нажимает Alt всмысле отсилает Пакет)

    MODE - (По дефолту - 0)
    0 - Нажимает Alt (Деактивация: + на NumPad, владелец приймёт или отклонит запрос)
    1 - Нажимает Alt (Деактивация: + на NumPad)
    2 - Все делает автоматически просто подходите к машине (Деактивация: + на NumPad, владелец отклонит запрос)

    timeout_1 - Задержка между нажатиями Alt (0 - максимальная, 10000 - минимальная) По дефолту - 5
    timeout_2 - (Используемый на втором моде) Задержка между нажатиями при чинке автомобиля Alt (0 - максимальная, 10000 - минимальная) По дефолту - 150

    (Не рекомендую ставить timeout меньше 5)


     

    Вложения:

    • main.zip
      Размер файла:
      4,2 КБ
      Просмотров:
      15
    • AutoMex.sf
      Размер файла:
      215 КБ
      Просмотров:
      5
    #1 Stiopko, 3 окт 2018
    Последнее редактирование: 28 ноя 2018
    DARKed, DonkRage, pycckknn и ещё 1-му нравится это.
  2. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Мои глаза, зачем так все сложно делать?
     
  3. Musaigen

    Musaigen ŜĆŘΣΔΜ ΔΝĐ ŜΉØΩТ
    Проверенный

    Регистрация:
    1 апр 2018
    Сообщения:
    857
    Симпатии:
    323
    чтобы показать, что ты типо дофига крутой чувак
     
    Revalto нравится это.
  4. DonkRage

    DonkRage Свой человек

    Регистрация:
    22 июл 2018
    Сообщения:
    378
    Симпатии:
    71
    А не легче весь сурс в архив запихать?
     
  5. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Ок. Буду знать.

    Я просто не знаю что упростить. Можеш показать что можно упростить?
     
  6. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Допустим слишком много функций, все можно сделать гараздо легче. Да и смысл с этого кода: ?

    
    void CALLBACK MechnicCommadIncoming(string param) // run plugin
    {
        if (IsMehanic) {
            IsMehanic = false;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_MechanicPlugin_Stop);
            keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0);
        }
        else {
            IsMehanic = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_MechanicPlugin_Run);
        }
    };
    Можно же сделать так:

    void CALLBACK MechnicCommadIncoming(string param)
    {
        IsMehanic ^= 1;
        SF->getSAMP()->getChat()->AddChatMessage(-1, (IsMehanic ? "ON":"OFF"));
        if(IsMehanic) keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0);
    };
    Зачем делать такие излишки кода?
    void PluginMehanicGetMessage(Message *msg) {
        if (IsMehanic) {
    
            if (msg->msg.find("игрок отказался от услуг механика!") != -1 || msg->msg.find("принял ваше предложение с работой над авто!") != -1 || msg->msg.find("состояние этого авто в полном порядке!") != -1 || msg->msg.find("[Ошибка]") != -1) MechnicCommadIncoming("");
        }
    }
    
    // CODE  Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params) // Getting message from server
    {
        static Message *incomingMessage;
    
        incomingMessage = GetMessageFromHook(params);
    
        if (incomingMessage != nullptr) {
            PluginMehanicGetMessage(incomingMessage);
        }
    
        return true;
    };
    Это же все можно делать в 1 функции.
    Мб у тебя такие удобства, но как по мне это чистый говнокод..
    Было бы больше времени, показал бы как я сделал бы это все...
     
  7. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Вооу спасибо.

    Передлал. Вроде нором.
    
    
    /*
        PLUGIN AutoMehanik by Stiopko
    */
    
    #include <windows.h>
    #include <assert.h>
    #include <ctime>
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    #pragma comment(lib, "user32.lib")
    
    // Main var 
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    bool IsMehanic = false;
    clock_t tim = clock();
    
    bool IsIssetWord(const char * source, const char * word) {
        static unsigned short i;
        i = 0;
        while (source[i] != '\0')
        {
            if (source[i] == word[0]) {
                static unsigned short r;
                r = 0;
                while (word[r] != '\0') {
                    if (word[r] != source[i]) break;
                    ++r;
                    ++i;
                }
               
                if (word[r] == '\0') return true;
                else i -= r;
            }
            ++i;
        }
        return false;
    }
    
    void CALLBACK MechnicCommadIncoming(std::string param) // run plugin
    {
        IsMehanic ^= true;
        SF->getSAMP()->getChat()->AddChatMessage(-1, (IsMehanic ? "{FF9700}AutoMehanic: {38E156}ON" : "{FF9700}AutoMehanic: {FF4E40}OFF"));
    };
    
    // CODE  Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params)
    {
    
        if (IsMehanic) {
            if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) {
                static char msg[256];
                {
                    static uint32_t len, color;
                    params->bitStream->ResetReadPointer();
                    params->bitStream->Read(color);
                    params->bitStream->Read(len);
                    params->bitStream->Read(msg, len);
                    msg[len] = '\0';
                }
    
                if (IsIssetWord(msg, "Игрок отказался от услуг механика!") || IsIssetWord(msg, "принял ваше предложение с работой над авто!") || IsIssetWord(msg, "Состояние этого авто в полном порядке!") || IsIssetWord(msg, "[Ошибка]")) MechnicCommadIncoming("");
                else if (IsIssetWord(msg, "Этим клиентом, занят другой механик!")) {
                    SF->getCLEO()->callOpcode("0ACD: \"~g~In zone vehicle\" 5");
                    return false;
                }
            }
        }
        return true;
    };
    
    // SAMPFUNCTS
    
    void CALLBACK mainloop(void) // 
    {
        static bool init = false;
    
        if (!init)
        {
            if (GAME == nullptr)
                return;
            if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
                return;
            if (!SF->getSAMP()->IsInitialized())
                return;
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
            SF->getSAMP()->registerChatCommand("fmex", MechnicCommadIncoming);
            init = true;
        }else if (IsMehanic) {
            if (GetAsyncKeyState(107) == 0) {
                if (tim + 5 < clock()) {
                    (SF->getGame()->isKeyDown(VK_MENU) ? keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0): keybd_event(VK_MENU, 0xb8, 0, 0));
                    tim = clock();
                }
            }
            else {
                keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0); keybd_event(107, 0xb8, KEYEVENTF_KEYUP, 0); MechnicCommadIncoming("");
            }
        }
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
    {
        switch (dwReasonForCall)
        {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    
     
    #7 Stiopko, 8 окт 2018
    Последнее редактирование: 8 окт 2018
  8. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    
    /*
        PLUGIN AutoMehanik by Stiopko
    */
    
    #include <windows.h>
    #include <assert.h>
    #include <ctime>
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    #pragma comment(lib, "user32.lib")
    
    // Main var
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    bool IsMehanic = false;
    clock_t tim = clock();
    
    void CALLBACK MechnicCommadIncoming(std::string param) // run plugin
    {
        IsMehanic ^= true;
        SF->getSAMP()->getChat()->AddChatMessage(-1, (IsMehanic ? "{FF9700}AutoMehanic: {38E156}ON" : "{FF9700}AutoMehanic: {FF4E40}OFF"));
    };
    
    // CODE  Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params)
    {
            if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage && IsMehanic == true) {
                static char msg[256];
                {
                    static uint32_t len, color;
                    params->bitStream->ResetReadPointer();
                    params->bitStream->Read(color);
                    params->bitStream->Read(len);
                    params->bitStream->Read(msg, len);
                    msg[len] = '\0';
                }
    
                if (strstr(msg, "Игрок отказался от услуг механика!") || strstr(msg, "принял ваше предложение с работой над авто!") || strstr(msg, "Состояние этого авто в полном порядке!") || strstr(msg, "[Ошибка]")) MechnicCommadIncoming("");
                else if (strstr(msg, "Этим клиентом, занят другой механик!")) {
                    SF->getCLEO()->callOpcode("0ACD: \"~g~In zone vehicle\" 5");
                    return false;
                }
            }
        return true;
    };
    
    // SAMPFUNCTS
    
    void CALLBACK mainloop(void) //
    {
        static bool init = false;
        if (!init) {
            if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return;
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
            SF->getSAMP()->registerChatCommand("fmex", MechnicCommadIncoming);
            init = true;
        } else if (IsMehanic) {
            if (GetAsyncKeyState(107) == 0) {
                if (tim + 5 < clock()) {
                    (SF->getGame()->isKeyDown(VK_MENU) ? keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0): keybd_event(VK_MENU, 0xb8, 0, 0));
                    tim = clock();
                }
            }
            else {
                keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0); keybd_event(107, 0xb8, KEYEVENTF_KEYUP, 0); MechnicCommadIncoming("");
            }
        }
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
    {
        switch (dwReasonForCall)
        {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    Если на то уж пошло...
     
  9. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Спс, не знал что есть такая функция strstr.
     
  10. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Еще вместо clock() можно юзать GetTickCount :D
    И скобки фигурные убери после static char msg[256]; Зачем они на переменную?
     
  11. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    А ну да зачем они на статичискую переменную. Ок. И каккя разница между clock() и GetTickCount().
     
  12. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Погугли)
     
  13. _Seriy_

    _Seriy_ Новичок

    Регистрация:
    19 фев 2016
    Сообщения:
    3
    Симпатии:
    0
    Как изменить звук когда вызов бот принемает?
     
  14. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    125 строка:
    SF->getCLEO()->callOpcode("0394: 2");

    Вызывай другой опкод и все.
     
    _Seriy_ нравится это.
  15. _Seriy_

    _Seriy_ Новичок

    Регистрация:
    19 фев 2016
    Сообщения:
    3
    Симпатии:
    0

    Встречный вопрос :D Как я смогу декомпилировать твой СФ плагин? Или мне копировать твой код и там уже файл в SF переделать?:thinking:
    Просто я таким не занимаюсь. Я пользую только :)
    Сорян что отнимаю ваше время.
     
    #15 _Seriy_, 2 ноя 2018
    Последнее редактирование: 2 ноя 2018
  16. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Код и так в теме написан ._.
     
  17. Vlad211121

    Vlad211121 Новичок

    Регистрация:
    2 фев 2016
    Сообщения:
    1
    Симпатии:
    0
    А как он работает ?
     
  18. Rzeźnik

    Проверенный

    Регистрация:
    13 мар 2016
    Сообщения:
    186
    Симпатии:
    147
    То самое чувство когда ревальто судит за гавнокод))00

    Не выкладывай в следующий раз исходной код сюда мой тебе совет, нынешние знатоки знают гораздо меньше тебя и гавнокодят ещё пизже но всегда готовы обосрать тебя =)
     
    Revalto нравится это.
  19. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Плагин автомеханик:

    Кликает Alt c какой то задержкой пока в чат не придет определенное сообщение потом он отключаетса. (я скоро залью новую версию она во все не кликет alt на прямую отправляет серверу что типа я нажал кнопку для медленной хотьбы, еще будут разные режимы работы, максимальная скорость где то 8000 нажатий, но тебя кикает с сервера уже когда около 500 кликов за сек)

    Плагин автотакси:

    Чекает чат пока не увидит что кто-то вызывает такси и с помощью опкода отправляет сообщение на сервер на прием вызова

    Я не могу так. Мне надо что то писать.
     
    #19 Stiopko, 10 ноя 2018
    Последнее редактирование: 10 ноя 2018
  20. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    У самого же говнокод :D
     
  21. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Вышло обновление AutoMex! Нельзя выгрузить через pfree (я не знаю как)
     
  22. Rzeźnik

    Проверенный

    Регистрация:
    13 мар 2016
    Сообщения:
    186
    Симпатии:
    147
    Что значит нельзя выгрузить? Любой плагин спокойно ей выгружается, разве ты что-то в деструкторе натворил.
     
  23. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Сори, можно вигрузить. Но без перезапуска игри загрузить нельзя.
     
  24. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    pload название ._.
     
  25. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Смотри зашел ты на сервер.
    Запустил automex, выключил.
    Выгрузил(через pfree).
    А назад загрузить не судьба(через pload).
     
    #25 Stiopko, 17 ноя 2018
    Последнее редактирование: 17 ноя 2018
  26. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Так сказать, руки не из того места...
     
  27. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    У тебя он работает?
     
  28. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    429
    Симпатии:
    102
    Естественно
     
  29. Stiopko

    Stiopko Постоянный участник

    Регистрация:
    28 фев 2018
    Сообщения:
    55
    Симпатии:
    23
    Обнова. Мелочи: избавился от некоторых библиотек, и так мелкие корректировки.