Исходник Simplest hitchance in the world for lw

like amiri in my mind
Пользователь
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
308
Реакции[?]
54
Поинты[?]
1K
вдохновился -
Пожалуйста, авторизуйтесь для просмотра ссылки.

и сделал хитчанс в 20 строк(без коментов то да)
hitchance:
bool aim::simple_hitchance(float chance, Vector aim_angle,player_t* ent) {
    //firstly define some variables
    auto src = g_ctx.globals.eye_pos; //our origin of shoot for next tracing to our target
    int hits = 0; //needed hits
    int rays = 256; // use up to 256 for better accuracy calculating u can use less than 256 for example for high accuracy weapon
    //48 rays may be enough for high accuracy weapon
    auto wep_info = g_ctx.globals.weapon->get_csweapon_info();  //wep info
    for (int i = 0; i < rays; i++)
    {
        auto spread = g_ctx.globals.inaccuracy + g_ctx.globals.spread; // curr spread def already known formule
        //p2c spread randomizer calculation (better than skeet does)
        Vector randomizer = { math::random_float(-(spread / 2), spread / 2),
            math::random_float(-(spread / 2), spread / 2),
            math::random_float(-(spread / 2), spread / 2) };

        Vector forward;
        math::angle_vectors(aim_angle, forward);

        trace_t tr;
        Ray_t ray;
        //apply our p2c spread randomizer to our target
        auto randomized_forward = forward + randomizer; //we look at our point then apply our randomly based spread

        ray.Init(src, src + randomized_forward * wep_info->flRange);
        
        m_trace()->ClipRayToEntity(ray, MASK_SHOT, ent, &tr);
        //if we hit our randomized trace and hitbox is intersected then our hits++
        if (tr.hit_entity == ent)
            hits++;
    }
    //if we readched needed hits then chance is true
    if (chance <= (hits / rays) * 100.f)
        return true;
}
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,574
Реакции[?]
595
Поинты[?]
34K
вдохновился -
Пожалуйста, авторизуйтесь для просмотра ссылки.

и сделал хитчанс в 20 строк(без коментов то да)
hitchance:
bool aim::simple_hitchance(float chance, Vector aim_angle,player_t* ent) {
    //firstly define some variables
    auto src = g_ctx.globals.eye_pos; //our origin of shoot for next tracing to our target
    int hits = 0; //needed hits
    int rays = 256; // use up to 256 for better accuracy calculating u can use less than 256 for example for high accuracy weapon
    //48 rays may be enough for high accuracy weapon
    auto wep_info = g_ctx.globals.weapon->get_csweapon_info();  //wep info
    for (int i = 0; i < rays; i++)
    {
        auto spread = g_ctx.globals.inaccuracy + g_ctx.globals.spread; // curr spread def already known formule
        //p2c spread randomizer calculation (better than skeet does)
        Vector randomizer = { math::random_float(-(spread / 2), spread / 2),
            math::random_float(-(spread / 2), spread / 2),
            math::random_float(-(spread / 2), spread / 2) };

        Vector forward;
        math::angle_vectors(aim_angle, forward);

        trace_t tr;
        Ray_t ray;
        //apply our p2c spread randomizer to our target
        auto randomized_forward = forward + randomizer; //we look at our point then apply our randomly based spread

        ray.Init(src, src + randomized_forward * wep_info->flRange);
       
        m_trace()->ClipRayToEntity(ray, MASK_SHOT, ent, &tr);
        //if we hit our randomized trace and hitbox is intersected then our hits++
        if (tr.hit_entity == ent)
            hits++;
    }
    //if we readched needed hits then chance is true
    if (chance <= (hits / rays) * 100.f)
        return true;
}
бля, удачи трейсить лучи из eyepos
 
like amiri in my mind
Пользователь
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
308
Реакции[?]
54
Поинты[?]
1K
бля, удачи трейсить лучи из eyepos
и? я сказал симплест втф я не хотел еще много строк в интерсект и др логику уходить
смысл темы - симплест, минимально строк
 
Модератор раздела «Создание читов CS2»
Забаненный
Статус
Оффлайн
Регистрация
21 Июн 2022
Сообщения
148
Реакции[?]
366
Поинты[?]
155K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
hitchance:
bool aim::simple_hitchance(float chance, Vector aim_angle,player_t* ent) {
        m_trace()->ClipRayToEntity(ray, MASK_SHOT, ent, &tr);
        //if we hit our randomized trace and hitbox is intersected then our hits++
        if (tr.hit_entity == ent)
            hits++;
    }
}
Ты не обращаешь внимание на то, куда именно идёт попадание. Возможно проверка пройдет, но точно ли чит попадет туда, куда хотел?
Использовать ClipRayToEntity — не лучшая идея.
TraceRay работает ненадежно, когда хитбоксы выходят за границы коллизии объекта.
Intersection с рифка так же лучше не использовать, так как это чревата проблем с миссами по окклюжену, хотя он как раз таки имеет размер объекта куда следует проверить попадание.

Можно попробовать сделать проверку на ребилде
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Эта функция не требует сетапа/рестора данных в рекорд плеера, который сканируется, в отличие от того же TraceRay, что даст дополнительный буст в производительности.

Референсы:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

