Mikhailovich Опубликовано 13 апреля, 2022 Поделиться Опубликовано 13 апреля, 2022 Добрый вечер, уважаемые форумчане! Прошу прощения заранее, я уверен, что данная тематика сто раз уже была рассмотрена в видео и руководствах, - и я их честно смотрел и читал, пока в котелке не образовался полный хаос и я окончательно не запутался. Итак, shared opcode. Я нахожу адрес здоровья, морожу значение, всё работает, хорошо. Нахожу инструкции, записывающие или обращающиеся к данному адресу. Методом научного тыка (ноплю по списку) нахожу нужную. Занопил - сам бессмертен, равно как и враги. Классика. И тут у меня начинается брожение мозгов. Ищу адреса, по которым осуществляется доступ к инструкции. Ок. Теперь, кто-то инструктирует через "Анализ структуры", в другом гайде советуют "найти совпадения между адресами". Что мне лучше использовать, есть ли какая-то принципиальная разница между этими методами? Идём далее. Допустим, я использовал поиск совпадений. получил список оффсетов для регистра. Надо ли их отсеивать (как временные указатели), вкл и выкл игру, перезагружать ПК и т.д.? Список вроде уменьшается. И наконец, одна и та же строчка выглядит иначе в зависимости от типа отображения. Например, оффсет 30 1103626240 0 0 0 (4 байта) 1103626240 3328197 0 0 (8 байтов) 0000041с800 2у30220 0000 000000 (hex) Что использовать при написании скрипта, если у меня тип адреса - Double? По умолчанию, скрипты читаются через hex (или так я понял), т.е. искать 16-ичное отображение? Или как-то записать условие вроде smp [rcx+30],(double)0000041с800 (знаю, что строка не подходит, но для примера сойдёт) или smp [rcx+30],#1103626240? Ещё раз прошу прощения за нубские вопросы, но я полный гуманитарий по природе и работаю с СЕ по принципу "мартышка увидела и повторила". Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 апреля, 2022 Поделиться Опубликовано 14 апреля, 2022 В 13.04.2022 в 8:43 PM, Mikhailovich сказал: Что мне лучше использовать, есть ли какая-то принципиальная разница между этими методами? Используй любой из методов, который будет работать у тебя в твоем конкретном случае. В 13.04.2022 в 8:43 PM, Mikhailovich сказал: Что использовать при написании скрипта, если у меня тип адреса - Double? Числа с плавающей точкой двойной точности, как и обычные числа с плавающей точкой (float) надо сравнивать через определенные инструкции FPU или XMM. Инструкция cmp подходит только для целых чисел. Ты можешь попытаться сравнить hex представление, но, учитывая способ хранения типов double и float, вероятность срабатывания такого сравнения невелика. Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 14 апреля, 2022 Поделиться Опубликовано 14 апреля, 2022 5 часов назад, Xipho сказал: Инструкция cmp подходит только для целых чисел Не правда, float можно так же сравнивать cmp, например: cmp [eax+4],(float)50 je ... jg ... jl ... и всё будет работать, потому что они уменьшаются и увеличиваются так же как обычные числа, хоть и в другом виде Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 15 апреля, 2022 Поделиться Опубликовано 15 апреля, 2022 6 часов назад, imaginary сказал: Не правда, float можно так же сравнивать cmp, например: Почитай про точность чисел с плавающей точкой, далее почитай про хранение и интерпретацию таких чисел в процессоре, далее почитай, почему может внезапно получиться при записи в переменную 50.00, а при чтении уже 50.0000000000000000000000000000000002, и затем почитай, как в этом случае сработает сравнение cmp Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 15 апреля, 2022 Поделиться Опубликовано 15 апреля, 2022 4 часа назад, Xipho сказал: 50.00, а при чтении уже 50.0000000000000000000000000000000002 Не важно что там будет, важно то что если писать например (float)2.56, получится к примеру 2.559999943, при этом в игре если было тоже самое значение - 2.559999943, тогда всё прекрасно будет работать, и вообще если сравнивается точное float то удобнее сравнивать их с видом hex, вроде такого - 4023D70A, а про больше и меньше всё так же остаётся, больше float число и в hex больше, меньше - меньше, так что их спокойно можно сравнивать в cmp. Как и с целыми числами никто не будет сравнивать 10 и 11, как будто они равны, во float тоже самое 5.5 и 5.55 это разные вещи, так что не понимаю что тебе не понравилось. Если надо сравнивать целые доли то надо округлять с помощью fpu и тп, но это далеко не всегда нужно, я много раз сравнивала float и использовала fpu что бы сравнивать в том числе, поэтому говорю из своего опыта Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 15 апреля, 2022 Поделиться Опубликовано 15 апреля, 2022 2 часа назад, imaginary сказал: важно то что если писать например (float)2.56, получится к примеру 2.559999943, при этом в игре если было тоже самое значение - 2.559999943 А какова вероятность, что в игре будет такое же значение? В общем, почитай теорию про хранение чисел с плавающей точке в памяти компьютера, не буду спорить, не вижу смысла одно и то же обсуждать. 2 часа назад, imaginary сказал: я много раз сравнивала float Это не значит, что ты делала это правильно, если ты сравнивала с помощью cmp. cmp допустим ТОЛЬКО если сравнение на больше/меньше делается. Но никак не на равенство. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 15 апреля, 2022 Поделиться Опубликовано 15 апреля, 2022 Из своего опыта могу сказать что через cmp сравнение float работает некорректно. Особенно если float имеет отрицательное значение. Я использовал fpu. Из старого трейнера - fld dword ptr [Camera_Original_Pitch] fcomp dword ptr [Mouse_Screen_Y_Min_Value] fstsw ax sahf jae @f 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Mikhailovich Опубликовано 15 апреля, 2022 Автор Поделиться Опубликовано 15 апреля, 2022 (изменено) Ок, ребята, спасибо всем за ответы, буду изучать дальше. 22 часа назад, Xipho сказал: Ты можешь попытаться сравнить hex представление, но, учитывая способ хранения типов double и float, вероятность срабатывания такого сравнения невелика. Ну да, так и получилось. До Вашего ответа попробовал в 3 играх. В одной всё работает, в другой про прогрузке уровня работает, но если внутри уровня персонаж перемещается в доп. область, скрипт перестаёт фурычить. А 3 игруха меня вообще удивила. Если скрипт просто активировать - не работает, Х стоит, а здоровье уменьшается. НО если открыть скрипт для редактирования, даже ничего не изменить, затем подтвердить и снова включить - он начинает работать.? Как такое вообще возможно? :-) Ещё раз всем спасибо. Изменено 15 апреля, 2022 пользователем Mikhailovich Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 17 апреля, 2022 Поделиться Опубликовано 17 апреля, 2022 Если хочешь использовать cmp, то можно сделать условное равенство, это будет костыльно, но срабатывать будет чаще, на C++ выглядит как то так: Спойлер if(b - a < 0.001) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения