Рейтинг - 5.0 (2)

Сегодня мы будем бегать по адресам памяти, связанных со структурой актёра.

Всем привет! Наконец то вышел урок по динамичным адресам памяти. Он будет составляться с большим количеством частей и не один раз будут переписываться, так как я успел изучить немного, но этого уже достаточно, что бы внести свои коррективы в игровой процесс. Прежде всего создадим актёра "0@", который будет жертвой наших испытаний:

{$CLEO}
0000:

var
#WMYDRUG: model
0@: actor
end

:A
thread "A"
wait 0
#WMYDRUG.Load
038B: load_requested_models

:A_1
wait 0
if
#WMYDRUG.Available
jf @A_1
0@.Create(4, #WMYDRUG, 2493.6321, -1670.4906, 12.3359)
0@.Angle = 189.6409
#WMYDRUG.destroy

0A93: end_custom_thread

Создав актёра, нужно получить его структуру опкодом:

0A96: 1@ = actor 0@ struct
Здесь:
0@ - хендл актёра
1@ - в переменную будет записан адрес структуры. Именно от неё мы будем сдвигаться по памяти. По сути в переменную запишется огромное число

Основная часть сделана. Получив структуру, мы можем двигаться по памяти и читать нужные адреса. Для сдвига очень полезно использовать опкод:

0A8E: 1@ = 0@ + 5 // int

В переменную "1@" будет записана сумма двух целых чисел. Используя этот опкод, давайте получим адрес брони актёра:

0A96: 1@ = actor 0@ struct
0A8E: 2@ = 1@ + 0x548

Теперь в переменной "2@" будет находится адрес брони.

Здесь:
1@ + 0x548 - смещение от структуры ( см. смещения в Структуре актёра )
2@ - результат этого смещения. Именно результат можно читать и записывать

Адрес мы вычислили. Теперь нам нужно узнать размер результата в байтах. Как видим, тип у этого адреса - float, значит размер ( size ) записи будет составлять 4 байта и значение собственно будет дробным. Давайте запишем 25.0 по этому адресу. Затем считаем броню обычным опкодом и запишем результат в ini-файл, что бы проверить правильность адреса. В результате в нас должен выйти такой скрипт:

{$CLEO}
0000:

var
#WMYDRUG: model
0@: actor
end

:A
thread "A"
wait 0
#WMYDRUG.Load
038B: load_requested_models

:A_1
wait 0
if
#WMYDRUG.Available
jf @A_1
0@.Create(4, #WMYDRUG, 2493.6321, -1670.4906, 12.3359)
0@.Angle = 189.6409

0A96: 1@ = actor 0@ struct // получаем адрес структуры
0A8E: 2@ = 1@ + 0x548 // делам сдвиг по памяти
0A8C: write_memory 2@ size 4 value 25.0 virtual_protect 0 // запишем по адресу значение 25.0

04DD: 3@ = actor 0@ armour // считываем текущую броню актёра. До выполнения лазейки в память, броня актёра была равна 0.
0AF1: write_int 3@ to_ini_file "cleo\config.ini" section "SectionName" key "intKey" // запишем значение в ini-файл

0A93: end_custom_thread

Запускаем игру. После того, как увидели актёра, сворачиваем её и проверим, что адрес действительно правильный и в актёра стало 25 брони. Открываем созданный ini-файл и смотрим результат:

Выводы:

  • адрес правильный, запись была без ошибок;
  • в этом адресе принимаются дробные значения, хотя в опкодах это обозначено как целое число;

Вот и первая удачная лазейка помогла изменить свойства актёра без использования опкода. Используя базу данных вы можете провести свои тесты :) Естественно пока творить особо не над чем, так как пока эта база не полная, но со временем она будет обновляться и дописываться а так же выходить новые уроки по этой хитроумной памяти.


Теги: структура актёра, динамические адреса памяти, адреса памяти

Tom_Harison   (19.08.12 11:21)
хороший урок! с нетерпением жду 2 часть - про структуру автомобиля

Yurko_UA   (19.08.12 11:43)
Круто! Давай пиши про структуру автомобіля!

troll   (22.08.12 16:09)
а мжно
сделать так чтобы актер был бессмертен и убивал с первого удара? и чтобы он преследовал гг????

Yurko_UA   (22.08.12 20:17)
Чтобы игрок был бессмертен можно использовать опкод
Code
actor.SetImmunities($PLAYER_ACTOR,1,1,1,1,1)
- дает актеру имунитеты от огня, падения, взрывов, ударов, выстрелов.

FOXMAN   (29.10.12 17:49)
Можно маленький пример скрипта запуска без условий, без кнопок? Просто с самого начала игры что бы работало, можно? А то что то у меня не работает...
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какая GTA Вам понравилась больше всего?
Всего ответов: 7
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Реклама