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

[Статья] Teleport / «Blink» Teleport


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

Данная статья расскажет вам о создании чит-опции под названием «„Blink“ Teleport», которая позволяет телепортировать игрока в указанную точку, используя для её выбора какой-то объект (прицел, курсор, или что-то иное, что может указать место для телепортации). Этот чит является разновидностью всеми известной опции «Teleport» и его создание практически ничем от него не отличается, за исключением нескольких моментов.

Примеры скриптов телепорта на форуме есть, а вот статьи на русском языке нету. Поэтому, сначала нужно рассказать о нём.

Часть 1: «Teleport»

Данный чит предназначен для быстрого перемещения игрового объекта (игрока) по заранее сохранённым или известным координатам. К примеру, вы взяли у НПС квест, который выполняется в другой части карты. Долго-долго шли, выполнили его и теперь нужно снова долго-долго возвращаться обратно для его сдачи. Чтобы сократить время бесполезного перемещения, умными геймхакерами была придумана опция «Teleport». Мы сохраняем координаты нахождения игрока около НПС и когда нужно, мы изменяем текущие координаты игрока на сохранённые, тем самым мгновенно перемещается к НПС.

Стоит заметить, что данная опция предназначена для перемещения персонажа в игровом пространстве в играх с открытым миром или в пределах одного игрового уровня.

Я не стану описывать трехмерную систему координат или строение игровых уровней. Для создания этих опций, как ни странно, знать это совершенно не обязательно (Но не ленитесь, поищите в гугле, там много информации на эту тему и это знание будет полезным). Нужно просто уметь находить хотя бы одну из координат. Все дальнейшие действия (в 99% случаев) сводятся к тому, что вы будете просто изменять инструкцию, её адрес, смещения и регистры в готовом шаблоне скрипта.

Первой игрой для примера будет Tomb Rider 2013.

Для начала нам нужно найти одну из координат игрока. Какую именно искать – решать вам. Лично я советую искать координату по оси Z (т.е. высоту), т.к. в большинстве игр, если мы спускаемся вниз, то значение координаты по оси Z уменьшается, если поднимаемся, то увеличивается. В случае же с X и Y, мы первоначально не знаем расположение игрока, относительно направления этих осей, поэтому мы можем идти вперёд и искать увеличивающееся значение, а на самом деле мы идём назад и значение координаты уменьшается.

Итак, мы запустили игру и нашли подходящее место, где мы можем спускаться и подниматься.

1.png

Ищем «Неизвестное значение» (Float), спускаемся и отсеиваем «Уменьшилось», поднимаемся и отсеиваем «Увеличилось» и так до тех пор, пока не найдем нужный нам адрес.

Часто бывает так, что у нас остаётся много адресов, которые уменьшаются и увеличиваются вместе с нужным нам адресом или вообще имеют такое же значение. Что и произошло в данной игре.

Добавляем их всех в таблицу, какую-то часть замораживаем и пытаемся прыгнуть в игре, если нам удалось это сделать, то это не те адреса. Размораживаем и удаляем их. И так, пока не найдем нужный адрес.

2.png

Мы нашли адрес со значением координаты по оси Z. «02С7С7D8» (у вас он будет другим).

Теперь ставим на него «Брейкпоинт на Доступ», всплывает много инструкций.

3.png

Нам нужно выбрать подходящую инструкцию и убедиться, что она работает только с координатами игрока.

Я выбрал «011E5D24 – 8B 50 08 – mov edx,[eax+08]». Нажимаем на неё правой кнопкой мыши и во всплывшем меню выбираем «Проверить адресам, к которым получают доступ выбранные инструкции (макс. 8)»

Появляется окно.

4.png

В нём отображается только 1 адрес, наш адрес. Отлично! (Желательно делать подобную проверку рядом с другими динамическими объектами – противниками, автомобилями и т.д. просто я первоначально знал, что данная инструкция верна)

Теперь можно выделить этот адрес и нажать комбинацию клавиш «Ctrl+R» и там скопировать адрес напротив нужного регистра или вернуться в предыдущее окно, выделить нашу инструкцию и нажать на кнопку «Доп. Информация»

5.png