p.s valve интерсекция для проверки хита использует матрицу костей из кэша ( тебе надо проверять валидность этого кэша )
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
// module: client.dll; sig: 55 8B EC 81 EC 08 04 00 00 53
char __thiscall C_BaseAnimating::TestHitboxes(int this, int ray, int fContentsMask, struct_trace_1 *trace)
{
  v4 = dword_15311FDC;
  (*(*dword_15311FDC + 132))(dword_15311FDC);
  if ( !*(this + 0x2950) && (*(*(this + 4) + 32))(this + 4) )
    sub_101CA950(this);
  studio_hdr = *(this + 0x2950);
  studio_hdr_1 = studio_hdr;
  if ( studio_hdr
    && *studio_hdr
    && (v7 = *studio_hdr,
        v8 = *(*studio_hdr + 0xB0) + 12 * *(this + 0x9FC),
        v9 = v7 + v8 == 0,
        v10 = v7 + v8,
        set = v10,
        !v9)
    && *(v10 + 4)
    && *(ray + 68) )                            // m_is_ray
  {
    HitboxToWorldTransforms(hitboxbones);
    model_scale = sub_101D4E10(this).m128_u32[0];
    render_origin = (*(*(this + 4) + 4))(this + 4);
    v13 = studio_hdr_1;
    if ( TraceToStudio(ray, studio_hdr_1, set, hitboxbones, fContentsMask, render_origin, model_scale, &trace->gap) )
    {
      v14 = *v13;
      bone = *(*v13 + 160) + 216 * *(*(set + 8) + 68 * trace->hitbox + set);
      trace->surface_flags = 0x8000;
      trace->surface_name = "**studio**";
      trace->surface_props = *(bone + v14 + 184);// get_surface_props
      if ( IsRagdoll(this) )
      {
        replace = (*(**(this + 2548) + 20))(*(this + 2548), trace->physicsbone);
        if ( replace )
        {
          *(this + 672) = 0;                    // VPhysicsSetObject(0)
          VPhysicsSetObject(replace);
        }
      }
    }
    (*(*v4 + 136))(v4);
    return 1;
  }
  else
  {
    (*(*v4 + 136))(v4);
    return 0;
  }
}
 
Последнее редактирование:
like amiri in my mind
Пользователь
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
308
Реакции[?]
54
Поинты[?]
1K
Ты не обращаешь внимание на то, куда именно идёт попадание. Возможно проверка пройдет, но точно ли чит попадет туда, куда хотел?
Использовать ClipRayToEntity — не лучшая идея.
TraceRay работает ненадежно, когда хитбоксы выходят за границы коллизии объекта.
Intersection с рифка так же лучше не использовать, так как это чревата проблем с миссами по окклюжену, хотя он как раз таки имеет размер объекта куда следует проверить попадание.

Можно попробовать сделать проверку на ребилде
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Эта функция не требует сетапа/рестора данных в рекорд плеера, который сканируется, в отличи от того же TraceRay, что даст дополнительный буст в производительности.

Референсы:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

p.s valve интерсекция для проверки хита использует матрицу костей из кэша ( тебе надо проверять валидность этого кэша )
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
// module: client.dll; sig: 55 8B EC 81 EC 08 04 00 00 53
char __thiscall C_BaseAnimating::TestHitboxes(int this, int ray, int fContentsMask, struct_trace_1 *trace)
{
  v4 = dword_15311FDC;
  (*(*dword_15311FDC + 132))(dword_15311FDC);
  if ( !*(this + 0x2950) && (*(*(this + 4) + 32))(this + 4) )
    sub_101CA950(this);
  studio_hdr = *(this + 0x2950);
  studio_hdr_1 = studio_hdr;
  if ( studio_hdr
    && *studio_hdr
    && (v7 = *studio_hdr,
        v8 = *(*studio_hdr + 0xB0) + 12 * *(this + 0x9FC),
        v9 = v7 + v8 == 0,
        v10 = v7 + v8,
        set = v10,
        !v9)
    && *(v10 + 4)
    && *(ray + 68) )                            // m_is_ray
  {
    HitboxToWorldTransforms(hitboxbones);
    model_scale = sub_101D4E10(this).m128_u32[0];
    render_origin = (*(*(this + 4) + 4))(this + 4);
    v13 = studio_hdr_1;
    if ( TraceToStudio(ray, studio_hdr_1, set, hitboxbones, fContentsMask, render_origin, model_scale, &trace->gap) )
    {
      v14 = *v13;
      bone = *(*v13 + 160) + 216 * *(*(set + 8) + 68 * trace->hitbox + set);
      trace->surface_flags = 0x8000;
      trace->surface_name = "**studio**";
      trace->surface_props = *(bone + v14 + 184);// get_surface_props
      if ( IsRagdoll(this) )
      {
        replace = (*(**(this + 2548) + 20))(*(this + 2548), trace->physicsbone);
        if ( replace )
        {
          *(this + 672) = 0;                    // VPhysicsSetObject(0)
          VPhysicsSetObject(replace);
        }
      }
    }
    (*(*v4 + 136))(v4);
    return 1;
  }
  else
  {
    (*(*v4 + 136))(v4);
    return 0;
  }
}
вау спасибо за ответ и объективную критику, по этой инфе можно целый пост сделать, точно возму идею на заметку
 
Сверху Снизу