Перейти к содержанию

Пишу телепорт, переменные не записывают координаты.


Рекомендуемые сообщения

Пока не получается с решением задачи из этой темы, решил отвлечься и написать что-то более знакомое - телепорт.

Но видать опять парюсь.

Нашёл координаты ГГ (X, Y, Z). При ручном изменении значений координат - происходит нормальный телепорт.

 

Написал скрипт:

 

Проблема: в переменные coordX17, coordY17, coordZ17 записывается только первый байт из четырёх значения координаты.

Причём в edx находятся правильные значение координат (проверял ставя бряк).

Подскажите - где я парюсь? (где ошибка?). 

[ENABLE]alloc(newMem17, 1024)label(returnHere17)label(coordX17)label(coordY17)label(coordZ17)label(OK17)label(Load17)label(SaveLoadCoords17)registersymbol(SaveLoadCoords17)newMem17:cmp eax,18F4A0                    // инструкция работает с несколькими адресами, поэтому фильтр.  //cmp byte ptr [esi+014f],14      // можно поставить и этот (вроде бы при нескольких перезагрузках    jne OK17                          // игры, оба варианта фильтра - постоянны).  cmp byte ptr [SaveLoadCoords17],1jne Load17push edxmov edx, dword ptr [esi+000000D0]mov dword ptr [coordX17],edxmov edx,dword ptr [esi+000000D4]mov dword ptr [coordY17],edxmov edx, dword ptr [esi+000000D8]mov dword ptr [coordZ17],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp OK17Load17:cmp [coordX17],0je OK17cmp byte ptr [SaveLoadCoords17],2jne OK17push edxmov edx, dword ptr [coordX17]mov dword ptr [esi+000000D0],edxmov edx, dword ptr [coordY17]mov dword ptr [esi+000000D4],edxmov edx,dword ptr [coordZ17]mov dword ptr [esi+000000D8],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp returnHere17OK17:fstp dword ptr [esi+000000D8]jmp returnHere17coordX17:dd 0coordY17:dd 0coordZ17:dd 0SaveLoadCoords17: // Добавим в таблицу адрес с адресом "SaveLoadCoords17" иdb 0              // названием "0 - ничего, 1 - сохранить координаты,                  // 2 - телепортироваться"Fallout3.exe+50DDC4:jmp newMem17nopreturnHere17:[DISABLE]Fallout3.exe+50DDC4:fstp dword ptr [esi+000000D8]unregistersymbol(SaveLoadCoords17)dealloc(newMem17) 
Ссылка на комментарий
Поделиться на другие сайты

Даа. Что тут сказать? Замутил ты логику выполнения очень странно. Но так как ты сделал выглядит короче чем у меня. 

 

Вроде у тебя логика правильная и скрипт должен работать. Но мне кажется что ошибка твоя здесь:

 

mov byte ptr [saveLoadCoords17],0


jmp returnHere17 <-- вот она ошибка

а надо так сделать
jmp OK17

 

Как делать телепорт здесь есть несколько постов(в том числе и мой), где все объяснено очень детально. Я делал телепорт к игре Darksiders 1 так там 3 телепорта в 1 скрипте. Вот линк на мою таблицу с телепортом. Еще читай мой пост № 16 здесь.

 

P.S.: никак не могу сделать урок о том как находить ID предмета в игре. Моя Camtasia Studio говорит что места у меня на харде нет, а у меня его аж 80 ГБ свободного места(что очень много как на 30 минутное видео!!!). Хочу тебе помочь с поиском ID.

 

P.P.S.: как у тебя идет поиск ID предмета? 

Ссылка на комментарий
Поделиться на другие сайты

Даа. Что тут сказать? Замутил ты логику выполнения очень странно. Но так как ты сделал выглядит короче чем у меня. 

 

Вроде у тебя логика правильная и скрипт должен работать. Но мне кажется что ошибка твоя здесь:

 

mov byte ptr [saveLoadCoords17],0

jmp returnHere17 <-- вот она ошибка

а надо так сделать

jmp OK17

 

Как делать телепорт здесь есть несколько постов(в том числе и мой), где все объяснено очень детально. Я делал телепорт к игре Darksiders 1 так там 3 телепорта в 1 скрипте. Вот линк на мою таблицу с телепортом. Еще читай мой пост № 16 здесь.

 

P.S.: никак не могу сделать урок о том как находить ID предмета в игре. Моя Camtasia Studio говорит что места у меня на харде нет, а у меня его аж 80 ГБ свободного места(что очень много как на 30 минутное видео!!!). Хочу тебе помочь с поиском ID.

 

P.P.S.: как у тебя идет поиск ID предмета? 

С поиском ID пока встрял и устал уже от этих поисков, поэтому решил отвлечься (собственно это повтор первого поста).

 

В этом месте:

ошибки нет. Да и логика выполнения скрипта тоже нормальная, после проверки хотел (хочу) добавить ещё несколько функций в скрипт, ну например при значении SaveLoadCoords17 = 3 - телепортировать ГГ назад на место  первого телепорта. Там много можно что придумать.

 

Объясню - у меня не работает первая часть скрипта, а именно сохранение координат.

В начале после написание скрипта (тогда я фильтры не ставил, так как сидел в доме ГГ, а в доме с этой инструкцией работает только адрес координаты и ещё один адрес (очень редко)), так вот без фильтров в доме ГГ скрипт работал правильно, т.е. в переменные прописывались правильно координаты и ГГ телепортировался при запуске второй части скрипта. 

 

После этого решил проверить как будет работать телепорт на мировой карте и обнаружил, что с инструкцией работает куча адресов (близких по смыслу, т.е. те же кооординаты с небольшим смещением чуть-чуть дальше, чуть-чуть ближе , что за адреса не изучал. Но их много. Поэтому поискал фильтр и после установки фильтра в переменные записывается только первый байт (float) значения координаты. В чём дело никак не могу понять. А статьёй при написании телепорта пользуюсь   - статьёй SER(G)ANTа (Вот этой) - прекрасная статья. Твои статьи тоже почитаю - большое спасибо.

 

Жаль, что не получается записать видео по нахождению ID предмета с помощью отсеивания по формуле. Посмотри пожалуйста почему у меня прекращается отсев по формуле (чаще всего)(Проблемы описал в этом сообщении). . Как можно настроить Артмани, чтобы более стабильно работало. Заранее Большой Спасыб.

mov byte ptr [SaveLoadCoords17],0jmp returnHere17 <-- вот она ошибка 
Ссылка на комментарий
Поделиться на другие сайты

Пока не получается с решением задачи из этой темы, решил отвлечься и написать что-то более знакомое - телепорт.

Но видать опять парюсь.

Нашёл координаты ГГ (X, Y, Z). При ручном изменении значений координат - происходит нормальный телепорт.

 

Написал скрипт:

 

Проблема: в переменные coordX17, coordY17, coordZ17 записывается только первый байт из четырёх значения координаты.

Причём в edx находятся правильные значение координат (проверял ставя бряк).

Подскажите - где я парюсь? (где ошибка?). 

 

У тебя по лейблу db - это байт. Попробуй dd. Скрипт целиком не смотрел. Внимательнее проанализирую - укажу ошибку, но это будет завтра.

[ENABLE]alloc(newMem17, 1024)label(returnHere17)label(coordX17)label(coordY17)label(coordZ17)label(OK17)label(Load17)label(SaveLoadCoords17)registersymbol(SaveLoadCoords17)newMem17:cmp eax,18F4A0                    // инструкция работает с несколькими адресами, поэтому фильтр.  //cmp byte ptr [esi+014f],14      // можно поставить и этот (вроде бы при нескольких перезагрузках    jne OK17                          // игры, оба варианта фильтра - постоянны).  cmp byte ptr [SaveLoadCoords17],1jne Load17push edxmov edx, dword ptr [esi+000000D0]mov dword ptr [coordX17],edxmov edx,dword ptr [esi+000000D4]mov dword ptr [coordY17],edxmov edx, dword ptr [esi+000000D8]mov dword ptr [coordZ17],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp OK17Load17:cmp [coordX17],0je OK17cmp byte ptr [SaveLoadCoords17],2jne OK17push edxmov edx, dword ptr [coordX17]mov dword ptr [esi+000000D0],edxmov edx, dword ptr [coordY17]mov dword ptr [esi+000000D4],edxmov edx,dword ptr [coordZ17]mov dword ptr [esi+000000D8],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp returnHere17OK17:fstp dword ptr [esi+000000D8]jmp returnHere17coordX17:dd 0coordY17:dd 0coordZ17:dd 0SaveLoadCoords17: // Добавим в таблицу адрес с адресом "SaveLoadCoords17" иdb 0              // названием "0 - ничего, 1 - сохранить координаты,                  // 2 - телепортироваться"Fallout3.exe+50DDC4:jmp newMem17nopreturnHere17:[DISABLE]Fallout3.exe+50DDC4:fstp dword ptr [esi+000000D8]unregistersymbol(SaveLoadCoords17)dealloc(newMem17) 
Ссылка на комментарий
Поделиться на другие сайты

Ребята проблема точно не в db(Define Byte) dd(Define Double word). Скорее всего фильтр неправильный. У меня когда-то тоже такое было.

 

Если garik66 у тебя тип переменной SaveLoadCoords17 НЕ БАЙТ, то смени тип и посмотри что будет. Но мое мнение это неправильный фильтр. Ты сам говорил, что если игрок один в комнате, то все нормально и есть SAVE/LOAD ОК, а когда идешь на карту, то уже проблемы.

Ссылка на комментарий
Поделиться на другие сайты

Ребята проблема точно не в db(Define Byte) dd(Define Double word). Скорее всего фильтр неправильный. У меня когда-то тоже такое было.

 

Если garik66 у тебя тип переменной SaveLoadCoords17 НЕ БАЙТ, то смени тип и посмотри что будет. Но мое мнение это неправильный фильтр. Ты сам говорил, что если игрок один в комнате, то все нормально и есть SAVE/LOAD ОК, а когда идешь на карту, то уже проблемы.

Если было бы так всё просто (было бы здорово, нашёл бы другой фильтр и усё).

 

Фильтр (а вернее оба фильтра, посмотри код) к сожалению оба правильные - об этом писал в первом посте. Посмотри эту строчку - "Причём в edx находятся правильные значение координат (проверял ставя бряк)." и посмотри первую часть кода:

Из этого видно, что до edx мы бы не добрались, если бы фильтр был неправилен.

Как происходит в игре при включённом скрипте, присваиваем  SaveLoadCoords17 - значение 1, затем подпрыгиваем героем на месте (т.к. выбранная инструкция именно по координате Z, собственно как практически во всех вариантах написанных телепортов на форуме). После этого делая шаги (после бряка) по коду видно, как в EDX - загружается координата (и она верная сверял значение в EDX с текущей координатой героя), но вот в переменную зараза пишется только первый байт из четырёх.  Например значение Z координаты в доме ГГ на 2 этаже равно (float) 1101,73 (или по байтно - 51 B7 89 44), так вот в этом случае в переменную coordZ17 записывается 51 (и значение становиться 81).

Так что тут мне нужно напрячь мозг и понять почему это происходит.

newMem17:cmp eax,18F4A0                    // инструкция работает с несколькими адресами, поэтому фильтр.  //cmp byte ptr [esi+014f],14      // можно поставить и этот (вроде бы при нескольких перезагрузках    jne OK17                          // игры, оба варианта фильтра - постоянны).  cmp byte ptr [SaveLoadCoords17],1jne Load17push edxmov edx, dword ptr [esi+000000D0]mov dword ptr [coordX17],edxmov edx,dword ptr [esi+000000D4]mov dword ptr [coordY17],edxmov edx, dword ptr [esi+000000D8]mov dword ptr [coordZ17],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp OK17 
Ссылка на комментарий
Поделиться на другие сайты

Перемести fstp dword ptr [esi+000000D8] в самый вверх под метку, чтобы было так

 

...newMem17: fstp dword ptr [esi+000000D8]
Пробовал и такой вариант, код полностью, без косметической обработки выглядит так:

 

Как видно пробовал и этот вариант и другие инструкции использовать, но сегодня добью. Если работает вручную, то должен и работать программно.

Перемести fstp dword ptr [esi+000000D8] в самый вверх под метку, чтобы было так

 

...newMem17: fstp dword ptr [esi+000000D8]
Проблема оказалось именно в этом, видимо когда использовал этот вариант раньше, ошибка в скрипте была в другом и телепорт не работал. Сейчас чуть-чуть подправил скрипт, удалил лишнюю OK17 метку, проставил правильные условные и безусловные прыжки и всё заработало. Попрыгал в доме ГГ и в Мегатонне (к дому от атомной бомбы и наоборот) - работает.

 

Чуть-чуть доработаю скрипт, добавлю опцию (может пару) и выложу в своей теме.

 

MasterGH - благодарю!!! :excl:  :rolleyes:

PS: Для меня оказалось новостью, что Дом и мировая карта - это разные локации (координаты сильно отличаются) и с улицы по координатам дома внутрь дома попасть нельзя.

Готовый скрипт выложил в этом сообщении.

[ENABLE]alloc(newMem17, 2048)label(returnHere17)label(coordX17)label(coordY17)label(coordZ17)label(OK17)label(Load17)label(SaveLoadCoords17)registersymbol(SaveLoadCoords17)newMem17://fstp dword ptr [esi+000000D8] // вот этот вариант//cmp eax,18F4A0//cmp ebx,18F4E0 // меняется//cmp edi,18F4A0 // меняется//cmp ebp,18F468 // меняется//cmp esp,18F38C // меняется//cmp byte ptr [esi+014f],14//jne OK17cmp byte ptr [SaveLoadCoords17],1jne Load17push edxmov edx, dword ptr [esi+000000D0]mov dword ptr [coordX17],edxmov edx,dword ptr [esi+000000D4]mov dword ptr [coordY17],edxmov edx, dword ptr [esi+000000D8]mov dword ptr [coordZ17],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp OK17Load17:cmp [coordX17],0je OK17cmp byte ptr [SaveLoadCoords17],2jne OK17push edxmov edx, dword ptr [coordX17]mov dword ptr [esi+000000D0],edxmov edx, dword ptr [coordY17]mov dword ptr [esi+000000D4],edxmov edx,dword ptr [coordZ17]mov dword ptr [esi+000000D8],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp returnHere17//jmp OK17OK17:fstp dword ptr [esi+000000D8]jmp returnHere17coordX17:dd 0coordY17:dd 0coordZ17:dd 0SaveLoadCoords17: // Добавим в таблицу адрес с адресом "SaveLoadCoords17" иdb 0              // названием "0 - ничего, 1 - сохранить координаты,                  // 2 - телепортироваться"//Fallout3.exe+5D9B09://Fallout3.exe+5D9B20://Fallout3.exe+50DDB1:Fallout3.exe+50DDC4:jmp newMem17nopreturnHere17:[DISABLE]//Fallout3.exe+5D9B09://Fallout3.exe+5D9B20://Fallout3.exe+50DDB1:Fallout3.exe+50DDC4:fstp dword ptr [esi+000000D8]unregistersymbol(SaveLoadCoords17)dealloc(newMem17) 
Ссылка на комментарий
Поделиться на другие сайты

Да еще одно вспомнил. У меня была проблемма с телепортом по прицелу. Стандартно я видел такую запись

 

coordinateX:

dd 0

coordinateY:

dd 0

coordinateZ:

dd 0

 

а потом проверка:

 


je originalcode
cmp [coordinateY],0
je originalcode
cmp [coordinateZ],0
je originalcode
ну и здесь загрузка координат(код загрузки)

cmp [coordinateX],0

 

Но это не совсем верный вариант, потому как координата (0,0,0) это вполне реальная координата и у меня лично был такой опыт когда она была в игре и телепорт срабатывал неверно. 

 

Так-вот решение этой проблеммы было очень простое, как для меня. Надо было сделать следующее:

 

coordinateX:

dd FFFFFF00

coordinateY:

dd FFFFFF00

coordinateZ:

dd FFFFFF00

 

а потом проверка:

 


je originalcode
cmp [coordinateY],FFFFFF00
je originalcode
cmp [coordinateZ],FFFFFF00
je originalcode
ну и здесь загрузка координат(код загрузки)

cmp [coordinateX],FFFFFF00

 

И все заработало на ура. В чем суть такой подмены? Суть в том что игры настроены на определенный диапазон значений в адресе. Все думают приблизительно так что игра воспринимает ВЕСЬ диапазон значений типа float от 00000000 до FFFFFFFF, но это не так. И шанс того что вы попадете на значение FFFFFF00 в адресе координаты = 0.

Ссылка на комментарий
Поделиться на другие сайты

Привет Всем, помагите пожалуйста с телепортом на игру Silent Hunter 4, хочу сделать телепорт по карте, кординаты подводной лодки я нашол x,y,z, не могу найти кординаты

на карте, искал не мог найти правильные кординаты на карте, может поможит кто ни буть с поиском, скрипт я написать смогу.

Изменено пользователем Baracuda
Ссылка на комментарий
Поделиться на другие сайты

Попробуй поиск по формуле программой Артмани Про. В одной из соседних тем рассматривается такой поиск ID предмета, и где-то на форуме есть тема, в которой видео по поиску координат в эмуляторе с помощью поиска по формуле. Думаю, разберешься. Если нет - скажешь, поможем.

Ссылка на комментарий
Поделиться на другие сайты

Если ты про этот урок,

я дажи пытаться не буду искать по формуле, на мучался я сдругими играми спасибо но нет. Было время, когда я потратил на это много времени, без толку все. Изменено пользователем Baracuda
Ссылка на комментарий
Поделиться на другие сайты

Тоже пробовал искать по формуле, но у меня к сожалению по формуле отсев зависает, так что бросил идею юзать Артемона.

Ссылка на комментарий
Поделиться на другие сайты

Ну че ребята, кто ни буть поможит найти кординаты на карте, в Silent Hunter 4 или кто ни буть, искал скажите как искать, что искать что бы нйти правильные кординаты.

Ссылка на комментарий
Поделиться на другие сайты

Ничего себе...

 

И где же учат писать скрипты такой... неведомой длинны?

[ENABLE]alloc(newMem17, 1024)label(returnHere17)label(coordX17)label(coordY17)label(coordZ17)label(OK17)label(Load17)label(SaveLoadCoords17)registersymbol(SaveLoadCoords17)newMem17:cmp eax,18F4A0                    // инструкция работает с несколькими адресами, поэтому фильтр.  //cmp byte ptr [esi+014f],14      // можно поставить и этот (вроде бы при нескольких перезагрузках    jne OK17                          // игры, оба варианта фильтра - постоянны).  cmp byte ptr [SaveLoadCoords17],1jne Load17push edxmov edx, dword ptr [esi+000000D0]mov dword ptr [coordX17],edxmov edx,dword ptr [esi+000000D4]mov dword ptr [coordY17],edxmov edx, dword ptr [esi+000000D8]mov dword ptr [coordZ17],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp OK17Load17:cmp [coordX17],0je OK17cmp byte ptr [SaveLoadCoords17],2jne OK17push edxmov edx, dword ptr [coordX17]mov dword ptr [esi+000000D0],edxmov edx, dword ptr [coordY17]mov dword ptr [esi+000000D4],edxmov edx,dword ptr [coordZ17]mov dword ptr [esi+000000D8],edxpop edxmov byte ptr [SaveLoadCoords17],0jmp returnHere17OK17:fstp dword ptr [esi+000000D8]jmp returnHere17coordX17:dd 0coordY17:dd 0coordZ17:dd 0SaveLoadCoords17: // Добавим в таблицу адрес с адресом "SaveLoadCoords17" иdb 0              // названием "0 - ничего, 1 - сохранить координаты,                  // 2 - телепортироваться"Fallout3.exe+50DDC4:jmp newMem17nopreturnHere17:[DISABLE]Fallout3.exe+50DDC4:fstp dword ptr [esi+000000D8]unregistersymbol(SaveLoadCoords17)dealloc(newMem17) 
Ссылка на комментарий
Поделиться на другие сайты

Ничего себе...

[

 

И где же учат писать скрипты такой... неведомой длинны?

RockHamer заканчивай пжлста с флудом (тем более не в своих темах). А ещё копируешь не рабочий код.

Я же дал ссылку на законченный написанный (полностью рабочий скрипт) ещё в #9 посте, ну ладно повторю скрипт в этом посте..

Просто я хочу, чтобы в каждой, созданной мною теме, было приведено решение и чтобы новичок - незря читал тему.  

Ссылка на комментарий
Поделиться на другие сайты

С блинком-телепортом решил не париться - пусть живёт.

 

Хотя нашёл очень похожие координаты - X и Y впритык к герою Z - на 6 единиц выше координат ГГ. Если ГГ подпрыгнуть, то и изменяется эта Z координата, если ГГ стоять, а прицелом вверх/вниз, то эта координата Z - меняется, а Z ГГ остаётся не изменной, но вот с X и Y нету такой закономерности в 90 % случаях - это координаты ГГ.

 

Решил заменить Блинк-телепорт скриптом Псевдо-полёта. Скрипт здесь. 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.