Копируем адрес после «Предполагаемое значение указателя:». У меня это 02C7C7D0, и он является началом структуры, в которой расположены координаты игрока.

Переходим в «Анализ данных/структур» и исследуем найденную структуру, содержащую координаты игрока

Практически всегда все 3 координаты по осям X,Y,Z находятся рядом друг с другом.

Отыскиваем уже найденную Z

6.png

Добавляем в таблицу адреса находящиеся рядом с Z, замораживаем их по очереди и смотрим, можем ли мы перемещаться в какую-либо сторону, если нет, значит мы нашли ещё какую-то из координат.

Отлично, адреса по смещению 0, 4, 8 и есть адреса с нашими координатами.

7.png

Переходим к написанию скрипта.

Скрытый текст

[ENABLE]
aobscanmodule(_loadAOB,TombRaider.exe,8b50088b400ce9xxxxxxxx8bxx8bxxxx8bxxxxxxxxb9xxxxxxxxe8xxxxxxxx85)
alloc(MyCheat,2048)
label(_loadRet)
label(_loadOrg)
label(coordX)
label(coordY)
label(coordZ)
label(_save)
label(_load)
label(_saveCoords)
label(_loadCoords)
registersymbol(_saveCoords)
registersymbol(_loadCoords)
registersymbol(_loadAOB)
MyCheat:
_save:
cmp [_saveCoords],1 //Если _saveCoords = 1, то будет выполняться код сохранения координат
jne short _load //Если _saveCoords не равно 1, то будет выполнен переход на _load, где находится код загрузки координат
push ecx //помещаем ecx в стек
mov ecx,[eax] //помещаем в ecx значение регистра eax (т.е. текущее значение адреса с координатой X. Записываем его как [eax], т.к.
//в структуре, которую мы исследовали, смещение этого адреса равнялась 0, т.е. [eax+0], что тоже самое).
mov [coordX],ecx //помещаем значение регистра ecx, в coordX (Тут и будет сохраняться значение координаты X)
//Далее всё тоже самое, только для Y и Z.
mov ecx,[eax+4]
mov [coordY],ecx
mov ecx,[eax+8]
mov [coordZ],ecx
pop ecx //убираем ecx из стека.
mov [_saveCoords],0 //изменяем значение флага на 0, чтобы сохранение координат больше не происходило.
jmp _loadOrg //Переход на выполнение оригинального кода
_load: //данный код будет выполняться, только если значение флага _saveCoords не равно 1
//Т.е. будет выполняться
// cmp [_saveCoords],1
// jne short _load
//а затем код ниже
cmp [coordX],0 //защита от дурака. Делаем её по любой из координат. Т.к. адреса coordX, coordY и coordZ первоначально имеют значение 0.
//Без этой проверки, если кто-то вначале не сохранит координаты, но произведет их загрузку, то он телепортнётся по координатам x=0, y=0,z=0
je short _loadOrg //если coordX=0, то выполняем оригинальный код
cmp [_loadCoords],1 //Если _loadCoords = 1, то будет выполняться код сохранения координат
jne short _loadOrg //Если _loadCoords не равно 1, то будет выполнен переход на оригинальный код
push ecx //снова помещаем ecx в стек
mov ecx,[coordX] //Помещаем сохранённое в coordX значение координаты по оси X в регистр ecx
mov [eax],ecx //и уже из регистра ecx помещаем значение в eax, т.е. заменяем текущие координаты игрока на сохраненные
//далее всё тоже самое
mov ecx,[coordY]
mov [eax+4],ecx
mov ecx,[coordZ]
mov [eax+8],ecx
pop ecx
mov [_loadCoords],0 //изменяем значение флага на 0, чтобы загрузка координат больше не происходила.
_loadOrg: //оригинальный код
mov edx,[eax+08]
mov eax,[eax+0C]
jmp _loadRet
//Тут будут располагаться наши метки и флаги
coordX:
dd 0
coordY:
dd 0
coordZ:
dd 0
_saveCoords:
dd 0
_loadCoords:
dd 0
_loadAOB: //"TombRaider.exe"+2E5D24:
jmp _save
db 90
_loadRet:
[DISABLE]
_loadAOB:
mov edx,[eax+08]
mov eax,[eax+0C]
unregistersymbol(_saveCoords)
unregistersymbol(_loadCoords)
unregistersymbol(_loadAOB)
dealloc(MyCheat)

 

 

