Escalation Project
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
// Данный момент используется лишь для обучения, эту функцию вам придется доработать самому.
C++:
// Итак, для начала давайте зададим все дефолтное для создания TraceRay Resolve.
for (int i = 1; i < m_globals()->m_maxclients; i++)
{
enum trace_sides
{
POSITIVE,
NEGATIVE,
POSITIVE_LOW,
NEGATIVE_LOW
};
Vector src3D, dst3D, forward, right, up, src, dst;
float back_two, right_two, left_two;
Ray_t RayToleft, RayToRight, RayRightLow, RayLeftLow;
float RightDistance, LeftDistance, RightLow, LeftLow;
Vector CurrentLocalPose;
CurrentLocalPose = globals.local()->get_shoot_position();
CGameTrace tr;
float Distance = std::floor(globals.local()->GetAbsOrigin().DistTo(player->GetAbsOrigin()));
Vector GetRight(player->m_angEyeAngles().x, player->m_angEyeAngles().y + player->get_max_desync_delta(), player->m_angEyeAngles().z); // получение правой трейсы
Vector GetLeft(player->m_angEyeAngles().x, player->m_angEyeAngles().y - player->get_max_desync_delta(), player->m_angEyeAngles().z); // получение левой трейсы
Vector GetLowRight(player->m_angEyeAngles().x, player->m_angEyeAngles().y + 30.f, player->m_angEyeAngles().z); // трейс на 30 градусов для лоудельты
Vector GetLowLeft(player->m_angEyeAngles().x, player->m_angEyeAngles().y - 30.f, player->m_angEyeAngles().z);// трейс на -30 градусов для лоудельты
CTraceFilter filter;
filter.pSkip = globals.local(); // фильтр чтобы не трейсить себя
math::angle_vectors(Vector(0, get_backward_side(player), 0), &forward, &right, &up); // получение бекварда энеми
// теперь приступим к отрисовки линий и дистанции.
RayRightLow.Init(CurrentLocalPose, rightPose); // правая лоудельта
m_trace()->TraceRay(RayRightLow, MASK_SHOT, &filter, &tr);
RightLow = (tr.endpos - tr.startpos).Length();
RayLeftLow.Init(CurrentLocalPose, leftPose); // левая
m_trace()->TraceRay(RayLeftLow, MASK_SHOT, &filter, &tr);
LeftLow = (tr.endpos - tr.startpos).Length();
RayToRight.Init(CurrentLocalPose, rightPose); // 60 градусов правая
m_trace()->TraceRay(RayToRight, MASK_SHOT, &filter, &tr);
RightDistance = (tr.endpos - tr.startpos).Length();
RayToleft.Init(CurrentLocalPose, leftPose); // 60 градусов левая
m_trace()->TraceRay(RayToleft, MASK_SHOT, &filter, &tr);
LeftDistance = (tr.endpos - tr.startpos).Length();
// теперь приступим к созданию abs между 60 градусами и лоудельтой
auto abs_right = (abs(RightDistance - RightLow) > 10.f); // разница между правой 60 и лоудельтой
auto abs_left = (abs(LeftDistance - LeftLow) > 10.f); // разница между левой 60 и лоудельтой
// start resolving
if (abs_right)
{
if (globals.g.missed_shots[i] < 1)
{
side = POSITIVE_LOW;
}
if (fabsf(abs_right > abs_left) > 10.f)
{
side = NEGATIVE;
}
}
else if (abs_left)
{
if (globals.g.missed_shots[i] < 1)
{
side = NEGATIVE_LOW;
}
else if (fabsf(abs_left > abs_right) > 10.f)
{
side = POSITIVE;
}
}
// также у вас должен стоять автоволл чек, потому что если энеми будет за непростреливаемой стенкой, то лучи не будут доходить, давайте сделаем и его.
auto fire_first = autowall::get().wall_penetration(globals.g.eye_pos, player->hitbox_position_matrix(HITBOX_HEAD, player_record->matrixes_data.first), player); // автоволл первой стороны
auto fire_second = autowall::get().wall_penetration(globals.g.eye_pos, player->hitbox_position_matrix(HITBOX_HEAD, player_record->matrixes_data.second), player); // autowall второй стороны
if (fire_first.damage > 0.0f && fire_second.damage > 0.0f)
{
// проверка на автоволл дамаг.
}
else
{
// здесь чекаем дистанцию, если нет автоволл дамага, или энеми стоит открыто.
if (LeftDistance > RightDistance)
{
resolve_1; // и по аналогии делаем противоположный сайд.
}
}
// Надеюсь этот гайд вам как нибудь поможет в ресольве маленького градуса десинка.
}
Последнее редактирование: