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

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
Фулл код дай.


Не достаточно просто вставить...
Код:
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
    {
            const auto myTask = []()
            {
                int &iDialogStatus = SF->getSAMP()->getDialog()->iIsActive;
                if (iDialogStatus)
                {
                    Sleep(599);
                    SF->getSAMP()->getDialog()->SetInputText("1");
                }

                if (iDialogStatus)
                {
                    Sleep(200);
                    SF->getSAMP()->getDialog()->SetInputText("2");
                }

                if (iDialogStatus)
                {
                    Sleep(300);
                    SF->getSAMP()->getDialog()->SetInputText("3");
                }

                if (iDialogStatus)
                {
                    Sleep(100;
                    SF->getSAMP()->getDialog()->SetInputText("4");
                }

                if (iDialogStatus)
                {
                    Sleep(555);
                    SF->getSAMP()->getDialog()->SetInputText("5");
                }
            };
            std::thread(myTask).detach();
        }
    }

Фулл код дай.


Не достаточно просто вставить...
может объяснишь чё не так ?
 

Cake_

Известный
Проверенный
263
313
Код:
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
    {
            const auto myTask = []()
            {
                int &iDialogStatus = SF->getSAMP()->getDialog()->iIsActive;
                if (iDialogStatus)
                {
                    Sleep(599);
                    SF->getSAMP()->getDialog()->SetInputText("1");
                }

                if (iDialogStatus)
                {
                    Sleep(200);
                    SF->getSAMP()->getDialog()->SetInputText("2");
                }

                if (iDialogStatus)
                {
                    Sleep(300);
                    SF->getSAMP()->getDialog()->SetInputText("3");
                }

                if (iDialogStatus)
                {
                    Sleep(100;
                    SF->getSAMP()->getDialog()->SetInputText("4");
                }

                if (iDialogStatus)
                {
                    Sleep(555);
                    SF->getSAMP()->getDialog()->SetInputText("5");
                }
            };
            std::thread(myTask).detach();
        }
    }


может объяснишь чё не так ?
Всё...
 

index

Известный
126
82
я прекрасно знаю что в моём коде происходит пиздец ;d это рофел, вот тебе норм код:

Код:
if (SF->getSAMP()->getDialog()->iIsActive && (SF->getSAMP()->getDialog()->DialogID == 9089 || SF->getSAMP()->getDialog()->DialogID == 9090) && work_started)
    {
            const auto myTask = []()
            {
                Sleep(100);
                SF->getSAMP()->getDialog()->SetInputText("1");
                Sleep(200);
                SF->getSAMP()->getDialog()->SetInputText("1");
            };
            std::thread(myTask).detach();
        }
   }

зависает игра, приходится через диспетчер офать
Чтобы самому понять, что и где не так - воспользуйтесь отладкой. Люди на форуме - не компиляторы и не дебаггеры.
https://blast.hk/threads/20320/
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
Код:
void CALLBACK mainloop()
{
       if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)    
       {            
               SF->getSAMP()->getDialog()->SetInputText("1");
                // нужна задержка в 5000 мс. перед вводом.
               SF->getSAMP()->getDialog()->SetInputText("2");
       }
}
нужен таймер без заморозки основного потока. (игры)
поток – краш.
таймер – краш.
 

ALF

Известный
Проверенный
320
537
Код:
void CALLBACK mainloop()
{
       if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)  
       {          
               SF->getSAMP()->getDialog()->SetInputText("1");
                // нужна задержка в 5000 мс. перед вводом.
               SF->getSAMP()->getDialog()->SetInputText("2");
       }
}
нужен таймер без заморозки основного потока. (игры)
поток – краш.
таймер – краш.
C++:
void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (!GAME) return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return;
        if (!SF->getSAMP()->IsInitialized()) return;

        init = true;
    }

    if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1)
    {          
        static bool state = false;
        static DWORD dwTime = 0;
  
        if (!state)
        {
            SF->getSAMP()->getDialog()->SetInputText("1");
            state = true;
            dwTime = GetTickCount();
        }
        else if (state && GetTickCount() - dwTime > 5000)
        {
            SF->getSAMP()->getDialog()->SetInputText("2");
            state = false;
        }
    }
}
 
  • Нравится
Реакции: Receiver

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
C++:
void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (!GAME) return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return;
        if (!SF->getSAMP()->IsInitialized()) return;

        init = true;
    }

    if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1)
    {      
        static bool state = false;
        static DWORD dwTime = 0;
 
        if (!state)
        {
            SF->getSAMP()->getDialog()->SetInputText("1");
            state = true;
            dwTime = GetTickCount();
        }
        else if (state && GetTickCount() - dwTime > 5000)
        {
            SF->getSAMP()->getDialog()->SetInputText("2");
            state = false;
        }
    }
}