Мы написали скрипт, добавили его в таблицу. Теперь туда же нужно добавить флаги «_saveCoords» и «_loadCoords»

8.png

И когда нам нужно сохранить или загрузить координаты, мы просто меняем значение одного из этих адресов на 1 (можно вручную, а можно установить Хоткей).

Вот, в принципе, и всё. Это самый простой скрипт телепорта, его можно сделать и более навороченным, но наша главная цель – «„Blink“ Teleport», для которого этого будет достаточно.

Часть 2: «„Blink“ Teleport»

А что, если нам нужно переместиться в место, где мы ещё не были?

В опции «Teleport» мы сначала сохраняли координаты нашего объекта, а уже потом заменяли его текущие координаты на сохранённые. А вот в «„Blink“ Teleport» всё тоже самое, только мы заменяем текущие координаты нашего объекта на текущие координаты другого объекта.

А какой объект, помимо игрока, мы ещё можем перемещать? Прицелом!

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

Координаты этого «вон туда» мы и должны попытаться найти.

Опять вам нужно начать поиск «Неизвестного значения», изменять расположение прицела и отсеивать «Увеличилось»/«Уменьшилось». Можно встать у ровной стены и, перемещая прицел вверх/вниз, искать координату по оси Z, как в случае с игроком, но я стал искать координату по оси Y, т.к. можно поставить прицел как можно ближе к ногам игрока, текущие координаты которого нам известны, и начать с поиска «Диапазона», что значительно уменьшит число ложных адресов. Далее можно продолжать отсеивать «Увеличилось»/«Уменьшилось». В общем, любым удобным методом находим одну из координат прицела.

9.png

Далее, повторяя те же действия, что мы делали в первой части статьи, мы находим инструкцию, начало структуры и смещение адресов с координатами в ней.

10.png

11.png

12.png

И изменяем наш скрипт телепорта

Скрытый текст

[ENABLE]
aobscanmodule(_loadAOB,TombRaider.exe,8b50088b400ce9xxxxxxxx8bxx8bxxxx8bxxxxxxxxb9xxxxxxxxe8xxxxxxxx85)
aobscanmodule(_saveAOB,TombRaider.exe,8983f40a000089xxxxxxxxxx89xxxxxxxxxx8bxxxxxxxxxxxxxxxxxx33xxe8)
alloc(MyCheat,2048)
label(_loadRet)
label(_loadOrg)
label(coordX)
label(coordY)
label(coordZ)
label(_save)
label(_load)
label(_loadCoords)
registersymbol(_loadCoords)
registersymbol(_loadAOB)
label(_saveRet)
registersymbol(_saveAOB)
MyCheat:
_save: //сохранение координат прицела
push ecx
mov ecx,[ebx+AF0]
mov [coordX],ecx
mov ecx,[ebx+AF4]
mov [coordY],ecx
mov ecx,[ebx+AF8]
mov [coordZ],ecx
pop ecx
mov [ebx+00000AF4],eax
jmp _saveRet
_load: //загрузка координат прицела
cmp [_loadCoords],1
jne short _loadOrg
cmp [coordX],0
je short _loadOrg
push ecx
mov ecx,[coordX]
mov [eax],ecx
mov ecx,[coordY]
mov [eax+4],ecx
mov ecx,[coordZ]
mov [eax+8],ecx
pop ecx
mov [_loadCoords],0
_loadOrg:
mov edx,[eax+08]
mov eax,[eax+0C]
jmp _loadRet
coordX:
dd 0
coordY:
dd 0
coordZ:
dd 0
_saveCoords:
dd 0
_loadCoords:
dd 0
_loadAOB: //"TombRaider.exe"+2E5D24: //координаты игрока
jmp _load
db 90
_loadRet:
_saveAOB: //"TombRaider.exe"+5225E3: //координаты прицела
jmp _save
db 90
_saveRet:
[DISABLE]
_loadAOB:
mov edx,[eax+08]
mov eax,[eax+0C]
_saveAOB:
mov [ebx+00000AF4],eax
unregistersymbol(_loadAOB)
unregistersymbol(_loadCoords)
unregistersymbol(_saveAOB)
dealloc(MyCheat)

 

 

