Работа с памятью игры, exe
|
|
Den_spb | Дата: Суббота, 23.04.2011, 00:23 | Сообщение # 166 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (d88) Так что мне с этим делать? Попробуй поэкспериментировать с другими видами оружия и названиями стилей - возможно, использование данной технологии имеет ограничения. Quote (d88) 1. Этот стиль становится не только у указанного оружия, но и вообще при отсутствии оружия Нужно проверять, имеется ли в данный момент у игрока оружие. Если нет, то следует вновь перезаписать значения, заменив их на стандартные. Quote (d88) 2. Этот стиль появляется у всех актёров, хотя у них нет этого оружия. Всё, что относится только к конкретному актёру, находится в личном блоке памяти этого актёра - его структуре (с транспортом и объектами - аналогично). Структура weapon.dat в игре одна, поэтому видимо она относится ко всем актёрам.
|
|
| |
d88 | Дата: Вторник, 03.05.2011, 17:58 | Сообщение # 167 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Den_spb, ну ты пойми, игрок держит это оружие и у него появляется этот стиль - это нормально, но что у других педов такой же стиль, хотя они вообще без оружия - вот в этом и глюк. Это здесь не поможет Quote (Den_spb) Нужно проверять, имеется ли в данный момент у игрока оружие. Если нет, то следует вновь перезаписать значения, заменив их на стандартные. Quote (Den_spb) Всё, что относится только к конкретному актёру, находится в личном блоке памяти этого актёра - его структуре (с транспортом и объектами - аналогично). Структура weapon.dat в игре одна, поэтому видимо она относится ко всем актёрам. Ведь если игрок держит нож, то все актёры же не начинают драться так, будто у них тоже нож. Добавлено (03.05.2011, 17:58) --------------------------------------------- Я решил свою проблему с +0x6E. Дело было в том, что я в коде 0A8C: write_memory 0@ size 1 value 10 virtual_protect 0 Вместо 1 поставил 4. Теперь такой вопрос. Я изменил флаг оружия - оружие в 2 руках 0@ = 8 0@ += 0 0@ *= 0x70 0@ += 0xC8AAB8 0@ += 0x18 0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 08BD: set 1@ bit 11 0A8C: write_memory 0@ size 4 value 1@ virtual_protect 0 01B2: give_actor $PLAYER_ACTOR weapon 8 ammo 1 // Load the weapon model before using this Как теперь сделать обратно, чтоб было в одной руке?
Сообщение отредактировал d88 - Суббота, 23.04.2011, 09:53 |
|
| |
Den_spb | Дата: Вторник, 03.05.2011, 19:50 | Сообщение # 168 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (d88) Как теперь сделать обратно, чтоб было в одной руке? Надо вернуть исходное значение соответствующего бита: 0@ = 8 0@ += 0 0@ *= 0x70 0@ += 0xC8AAB8 0@ += 0x18 0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 08C3: clear 1@ bit 11 0A8C: write_memory 0@ size 4 value 1@ virtual_protect 0 01B2: give_actor $PLAYER_ACTOR weapon 8 ammo 1 // Load the weapon model before using this Команда "set bit" записывает в указанный бит единицу, а "clear bit" - ноль (см. SB-справку, раздел Статьи - Работа с битами переменной)
|
|
| |
izerli | Дата: Четверг, 12.05.2011, 16:54 | Сообщение # 169 |
Группа: Проверенные
Сообщений: 90
Статус: Offline
| Den_spb, столкнулся с проблемой... ты не подскажешь как можно через игровую память изменить характеристики автомобился в handling.cfg? я что то не пойму...
|
|
| |
Den_spb | Дата: Пятница, 13.05.2011, 05:43 | Сообщение # 170 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Характеристики handling не относятся к конкретному транспортному средству - если поменять значение какого-то параметра, то изменения коснутся всех транспортных средств с данным handling-ID (одному handling-ID соответствует одна handling-структура). Получить указатель на handling-структуру для конкретного handling-ID можно одним из двух способов: Первый способ - по ID модели:Code 0441: 1@ = car 0@ model 1@ *= 4 1@ += 0xA9B0C8 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 //CModel 1@ += 0x4A 0A8D: 1@ = read_memory 1@ size 2 virtual_protect 0 //handlingIndex 1@ *= 224 1@ += 0xC2B9DC Второй способ - через структуру транспортного средства с данным handling-ID: Code 0A97: 2@ = car 0@ struct 2@ += 0x384 0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0 Получив указатель на handling-структуру, прибавляем к нему нужное смещение ( http://gtamodding.ru/wiki/Адреса_Памяти_ (SA)#Handling ), после чего читаем или пишем значение. Пример: в handling-структуре, относящейся к модели ID 400 (LANDSTAL), установим значение Z-координаты центра массы, равное 5.0: Code 1@ = 400 // ID 1@ *= 4 1@ += 0xA9B0C8 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 //CModel 1@ += 0x4A 0A8D: 1@ = read_memory 1@ size 2 virtual_protect 0 //handlingIndex 1@ *= 224 1@ += 0xC2B9DC 1@ += 0x1C // CentreOfMass.z 0A8C: write_memory 1@ size 4 value 5.0 virtual_protect 0 Размер чтения или записи памяти в опкодах 0A8C/0A8D зависит от типа данных: 1 - для "byte", 2 - для "word", 4 - для "dword" и для "float" (дробное число). Данные, относящиеся только к конкретному транспортному средству, находятся в "личном" блоке памяти этого транспортного средства - его структуре. Смещения для структур транспортных средств, указаны здесь: http://gtamodding.ru/wiki/Адреса_Памяти_ (SA)#.D0.9C.D0.B0.D1.88.D0.B8.D0.BD.D1.8B Пример: установим значение Z-координаты центра массы, равное 5.0, только на автомобиле с хэндлом 0@: Code 0A97: 1@ = car 0@ struct 1@ += 172 // CoM Z 0A8C: write_memory 1@ size 4 value 5.0 virtual_protect 0
|
|
| |
izerli | Дата: Пятница, 13.05.2011, 17:15 | Сообщение # 171 |
Группа: Проверенные
Сообщений: 90
Статус: Offline
| Денис, спасибо!
|
|
| |
DK22Pac | Дата: Воскресенье, 15.05.2011, 02:18 | Сообщение # 172 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Вопросы Есть ли разновидности опкода push в зависимости от того, какой параметр передается (1, 2, 4 байта)? Ещё хотелось бы узнать, как примерно игра создаёт тени (которые "падают" на обьекты с их неровностями) - есть какие либо идеи (интересует именно техническая сторона этого дела)? И ещё, как понимать код самой функции (например, та же addPermanentShadow) - это уже непосредственно команды движку игры?
|
|
| |
Vital | Дата: Воскресенье, 15.05.2011, 14:40 | Сообщение # 173 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| DK22Pac, насколько я знаю про тени, это 2d эффекты, про их создание я читал здесь. Как они будут себя вести, не знаю, пока не пробовал. К тому же на сайте не написано, можно ли цеплять такие эффекты к человеку, машине или объекту.
SCRIPTER
|
|
| |
Den_spb | Дата: Воскресенье, 15.05.2011, 17:21 | Сообщение # 174 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Есть ли разновидности опкода push в зависимости от того, какой параметр передается (1, 2, 4 байта)? Если передаётся число, то используется один из двух опкодов:Code asm push 2 push 31282 push 90000 end; Code 6A 02 68 32 7A 00 00 68 90 5F 01 00 Если передаётся значение регистра, то команда выбирается в зависимости от того, используется ли целый регистр, или только его часть (строение регистров см. в схеме, представленной здесь: http://ru.wikipedia.org/wiki/Регистр_процессора )Code asm push eax push ax end; Quote (DK22Pac) И ещё, как понимать код самой функции (например, та же addPermanentShadow) - это уже непосредственно команды движку игры? Не нашёл в базе такого имени. Какой это адрес? Quote (Vital) К тому же на сайте не написано, можно ли цеплять такие эффекты к человеку, машине или объекту. Короны цеплять можно, способ описан здесь: http://sannybuilder.com/forums/viewtopic.php?pid=14204#p14204 С проекциями оказалось сложнее, для них решение пока не найдено (обсуждение ведётся здесь: http://modsforgta.ucoz.ru/forum/5-22-1 )
|
|
| |
DK22Pac | Дата: Воскресенье, 15.05.2011, 17:41 | Сообщение # 175 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Т.е. 6A - когда 1 байт, и 68 - когда больше? addPermanentShadow = sub_707390 Я посмотрел код самой ф-ции, но не могу понять, что именно там происходит.
|
|
| |
Den_spb | Дата: Воскресенье, 15.05.2011, 18:02 | Сообщение # 176 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Т.е. 6A - когда 1 байт, и 68 - когда больше? Да. Quote (DK22Pac) И ещё, как понимать код самой функции (например, та же addPermanentShadow) - это уже непосредственно команды движку игры? Функций из этой процедуры никаких не вызывается, что видно по пустому списку Function calls, но "тупиковой" эта процедура скорей всего не является, т.к. она записывает значение по адресу word_C403DC, а оно, в свою очередь, читается другими процедурами (отобразить список ссылок на data-адрес, можно, вставив курсор между буквами названия адреса, и нажав X).
|
|
| |
DK22Pac | Дата: Суббота, 21.05.2011, 00:56 | Сообщение # 177 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Есть ли опкод на асме, который записывает значение ecx по адрессу? Как-то так Code mov dword_ptr [123456h], ecx Добавлено (21.05.2011, 00:56) --------------------------------------------- Ещё вопрос. Есть Надо перенести во скрипт. Переписывать дамп или arg_0 записывается в виде смещения?
|
|
| |
Den_spb | Дата: Суббота, 21.05.2011, 07:47 | Сообщение # 178 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Есть ли опкод на асме, который записывает значение ecx по адрессу? Как-то так Да, есть такой опкод. Перевести в hex можно с помощью Delphi:Code mov [$123456], ecx // в Delphi используется приставка $ вместо h 89 0D 56 34 12 00 // hex Quote (DK22Pac) Надо перенести во скрипт. Переписывать дамп или arg_0 записывается в виде смещения? В команду записывается смещение параметра arg_0 в структуре стека. Пример:Quote :.text:00408000 sub_408000 proc near .text:00408000 .text:00408000 arg_0 = dword ptr 8 .text:00408000 .text:00408000 000 push ebx .text:00408001 004 mov ebx, [esp+arg_0] Посмотрев на структуру стека или щёлкнув ПКМ по [esp+arg_0], видим, что смещение arg_0 равно 8. Т.е. команда должна выглядеть так: Quote mov ebx, [esp+8] // Asm 8B 5C 24 08 // Hex
|
|
| |
DK22Pac | Дата: Суббота, 21.05.2011, 11:25 | Сообщение # 179 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Вот скрипт, всё ли верно? Code {$CLEO .cs} //0AC6: 2@ = label @__asm offset 0A9F: 0@ = current_thread_pointer 0A8E: 1@ = 0@ + 0x10 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 0A8F: 2@ = 1@ - @__asm 0A8E: 3@ = 2@ + 2 // +2 байта //0AC7: 1@ = var 0@ offset 0A9F: 1@ = current_thread_pointer inc(1@, 0x3C) 0A8C: write_memory 3@ size 4 value 1@ virtual_protect 0 0A8C: write_memory 0x5F0140 size 1 value 0xE9 virtual_protect 1 // jmp 2@ -= 0x5F0145 // оффсет 0A8C: write_memory 0x5F0141 size 4 value 2@ virtual_protect 1 // __asm //0AC7: 1@ = var 2@ offset inc(1@, 8) while true wait 0 if 0@ <> 0 then 0AA6: call_method 0x5E4280 struct 0@ num_params 3 pop 0 1 6 1@ // getPedBonePosition 064B: 5@ = create_particle "headshot" at 2@ 3@ 4@ type 1 064C: make_particle 5@ visible_and_remove_references 0@ = 0 end end
:__asm hex 89 0D 00 00 00 00 // mov dword ptr ds:[0@], ecx 53 // push ebx 8B 5C 24 08 // mov ebx, [esp+arg_0] B8 45 01 5F 00 // mov eax, 005F0145h FF E0 // jmp eax end Команды с ebx - это то, что вылетело из процедуры CPed__removeBodyPart, куда я вписал "джамп" на асм-код (@__asm)
|
|
| |
sexy | Дата: Суббота, 21.05.2011, 17:01 | Сообщение # 180 |
Группа: Пользователи
Сообщений: 23
Статус: Offline
| А можно как то включать отключать сирену
|
|
| |