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

Модуль `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**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00700/000200.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