В нём всё тоже самое, только скрипт уже работает с двумя разными инструкциями.

В «_save:» теперь происходит сохранение не координат игрока, а прицела. Флаг «_saveCoords» уже нам не нужен (Но его можно поставить, если вы хотите данный телепорт не сразу). В «_load:» всё осталось без изменений.

Активируем скрипт, прицеливаемся в выбранную точку, меняем значение флага «_loadCoords» на 1 и вуаля.

Но не всегда бывает всё так гладко с нахождением координат.

К примеру возьмём игру «Санитары Подземелий» (1 и 2 части).

Получать координаты для телепортации мы будем из курсора, точнее из зелёного кружочка, который указывает конечную точку перемещения Хартмана.

13.png

Если мы расположим его в том же месте, где стоит Хартман, то увидим, что координаты по оси X и Y равны, а вот по Z отличаются

(координаты курсора)

14.png

(координаты игрока)

15.png

Высота расположения курсора ниже на 3, чем у Хартмана.

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

Следовательно в скрипте пришлось делать небольшую поправку, а именно уменьшать значение координаты курсора по оси Z на 3

Скрытый текст

….
_save: //сохранение координат курсора
push ecx
mov ecx,[ebx+94]
mov [coordX],ecx
mov ecx,[ebx+98]
mov [coordY],ecx
mov ecx,[ebx+a9]
mov [coordZ],ecx
pop ecx
mov eax,[ebx+94]
jmp _saveRet
_load: //загрузка координат курсора
cmp [_loadCoords],1
jne short _loadOrg
push ecx
mov ecx,[coordX]
mov [esi+254],ecx
mov ecx,[coordY]
mov [esi+258],ecx
mov ecx,[coordZ] //Помещаем координат курсора по оси Z в регистр ecx
sub ecx,(float)3 //Вычитаем из него 3 (float)
mov [esi+260],ecx //Остаток помещаем в адрес с текущими координатами игрока по оси Z
pop ecx
mov [_loadCoords],0
_loadOrg:
movss xmm1,[esi+254]
jmp _loadRet
…

 

Это лишний раз говорит о том, что не всегда может быть точно так же, как и в статье.

Стоит так же отметить, что сейчас существует много игр с якобы открытым миром, где при обычном прохождении ничего не замечаешь, а на самом деле там всё строго заскриптовано. И, если перепрыгнуть заскриптованную сцену при помощи данного чита, то могут появиться различные глюки, вплоть до невозможности пройти дальше.

Удачи!

© SER[G]ANT 2013

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

К статье, тоже самое Lua + AA (пустое окно формы, связка с хоткеями) :

Надеюсь работает, т.к. не проверял

Tomb Rider 2013

- VK_K - сохранить позицию

- VK_M - сохранить позицию пересечения луча из камеры с поверхностью коллизии

- VK_L - загрузить позицию


gameProcessName = "TombRaider.exe"

cheatTeleport_storyPosX = 0.0
cheatTeleport_storyPosY = 0.0
cheatTeleport_storyPosz = 0.0

function CheatTeleport_OnStartTrainer()
autoassemble(
[[
aobscanmodule(_SignTeleport,TombRaider.exe, 8b50088b400ce9xxxxxxxx8bxx8bxxxx8bxxxxxxxxb9xxxxxxxxe8xxxxxxxx85)
aobscanmodule(_SignHitRayCamera,TombRaider.exe,8983f40a000089xxxxxxxxxx89xxxxxxxxxx8bxxxxxxxxxxxxxxxxxx33xxe8)

alloc(_MemorySavePointerHeroPosition,2048)

label(_BackSignTeleport)
label(_pVector3HeroPosition)
registersymbol(_pVector3HeroPosition)

label(_BackSignHitRayCamera)
label(_pVector3HitPointRayPosition)
registersymbol(_pVector3HitPointRayPosition)


_MemorySavePointerHeroPosition:
mov [_pVector3HeroPosition], eax
mov edx,[eax+08]
mov eax,[eax+0C]
jmp _BackSignTeleport

_MemoryHitRayCamera:
push eax
lea eax, [ebx+00000AF4]
mov [_pVector3HitPointRayPosition],eax
pop eax
mov [ebx+00000AF4],eax
jmp _BackSignHitRayCamera
_pVector3HeroPosition:
dd ffffffff

_pVector3HitPointRayPosition:
dd ffffffff

_SignTeleport: //"TombRaider.exe"+2E5D24:
jmp _MemorySavePointerHeroPosition
db 90
_BackSignTeleport:

_SignHitRayCamera: //"TombRaider.exe"+5225E3:
jmp _MemoryHitRayCamera
db 90
_BackSignHitRayCamera:
]])
end

