Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
поток или таймер, окда?задержку в мейне ставить, окда?
поток или таймер, окда?задержку в мейне ставить, окда?
function main()
for i = 48, 57 do
if isKeyJustPressed(i) then
if state < 5 then
state = state + 1
end
end
end
end
function samp.onShowDialog(id, style, title, btn, btn, text)
state = 0
dtitle = title
if dtitle:find('репорт') then
if state == 1 then
sampSetCurrentDialogEditboxText("а")
elseif state == 2 then
sampSetCurrentDialogEditboxText("ад")
elseif state == 3 then
sampSetCurrentDialogEditboxText("адм")
elseif state == 4 then
sampSetCurrentDialogEditboxText("адми")
elseif state == 5 then
sampSetCurrentDialogEditboxText("админ")
elseif state == 0 then
sampSetCurrentDialogEditboxText('')
end
end
end
я же ответил, хукни wndprochandler или юзай функцию в потокекак перенести данное произведение на C++, isKeyPressed не работает в диалоге, GetAsyncState флудитLua:function main() for i = 48, 57 do if isKeyJustPressed(i) then if state < 5 then state = state + 1 end end end end function samp.onShowDialog(id, style, title, btn, btn, text) state = 0 dtitle = title if dtitle:find('репорт') then if state == 1 then sampSetCurrentDialogEditboxText("а") elseif state == 2 then sampSetCurrentDialogEditboxText("ад") elseif state == 3 then sampSetCurrentDialogEditboxText("адм") elseif state == 4 then sampSetCurrentDialogEditboxText("адми") elseif state == 5 then sampSetCurrentDialogEditboxText("админ") elseif state == 0 then sampSetCurrentDialogEditboxText('') end end end
void checkKey()
{
static DWORD tick = GetTickCount();
if (tick - GetTickCount() <= 0)
{
if (GetAsyncKeyState(key))
{
// code
}
tick = GetTickCount() + 800; // 800 - задержка в мс, если будет флудить ставь больше
}
}
вообще не работает)я же ответил, хукни wndprochandler или юзай функцию в потоке
C++:void checkKey() { static DWORD tick = GetTickCount(); if (tick - GetTickCount() <= 0) { if (GetAsyncKeyState(key)) { // code } tick = GetTickCount() + 800; // 800 - задержка в мс, если будет флудить ставь больше } }
вообще не работает)
// 1 способ
bool CheckPress() {
static bool was_pressed = false;
bool pressed = GetAsyncKeyState(key) & 0x8000;
if (was_pressed != pressed) {
was_pressed = pressed;
if (pressed)
return true;
}
return false;
}
void CALLBACK mainloop() {
if (CheckPress()) {
// code
}
// ...
}
// 2 способ
void CheckPressThread() {
bool was_pressed = false;
while(true) {
bool pressed = GetAsyncKeyState(key) & 0x8000;
if (was_pressed != pressed) {
was_pressed = pressed;
if (pressed) {
// code
}
}
Sleep(50);
}
}
void CALLBACK mainloop() {
static bool init = false;
if (!init) {
if (...) return;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CheckPressThread, 0, 0, 0);
init = true;
}
}
// 3 способ
#define GTA_HWND **(HWND**)0xC97C1C
static WNDPROC g_OriginalWndProc = nullptr;
LRESULT __stdcall WndProc(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam) {
switch(msg) {
case WM_KEYDOWN: case WM_SYSKEYDOWN: {
if (wParam == key) {
// code
}
} break;
}
return CallWindowProc(g_OriginalWndProc, hWnd, msg, lParam, wParam);
}
void CALLBACK mainloop() {
static bool init = false;
if (!init) {
if (...) return;
g_OriginalWndProc = SetWindowLongPtrA(GTA_HWND, GWLP_WNDPROC, (LONG_PTR)&WndProc);
init = true;
}
}
mainloop
C++:// 1 способ bool CheckPress() { static bool was_pressed = false; bool pressed = GetAsyncKeyState(key) & 0x8000; if (was_pressed != pressed) { was_pressed = pressed; if (pressed) return true; } return false; } void CALLBACK mainloop() { if (CheckPress()) { // code } // ... }
C++:// 2 способ void CheckPressThread() { bool was_pressed = false; while(true) { bool pressed = GetAsyncKeyState(key) & 0x8000; if (was_pressed != pressed) { was_pressed = pressed; if (pressed) { // code } } Sleep(50); } } void CALLBACK mainloop() { static bool init = false; if (!init) { if (...) return; CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CheckPressThread, 0, 0, 0); init = true; } }
C++:// 3 способ #define GTA_HWND **(HWND**)0xC97C1C static WNDPROC g_OriginalWndProc = nullptr; LRESULT __stdcall WndProc(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam) { switch(msg) { case WM_KEYDOWN: case WM_SYSKEYDOWN: { if (wParam == key) { // code } } break; } return CallWindowProc(g_OriginalWndProc, hWnd, msg, lParam, wParam); } void CALLBACK mainloop() { static bool init = false; if (!init) { if (...) return; g_OriginalWndProc = SetWindowLongPtrA(GTA_HWND, GWLP_WNDPROC, (LONG_PTR)&WndProc); init = true; } }
wchar_t *text = SF->getSAMP()->getDialog()->GetInputText();
if (CheckPress(49))
{
switch (strlen((char*)SF->getSAMP()->getDialog()->GetInputText()))
{
case 0: sprintf(result, "с"); break;
case 1: sprintf(result, "са"); break;
case 2: sprintf(result, "сас"); break;
case 3: sprintf(result, "саса"); break;
case 3: sprintf(result, "сасат"); break;
default: sprintf(result, "сасать"); break;
}
SF->getSAMP()->getDialog()->SetInputText(result);
}
else SF->getSAMP()->getDialog()->SetInputText((char*)text);
Попробуй использовать getDialog()->pText вместо Get/SetInputTextЗастревает на первой букве, я понимаю что это из-за этой строчки SF->getSAMP()->getDialog()->SetInputText((char*)text), но не знаю чем заменитьC++:wchar_t *text = SF->getSAMP()->getDialog()->GetInputText(); if (CheckPress(49)) { switch (strlen((char*)SF->getSAMP()->getDialog()->GetInputText())) { case 0: sprintf(result, "с"); break; case 1: sprintf(result, "са"); break; case 2: sprintf(result, "сас"); break; case 3: sprintf(result, "саса"); break; case 3: sprintf(result, "сасат"); break; default: sprintf(result, "сасать"); break; } SF->getSAMP()->getDialog()->SetInputText(result); } else SF->getSAMP()->getDialog()->SetInputText((char*)text);
Через сампфункс нельзя создавать потоки вообще, колхозь с таймерамиОшибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?
Ты создаёшь поток в mainloop? Если да, то это не лучший вариант, создавай его в DLL_PROCESS_ATTACHОшибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?
в теле команды. спасибо, буду пробовать.Ты создаёшь поток в mainloop? Если да, то это не лучший вариант, создавай его в DLL_PROCESS_ATTACH
смысл в том чтобы заблокировать ввод своего текстаПредлагаю использовать wcslen вместо strlen, дать нормальную нумерацию кейсам и убрать последнюю строчку кода. Не вижу в ней смысла.
pText получает текст диалога, нужно получать input (введённый текст)Попробуй использовать getDialog()->pText вместо Get/SetInputText
#include <Windows.h>
#include <process.h>
#include "main.h"
void __cdecl MainThread(void *pArg)
{
while (true)
Sleep(1);
{
if ($ == 100)// Проверка на то что $ = 100 и если оно верное ( true ) то выполнится код нижу.
{
Sleep(1);//Задержка 1 мс. Добавил чисто для безопасности шобы не было просадки , ну а вдруг нада .
AddMessageJumpQ("Проверка выполнена и равна 100 . ", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
}
else { //Если $ не равна 100 то выполнится этот код ниже .
Sleep(10000);// Задержка 10 Сек.
AddMessageJumpQ("Значение не 100", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
}
}
}
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
return TRUE;
}
// Проблема в том что когда $ равно в игре 100 но код не выполнятся , вобще хоть функцию хп 0 добавить она не выполнится .
DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо .
DWORD ZZZ = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}
0xB7CE50 - [dword] Деньги \\ - пробуй через это1. Как правильно выполнить проверку через if при работает с адресами памяти игры . Просто когда значение должно быть верным и должен выполнится код он не выполнятся . Я написал быстро код который приводит мой пример и описал все что там есть вроде . Типа если денег у меня 100 долларов то вывестись на экран подсказка в игре samp или gta sa типа у вас 100 долларов или что-то такое . А если не 100 то будет раз в 10 сек писаться типа не 100 долларов у вас . Но
проблема в том что когда денег ряльно 100 и даже если через CE ( Чит движок , Чит энерджи , cheat engine ) и поставить там 100 то это один хер не будет работать я уже замучился искать ответ . Спрашивать на форуме и мне там только администратор форума отвечает но он не понимает в чом проблема или не знает почему это так .
Вопрос.CPP:#include <Windows.h> #include <process.h> #include "main.h" void __cdecl MainThread(void *pArg) { while (true) Sleep(1); { if ($ == 100)// Проверка на то что $ = 100 и если оно верное ( true ) то выполнится код нижу. { Sleep(1);//Задержка 1 мс. Добавил чисто для безопасности шобы не было просадки , ну а вдруг нада . AddMessageJumpQ("Проверка выполнена и денег 100 . ", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция) } else { //Если $ не равна 100 то выполнится этот код ниже . Sleep(10000);// Задержка 10 Сек. AddMessageJumpQ("Проверка на то что денег 100 не верно", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция) } } } BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr); return TRUE; } // Проблема в том что когда $ равно в игре 100 но код не выполнятся , вобще хоть функцию хп 0 добавить она не выполнится .
Проблема в коде в том что проверка не проходит даже если оно равно 100 .
main.h:DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо . DWORD $ = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 . #define FUNC_CMessages__AddMessageJumpQ 0x69F1E0 void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране. { ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief); }
DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо .
DWORD dwMoney = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}
void __cdecl MainThread(void *pArg)
{
static DWORD dwOldMoney = 0;
static bool _bInit = false;
while(true) {
if(!_bInit) {
dwOldMoney = (Cped + 0x756); // Или тот адресс который я кинул выше.
_bInit = true;
}
if(dwOldMoney != (Cped + 0x756)) {
if ($ == 100) {
AddMessageJumpQ("Проверка выполнена и денег 100 . ", 1500, NULL, false);
dwOldMoney = (Cped + 0x756);
}
else {
AddMessageJumpQ("Проверка на то что денег 100 не верно", 1500, NULL, false);
dwOldMoney = (Cped + 0x756);
}
}
Sleep(100);
}
}