Четверг, 28.03.2024, 17:53
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с памятью игры, exe
Работа с памятью игры, 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;
Code
50
66 50

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)
---------------------------------------------
Ещё вопрос. Есть

Code
mov     ebx, [esp+arg_0]

Надо перенести во скрипт. Переписывать дамп или 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
А можно как то включать отключать сирену
 
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с памятью игры, exe
Поиск: