Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Исходник Пишем aim на капсулы.

  • Автор темы Автор темы Dimedrol
  • Дата начала Дата начала
Energy Reload
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции
330
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пишем aim на капсулы.
Для этого нам понадобится самые простые и элиментарные функции.

Для начало нам понадобится обзавестись переменными
AABB bBox;
Vec3 check_capsule;

Потом определить имя
strstr(pEntity->GetName(), "_capsule")

Получить данные структуры
pEntity->GetWorldBoundsCenter(bBox);

Сделаем проверку на валидность данных
if (bBox.max == ZERO ) return;
if (bBox.GetCenter== ZERO ) return;

Сделаем перекрестную проверку на видимость двух элиментов: bBox.max и bBox.GetCenter
!isVisible(CamPos, bBox.max) && isVisible(CamPos, bBox.GetCenter())
Что из себя предстовляет GetCenter
GetCenter - это центр куба AABB.
max - это вершина угла.
Капсула это элимент карты, имеющая свой куб, центр куба покрыт текстурой капсулы, поэтому не виден и при уничтожении капсулы (текстуры), её куб остается существовать. В этом и вся проблема.
Когда текстура капсулы разрушается, центр куба становится видим.
Для того, что-бы видеть вершину куба капсулы используем bBox.max.

Весь принцип визибла: видим вершину куба (bBox.max), но не видим центр куба (bBox.GetCenter), значит капсула в нашей видимости и мы можем по ней открыть огонь. После её уничтожения, нам открывается видимость её центра. В итоге, если видим вершину угла и центр, AIM не срабатывает.

Для позиции будет использовать центр куба (bBox.GetCenter).

Бывает такое, что куб отображается на земле, и AIM целится в него. Для этого будем использовать обзор в 180 градусов, через WorldToScreen. Но можно через любой другой способ ограничивающий угол обзора.

А теперь весь код:
C++:
Expand Collapse Copy
if (strstr(pEntity->GetName(), "_capsule"))
    {
        AABB1 bBox;
        Vec3 check_capsule;
        pEntity->GetWorldBoundsCenter(bBox);
        if (bBox.max ==  ZERO ) return;
        if (bBox.GetCenter() ==  ZERO ) return;
         if (!isVisible(CamPos, bBox.max) && isVisible(CamPos, bBox.GetCenter()))
            {
             if (WorldToScreen(bBox.max, check_capsule))
                {
                    //Targen is bBox.GetCenter
                    Box3D(pEntity, REDWOOD);
                }
            }
    }
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Чет не очень два раза учёт использовать для капсул, когда можно одним флагом обойтись
 
Назад
Сверху Снизу