function CheatTeleport_SavePosition()
writeFloat(getAddress('_pVector3HeroPosition'), cheatTeleport_storyPosX)
writeFloat(getAddress('_pVector3HeroPosition+4'), cheatTeleport_storyPosY)
writeFloat(getAddress('_pVector3HeroPosition+8'), cheatTeleport_storyPosZ)
end

function CheatTeleport_LoadPosition()
cheatTeleport_storyPosX = readFloat(getAddress('_pVector3HeroPosition'))
cheatTeleport_storyPosY = readFloat(getAddress('_pVector3HeroPosition+4'))
cheatTeleport_storyPosZ = readFloat(getAddress('_pVector3HeroPosition+8'))
end

function CheatTeleport_SaveHitRayPosition()
cheatTeleport_storyPosX = readFloat(getAddress('_pVector3HitPointRayPosition'))
cheatTeleport_storyPosY = readFloat(getAddress('_pVector3HitPointRayPosition+4'))
cheatTeleport_storyPosZ = readFloat(getAddress('_pVector3HitPointRayPosition+8'))
end

function OnCheckHotkeys()
if isKeyPressed(VK_K) then
CheatTeleport_SavePosition()
return
end
if isKeyPressed(VK_L) then
CheatTeleport_LoadPosition()
return
end

if isKeyPressed(VK_M) then
CheatTeleport_SaveHitRayPosition()
return
end
end

function onOpenProcess(processid)
CheatTeleport_OnStartTrainer()

hotKeyTimer = createTimer(trainerForm)
timer_setInterval(hotKeyTimer, 100)
timer_onTimer(hotKeyTimer, OnCheckHotkeys)
end

function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)
autoAttachList = getAutoAttachList()
stringlist_add(autoAttachList, gameProcessName)

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

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

кому то нрав видео записывать а кто то пишет письменно ))) тяжко понять ((( ну а так спасибо давно ждал )

вопрос а если такая карта thumb.png то как сделать телепорт по такой карте ??

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

А в чём разница? То, что в статье совсем другие картинки? В различных играх уровень здоровья отображается по разному, разве от этого что-то кардинально меняется?

Статья даёт лишь базовые знания и не может ответить на все ваши вопросы и ситуации, которые вы встретите. Вы рассматриваете её как 100% шаблон, и если что-то отличается - всё, безвыходная ситуация! Но, судя по вашему последнему ответу, вы даже и не пытались попробовать.

Если не учитывать, что на скриншотте сетевая игра (это же просто, как пример), то я не вижу ничего сложного в создании телепорта для человека, умеющего просто посидеть и подумать. (в игре, где это вообще возможно реализовать)

Задайте себе вопросы:

Координаты на глобальной карте и в игровом мире отличаются, если да, то как?

Как или чем можно узнать координаты нужного вам места для телепорта?

Если это не открытый мир, то как в игре происходит смена игровых уровней?

Ваш эльф (или кто это там) управляет курсором на глобальной карте или наоборот?

И т.д. и т.п.

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

  • 2 недели спустя...

Во многих играх у маркера на карте нет координаты высоты Z. В GTA 4-5 она равна единице, в Assassin's Creed нулю. Есть способы победить баг\вычислить эту высоту? т.е. телепортить игрока, а потом быстренько поставить его на землю тем или иным способом. В той же GTA игра сама ставит игрока на землю после небольшого полёта в вакууме, а в AC игрок умирает((

В общем, я исходил из предположения что игра где-то хранит координату уровня земли. Идея бредовая, но с асассин кридом прокатила вроде как. Искал координату высоты, равную координате высоты игрока если он стоит на земле. А если карабкается по стене, то этот адрес не меняется, пока он не долезет до крыши. Нашёлся всего один адрес :) Написал скрипт телепорта, заменив Z на найденный адрес, вроде работает!

Надо на других играх проверить этот способ...

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

  • 9 месяцев спустя...

Я сейчас уже и не вспомню.

Возможно я перезапускал игру, возможно Cheat Engine так решил (модульные адреса я копирую из CE, а не высчитываю их), может в Sеeam вышло обновление. Правда, я сейчас точно не вспомню. В любом случае, я использовал AOBScan. Не придирайтесь особо к этому, но всё равно спасибо за замечание.

 

Вы хотите сделать телепорт по уже известным координатам. Вам просто нужно переделать или просто удалить первую часть скрипта и вписывать в coordX,coordY,coordZ уже известные. Можно луа скриптом, можно обычным скриптом, как вам будет удобней.

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

Нет, возможно это я не совсем корректно выразился. Лучше было написать "не обращайте особого внимания".Словом  "придираться" у меня и в мыслях не было как-то нагрубить

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

  • 4 недели спустя...

 

что не так с этим скриптом аоб правильный ну и т д а игра просто вылетает что делать

[ENABLE]alloc(cheatByteCodeZ,2048)label(returnhereZ)aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)label(aob_scanZ)registersymbol(aob_scanZ)label(QWordValueZ)registersymbol(QWordValueZ)label(QWordValue)registersymbol(QWordValue)//########################################cheatByteCodeZ:fld qword ptr [eax+18]fstp qword ptr [edi+18]push eaxfld [QWordValueZ] // подгрузил, возможно вытолкнул что нужное стека...fcomp qword ptr [edi+08]fnstsw axtest ah,0x41jne returnhereZ// fld [QWordValueZ] // уже загружалfcomp qword ptr [edi+10]fnstsw axtest ah,0x41jne returnhereZfld qword ptr [QWordValue]fstp qword ptr [edi+08]fld qword ptr [QWordValue]fstp qword ptr [edi+10]returnhereZ:fstp [QWordValueZ] // подгрузил, но оставил невыгруженным.pop eaxret //*****************возврат к месту вызова//****************объявить переменные можно в конце страницы cheatByteCodeZQWordValueZ:dq (double)10000QWordValue:dq (double)10//########################################//*****************инжект вызова процедуры cheatByteCodeZaob_scanZ:call cheatByteCodeZnop//########################################[DISABLE]//****************возвращаем как былоaob_scanZ:fld qword ptr [eax+18]fstp qword ptr [edi+18]//****************стираем все что создавалиunregistersymbol(aob_scanZ)unregistersymbol(QWordValueZ)unregistersymbol(QWordValue)dealloc(cheatByteCodeZ)
Ссылка на комментарий
Поделиться на другие сайты

Ты телепорт что-ли делаешь?

Где тут сравнение структур это раз?

Очень интересная у тебя логика это два.

Где сохраняешь и выгружаешь данные координат это три?

Где дополнительные переменные на сохранение и загрузку, это четыре?

Пятое ты что-то намутил со смещениями у тебя [edi+08] и [edi+10], а в оригинале [edi+18].

Ну и 6 скажи что за игра, может кто-то уже ломал и давно решение проблемы есть.

 

Я тебе вкратце логику телепорта подскажу(на двумерной игре как у тебя). 

 

И так по пунктам.

 

0) программа СЕ или любой другой сканер памяти, свежая голова, время и терпение :-)

1) для начала ищешь координаты (высота, ширина)

2) ставишь брейкпоинт(брейк) на доступ(ИМЕННО НА ДОСТУП)

3) смотришь какие инструкции все время обращаються к адресу

4) вибираешь инструкцию которая работала бы только с твоим героем(ну это везение), а если такой нет делаешь фильтр (примеры 1, 2, 3), ну или используешь поинтеры (работать будет скорее всего на конкретной версии игры и ее сборке) как искать поинтер, как использовать поинтер, ну и мой пример в таблице к игре darksiders

