> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00500/00096.-igrovaya-pamyat.-dinamicheskie-adresa-struktura-weapon.dat.md).

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

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

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

Далее нам необходимо сместится по структуре. Для этого нам нужно узнать номер оружия, по которому будет идти редактирование а также навык владения этим оружием. Для примера, давайте возьмём АК47 и увеличим количество патронов в обойме с 30 до 400. Номер смотрим в справке или в нашей [базе данных](https://github.com/wmysterio/scm-scripting-lessons/blob/main/dir/gta_sa/oruzhie_v_gta_san_andreas/1-1-0-14/README.md). Как видим, номер АК47 - 30. Запомним его. Потом нам необходимо уточнить в каком навыке мы будем делать изменения. Есть 4 навыка владения оружием и каждый имеет свой номер. Вот таблица навыков и их номера:

| Номер | Навык                                |
| ----- | ------------------------------------ |
| 0     | Низкий ( начальный )                 |
| 25    | Нормальный ( уровень профессионала ) |
| 36    | Высокий ( уровень киллера )          |
| 47    | Для копов                            |

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

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

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

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

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

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

Теперь к этой переменной мы прибавляем саму характеристику. Посмотреть некоторые характеристики вы можете в [базе данных](https://github.com/wmysterio/scm-scripting-lessons/blob/main/dir/gta_sa/dinamicheskie_adresa_pamjati_struktura_weapon_dat/1-1-0-33/README.md). Так, как мы собираемся изменять максимальное количество патронов в обойме, то размер смещения будет равен 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
```

Результат:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/04978583.png)

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

```
`\||igrovaja_pamjat_dinamicheskie_adresa_struktura_weapon_dat|1504429497
```
