> 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/00700/000200.md).

# Работа с массивами объектов

Модуль `CBulletTraces` описывает классы, отвечающие за следы пуль. В этой статье разберёмся, как работать с массивом следов пуль.

### **Подключение файлов**.

Для начала, подключаем хедер этого модуля:

```cpp
#include "CBulletTraces.h"
```

Теперь мы можем работать с классами `CBulletTrace` и `CBulletTraces`. Если мы заглянем в файл "CBulletTraces.h", то увидим, что класс "CBulletTraces" содержит в себе указатель на первый объект "CBulletTrace", а всего — 16 таких объектов. Обращение к какому-либо объекту из этого массива выглядит так:

```cpp
CBulletTraces::aTraces[0] // (или CBulletTraces::aTraces) - 1-ый элемент 
CBulletTraces::aTraces[5] // шестой элемент 
CBulletTraces::aTraces[9].m_dwCreationTime // время создания 10-го элемента 
CBulletTraces::aTraces[i].m_bExists // статус создания i-го элемента
```

Для удобства мы можем создать переменную, которая будет хранить указатель на нужный нам элемент:

```cpp
// теперь мы можем обращаться к i-ому элементу массива пулей через переменную trace
CBulletTrace *trace = CBulletTraces::aTraces[i]; 

// проверяем, существует ли эта пуля
if (trace->m_bExists)
```

В файле "CBulletTraces.h" присутствует переменная **MAX\_NUM\_BULLETTRACES** (по умолчанию равна 16). Рассмотрим 2 варианта перебора массива пулей.

#### 1. С использованием переменной-счётчика i.

```cpp
#include "plugin.h"
#include "CBulletTraces.h"

using namespace plugin;

class TestPlugin {
public:
    // Функция, которая выполняется при загрузке .asi-плагина.
    TestPlugin() {
        // Регистрируем нашу функцию
        Events::gameProcessEvent += [] {
            for (int i = 0; i < MAX_NUM_BULLETTRACES; i++) { // Перебираем 0-15 (MAX_NUM_BULLETTRACES = 16)
                // Если след пули существует и его радиус меньше 0,5
                if (CBulletTraces::aTraces[i].m_bExists && CBulletTraces::aTraces[i].m_fRadius < 0.5f) {
                    // Прибавляем 0,01 к радиусу
                    CBulletTraces::aTraces[i].m_fRadius += 0.01f;
                    // Если время существования следа пули меньше 3 мс - ставим в 3 мс.
                    if (CBulletTraces::aTraces[i].m_dwLifeTime < 3000)
                        CBulletTraces::aTraces[i].m_dwLifeTime = 3000;
                    // Если прозрачность меньше 255 - ставим в 255.
                    if (CBulletTraces::aTraces[i].m_nTransparency != 255)
                        CBulletTraces::aTraces[i].m_nTransparency = 255;
                }
            }
        };
    }
} test;
```

#### 2. С использованием в роли счётчика переменной **trace**

```cpp
#include "plugin.h"
#include "game_sa\CBulletTraces.h"

using namespace plugin;

class TestPlugin {
public:
    // Функция, которая выполняется при загрузке .asi-плагина.
    TestPlugin() {
        // Регистрируем нашу функцию
        Events::gameProcessEvent += [] {
            // Перебираем элементы массива, пока элемент не будет равен 17-ому (CBulletTraces::aTraces[MAX_NUM_BULLETTRACES])
            for (CBulletTrace *trace = CBulletTraces::aTraces; trace < &CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]; trace++) {
                // Если след пули существует и его радиус меньше 0,5
                if (trace->m_bExists && trace->m_fRadius < 0.5f) {
                    // Прибавляем 0,01 к радиусу
                    trace->m_fRadius += 0.01f;
                    // Если время существования следа пули меньше 3 мс - ставим в 3 мс.
                    if (trace->m_dwLifeTime < 3000)
                        trace->m_dwLifeTime = 3000;
                    // Если прозрачность меньше 255 - ставим в 255.
                    if (trace->m_nTransparency != 255)
                        trace->m_nTransparency = 255;
                }
            }
        };
    }
} test;
```

Второй вариант является более "компактным". Обратим внимание на запись

```cpp
CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]
```

Так мы получаем 17-ый элемент, который фактически не существует. Но с помощью такой записи мы можем определить, где находится последний элемент массива. Надо также отметить, что в C++ запись

```cpp
CBulletTraces::aTraces // без указания индекса
```

Равносильна записи

```cpp
CBulletTraces::aTraces[0] // индекс - 0, первый элемент массива
```

Автор: **DK22Pac**