Код:
switch (state)
            {
                case 0: dwTime = GetTickCount(); state ++;
                case 1:
                {
                    if (GetTickCount() - dwTime > 500)
                    {
                        sprintf(result, "%c", text[0]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
                case 2:
                {
                    if (GetTickCount() - dwTime > 600)
                    {
                        sprintf(result, "%c%c", text[0], text[1]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
            }
если в стриме 5-6 игроков, то скрипт сбивается
видимо TickCount плохая идея
тупо нужен таймер, который игру бы не крашил
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
У тебя взаимодействий с игроками нет...


Кидай полный код откуда мы можем знать что у тебя еще есть?
C++:
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;

        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255,55,55), "хуйня загружена." );

        init = true;
    }

    if (SF->getSAMP()->getDialog()->iIsActive && (SF->getSAMP()->getDialog()->DialogID == 1)
    {
            static DWORD dwTime = 0;
            char result[5];
            char * text = "лох";
            static int state = 0;

            switch (state)
            {
                case 0: dwTime = GetTickCount(); state ++;
                case 1:
                {
                    if (GetTickCount() - dwTime > 500)
                    {
                        sprintf(result, "%c", text[0]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
                case 2:
                {
                    if (GetTickCount() - dwTime > 600)
                    {
                        sprintf(result, "%c%c", text[0], text[1]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
                case 3:
                {
                    if (GetTickCount() - dwTime > 700)
                    {
                        sprintf(result, "%c%c%c", text[0], text[1], text[2]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
            }
            char result2[255];
            sprintf(result2, "%d | %d | %d", GetTickCount(), GetTickCount() - dwTime, state);
            SF->getSAMP()->getChat()->AddChatMessage(-1, result2);
    }





}

если в зоне стрима есть человек, то скрипт сразу переходит к state 3, то есть вводу последнего символа
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
Cам код - полный ужас. Если делаешь клики диалогов делай это в хуке
C++:
if (GetTickCount() - dwTime > timer[0])   // warning C4018: >: несоответствие типов со знаком и без знака
я заметил что когда у меня задержка на каждом символе одинаковая, то все нормально.
если же разная, то эти символы вводятся без задержки. Что за бред блинблять
 

ishi

Известный
493
110
Как заставить vector и string в std выделять динамическую память, а не стек?
 

_Vine_

Активный
154
57
Как заставить vector и string в std выделять динамическую память, а не стек?
Динамически выделить std::string или std::vector

C++:
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;

        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255,55,55), "хуйня загружена." );

        init = true;
    }

    if (SF->getSAMP()->getDialog()->iIsActive && (SF->getSAMP()->getDialog()->DialogID == 1)
    {
            static DWORD dwTime = 0;
            char result[5];
            char * text = "лох";
            static int state = 0;

            switch (state)
            {
                case 0: dwTime = GetTickCount(); state ++;
                case 1:
                {
                    if (GetTickCount() - dwTime > 500)
                    {
                        sprintf(result, "%c", text[0]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
                case 2:
                {
                    if (GetTickCount() - dwTime > 600)
                    {
                        sprintf(result, "%c%c", text[0], text[1]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
                case 3:
                {
                    if (GetTickCount() - dwTime > 700)
                    {
                        sprintf(result, "%c%c%c", text[0], text[1], text[2]);
                        SF->getSAMP()->getDialog()->SetInputText(result);
                        state ++;
                        dwTime = GetTickCount();
                    }

                }
            }
            char result2[255];
            sprintf(result2, "%d | %d | %d", GetTickCount(), GetTickCount() - dwTime, state);
            SF->getSAMP()->getChat()->AddChatMessage(-1, result2);
    }





}

если в зоне стрима есть человек, то скрипт сразу переходит к state 3, то есть вводу последнего символа

Ты забыл оператор break после case X:
C++:
switch (a){
case 0: {
// code
} break;
case 1: {
// code
} break;
}
 
Последнее редактирование:

_Vine_

Активный
154
57
Он должен стоять внутри конструкции.
Если ты про скобки после case - то их можно вообще не ставить, и break может быть хоть в них, хоть за ними.
C++:
    for (int i = 0; i < 4; i++) {
        printf("Switch test %d: ", i);
        switch (i) {
        case 0: printf("1 ");
        case 1: {
            printf("2 ");
        }
        case 2: {
            printf("3 ");
            break;
        }
        case 3: {
            printf("4 ");
        } break;
        }
        printf("\n");
    }
Вывод:
Код:
Switch test 0: 1 2 3
Switch test 1: 2 3
Switch test 2: 3
Switch test 3: 4
 

DarkP1xel

Сила воли наше всё.
BH Team
3,635
4,962
Если ты про скобки после case - то их можно вообще не ставить
Причем тут синтаксис? При использовании многослойного switch/case, внешний break нарушит слой и произойдет незапланированный выход. Зачем лишний раз себе палку в колеса пихать?