-
Автор темы
- #1
вообщем пишу (пасчу) хитшанс и хотел задать пару вопросов знающим людям что будет лучше?
1 can_hit
2 can_hit
3 can_hit
1 способ у меня не внушает доверия, 2 мне нравится, 3 50/50, но что из этого лучше, и какая есть лучшая калькуляция хитшанса
1 can_hit
C++:
bool can_hit_hitbox(const Vector start, const Vector end, studiohdr_t* hdr, int box, player_t* player, adjust_data* record)
{
studiohdr_t* pStudioModel = m_modelinfo()->GetStudioModel(player->GetModel());
mstudiohitboxset_t* set = pStudioModel->pHitboxSet(0);
if (!set)
return false;
mstudiobbox_t* studio_box = set->pHitbox(box);
if (!studio_box)
return false;
if (!record)
return false;
Vector min, max;
const auto is_capsule = studio_box->radius != -1.f;
if (is_capsule)
{
math::vector_transform(studio_box->bbmin, record->matrixes_data.main[studio_box->bone], min);
math::vector_transform(studio_box->bbmax, record->matrixes_data.main[studio_box->bone], max);
const auto dist = math::segment_to_segment(start, end, min, max);
if (dist < studio_box->radius)
return true;
}
else
{
adjust_data backup_data{};
record->adjust_player();
Ray_t ray;
ray.Init(start, end);
trace_t tr;
m_trace()->ClipRayToEntity(ray, MASK_SHOT | CONTENTS_GRATE, player, &tr);
if (auto ent = tr.hit_entity; ent)
{
if (ent == player)
return true;
}
backup_data.adjust_player();
return false;
}
return false;
}
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)
{
auto model = e->GetModel();
if (!model)
return false;
auto studio_model = m_modelinfo()->GetStudioModel(model);
if (!studio_model)
return false;
auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());
if (!studio_set)
return false;
auto studio_hitbox = studio_set->pHitbox(hitbox);
if (!studio_hitbox)
return false;
CGameTrace trace;
Ray_t ray;
ray.Init(start, end);
return clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;;
}
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)
{
auto model = e->GetModel();
if (!model)
return false;
auto studio_model = m_modelinfo()->GetStudioModel(model);
if (!studio_model)
return false;
auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());
if (!studio_set)
return false;
auto studio_hitbox = studio_set->pHitbox(hitbox);
if (!studio_hitbox)
return false;
Vector min, max;
const auto is_capsule = studio_hitbox->radius != -1.f;
if (is_capsule)
{
math::vector_transform(studio_hitbox->bbmin, matrix[studio_hitbox->bone], min);
math::vector_transform(studio_hitbox->bbmax, matrix[studio_hitbox->bone], max);
const auto dist = math::segment_to_segment(start, end, min, max);
if (dist < studio_hitbox->radius)
return true;
}
else
{
math::vector_transform(math::vector_rotate(studio_hitbox->bbmin, studio_hitbox->rotation), matrix[studio_hitbox->bone], min);
math::vector_transform(math::vector_rotate(studio_hitbox->bbmax, studio_hitbox->rotation), matrix[studio_hitbox->bone], max);
math::vector_i_transform(start, matrix[studio_hitbox->bone], min);
math::vector_i_rotate(end, matrix[studio_hitbox->bone], max);
if (math::intersect_line_with_bb(min, max, studio_hitbox->bbmin, studio_hitbox->bbmax))
return true;
}
return false;
}