Energy Reload
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пишем 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. Но можно через любой другой способ ограничивающий угол обзора.
А теперь весь код:
Для этого нам понадобится самые простые и элиментарные функции.
Для начало нам понадобится обзавестись переменными
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);
}
}
}