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

Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пишем 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++:
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);
                }
            }
    }
 
Забаненный
Статус
Оффлайн
Регистрация
21 Авг 2018
Сообщения
157
Реакции[?]
71
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Чет не очень два раза учёт использовать для капсул, когда можно одним флагом обойтись
 
Сверху Снизу