В новой версии SA Plugin SDK добавлен модуль CBulletTraces, который описывает классы, отвечающие за "следы пуль".
В этой статье разберёмся, как работать с этим массивом.
Подключение файлов
Для начала, подключаем хедер этого модуля.
Код
#include "game_sa\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_bExist - статус создания i-го элемента

Для удобства, мы можем создать переменную, которая будет хранить указатель на нужный нам элемент:
Код
CBulletTrace *trace = CBulletTraces::aTraces[i]; // теперь мы можем обращаться к i-ому элементу массива пулей через переменную trace
if(trace->m_bExist) // проверяем, существует ли эта пуля

В файле CBulletTraces.h присутствует константа MAX_BULLETTRACES, равна 16.
Код
Рассмотрим 2 варианта перебора массива пулей.
1-ый - с использованием переменной-счётчика i.
Код
#include <Windows.h>
#include "plugin\plugin.h"
#include "game_sa\CBulletTraces.h"

void OurTraces();

// Функция, которая выполняется при загрузке .asi-плагина.
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
{
  if(reason == DLL_PROCESS_ATTACH)
  {
  // Регистрируем наш плагин
  plugin::System::RegisterPlugin("Bullet Traces", "DK", "traces.asi", "1.0", 1, GAME_SA_1_0_US, 0);
  // Регистрируем нашу функцию, на этапе, когда мы можем вывести сообщение (FUNC_DRAWING)
  plugin::Core::RegisterFunc(FUNC_DRAWING, OurTraces);
  }
  return TRUE;
}

void OurTraces()
{
  for(int i = 0; i < MAX_BULLETTRACES; i++) // Перебираем 0-15 (MAX_BULLETTRACES = 16)
  {
  // Если след пули существует и его радиус меньше 0,5
  if(CBulletTraces::aTraces[i].m_bExist && CBulletTraces::aTraces[i].m_fRadius < 0.5)
  {
  // Прибавляем 0,01 к радиусу
  CBulletTraces::aTraces[i].m_fRadius += 0.01;
  // Если время существования следа пули меньше 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;
  }
  }
}

Второй - с использованием в роли счётчика переменной trace.
Код
#include <Windows.h>
#include "plugin\plugin.h"
#include "game_sa\CBulletTraces.h"

void OurTraces();

// Функция, которая выполняется при загрузке .asi-плагина.
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
{
  if(reason == DLL_PROCESS_ATTACH)
  {
  // Регистрируем наш плагин
  plugin::System::RegisterPlugin("Bullet Traces", "DK", "traces.asi", "1.0", 1, GAME_SA_1_0_US, 0);
  // Регистрируем нашу функцию, на этапе, когда мы можем вывести сообщение (FUNC_DRAWING)
  plugin::Core::RegisterFunc(FUNC_DRAWING, OurTraces);
  }
  return TRUE;
}

void OurTraces()
{
  // Перебираем элементы массива, пока элемент не будет равен 17-ому (CBulletTraces::aTraces[MAX_BULLETTRACES])
  for(CBulletTrace *trace = CBulletTraces::aTraces; trace < &CBulletTraces::aTraces[MAX_BULLETTRACES]; trace++)
  {
  // Если след пули существует и его радиус меньше 0,5
  if(trace->m_bExist && trace->m_fRadius < 0.5)
  {
  // Прибавляем 0,01 к радиусу
  trace->m_fRadius += 0.01;
  // Если время существования следа пули меньше 3 мс - ставим в 3 мс.
  if(trace->m_dwLifeTime < 3000)
  trace->m_dwLifeTime = 3000;
  // Если прозрачность меньше 255 - ставим в 255.
  if(trace->m_nTransparency != 255)
  trace->m_nTransparency = 255;
  }
  }
}

Второй вариант является более "компактным".
Обратим внимание на запись
Код
CBulletTraces::aTraces[MAX_BULLETTRACES]

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

Равносильна записи
Код
CBulletTraces::aTraces[0] // индекс - 0, первый элемент массива


KiLLeR96   (29.09.13 22:42)
Что данный плагин делает?

DK22Pac   (29.09.13 22:43)
KiLLeR96, в комментариях же написано.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Что скажете о GTA V?
Всего ответов: 51
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама