- Статус
- Оффлайн
- Регистрация
- 14 Июл 2019
- Сообщения
- 1,116
- Реакции
- 505
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
bool resolve_p::ncontinue(int id, player_t* e, ClientFrameStage_t stage) {
switch (stage) {
case FRAME_RENDER_START:
if (!e->valid(true))
return false;
break;
case FRAME_NET_UPDATE_POSTDATAUPDATE_START:
if (!e->valid(true)) {
return false;
}
break;
case FRAME_NET_UPDATE_POSTDATAUPDATE_END:
if (e->m_iHealth() <= 0 || e->m_iTeamNum() == g_ctx.m_local->m_iTeamNum()) {
return false;
}
if (e->IsDormant() || e->m_bGunGameImmunity())
return false;
break;
case FRAME_NET_UPDATE_END:
if (!e->valid(true))
return false;
break;
}
return true;
}
void resolve_p::create_move(ClientFrameStage_t stage)
{
if (!g_ctx.m_local || !g_csgo.m_engine()->IsInGame() || !g_csgo.m_engine()->IsConnected())
return;
static bool wasDormant[65];
for (int i = 0; i <= g_csgo.m_globals()->m_maxclients; ++i)
{
auto pPlayerEntity = static_cast<player_t *>(g_csgo.m_entitylist()->GetClientEntity(i));
if (!pPlayerEntity
|| !pPlayerEntity->is_alive()
|| !pPlayerEntity->is_valid_player())
continue;
if (pPlayerEntity->IsDormant())
{
wasDormant[i] = true;
continue;
}
switch (stage)
{
case FRAME_NET_UPDATE_POSTDATAUPDATE_END:
if (pPlayerEntity != g_ctx.m_local)
pPlayerEntity->update_clientside_animation();
break;
case FRAME_RENDER_START:
if (pPlayerEntity != g_ctx.m_local)
{
// skip_animations(pPlayerEntity);
// sync_animations(pPlayerEntity);
}
break;
case FRAME_NET_UPDATE_POSTDATAUPDATE_START:
if (pPlayerEntity != g_ctx.m_local)
{
update(pPlayerEntity);
resolve_yaw(pPlayerEntity);
resolve_pitch(pPlayerEntity);
}
break;
case FRAME_NET_UPDATE_END:
if (pPlayerEntity != g_ctx.m_local)
{
auto VarMap = reinterpret_cast<uintptr_t>(pPlayerEntity) + 36;
auto VarMapSize = *reinterpret_cast<int*>(VarMap + 20);
for (auto index = 0; index < VarMapSize; index++)
*reinterpret_cast<uintptr_t*>(*reinterpret_cast<uintptr_t*>(VarMap) + index * 12) = 0;
}
break;
}
wasDormant[i] = false;
}
}
void resolve_p::update(player_t * x)
{
for (int i = 0; i < x->animlayer_count(); i++)
rec.layers[i] = x->get_animlayers()[i];
rec.pitch = x->m_angEyeAngles().x;
rec.yaw = x->m_angEyeAngles().y;
rec.state = x->get_animation_state();
// rec.misses[x->EntIndex()] = g_ctx.m_globals.missed_shots[x->EntIndex()];
rec.server_hurt[x->EntIndex()] = miss_count::get().bPlayerHurt[x->EntIndex()];
rec.modificated = x->get_modificated_state();
rec.is_desync[x->EntIndex()] = rec.modificated->pad_0x0000[0];
Vector direction_1, direction_2;
math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y - 90.f, 0.f), direction_1);
math::angle_vectors(Vector(0.f, math::calculate_angle(g_ctx.m_local->m_vecOrigin(), x->m_vecOrigin()).y + 90.f, 0.f), direction_2);
const float height = 64;
const auto left_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_1 * 16.f);
const auto right_eye_pos = x->m_vecOrigin() + Vector(0, 0, height) + (direction_2 * 16.f);
rec.left_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), left_eye_pos, g_ctx.m_local, x, 1).m_damage;
rec.right_damage = autowall::get().calculate_return_info(g_ctx.m_local->get_eye_pos(), right_eye_pos, g_ctx.m_local, x, 1).m_damage;
Ray_t ray;
trace_t trace;
CTraceFilterWorldOnly filter;
ray.Init(left_eye_pos, g_ctx.m_local->get_eye_pos());
g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
rec.left_fraction = trace.fraction;
ray.Init(right_eye_pos, g_ctx.m_local->get_eye_pos());
g_csgo.m_trace()->TraceRay(ray, MASK_ALL, &filter, &trace);
rec.right_fraction = trace.fraction;
switch (rec.misses[x->EntIndex()])
{
case 0:
rec.mode[x->EntIndex()] = mode::brute_side_0;
break;
case 1:
rec.mode[x->EntIndex()] = mode::brute_side_1;
break;
case 2:
rec.mode[x->EntIndex()] = mode::brute_side_2;
break;
default:
break;
}
}
void resolve_p::resolve_yaw(player_t * ent)
{
if (!g_cfg.ragebot.antiaim_correction)
return;
if (!rec.state)
return;
if (rec.is_desync[ent->EntIndex()])
{
sync_animations(ent);
if (rec.mode[ent->EntIndex()] == mode::brute_side_0 || rec.mode[ent->EntIndex()] == mode::brute_side_1 ||rec.mode[ent->EntIndex()] == mode::brute_side_2)
brute(ent);
normalize_yaw(rec.state->m_flGoalFeetYaw);
ent->set_animation_state(rec.state);
}
}
void resolve_p::normalize_yaw(float yaw)
{
for (; yaw > 180.0; yaw = yaw - 360.0);
for (; yaw < -180.0; yaw = yaw + 360.0);
}
void resolve_p::brute(player_t * ent)
{
auto rec_yaw = rec.state->m_flEyeYaw;
if (rec.mode[ent->EntIndex()] == mode::brute_side_0)
rec.state->m_flGoalFeetYaw = rec_yaw + 58.0;
else if (rec.mode[ent->EntIndex()] == mode::brute_side_1)
rec.state->m_flGoalFeetYaw = server_goal_feet_yaw(ent);
else if (rec.mode[ent->EntIndex()] == mode::brute_side_2)
rec.state->m_flGoalFeetYaw = rec_yaw - 60.0;
}
float resolve_p::fl_approach_angle(float fl_target, float fl_value, float fl_speed)
{
auto fl_angle_mod = [](float fl_angle) -> float
{
return ((360.0f / 65536.0f) * ((int32_t)(fl_angle * (65536.0f / 360.0f)) & 65535));
};
float fl_adjusted_speed = fl_speed;
if (fl_adjusted_speed < 0.0f)
fl_adjusted_speed *= -1.0f;
float fl_angle_mod_target = fl_angle_mod(fl_target);
float fl_angle_mod_value = fl_angle_mod(fl_value);
float fl_delta = (fl_angle_mod_target - fl_angle_mod_value);
if (fl_delta >= -180.0f)
{
if (fl_delta >= 180.0f)
fl_delta -= 360.0f;
}
else
{
if (fl_delta <= -180.0f)
fl_delta += 360.0f;
}
float fl_return;
if (fl_delta <= fl_adjusted_speed)
{
if ((fl_adjusted_speed * -1.0f) <= fl_delta)
fl_return = fl_angle_mod_target;
else
fl_return = (fl_angle_mod_value - fl_adjusted_speed);
}
else
fl_return = (fl_angle_mod_value + fl_adjusted_speed);
return fl_return;
}
float resolve_p::server_goal_feet_yaw(player_t* entity)
{
auto animstate = rec.state;
if (!animstate)
return 0.f;
auto ground_fraction = *(float*)(animstate + 0x11C);
auto duck_ammount = *(float*)(animstate + 0xA4);
auto ducking_speed = max(0.f, min(1.f, *reinterpret_cast<float*> (animstate + 0xFC)));
auto running_speed = max(0.f, min(*reinterpret_cast<float*> (animstate + 0xF8), 1.f));
auto abs_velocity = *reinterpret_cast<Vector*> (uintptr_t(entity) + 0x94);
auto speed = std::fmin(abs_velocity.Length2D(), 260.0f);
auto goal_feet_yaw = animstate->m_flGoalFeetYaw;
auto angle_diff = [](float destAngle, float srcAngle) -> float
{
auto delta = 0.f;
delta = fmodf(destAngle - srcAngle, 360.0f);
if (destAngle > srcAngle)
{
if (delta >= 180)
(delta -= 160);
delta -= 360;
}
else
{
if (delta <= -180)
(delta += 160);
delta += 360;
}
return delta;
};
auto eye_feet_delta = angle_diff(animstate->m_flEyeYaw, goal_feet_yaw);
auto flYawModifier = (((ground_fraction * -0.3f) - 0.2f) * running_speed) + 1.0f;
if (duck_ammount > 0.0f)
flYawModifier = flYawModifier + ((duck_ammount * ducking_speed) * (0.5f - flYawModifier));
auto flMaxYawModifier = flYawModifier * 58.f;
auto flMinYawModifier = flYawModifier * -58.f;
if (eye_feet_delta <= flMaxYawModifier)
{
if (flMinYawModifier > eye_feet_delta)
goal_feet_yaw = fabs(flMinYawModifier) + animstate->m_flEyeYaw;
}
else
goal_feet_yaw = animstate->m_flEyeYaw - fabs(flMaxYawModifier);
if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
return 0.f;
math::normalize_yaw(goal_feet_yaw);
if (speed > 0.1f || fabs(abs_velocity.z) > 100.0f)
{
goal_feet_yaw = fl_approach_angle(
animstate->m_flEyeYaw,
goal_feet_yaw,
((ground_fraction * 20.0f) + 30.0f)
* animstate->m_flLastClientSideAnimationUpdateTime);
}
else
{
goal_feet_yaw = fl_approach_angle(
entity->m_flLowerBodyYawTarget(),
goal_feet_yaw,
animstate->m_flLastClientSideAnimationUpdateTime * 100.0f);
}
if (goal_feet_yaw > 5000 || goal_feet_yaw < -5000)
return 0.f;
math::normalize_yaw(goal_feet_yaw);
return goal_feet_yaw;
}
void resolve_p::direction_based(player_t * e)
{
if (rec.left_damage <= 0 && rec.right_damage <= 0) {
if (rec.right_fraction < rec.left_fraction)
rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
else
rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
}
else {
if (rec.left_damage > rec.right_damage)
rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw + 58.0;
else
rec.state->m_flGoalFeetYaw = rec.state->m_flEyeYaw - 58.0;
}
}
void resolve_p::skip_animations(player_t * player)
{
static ConVar *sv_pvsskipanimation = g_csgo.m_cvar()->FindVar("sv_pvsskipanimation");
int32_t backup_sv_pvsskipanimation = sv_pvsskipanimation->GetFloat();
sv_pvsskipanimation->SetValue(0);
*(int32_t*)((uintptr_t)player + 0xA30) = 0;
*(int32_t*)((uintptr_t)player + 0x269C) = 0;
int32_t backup_effects = *(int32_t*)((uintptr_t)player + 0xEC);
*(int32_t*)((uintptr_t)player + 0xEC) |= 8;
player->SetupBones(NULL, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
*(int32_t*)((uintptr_t)player + 0xEC) = backup_effects;
sv_pvsskipanimation->SetValue(backup_sv_pvsskipanimation);
}
void resolve_p::sync_animations(player_t * entity)
{
auto state = entity->get_animation_state(); if (!state) return;
auto index = entity->EntIndex();
static float sim_time[65];
if (sim_time[index] != entity->get_simulation_time())
{
const float curtime = g_csgo.m_globals()->m_curtime;
const float frametime = g_csgo.m_globals()->m_frametime;
static auto host_timescale = g_csgo.m_cvar()->FindVar(("host_timescale"));
g_csgo.m_globals()->m_frametime = g_csgo.m_globals()->m_interval_per_tick * host_timescale->GetFloat();
g_csgo.m_globals()->m_curtime = entity->get_simulation_time() + g_csgo.m_globals()->m_interval_per_tick;
vec3_t backup_velocity = entity->m_vecVelocity();
int backup_flags = entity->m_fFlags();
int backup_eflags = entity->m_iEFlags();
AnimationLayer backup_layers[15];
std::memcpy(backup_layers, entity->GetAnimOverlays(), (sizeof(0x0038) * 15));
state->m_bOnGround ? entity->m_fFlags() |= (1 << 0) : entity->m_fFlags() &= ~(1 << 0);
entity->m_iEFlags() &= ~0x1000;
entity->m_vecAbsVelocity() = entity->m_vecVelocity();
if (state->m_iLastClientSideAnimationUpdateFramecount == g_csgo.m_globals()->m_framecount)
state->m_iLastClientSideAnimationUpdateFramecount = g_csgo.m_globals()->m_framecount - 1;
entity->update_clientside_animation();
float lby_delta = entity->m_flLowerBodyYawTarget() - entity->m_angEyeAngles().y;
lby_delta = std::remainderf(lby_delta, 360.f);
lby_delta = math::clamp(lby_delta, -60.f, 60.f);
float feet_yaw = std::remainderf(entity->m_angEyeAngles().y + lby_delta, 360.f);
if (feet_yaw < 0.f) {
feet_yaw += 360.f;
}
static float pitch, yaw = 0.f;
std::memcpy(entity->GetAnimOverlays(), backup_layers, (sizeof(0x0038) * 15));
entity->m_vecVelocity() = backup_velocity;
entity->m_fFlags() = backup_flags;
entity->m_iEFlags() = backup_eflags;
g_csgo.m_globals()->m_curtime = curtime;
g_csgo.m_globals()->m_frametime = frametime;
sim_time[index] = entity->get_simulation_time();
}
entity->SetupBones(nullptr, -1, 0x7FF00, g_csgo.m_globals()->m_curtime);
}
void resolve_p::resolve_pitch(player_t * e)
{
if (!g_cfg.ragebot.pitch_resolve)
return;
float last_simtime[64] = { 0.f };
float stored_pitch_1[64] = { 0.f };
float fixed_pitch[64] = { 0.f };
bool has_been_set[64] = { false };
for (auto i = 0; i < g_csgo.m_globals()->m_maxclients; ++i)
{
auto eye = rec.pitch;
auto pitch = 0.f;
if (stored_pitch_1[i] == FLT_MAX || !has_been_set[i])
{
stored_pitch_1[i] = eye;
has_been_set[i] = true;
}
if (stored_pitch_1[i] - eye < 30 && stored_pitch_1[i] - eye > -30)
{
pitch = eye;
}
else
{
pitch = stored_pitch_1[i];
}
e->m_angEyeAngles().x = pitch;
}
}
