Там сверху проверка есть на валидность, это похоже из-за того что два SleepНужно проверять на валидность диалог.
поставил, перед каждый вводом проверка, снова крашC++:int &iDialogStatus = SF->getSAMP()->getDialog()->iIsActive;
Фулл код дай.
Не достаточно просто вставить...
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();
}
}
может объяснишь чё не так ?Фулл код дай.
Не достаточно просто вставить...
Всё...Код: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(); } }
может объяснишь чё не так ?
Чтобы самому понять, что и где не так - воспользуйтесь отладкой. Люди на форуме - не компиляторы и не дебаггеры.я прекрасно знаю что в моём коде происходит пиздец ;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(); } }
зависает игра, приходится через диспетчер офать
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");
}
}
нужен таймер без заморозки основного потока. (игры)Код: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"); } }
поток – краш.
таймер – краш.
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;
}
}
}
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();
}
}
}
У тебя взаимодействий с игроками нет...
Кидай полный код откуда мы можем знать что у тебя еще есть?
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);
}
}
Cам код - полный ужас. Если делаешь клики диалогов делай это в хуке
if (GetTickCount() - dwTime > timer[0]) // warning C4018: >: несоответствие типов со знаком и без знака
if (GetTickCount() - dwTime > (DWORD)timer[0])if (GetTickCount() - dwTime > timer[0]) // warning C4018: >: несоответствие типов со знаком и без знака
Динамически выделить std::string или std::vectorКак заставить vector и string в std выделять динамическую память, а не стек?
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, то есть вводу последнего символа
switch (a){
case 0: {
// code
} break;
case 1: {
// code
} break;
}