Приветствую всех, подскажите пожалуйста, у меня есть базовый адрес и офсеты, как правильно все написать пробовал вот так :
set #target_hp_base 0x7D47265C
set #offset1 0x72c
set #offset2 0xf8
set #offset3 0x418
set #offset4 0x3a4
set #offset5 0x204
set #target_hp #target_hp_base + #offset1 + #offset2 + #offset3 + #offset4 + #offset5
readmem #hp #target_hp d
hint Жизней мало епт = #hp
ничего не получилось возвращает либо ноль либо не верное число...
У вас скорее всего есть цепочка указателей и офсеты от каждого указателя указаны. Т.е. берете адрес + офсет1, считываете значение. В значении у вас будет указатель со следующим адресом, прибавляете к нему второй офсет и т.д.
Пробовал вот так :
set #target_hp_point0 0x7D47265C
set #target_hp_point2 #target_hp_point0 + 72C
set #target_hp_point3 #target_hp_point2 + F8
set #target_hp_point4 #target_hp_point3 + 418
set #target_hp_point5 #target_hp_point4 + 3A4
set #target_hp #target_hp_point5 + 204
readmem #hp #target_hp d
hint Жизней мало епт = #hp
Возвращает 0
это печальная история... Мог, но релиз не состоялся т.к. исходники были утеряны... На данный момент пилот не может запросить начальный адрес блока дллки. Вся адресация у него только общая на процесс. С PE tools дело не имел, только с артмани. Надеюсь правильно вас понял, что адресация идет от начала дллки, но что-то больно цифры тогда большие. Если адресация все-таки общая на процесс, а судя по адресам это так, то схему я уже выше описывал. В данном случае это будет выглядеть примерно так:
set #a 0x2B7BAF00 + 0x204
readmem #b #a D
// В #b должен в данном случае упасть адрес 2BF033F70
// от вернувшегося адреса необходимо расчитать смещение
set #b #b + 0x3A4
readmem #c #b D
set #c #c +0x418
readmem #d #c D
и т.д.
log dec2hex(#b)
Спасибо уважаемы Дарк , все получилось, но уж больно огромен код получается )))
Можете подсказать как оптимизировать можно, если это возможно?
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели
:start_script
hint HP = #target_hp
goto start_script
Теперь другая проблема, тестил скрипт на 64х битной системе, принес домой адреса не читаются на 32х битной такое возможно? Есть ли решение?
включаю этот же скрипт на домашнем компе
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели
hint #target_hp
Уважаемый Дарк, а возможно как то проверить в начале скрипта битность системы, а затем запускать требуемые куски скрипта?
про запуск нужного куска я так понимаю gosub мне поможет, а вот как проверить битность? Через реестр есть мысль, но тут опять вопрос на разных типах систем XP Vista и т.д адрес так же разный наверное... может есть какое то универсальное решение...
Самый тупой способ - проверить существование папок. Например, wow64. Вообще в пилоте прямого вытягивания битности и работы с реестром нет. Данная методика из костылей батников. Там проверяют зарезервированную системную переменную.
Уважаемый Дарк подскажите , как можно работать с значением в формате Float выдает 0 всегда, если можите с примером пожалуйста.
используйте строковую переменную, а не числовую. В числовую не может быть помещено значение с точкой.
Если ставлю строку "S" то выдает так же 0 не понимаю в чем дело
readmem #a 0x0F2999BC s 10
hint #a
хотя на тот момент я точно знаю, что значение 9.024896622
S это string тобиш строка, яподумал что про строковую переменную вы имели ввиду это, просто F ноль возвращает, покажите пожалуйста пример кода, не могу никак понять что да как...
Все разобрался )
теперь я знаю что переменная с $ - это строковая )))
Даже в последующем найденом значении делаю проверку на целое число все работает.
$a 8.98880291
If $a > 6
hint
end_if
короче говоря все получилось! Спасибо большое Дарк! )
то есть я так понимаю число проверяется до точки?
Не совсем так. Если я правильно понимаю логику пилота, а здесь она не совсем адекватная, то все сравнение идет посимвольно кодами символов.
Т.е. берем строку, лезем в ascii таблицу, переводим все символы в коды. http://www.cdrummond.qc.ca/cegep/informat/Professeurs/Alain/images/ASCII1.GIF
Т.е. у нас получится вместо:
8.98880291
56 46 56 56 56 48 50 57 49
Далее из этого числа по одной цифре идет сравнение. Символ точки меньше значения цифры и это видимо как-то обрабатывается. Вообще трогать страшно.
В общем и целом делать так крайне не рекомендую, это ну уж очень не корректно. Используйте trunc или round для приведения к целочисленному типу.
if 9.0 > 9
log +
else
log -
end_if
я считываю значение из памяти оно идет 9.00000хххх и сравниваю его с целым числом все сравнивается правильно, фиг знает, числа с точкой сравниваются как целое число до точки, все что после точки, не берет пилот в сравнение.
set $a 5.98880291
set $b 6
if a < b
hint // В данном случае хинт выведется
end_if
Может так: if $a < $b
Сравнение работает если сравнивать целые числа с целыми и нецелые с нецелыми.
Т. е. если надо сравнивать нецелое число, скажем 5.98880291, то и сравнивать его надо не с 6, а с 6.0.
if strtoint() then f:= a < b
else CompareStr ()
Как именно работает сравнение строк? Все что я понял, то вернет 0, если они равны. Точнее я не понял, что есть "строка больше/меньше". По Ascii, как я и написал?
if 9.80 > 9.8
log +
else
log -
end_if
stop_script
Видимо все-таки не работает.
Если по порядку по ascii сравнивает, то все логично. Код символа '0' будет больше, чем код окончания строки.
А где-то вообще пишется 9.80 или везде 9.8? Если не пишется то смысл что-то выдумывать.
А эти десятые вообще нужны? почему не делать trunc или round?
я сейчас подбираю, нужную ячейку памяти, не могу подобрать дистанцию до моба в La2 геморрой сплошной, нашел вроде бы float , но улетаю в другую локацию, значение принимает отрицательный вид... тобиш с минусом впереди... пока кароче ничего не получается с дистанцией...
минус можно убрать через
set #var abs(значение)
брал в цель мобов, НПС, отбегал, подбегал, и искал соответственно что уменьшилось или увеличилось значение, (Cheat Engine)
P/S Искал по всем значениям кроме строк от байта до Double , вроде второе правильно написал.
какой диапазон значений? Скажем при ренче 600 и 900 какие значения будут?
При каких ситуациях значение становится отрицательным?
рейндж не могу проверить, а в минус уходят не понятно по каким причинам, сам пока не пойму.
если несложно, уточните ренч и значения, когда сможете. Есть кстати подозрение, что там используется unsigned (безнаковая) перемененная, а пилот вроде считывает их как знаковые. Но тут опять же должны быть очень большие значения, чтобы знак менялся.
Поискал диапазоны значений... А походу не существует беззанокового float...
Т.Е. нет возможности вычеслить дистанцию до моба?
Т.е. моя догадка про появление минуса ошибочна.
При минусе само число по модулю остается корректным? Если да, то можно просто использовать abs, как я писал выше.
возможно адрес смещен на 1 байт.
Могу порекомендовать открыть страницу памяти и глазками посмотреть на изменение значений. Может все очень быстро проясниться.
сейчас папробую
ОТкрыл, и Заморгал, ничего не понимаю только это понял )))
Вродеб нашел , но есть один косяк, если я с переди одно значение, если сзади или с боку другое... но оба правильно увеличиваются ли уменьшаются если я отбегаю или подбегаю к мобу. цифры разные но увеличиваются либо уменьшаются правильно относительно моба, единственно, что они разные и меняются относительно моего положения в пространстве и то где расположен моб, вот скрин с значениями может яснее будет.
вот скрин еще разок.
и Еще я хоть и обозначил числа не измененными но это немного не так, дело в том что при близком расстоянии к мобу 16 меняется на 15 896 к примеру, а 49 на 48 954 к примеру.
Теперь понятно мне что Float (значение с точкой) менялся на отрицательное значение так же из за положения персонажа относительно моба в мире и имело значение то положительное то отрицательное.
Сейчас нужно покумекать и сделать значение первых двух чисел не измененным, тогда б и вопрос решился.
Эскизы прикрепленных изображений
Можно поискать какие-нибудь флаги. Посмотри память - оно может быть рядом. Не знаю как в чит инжи, но в артмани это достаточно удобно делать: открываешь область памяти и у тебя все значения на глазах в виде таблицы.
Вообще можно пойти еще и сложным путем. Можно вытащить координаты чара и координаты цели. Координаты чара точно вытаскиваются. С координатами цели сложнее - их может не существовать. Т.е. есть просто некая таблица(далеко не факт, что таблица, возможно список разбросанный по памяти) мобов с координатами, именами т.д. Когда ты берешь моба в цель, то есть неплохая вероятность, что некоторый набор значений моба копируется в структуру цели. Если так происходит, то может получится вытащить координаты цели. Если вытащишь, то найти дистанцию проблемой не будет.
А можно по подробнее что такое флаги , как искать , и что с ними делать?
Обычные переменные, принимающие значения 1 или 0. Пример:
https://forum.uokit.com/index.php?s=&showtopic=28316&view=findpost&p=209321
Искать соответственно 1 и 0 при изменении отсчета.
Нашел я байт , который скачет,
вот скрин наглядный, что можно имея эти данные с этим сделать?
Эскизы прикрепленных изображений
этот байт, надеюсь не является частью того float'а? От него можно отталкиваться и проводить коррекцию значения.
А вообще значения до и после скачка хоть как-то пересекаются? Может проще вообще просто сделать некоторый алгоритм коррекции основываясь только на изначальном значении?
Это не тот Float, это уже я нашел значение (2b) ,
P/S Для меня все не просто )))
а вопрос про пересечение, есть кое какие цифры но я в них не уверен на 100% не получается точно найти
примерно 15700 - 48700
А число изменяется при удалении линейно на отрезаках 0-15700 и 48700-много?
Идентично ли изменение значений на этих отрезках при идентичном изменении реального ренча?
Т.е. я хочу все это дело подвести примерно под такой код:
set #rangeMultipler // Некоторый множитель для приведения ренча к стандарту л2
if #memRange < 15700
set #range #memRange / #rangeMultipler
else
set #range (#memRange - ( 48700 - ( 48700 - 15700 ) ) )/ #rangeMultipler
end_if
log #range
Блин не совсем понял про что ты спрашиваешь...
Сравнивал через некст тарег в одном случае ловит в таргет при дистанции 49300 а в другом при дистанции 16500, т.е дистанция не идентична. в 200 единиц, но это не критично. наверное.
Это обусловлено я думаю тем, что смещение байта не идентично, я выше скрин присылал там было 3D,3E,3F а другое по логике тоже с D должно но нет там BC,BD,BE, и т.д
Перескок зависит от положения чара относительно цели к примеру чар на юге а цель на севере 49 если на оборот то 16 а значения я прислал некст таргет, это рандж 400 памоему в интерлюде.
вот они 49300 (400 рендж) а в другом 16500 (400 рендж)
Но опять же я мог подбежать чуть ближе или дальше, возможно они идентичны даже.
я имею идентичность трех последних чисел. (300 и 500)
Какие значения будут при ренче:
0
200
400(ну уже есть в принципе)
600
800
1000
Побегай) На глаз примерно. У магов виндстрайк на 400 бьет, на 600 почти у любого чара есть скилы, лук на 600 бьет без скилов. Маги на хай левелах 900. Открой скилы, посмотри ренч, примерно на глаз все это промерь. Надо понять точность значений и как они изменяются.
Что то разброс идет проверял на рендж 600 бить начинает от 16000 до 16700
а другое значение с рейнджем 600 48700 - 49500
Рейндж 400
Начинает бить от 15840 до 16666
Другое значение 48700 до 49434
(400 рейндж проверил более точно побега вокруг гуарда и бафал его шитом баф шита имеет дистанцию 400)
А это точно значение ренча?
Ок, папробую поискать координаты
Координаты цели нашел по X и по Z высота я думаю не нужна? что дальше?
Ну дальше найти бы еще по Y =)
Найди свои координаты.
Потом:
set #distance point_distance (x1 y1 x2 y2)
координаты Вы имели ввиду? Если да то Float
set $zero 0
set $x1 258910,46875
set $y1 -71314,3125
set $x2 258906,15625
set $y2 -71314,234375
set $x1Frac frac ($x1)
while size ($x1Frac) < 3
set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) copy ( $x1Frac 1 3)
set $y1Frac frac ($y1)
while size ($y1Frac) < 3
set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) copy ( $y1Frac 1 3)
set $x2Frac frac ($x2)
while size ($x2Frac) < 3
set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) copy ( $x2Frac 1 3)
set $y2Frac frac ($y2)
while size ($y2Frac) < 3
set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
log #distance
stop_script
Высота смотрю не нужна для вычислений?
Значение иногда принимает отрицательное значение, это не критично?
И поясните пожалуйста где чьи координаты в коде ?
set $x1 10,06
set $y1 1,21
set $x2 20,2468
set $y2 11
x1 y1 - первый объект.
x2 y2 - второй объект.
Что цель, а что вы - без разницы. Z можно прилепить, но оно надо?
Координаты возвращаются аналогичные тем, то по .loc?
Не понял про
В чате л2 напишите .loc или /loc (зависит от сервера). Значение будет аналогичным вытянутому из памяти? В памяти координаты хранятся такие же как на карте?
Значения немного разные к примеру 258129.3125 а на сервере 258136.
но это мой косяк не точно нашел значение в памяти сейчас папробовал найти то что выдает сервер, все совпадает
хм. Обычно зачения схожи с координатной сеткой на карте. Т.е., например 62,34 на 30,42. Если значения всегда так велики и все, что после точки можно просто отбросить, то код можно очень сильно сократить. Все, что нужно будет оставить:
set #y2Int trunc ($y2)
set #distance point_distance (x1 y1 x2 y2)
readmem $x1_target 0x1605ABF8 F
readmem $y1_target 0x1605ABF4 F
readmem $x2_target 0x068780D8 F
readmem $y2_target 0x068780D4 F
set $zero 0
set $x1 $x1_target //25
set $y1 $y1_target //-
set $x2 $x2_target
set $y2 $y2_target
set $x1Frac frac ($x1)
while size ($x1Frac) < 3
set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) * 1000 + $x1Frac
set $y1Frac frac ($y1)
while size ($y1Frac) < 3
set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) * 1000 + $y1Frac
set $x2Frac frac ($x2)
while size ($x2Frac) < 3
set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) * 1000 + $x2Frac
set $y2Frac frac ($y2)
while size ($y2Frac) < 3
set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) * 1000 + $y2Frac
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
log #distance
stop_script
Минуса??? В л2 не должно быть минуса координат. Либо какой-то совсем чудесный сервер. Значения координат очень странные. Добавь вывод в лог:
log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
обычный фри интерлюд сервер
16:17:25 4 (, 42): 258243 -71456 258304 -71384
16:17:25 4 (, 43): 258243000 -71456000 258304000 -71384000
И кстате в игровом /loc так же минуса присутствуют
Дистанция возвращалась с точкой. Поправил код.
если подойти близко к мобу цыфры выростают а не наоборот, хм странно
вот лог к примеру подхожу к мобу все норм уменьшается но если совсем близко то:
6:26:26 4 (, 39): 26249
16:26:26 4 (, 39): 26249
16:26:27 4 (, 39): 26249
16:26:28 4 (, 39): 22023
16:26:29 4 (, 39): 22023
16:26:29 4 (, 39): 258101001
Значение скачет видимо из за не стабильной информации из памяти, папробую подобрать что то поточнее.
log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
С логами координат и int значений приводите. Для отладки они очень полезны.
Что то значение скачет... ничего не понимаю, адреса нашел стабильные...
Я выделил цель и подбегаю к ней постепенно вот что выходит.
вот лог:
8:50:36 1 (, 40): 716867
8:50:37 1 (, 40): 334937
8:50:37 1 (, 40): 211837
8:50:38 1 (, 40): 170695
8:50:38 1 (, 40): 95742
8:50:39 1 (, 40): 95742
8:50:39 1 (, 40): 777597
8:50:40 1 (, 40): 777597
8:50:41 1 (, 40): 722105
8:50:41 1 (, 40): 722105
То же самое вот :
9:06:10 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:10 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:10 1 (, 40): 1561717
9:06:10 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:10 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:11 1 (, 40): 1561717
9:06:11 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:11 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:11 1 (, 40): 1561717
9:06:12 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:12 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:12 1 (, 40): 725027
9:06:12 1 (, 41): 258110 -71040 258824,0625 -71303,140625
9:06:12 1 (, 42): 258110000 -71040000 258824625 -71162375
9:06:13 1 (, 40): 1411175
9:06:13 1 (, 41): 258110 -71040 258741,765625 -71289,46875
9:06:13 1 (, 42): 258110000 -71040000 259506625 -71242125
9:06:13 1 (, 40): 670899
9:06:13 1 (, 41): 258110 -71040 258709,71875 -71280,0234375
9:06:13 1 (, 42): 258110000 -71040000 258780875 -71045625
9:06:14 1 (, 40): 655258
9:06:14 1 (, 41): 258110 -71040 258630,25 -71251,609375
9:06:14 1 (, 42): 258110000 -71040000 258630250 -70641625
9:06:15 1 (, 40): 8849580
9:06:15 1 (, 41): 258110 -71040 258530,390625 -71212,8984375
9:06:15 1 (, 42): 258110000 -71040000 258920625 -62227625
9:06:15 1 (, 40): 2808937
9:06:15 1 (, 41): 258110 -71040 258445,234375 -71180,2890625
9:06:15 1 (, 42): 258110000 -71040000 258679375 -68289375
9:06:16 1 (, 40): 262689
9:06:16 1 (, 41): 258110 -71040 258353,875 -71142,4375
9:06:16 1 (, 42): 258110000 -71040000 258353875 -71137625
9:06:16 1 (, 40): 886794
9:06:16 1 (, 41): 258110 -71040 258263,390625 -71105,765625
9:06:16 1 (, 42): 258110000 -71040000 258653625 -70339375
9:06:17 1 (, 40): 92639
9:06:17 1 (, 41): 258110 -71040 258188,6875 -71078,875
9:06:17 1 (, 42): 258110000 -71040000 258194875 -71077125
В во 1 почему различаются координаты int и считанные? Считывается разный набор адресов?
-71308,1875
-71306125
так не бывает.
Все с запятыми должны быть?
запятая должна выкидываться и браться первые 3 числа после запятой и прлепляться к целой части числа. Вот только не совпадают тут числа.
-71308,1875
-71308187 // должно быть так
-71306125 // а как это получилось?
Сам не понимаю, все как бы правильно, может скрипт что то не так вычисляет?
set $zero 0
set $x1 258910,46875
set $y1 -71314,3125
set $x2 258906,15625
set $y2 -71314,234375
set $x1Frac frac ($x1)
while size ($x1Frac) < 3
set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) copy ( $x1Frac 1 3)
set $y1Frac frac ($y1)
while size ($y1Frac) < 3
set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) copy ( $y1Frac 1 3)
set $x2Frac frac ($x2)
while size ($x2Frac) < 3
set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) copy ( $x2Frac 1 3)
set $y2Frac frac ($y2)
while size ($y2Frac) < 3
set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
log #distance
Это весь код? Это бред.
И еще я заметил что значение не всегда с запятой, может это как то влияет?
Задержки там вообще не при чем. Можно ставить смело 0.
а Что с кодом не так, подскажите?
А как же нужно?
что то я запутался...
вы ВЕСЬ код из вкладки сюда копируете? Он в неизмененном виде относительно вашей вкладки?
да весь код
В шапку скрипта:
log clear
log mode commands
:start
goto start
В логе иногда появляется ноль, это значит, что я выделил в цель себя, затем я менял цель и начинал движение к ней
Прикрепленные файлы
log.txt ( 9,96 килобайт )
Кол-во скачиваний: 121
script.txt ( 965 байт )
Кол-во скачиваний: 71
log commands
вот еще раз )
Прикрепленные файлы
log.txt ( 40,78 килобайт )
Кол-во скачиваний: 91
set #distance point_distance (x1 y1 x2 y2) - удалить строку в начале скрипта.
Так же я не увидел ни одного дробного значения либо искаженного значения. Все отработало точно так, как и должно было. Ну разве что результат я проверял ибо желания строить координатную сетку, считать на калькуляторе и сличать с сеткой у меня желания не много)
Что изменяли? Признавайтесь =)
// Если проблема останется, то лог с проблемой сюда. Т.е. лог нужно снять, когда проблема будет, а не в идеальных условиях.
Поднял старый лог, подставил значение, нашел косяк =)
https://forum.uokit.com/index.php?showtopic=28537&st=60&p=211572&#entry211572
исправил. Если в 2 словах, то так увлекся компенсацией излишнего обрезания дробной части, что забыл ее обрезать =)
Спасибо Уважаемый Дарк, пока нет возможности проверить, как появится, сразу отпишусь о работоспособности!
Спасибо еще раз огромное!
Руку Мастера, сразу видно, все работает как часы!!!
Единственно неудобно, и я не знаю как это реализовать, когда цели нет он все ровно выдает дистанцию, и это немного сбивает, эту проблему можно как то обойти? Помогите пожалуйста!
А вот это дожен быть где-то флаг в чистом виде.
Ищите 1 когда цель есть и 0, когда цели нет.
Ну либо обычный if на панельку с целью.
Такой флаг у меня найден уже на проверку цели, а как и в какое место кода вставить его чтоб подружить с предыдущем скриптом, где и как проверку сделать, подскажите пожалуйста
Дык а чего вы хотите добиться? У вас есть флаг проверки существования цели - от этого и отталкивайтесь выстраивая логику скрипта. Сейчас у вас в случае отсутствия цели возвращает фантомную дистанцию, а что должно возвращать?
я так понимаю 0 ?
Я в начало просто добавил проверку вот такого вида:
if #target = 0 // Проверяем есть ли цель?
goto main
end_if
Проверка синтаксически верна?
Ок, спасибо буду разбираться, единственно хотел еще уточнить вы упомянули про goto - не использовать, gosub - нужно?
и значение 0 чем хуже -1 ?
gosub - правильное решение.
0 - теоретически корректное значение. Нам же фактически нужно вернуть ошибку определения дистанции. Ну и есть общее негласное правило - возвращать отрицательное значение при ошибках.
Все Ясно! Спасибо!
Я надеюсь конструкция не превратилась в gosub main?
Нет я поступил по другому в конец скрипта проверку добавил с присваиванием значения, вот кусок концовки кода:
set $y2Frac frac ($y2)
while size ($y2Frac) < 3
set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
if $x2 = 0 // Проверяем есть ли цель?
set #distance -1
end_if
log #distance // Выводим в переменную #distance дистанцию до цели
// Памятка соотношение дистанции скрипта и игрового RANGE
// Range 400 I 413000
// Range 600 I 613000
Спасибо, действительно так будет правильно!
Уважаемый драк подскажи как работать с строковыми перемеными, никак не могу оффсеты прибавить в формате 0x260 к примеру результат -1 всегда
вот мой код:
while 1
// Считываем базовый адрес и оффсеты HP положение цели по X
set $offset1 0x670
set $offset2 0x708
set $offset3 0x298
set $target_pos_point_x 0x0693AC00 + $offset1
readmem $target_pos_point_x $target_pos_point_x f
set $target_pos_point_x1 $target_pos_point_x + $offset2
readmem $target_pos_point_x1 $target_pos_point_x1 f
set $target_pos_point_x2 $target_pos_point_x1 + $offset3
readmem $target_pos_x $target_pos_point_x2 f
hint $target_pos_x
end_while
потому что они должны быть не строковыми а числовыми.
0xчисло - это не строковые, а числовые значения. Просто они представлены в шестнадцатиричной системе счисления.
а значение Float записывается в строковую?, как объединить?
а зачем? вы в данном примере вычисляете адреса по указателям. При этом точно вам не придется складывать дробные значения. В пилоте нет нецелочисленной математики на данный момент. Если в этом есть необходимость, то могу написать функцию.
Не могу понять как это сделать, значение все ровно -1
оставил строковую переменную при чтении памяти,
в при сложении изменил на решетку,
подскажите пожалуйста:
while 1
// Считываем базовый адрес и оффсеты положение цели по X
set #offset1 0x6C
set #offset2 0x18
set #offset3 0x5A4
set #target_pos_point_x 0x0693AC00 + #offset1
readmem $target_pos_point_x #target_pos_point_x f
set #target_pos_point_x1 $target_pos_point_x + #offset2
readmem $target_pos_point_x1 #target_pos_point_x1 f
set #target_pos_point_x2 $target_pos_point_x1 + #offset3
readmem $target_pos_x #target_pos_point_x2 f
hint $target_pos_x
end_while
А адрес то получается точно нужный вам? Для меня вообще не очень понятен смысл каждый раз складывать две константы.
0x0693AC00 + 0x6C - результат всегда будет одинаковый. В чем смысл сего действа? Скорее всего необходимо было считать адрес 0x0693AC00, получить из него указатель и к значению этого указателя прибавить 0x6C.
Спасибо огромгое за подсказку. Буду работать дальше.
Разобрался, я сам затупил по черному, зачем то указатель флотом помечал ))))
Ваш пинок в нужное направление мне сильно помог, спасибо еще раз
Что то я вообще запутался ))
То выдает значение, то нет, подскажите куда ковырять, в первом варианте выдает - 1
во втором все работает, что я не так делаю?
While 1
//Позиция ЦЕЛИ по X
set #base_target_x 0x0692B000
set #offcet1 0x270
set #offcet2 0x708
set #offcet3 0x298
readmem #base_target_x #base_target_x d
set #point1 #base_target_x + #offcet1
readmem #point1 #point1 d
set #point2 #point1 + #offcet2
readmem #point2 #point2 d
set #point3 #point2 + #offcet3
readmem $target_x #point3 F
hint $target_x
end_while
// КОНЕЦ //
While 1
//log dec2hex (#baseadr)
set linedelay 50 //Для забывчивых
set #off1 0x4
set #baseadr 0x00179424
// Считываем базовый адрес и оффсеты HP выбранной цели
readmem #baseadr #baseadr d
set #point1 #baseadr + #off1
readmem $am_Y #point1 F
hint $am_Y
end_while
// КОНЕЦ //
вообще визуально косяков не вижу. Либо цепочка кривая либо при переносе из чит инжи в скрипт где-то ошибка. А чит инжи эту цепочку нормально считывает? Адреса совападют с тем, что пилот делает?
HP не float просто кусок кода скопировал )
Подскажите как прапвильно пользоваться log dec2hex (#baseadr) у меня так не выдает в лог в HEX
Все разобрался, спасибо. ) С адресами начудил
set $tmp dec2hex (#baseadr)
log $tmp
Столкнулся с другой проблемой,
вот код лога:
как правильно присвоить значение переменным, а то получается -1
readmem $x1(-1) $target_pos_x(0) F
readmem $y1(-1) $target_pos_y(0) F
readmem $x2(-1) $player_pos_x(244630,171875) F
readmem $y2(-1) $player_pos_y(-94823,984375) F
set $zero(0) 0
У меня вопрос к знатокам )
Есть мысль заставить бота подбирать не все подрят, а только предметы из списка, так вот вопрос, как то можно прочитать память в момент поднятия нужного предмета и в последующем поднимать уже используя write memory а не макрос pickup?
Я не представляю, как с помощью writemem можно инициоравать поднятие предмета. Ну очень глубоко теоретически догадываюсь, но как это применить к реалиям не знаю.
Можно попробовать наводить мышкой на лут, читать смотреть, что изменилось в памяти. Потом без наведения мышки можно будет подставлять необходимые значения, и посылать клик. Но не факт, что предмет определяется при наведении, а не после клика.
понятно, ладно спасибо, понял лиш, что это очень трудно реализовать )
проще фиш билетов купить)
всмысле? )))
Понятно! )) Умно ))
У меня сейчас проблема очередная, память читается из Dll процесса ,
К примеру : "Engine.dll"+00ADD81C получаем адрес на указатель , к которому прибавляем оффсет, который выведет нас на нужное значение, через PE tools можно расковырять* l2.bin и увидеть все Dll'ки процесса и их HEX адреса памяти, что нам позволяет в начале не использовать "Engine.dll"+00ADD81C а сразу приплюсовать два hex'a и получаем стартовый указатель, НО ловушка в чем, при перезагрузки (не всегда) hex адрес памяти Dll'ки может измениться, что уже обрывает правильность цепочки, но если б вы научили меня читать значение непосредственно из engine.dll к примеру эта проблема превратиться в Пух.
Я очень активно пинаю кнайта по этому поводу. Пока никак. Только отключать модульную адресацию и искать километровую цепочку указателей.
Если адреса длл имеют ограниченный набор, скажем 5 вариантов, то можно перебрать все 5 вариантов и найти рабочий на данный момент. Для этого необходимо будет найти некоторую последовательность в памяти, которая никогда не меняется в этой длл. Я бы посмотрел на самое начало дллки - вряд ли там что-то будет менятся. Сейчас еще раз чиркну кнайту.
Я нашел значение которое идет от другой DLL , она статична ) проблема устранена!
Но Кнайту лучше чернуть )))
Уважаемый Дарк, вопросик появился, нашел бота, который использует вот такие значения памяти:
Как, что это, и куда это?
Эскизы прикрепленных изображений
Это не значения адресов памяти, которые использует чит, а просто память процесса в чистом виде. Слева идут адреса начиная с первого байта и по порядку.
А как бот этим пользуется? И для чего это было сделано.
Откуда для начала вы это взяли?
Вы можете взять любой процесс, открыть память и увидеть примерно тоже самое.
Это не имеет ничего общего со списком адресов с какими-то данными. Это просто память процесса. Если хотите, то вы сейчас взяли книжку на неизвестном вам языке и читаете ее предисловие, а на какой-нибудь странице возможно есть и необходимая информация.
Друзья созрел вопрос, как можно получить статический адрес в игре на андроид эмуляторе, NoxAppPlayer или Bluestack к примеру, весь интернет перелопатил, стандартные методы не работают, может кто то направит на путь истенный, вопрос очень острый на мой взгляд, и многим будет интересно это, выручайте гуру!
Имхо, нереально.
Может есть какой то другой способ как обращаться к ячейки памяти, по array bite или еще что то, просто мне кажется должен быть какой то указатель на адрес, по крайней мере хочется в это верить...
Ничем я не обнадежу. Там очень большая матрешка завернутых друг в друга оболочек. Имхо теоретически это реально, но практически это найти невозможно. Там будет километровая цепочка указателей. Куча смещений. Не прочитаете вы напрямую память в нужном адресе. Точнее прочитать можно, но нужный адрес вы не найдете. Тут скорее нужно думать о чтении памяти прямо внутри эмулятора и каком-то экспорте во внешнюю систему.
в смысле в самом Андроиде?
Да.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)