[WF - RU] Health Arm Box

Безопасный и надёжный обменник криптовалют на наличные — Insight
Сообщения
423
Реакции
198
[HIDE500]
void HealthArmBox(IActor*Player, IEntity* pEnt, float HP, float Ar)
{
DWORD color=GREEN;
Vec3 ScreenPos1, ScreenPos2;

//Выходим на класс костей
ICharacterInstance* GetCharacter = pEnt->GetCharacter(0);
if (!GetCharacter)return;

ISkeletonPose* m_pSkeleton = GetCharacter->GetISkeletonPose();
if (!m_pSkeleton)return;

//Получаем матрицу кости, головы
Matrix34 Head = pEnt->GetProjectedWorldBBox()*Matrix34(m_pSkeleton->GetAbsJointByID(m_pSkeleton->GetJointIDByName("Bip01 Head")));

//Получаем позицию игрока
Vec3 Ground = позиция игрока

//Проверяем на валидность позиции
if (Head.GetTranslation() == Vec3{ZERO}) return;
if (Ground == Vec3{ ZERO }) return;

//Определяем цвет согласно значению жизней
if (HP < 60)color = YELLOW(150);
if (HP < 30) color = RED(150);

//Переводим 3Д координаты головы в 2Д координаты
if (WorldToScreen(Head.GetTranslation(), ScreenPos2))
{
//Переводим 3Д координаты позиции в 2Д координаты
WorldToScreen(Ground, ScreenPos1);//ноги

//Вычесляем расстояние между 2Д координатами
float w = (ScreenPos1.y - ScreenPos2.y) / 4;

//Вычесляем расстояние между 2Д координатами в соответствии жизней
int hw = (int)(((ScreenPos1.y - ScreenPos2.y)*(HP)) / -100);

//Вычесляем расстояние между 2Д координатами в соответствии брони
int arrmory = (int)(((ScreenPos1.y - ScreenPos2.y)*(Ar)) / -100);

//рисуем жизни
pRender->GradientBox(ScreenPos1.x + w, ScreenPos1.y, 4, hw, RED, color, vertical);//градиент жизней
pRender->Border(Vec2(ScreenPos1.x + w, ScreenPos1.y), 4, hw, 1, BLACK);//рамка градиента

//рисуем броню
pRender->GradientBox(ScreenPos1.x + w + 5, ScreenPos1.y, 4, arrmory, ORANGE, ORANGE, vertical);//градиент брони
pRender->Border(Vec2(ScreenPos1.x + w + 5, ScreenPos1.y), 4, arrmory, 1, BLACK);//градиент рамки

}
}
[/HIDE]
GradientBox думаю есть у каждого.
vertical - говорит о том, что он вертикальный.

Вот что имеем:
https://chitachok/attachments/2138/
 
Сообщения
423
Реакции
198
[HIDE=500]
for (; IActor* pActor = pIActorIterator->Next();)
{
if (!pActor)
continue;
if (pActor->IsDead())
continue;

if (!pActor->m_pEntity()->GetCharacter(0))
continue;
ISkeletonPose* m_pSkeleton = pActor->m_pEntity()->GetCharacter(0)->GetISkeletonPose();
Matrix34 m_pWorld = pActor->m_pEntity()->GetWorldTM();

Vec3 v2dVector = { ZERO };
Vec3 vWorld = vGetBone(m_pWorld, m_pSkeleton, "Bip01 R Clavicle");


if (!IRender::Singleton()->WorldToScreen(vWorld, v2dVector))
continue;

//рисуем используя данные выше (скелеты, боксы..... + используем данные для аима и других расчетов)
[/HIDE]таким образом мы получаем эти данные один раз за итерацию, а не обращаемся для каждый раз для получения
[HIDE500]
Vec3 vGetBone(Matrix34 m_pWorld, ISkeletonPose* m_pSkeleton, const char* szJointName)
{
if (!m_pSkeleton)
return Vec3{ ZERO };
__int16 BoneId = m_pSkeleton->GetJointIDByName(szJointName);
Matrix34 mOut = m_pWorld * Matrix34(m_pSkeleton->GetAbsJointByID(BoneId));
return mOut.GetTranslation();
}
[/HIDE]
 
kaspersky keys
Верх