5) далее логика скрипта должна быть следующей:

 

   а) все метки оставляй как есть

   б) дальше добавляй метки для координат(их 2, так-как игра 2мерная), метки для включения сохранения и загрузки координат, метки сохранения и загрузки координат, регистрация (дерегистрация в конце скрипта) символов, а именно для координат и для включения сохранения и загрузки координат.

   в) ОБЯЗАТЕЛЬНО должна быть ОРИГИНАЛЬНАЯ инструкция!!!

   г) далее должна быть проверка включили ли мы сохранить или нет, если да, то сохраняем и прыжок на ОРИГИНАЛЬНУЮ ИНСТРУКЦИЮ

   д) далее должна быть проверка включили ли мы загрузить или нет, если да, то загружаем и прыжок на ОРИГИНАЛЬНУЮ ИНСТРУКЦИЮ

   е) далее, если мы ничего не хотим сохранять/загружать прыжок на ОРИГИНАЛЬНУЮ ИНСТРУКЦИЮ

 

7) если все сделали правильно, то проверяем и радуемся жизни  :-D

 

P.S.: если работаешь с типом дабл(double), а qword ptr не помогает, то надо разделить этот тип на 2 типа по 4 байта(как это сделать думай сам, я забыл как делать)

Ну на этом все. Удачи тебе.

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

это скрипт тигры не мой.Я думал он всё сделал правильно но нет.Игра ил 2 штурмовик версия 4.12.2m вот сомневаюсь что кто то там телепорт делал, первый трейнер и то я написал а в инете нигде нет.

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

  • 2 месяца спустя...

Удачи!

© SER[G]ANT 2013

Ну во-первых за статью - Спасибо!

 

С первой частью успешно справился - стандартный "Телепорт" для Fallout 3 (над которой я сейчас измываюсь) работает на ура.

 

Решил попробовать написать телепорт по прицелу, но координаты прицела находятся, как мне показалось, всего в полутора метрах от координат ГГ и смысла в написании такого скрипта нет.

 

Но скорее всего или я не правильно ищу координаты прицела, или для данной игры нужно вместо прицела использовать что-то другое.

 

Подскажите как для данной игры написать второй вариант "Телепорта".

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

garik66 я же тебе давал линк на свою таблицу к игре Darksiders. Там есть реализация(рабочая) на блинк телепорт. Что тебе стоит скачать игру и посмотреть на реализацию? Множество ответов есть в моей таблице и создавал я ее именно для того чтоб по ней все было понятно. Вряд ли кто здесь скажет что тебе конкретно надо делать в игре Fallout 3.

Тебе дают алгоритм и по нему смотри как себя ведет игра. В каждой игре есть свои ньюансы и эти ньюансы ты должен найти и использовать.

 

И приступим к твоему вопросу:

 

Решил попробовать написать телепорт по прицелу, но координаты прицела находятся, как мне показалось, всего в полутора метрах от координат ГГ и смысла в написании такого скрипта нет.

 

Но скорее всего или я не правильно ищу координаты прицела, или для данной игры нужно вместо прицела использовать что-то другое.

 

В полутора метрах так и должно быть! Прицел не всегда должен показывать конкретное значение координаты игрока. И смысл в написании скрипта тоже есть. Напиши скрипт и затести его. Можешь смело использовать способ, который есть реализован у меня(я буду только рад, если у тебя все получиться).

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

garik66 я же тебе давал линк на свою таблицу к игре Darksiders. 

Для меня в твоём посте оказалось ноль информативности.

Скачал я твою таблицу, посмотрел скрипт «„Blink“ Teleport» примерно такой-же как и у SER(G)ANTа (думаю как и у остальных).

 

У меня в данном случае проблема не в том чтобы написать скрипт (с этим я справлюсь), а в нахождении адресов координат прицела.

То что я находил, это были какие-то координаты, которые меняются незначительно, если смещать прицел, поэтому и написал, а есть ли смысл писать данный скрипт, если координаты так близки. 

 

Но думаю я ошибаюсь в поиске и то что я находил - это не координаты прицела.

 

А вот как искать именно координаты прицела я пока не понял.

Делал так:

