-
Постов
1 635 -
Зарегистрирован
-
Посещение
-
Победитель дней
55
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент keng
-
Это обыкновенный Courier New Regular. Там же в настройках посмотреть можно.
-
Карочи! Ты такой: int flag = 0; /* объявляем флажок */ if ( GetAsyncKeyState(0x20) & 0x8000 && !flag ) { /* Если кнопка в нижнем положении и флажок == 0 */ flag = 1; /* Ставим флажок в 1 */ /* Выполняем нужный код */} else if ( !GetAsyncKeyState(0x20) ) { /* Иначе, если кнопка НЕ нажата */ flag = 0; /* Снимаем флажок */}Заметь, что перед 0x8000 стоит логическое И. В чем суть? В том, что функция GetAsyncKeyState возвращает значение типа SHORT. SHORT - это два байта. Младший показывает состояние кнопки (нажата - не нажата), а старший - подробности. Эти самые подробности в бинарном виде выглядят так: 0000 0000 0000 0000 // Кнопка вверху и не нажата 1000 0000 0000 0001 // Кнопку нажали и она теперь внизу 1000 0000 0000 0000 1000 0000 0000 0000 // Кнопка все еще внизу 1000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 0000 // Кнопка отжалась обратно То же, но в 16-ричном формате: 0x0000 0x8001 0x8000 0x8000 0x8000 0x8000 0x0000 Итого: 0x0000 0x8001 OnKeyDown - нажали кнопку и держим ее так. 0x8000 ИЛИ 0x8001 OnKeyPressed - нажали и отпустили, НО предыдущяя проверка должна была вернуть 0. 0x8001 OnKeyHold - с момента предыдущей провери кнопка все еще нажата. В духе: "ABCDDDDDDDDDDD". 0x8000 ИЛИ 0x8001 0x0000 OnKeyUp - то есть кнопка отпустилась из предыдущего своего состояния. Такая вот штуковина! =D
-
Привет!В подобных темах хорошо указывать название игры. А так, погода - это несколько состояний, вроде "ясно", "пасмурно", "снег идет". Это и нужно будет искать, методом "изменилось\не изменилось". Начать можно с типа "целое, 4 байта".
-
Вроде бы, все ок. Думаю, корректнее было бы скрипт обернуть в lua-таймер - оно вроде как это умеет.
-
Говорят, что создание потока в скрипте нужно вызывать последним, т.е. в самом низу. Сначала, мол, код записать, а потом уже поток сделать.
-
Представь себе пример. Есть программа, которая показывает кнопку "Скачать файл", по нажатию на которую начинает этот самый файл скачивать. Файл размером в 100 Тб, скорость - 56 Кбит\сек. То есть понадобится дофигалион времени на скачивание. А пользователю во время скачивания нужно показывать индикатор загрузки. Раньше было так, что можно было или качать и ждать, или рисовать этот самый индикатор. Потом изобрели потоки, которые позволили разделить контекст выполнения программы - одна ее часть теперь рисует индикатор, а другая - грузит файл. Процессор переключается между этими двумя потоками и выполняет их код поочередно. Для пользователя это выглядит, будто оно одновременно делает и то и другое, но это просто процессор работает быстро. А потом изобрели многозадачные ОС, которые работают примерно по этому же принципу. Дык вот в моем примере есть функция. Допустим, такая: void func(int a, int b, int c); Чтобы вызвать эту функцию из Си, надо сделать так: func(1, 2, 3); Чтобы из ассемблера - так: PUSH 3PUSH 2PUSH 1CALL func Мы взяли и нашли через Cheat Engine адрес этой самой функции, но нам хочется сделать такую инъекцию, чтобы не трогать сам код игры, но чтобы эта функция вызвалась в нужный нам момент. Тут и спасут потоки. Создаем поток и передаем ему код вызова функции - при создании потока ОС увидит его, скажет об этом процессору, тот переключит контекст выполнения на этот поток и выполнит код, а затем поток просто завершится и ничего больше не будет делать. Регистры и флаги не пострадают, потому что это выполнится "параллельно" (отдельно) от остального игрового кода. Такая вот штука.
-
Тем, что label просто позволяет дать имя адресу памяти, а CreateThread создает поток. Почитать о них подробнее можно, например, [тут]. RET нужна, насколько я помню, для того чтобы поток понял, что пора завершаться.
-
Привет!Смотря какую функцию и смотря откуда. Если игровую и из инъекции кода, то тебе нужно будет знать ее адрес и аргументы. А дальше сделать примерно так: alloc(mycode,4096) // Выделяем 4096 байт памяти для записи нашего кодаCREATETHREAD(mycode); // Создаем новый поток и передаем управление на выделенную памятьmycode: PUSH arg2 // Кладем в стек аргументыPUSH arg1PUSH arg0CALL 0x1234567 // Вызываем функцию по адресу 0x1234567RET // Выходим
-
Мое обычное решение - оригинальная версия программы, не в обиду SER[G]ANT'у будет сказано. А вообще, адресное пространство общее, тебе в любом случае понадобится image base client.dll, даже внутри dll твоего хука. Адрес-то один фиг будет вида "image base + offset", потому что этот самый image base меняется при перезапуске игры.
-
wts использует видовую матрицу, чтобы понять, на экране находится объект или нет. А до этого - чтобы сделать проекцию трехмерных координат объекта на двумерное пространство (окно игры). Если in russian, то это надо зайти в, ммм, "Просмотр Памяти", потом выбрать меню "Вид" и ткнуть там опцию "Показать имена модулей" (О_о). Не люблю я in russian, а то каждый раз как представлю: целое ничего главное(целое колво_аргументов, указатель буква аргументы){ возврат 0;}Кошмар же, ну! Брр... А прямоугольник рисуется легко. Представь, что [0:0] - это верхний левый угол экрана. Линия рисуется на двумерной плоскости, так что нужно две точки: 0. От [0:0] до [10:0] 1. От [10:0] до [10:10] 2. От [10:10] до [0:10] 3. От [0:10] до [0:0] По часовой стрелке. Координаты - в формате [X:Y]. Попробуй сначала на бумажке это нарисовать. Id команды находится там же, где и здоровье с координатами - все в одной структуре. Когда найдешь их массив (или отладишь функцию нанесения урона) - увидишь при сравнении. Там значения 0, 1 и 2 (T, CT и Spectator, вроде так).
-
Привет!С модулями можно потыкать меню "View" окна "Memory view", вроде как оно там зовется "Show symbols". Нужен модуль "client.dll". Структура там здоровая, как и почти все в source engine - здоровье находится по смещению что-то около 0x90. С CS:GO никакой разницы, разве что эти самые смещения в структурах. Попутный ответ - рисуется прямоугольник из линий. Тут нужно будет только немного поиграться с его размером.