00096. Игровая память. Динамические адреса (структура weapon.dat)

Игровая память. Динамические адреса (структура weapon.dat)|Начинаем первый в этом году урок, который посвящен игровой памяти. Сегодня мы рассмотрим структуру weapon.dat и будем учится вычислять адреса характеристик оружия.|wmysterio|wmysterio||||Здравствуйте, уважаемые пользователи нашего сайта! Что бы вычислить, нужно сделать небольшие вычисления. Первым делом считываем адрес начала структуры:

0@ = 0xC8AAB8 // адрес начала структуры (это число 13150904)

Далее нам необходимо сместится по структуре. Для этого нам нужно узнать номер оружия, по которому будет идти редактирование а также навык владения этим оружием. Для примера, давайте возьмём АК47 и увеличим количество патронов в обойме с 30 до 400. Номер смотрим в справке или в нашей базе данных. Как видим, номер АК47 - 30. Запомним его. Потом нам необходимо уточнить в каком навыке мы будем делать изменения. Есть 4 навыка владения оружием и каждый имеет свой номер. Вот таблица навыков и их номера:

Думаю, в игре Вы видели, что при стрельбе с оружия на экране появлялись текст-боксы с сообщениями типа: "Ваш навык стрельбы повышен. Теперь вы можете стрелять точнее, дальше и т.п.". Вот об этом навыке и идёт речь. Допустим мы задали уровень владения навыка для СЖ на максимум ( высокий ). Запоминаем номер этого навыка и запишем в переменные эти номера:

1@ = 30 // номер оружия
2@ = 36 // навык владения

Значения этих переменный нам нужно сложить. Это нужно для того, что бы двигаться по структуре, каждая из которых равна 0x70 байт ( 112 байт ):

0A8E: 3@ = 1@ + 2@ // ( int )
3@ *= 0x70 // определяем размер смещения

Далее нам необходимо сделать смещение от начала структуры:

005A: 0@ += 3@ // ( int )

Теперь к этой переменной мы прибавляем саму характеристику. Посмотреть некоторые характеристики вы можете в базе данных. Так, как мы собираемся изменять максимальное количество патронов в обойме, то размер смещения будет равен 32:

0@ += 32 // получить характеристику

Всё! Адрес вычислен! Теперь только поменяем значения на нужные:

0A8C: write_memory 0@ size 2 value 600 virtual_protect 0

Теперь в обойме будет 600 патронов :) Давайте напишем скрипт, который будет делать вычисления:

{$CLEO}
0000:
0627: change_stat 77 to 9999.0
model.Load(#AK47)
038B: load_requested_models

while not model.Available(#AK47)
wait 0
end

0@ = 0xC8AAB8 
1@ = 30
2@ = 36
0A8E: 3@ = 1@ + 2@ // ( int )
3@ *= 112 // 0x70
005A: 0@ += 3@ // ( int )
0@ += 32

0A8C: write_memory 0@ size 2 value 600 virtual_protect 0
01B2: give_actor $PLAYER_ACTOR weapon 30 ammo 1500
model.Destroy(#AK47)
0A93: end_custom_thread

Результат:

Однако, не нужно забывать, что вы редактируете не текущее оружие, которые будет держать/держит СЖ. Эти характеристики будут влиять на использование и других актёров.|2116|1|0|04978583png148`114

`\||igrovaja_pamjat_dinamicheskie_adresa_struktura_weapon_dat|1504429497

Last updated