Начинал поиск также, как писал SER(G)ANT, т.е. ставил прицел прямо к ногам ГГ и искал диапазон (по координате X или Y в данном случае не важно), чтобы сразу снизить количество адресов. Потом удалял (приближал) прицел и отсеивал увеличилось (уменьшилось). Но оставалось всё равно довольно много адресов (от 30 до 100) и какой из них отвечает за прицел не понятно. Заморозка адресов никчему не приводила (т.е. прицел свободно двигался - я не в курсе должен ли он перестать двигаться, если я найду например координату X прицела и заморожу её).

Так что, если есть более точный способ нахождения координат прицела - опиши его. А готовый скрипт мне ничего нового не даст.

 

 И смысл в написании скрипта тоже есть. Напиши скрипт и затести его. 

Скрипт не писал, потому что нет уверенности, что это координаты прицела.

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

Что-то вы тут интересное делаете) Тоже наверно поковыряю) Блинк, да? Опыт перемещения Лары Крофт в задницу к оленям есть, так что должно и тут получиться) Fallout 3 или потом ещё и New Vegas модить собираетесь?

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

Скрипт не писал, потому что нет уверенности, что это координаты прицела.

 

Для начала координаты игрока находятся по адресам

[Fallout3.exe+C7A104]+2C - X-координата[Fallout3.exe+C7A104]+30 - Y-координата[Fallout3.exe+C7A104]+34 - Z-координата 

А чуть ранее, то что видимо и было найдено("маленькие числа") - это углы поворота игрока в радианах

[Fallout3.exe+C7A104]+20 - поворот по оси X (от -1.553343058 до 1.553343058) смотрим вверх/вниз[Fallout3.exe+C7A104]+28 - поворот по оси Z (от 0 до 6.282012463) влево/вправо, 0 на севере далее по часовой стрелке
Ссылка на комментарий
Поделиться на другие сайты

 

Для начала координаты игрока находятся по адресам

А чуть ранее, то что видимо и было найдено("маленькие числа") - это углы поворота игрока в радианах

Всё таки просьба, если читаете сообщения и участвуете в обсуждении, то читайте пжлста внимательнее:

Во-первых: координаты ГГ я давно нашёл и написал даже скрипт "Телепорт" (если интересно см. обсуждение здесь  и скрипт здесь) .

Во-вторых: то что ты нашёл - это не координаты ГГ. А что-то другое. 

И повторюсь, мне нужно найти координаты прицела, как их найти не понимаю до конца. Вот если подскажешь способ нахождения координат прицела - буду премного благодарен.

PS: почему это не координаты ГГ, попробуй "заморозь" их и увидишь.

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

И повторюсь, мне нужно найти координаты прицела, как их найти не понимаю до конца. Вот если подскажешь способ нахождения координат прицела - буду премного благодарен.

PS: почему это не координаты ГГ, попробуй "заморозь" их и увидишь.

 

Да, ты прав. Три координаты оказались временным хранилищем, они показывают правильные координаты, но не определяют положение ГГ, так как при заморозке он всё равно бегает.

 

Но остальные два значения - углы поворота при заморозке не дают повернуться. В Tomb Raider координаты прицела находились просто: нашёл float, прицелился, отсеял по больше/меньше/не_изменилось/изменилось, и т.д. Находилось за несколько отсевов. Но здесь просто засада. Если хорошо с математикой можно вычислять место куда переместиться исходя из углов поворота и координат игрока. Правда остаётся одно но - на какое расстояние прыгать, сделаешь много - можешь провалиться под землю или застрять в камне.

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

Решил ещё раз попробовать «„Blink“ Teleport» поискать координаты прицела.

 

Делал на этот раз так:

Вышел на улицу из дома, взял пистолет на всякий случай, выбрал два дома. Подошёл героем к стене 1 дома и записал координату X ГГ (-253.22), подошёл вплотную к стене второго дома и опять записал координату X ГГ (-150,59). Встал посередине и поворачиваясь на 180 градусов указывал то на одну стену, то на вторую - искал тип Float диапазон, навсякий случай брал с запасом (от - 270, до - 230) и отсеивал (от -170 до -130). Делал это предполагая, что пуля должна попасть в стену.

 

Но всё равно  так ничего и не нашёл. Подскажите пжлста правильный   способ нахождения координаты прицела.

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

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

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

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