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

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

  1. Firto

    Firto Участник

    Регистрация:
    28 фев 2018
    Сообщения:
    5
    Симпатии:
    3
    Исходники Auto Mehanic

    "main.h"

    #pragma once
    
    /*
        PLUGIN AutoMehanik by Stiopko
    */
    
    // First message
    
    const char firstMessage[] = "{FF9700}AutoMehanik by Stiopko is {38E156}loaded!";
    
    // Commands
    
    const char cmd_MechanicPlugin_StartStop[] = "fmex";
    
    // Messages
    
    const char msg_MechanicPlugin_Run[] = "{FF9700}AutoMehanic {38E156}включен!";
    
    const char msg_MechanicPlugin_Stop[] = "{FF9700}AutoMehanic by Stiopko {FF4E40}выключен!";
    
    // INCLUDES
    
    #include <windows.h>
    #include <string>
    #include <assert.h>
    #include <ctime>
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    #pragma comment(lib, "user32.lib")
    using namespace std;
    
    // Main var
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    struct Message {
        string msg;
        uint32_t color;
    };
    
    
    
    bool IsMehanic = false;
    clock_t tim = clock();
    
    // Functs
    
    void CALLBACK MechnicCommadIncoming(string param);
    
    // Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params);
    Message * GetMessageFromHook(stRakNetHookParams *params);
    
    // Work with message in the hook
    
    void PluginMehanicGetMessage(Message *msg);
    
    void Initialize();
    "main.cpp"

    
    /*
        PLUGIN AutoMehanik by Stiopko
    */
    
    #include "main.h"
    
    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 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;
    };
    
    Message * GetMessageFromHook(stRakNetHookParams *params) {
        if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) {
            Message *message = new Message;
    
            {
                static uint32_t len;
                static char msg[256];
    
                params->bitStream->ResetReadPointer();
                params->bitStream->Read(message->color);
                params->bitStream->Read(len);
                params->bitStream->Read(msg, len);
                msg[len] = '\0';
                message->msg = msg;
            }
    
            return message;
        }
        else return nullptr;
    }
    
    // INIT
    
    void Initialize() {
        static bool init = false;
    
        if (!init)
        {
            if (GAME == nullptr)
                return;
            if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
                return;
            if (!SF->getSAMP()->IsInitialized())
                return;
    
            if (SF->getRakNet()->getRakClient()->IsConnected()) {
                SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
                SF->getSAMP()->registerChatCommand(cmd_MechanicPlugin_StartStop, MechnicCommadIncoming);
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), firstMessage);
                init = true;
            }
        }
        else if (IsMehanic) {
            if (!SF->getGame()->isKeyDown(107)) {
                static bool pressed = false;
                if ((tim + 30 < clock() && !pressed)) {
                    keybd_event(VK_MENU, 0xb8, 0, 0);
                    pressed = true;
                    tim = clock();
                }
                else if ((tim + 20 < clock() && pressed)) {
                    keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0);
                    pressed = false;
                    tim = clock();
                }
    
            }
            else MechnicCommadIncoming("");
        }
    }
    
    
    // SAMPFUNCTS
    
    void CALLBACK mainloop(void) //
    {
        Initialize();
    }
    
    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;
    }
    Исходники Auto Taxi

    "main.h"

    #pragma once
    
    /*
        PLUGIN AutoTaxi by Stiopko
    */
    
    // First message
    
    const char firstMessage[] = "{FF9700}AutoTaxi by Stiopko is {38E156}loaded!";
    
    // Commands
    
    const char cmd_TaxiPlugin_StartStop[] = "staxi"; // Command start, stop
    
    const char cmd_TaxiPlugin_Help[] = "taxihelp"; // Command help
    
    const char cmd_TaxiPlugin_State[] = "gtaxi"; // Get status plugin
    
    
    // Messages
    
    const unsigned short msg_TaxiPlugin_CountHelp = 6;
    
    const char msg_TaxiPlugin_Help[msg_TaxiPlugin_CountHelp][256] = {
        "{ADFF2F}Мануал:",
        "{1E90FF}/staxi{DAA520} - команда которая останавливает и запускает плагин AutoTaxi.",
        "{DAA520}Для запуска вводим команду {1E90FF}/staxi{DAA520} далее (через пробел) вводим город ",
        "{FF6347}LS{DAA520} або {FF6347}LV{DAA520} або {FF6347}SF{DAA520} або {FF6347}All{DAA520}.",
        "{DAA520}Для остановки плагина вводим команду {1E90FF}/staxi{DAA520} без параметров (Работает если плагин запущен).",
        "{DAA520}Для получения текущего состояния плагина вводи команду {1E90FF}/gtaxi{DAA520} ."
    };
    
    const char msg_TaxiPlugin_Run[] = "{FF9700}AutoTaxi {38E156}включен!";
    
    const char msg_TaxiPlugin_Stop[] = "{FF9700}AutoTaxi {FF4E40}выключен!";
    
    const char msg_TaxiPlugin_IncorrectCity[] = "{FF7D73}Неправильное название города!";
    
    const char msg_TaxiPlugin_CallOk[] = "{FF9700}Вызов принят от {9BD851}";
    
    const char msg_TaxiPlugin_GetState_Run_1[] = "{DAA520}Плагин работает в городе {FF6347}";
    
    const char msg_TaxiPlugin_GetState_Run_2[] = "{DAA520}.";
    
    const char msg_TaxiPlugin_GetState_Stop[] = "{DAA520}Плагин не работает.";
    
    // INCLUDES
    
    #include <windows.h>
    #include <string>
    #include <assert.h>
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    using namespace std;
    
    
    
    // Main var
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    struct Message {
        string msg;
        uint32_t color;
    };
    
    bool IsTaxiing = false;
    const char types[5][11] = { "", "New Island", "SF", "LS", "LV" };
    const char typess[5][11] = { "All", "New Island", "SF", "LS", "LV" };
    unsigned short id = 0;
    
    // Functs
    
    string TextBetweenWords(const string &text, const string &word1, const string &word2);
    string GetNameActor(const string &str);
    
    void CALLBACK TaxiCommandIncomming(string param);
    void CALLBACK TaxiHelpCommandIncominng(string param);
    void CALLBACK TaxiStateCommandIncominng(string param);
    
    // Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params);
    Message * GetMessageFromHook(stRakNetHookParams *params);
    
    // Work with message in the hook
    
    void PluginTaxiGetMessage(Message *msg);
    bool IsTaxiCall(const string &str);
    
    void Initialize();


    "main.cpp"

    
    /*
    PLUGIN AutoTaxi by Stiopko
    */
    
    #include "main.h"
    
    string TextBetweenWords(const string &text, const string &word1, const string &word2) {
        if (text.length() > word1.length() + word2.length()) {
            size_t i = 0;
            bool write = false;
            string temp;
            while (i < text.length()) {
                if (text[i] == word1[0] && !write) {
                    bool IsOk = true;
                    size_t s = 0;
                    size_t r = i;
                    while (s < word1.length()) {
                        if (word1[s] != text[r]) {
                            IsOk = false;
                            break;
                        }
                        s++;
                        r++;
                    }
                    if (IsOk) {
                        i = r;
                        write = true;
                    }
    
                }
                else if (text[i] == word2[0] && write) {
                    bool IsOk = true;
                    size_t s = 0;
                    size_t r = i;
                    while (size_t(word2[s]) < word2.length()) {
                        if (word2[s] != text[r]) {
                            IsOk = false;
                            break;
                        }
                        s++;
                        r++;
                    }
                    if (IsOk) return temp;
                }
                if (write) temp += text[i];
                i++;
            }
            return temp;
        }
        else return "";
    }
    
    string GetNameActor(const string &str) {
        if (str.find("{B03131}") != -1)
            return TextBetweenWords(str, "{B03131}", "{FFFFFF}");
        else return TextBetweenWords(str, "{79FB5F}", "{FFFFFF}");
    }
    
    // CODE Commands
    
    void CALLBACK TaxiCommandIncomming(string param) // run plugin
    {
        if (!IsTaxiing) {
            for (int i = 0; i < 5; i++) {
                if (typess[i] == param) {
                    id = i;
                    IsTaxiing = true;
                    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_TaxiPlugin_Run);
                    break;
                }
                else if (typess[i] != param && i == 4) {
                    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_TaxiPlugin_IncorrectCity);
                    break;
                }
            }
        }
        else {
            IsTaxiing = false;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_TaxiPlugin_Stop);
        }
    };
    
    bool IsTaxiCall(const string &str) {
        return ((str.find("{B03131}") != -1 || str.find("{79FB5F}") != -1) && str.find("{FFFFFF}") != -1 && str.find("{FFFFFF}") != -1 && str.find("с города " + string(types[id])) != -1);
    }
    
    
    void CALLBACK TaxiHelpCommandIncominng(string param) // HELP
    {
    
        for (int i = 0; i < msg_TaxiPlugin_CountHelp; i++)
        {
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_TaxiPlugin_Help[i]);
        }
    }
    
    void CALLBACK TaxiStateCommandIncominng(string param) // State plugin
    {
        if (IsTaxiing) {
            static char temp[256];
    
            temp[0] = '\0';
    
            strcat_s(temp, msg_TaxiPlugin_GetState_Run_1);
    
            strcat_s(temp, typess[id]);
    
            strcat_s(temp, msg_TaxiPlugin_GetState_Run_2);
    
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), temp);
        }
        else SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), msg_TaxiPlugin_GetState_Stop);
    }
    
    void PluginTaxiGetMessage(Message *msg) {
        if (IsTaxiing) {
    
            // переменная in для того чтобы сообщение в чат выводилось !!после поступлени¤ вызова
    
            static unsigned short in = 0;
            static string name;
    
            if (in == 1) {
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), (msg_TaxiPlugin_CallOk + name).c_str());
                SF->getCLEO()->callOpcode("0394: 2");
    
                TaxiCommandIncomming("");
            }
    
            if (in > 0) in--;
    
            if (msg->color == 1687547391) if (IsTaxiCall(msg->msg) && in == 0)
            {
                name = GetNameActor(msg->msg);
                SF->getCLEO()->callOpcode(("0AF9: \"/gotaxi " + TextBetweenWords(name, "[", "]") + "\"").c_str());
                in = 2;
            }
        }
    }
    
    // CODE  Work with hook
    
    bool CALLBACK incomingRPC(stRakNetHookParams *params) // Getting message from server
    {
        static Message *incomingMessage;
    
        incomingMessage = GetMessageFromHook(params);
    
        if (incomingMessage != nullptr) {
            PluginTaxiGetMessage(incomingMessage);
        }
    
        return true;
    };
    
    Message * GetMessageFromHook(stRakNetHookParams *params) {
        if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) {
            Message *message = new Message;
    
            {
                static uint32_t len;
                static char msg[256];
    
                params->bitStream->ResetReadPointer();
                params->bitStream->Read(message->color);
                params->bitStream->Read(len);
                params->bitStream->Read(msg, len);
                msg[len] = '\0';
                message->msg = msg;
            }
    
            return message;
        }
        else return nullptr;
    }
    
    // INIT
    
    void Initialize() {
        static bool init = false;
    
        if (!init)
        {
            if (GAME == nullptr)
                return;
            if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
                return;
            if (!SF->getSAMP()->IsInitialized())
                return;
    
            if (SF->getRakNet()->getRakClient()->IsConnected()) {
                SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
                SF->getSAMP()->registerChatCommand(cmd_TaxiPlugin_StartStop, TaxiCommandIncomming);
                SF->getSAMP()->registerChatCommand(cmd_TaxiPlugin_Help, TaxiHelpCommandIncominng);
                SF->getSAMP()->registerChatCommand(cmd_TaxiPlugin_State, TaxiStateCommandIncominng);
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_ARGB(255, 255, 255, 255), firstMessage);
                init = true;
            }
        }
    }
    
    
    // SAMPFUNCTS
    
    void CALLBACK mainloop(void) //
    {
        Initialize();
    }
    
    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;
    }



     

    Вложения:

    DonkRage, pycckknn и mrdiimax нравится это.
  2. Revalto

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

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

    Musaigen мой проект лайкнул пиксель
    Проверенный

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

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

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

    Firto Участник

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

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

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

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

    
    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. Firto

    Firto Участник

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

    Передлал. Вроде нором.
    
    
    /*
        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 Firto, 8 окт 2018
    Последнее редактирование: 8 окт 2018
  8. Revalto

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

    Регистрация:
    13 фев 2016
    Сообщения:
    375
    Симпатии:
    86
    
    /*
        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. Firto

    Firto Участник

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

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

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

    Firto Участник

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

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

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