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

Receiver

leet-cheats 👑
Проверенный
619
882
C++:
char text[] = "12345";
 text[0];   // 1
 text[1];   // 2
 text[2];   // 3
 text[3];   // 4
 text[4];   // 5
Смысл тебе писать на C++ , если ты даже основ не знаешь?
мне нужно чтобы было именно char * а не char[]

но если использовать такой метод с char *, то игру крашит
 

index

Известный
126
82
нужно разбить char * test = "12345" на цифры, чтобы можно было сделать так:
char nds[5];
sprintf(result, "%s%s%s%s%s", nds[0], nds[1], nds[2], nds[3], nds[4], nds[5])

когда пытаюсь делать test[0], test[1] ... - краш игры.
??
При спецификаторе %s идет обращение к адресу, записанному в передаваемый аргумент (т.е. переменная должна быть указателем на строку). Естественно, у тебя будет ошибка access violation at adress test[number].
https://ru.wikipedia.org/wiki/Система_типов_Си

Сначала неплохо бы основы выучить, как сказал товарищ сверху. Чтобы вывести однобайтовый символ - используй %c.
 

Receiver

leet-cheats 👑
Проверенный
619
882
Код:
const auto myTask = []()
{
       Sleep(500);
        SF->getSAMP()->getDialog()->SetInputText("х");

         Sleep(500);
         SF->getSAMP()->getDialog()->SetInputText("у");
};
std::thread(myTask).detach();
- краш игры, в чём проблема ?
 

Receiver

leet-cheats 👑
Проверенный
619
882
Фулл код дай.


Не достаточно просто вставить...
Код:
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

leet-cheats 👑
Проверенный
619
882
Код:
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
539
Код:
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

leet-cheats 👑
Проверенный
619
882
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

leet-cheats 👑
Проверенный
619
882
У тебя взаимодействий с игроками нет...


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

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