Уроки моддинга
Основной раздел
Search
K
Links

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

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

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

Для начала, подключаем хедер этого модуля:
#include "CBulletTraces.h"
Теперь мы можем работать с классами CBulletTrace и CBulletTraces. Если мы заглянем в файл "CBulletTraces.h" - увидим, что класс "CBulletTraces" содержит в себе указатель на первый объект "CBulletTrace", а всего таких объектов: 16. Обращение к какому-либо объекту из этого массива выглядит так:
CBulletTraces::aTraces[0] (или CBulletTraces::aTraces) - 1ый элемент
CBulletTraces::aTraces[5] - шестой элемент
CBulletTraces::aTraces[9].m_dwCreationTime - время создания 10-го элемента
CBulletTraces::aTraces[i].m_bExists - статус создания i-го элемента
Для удобства, мы можем создать переменную, которая будет хранить указатель на нужный нам элемент:
CBulletTrace *trace = CBulletTraces::aTraces[i]; // теперь мы можем обращаться к i-ому элементу массива пулей через переменную trace
if (trace->m_bExists) // проверяем, существует ли эта пуля
В файле "CBulletTraces.h" присутствует переменная MAX_NUM_BULLETTRACES (по умолчанию равна 16). Рассмотрим 2 варианта перебора массива пулей.
1-ый - с использованием переменной-счётчика i.
#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;
Второй - с использованием в роли счётчика переменной trace.
#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;
Второй вариант является более "компактным". Обратим внимание на запись
CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]
Так мы получаем 17-ый элемент, который фактически не существует. Но с помощью такой записи мы можем определить, где находится последний элемент массива. Надо также отметить, что в C++ запись
CBulletTraces::aTraces // без указания индекса
Равносильна записи
CBulletTraces::aTraces[0] // индекс - 0, первый элемент массива
Автор: DK22Pac