-
Автор темы
- #1
when draining the source, the shift itself was cut out
Код:
void Exploits::teleport(int ticks, crypt_ptr <CUserCmd> cmd)
{
if (!ctx->weapon_data())
return;
auto teleporting = false;
auto forwardmove = ctx->original_forwardmove;
auto sidemove = ctx->original_sidemove;
if (ctx->weapon_config != WEAPON_CONFIG_INVALID && engine_prediction->flags & FL_ONGROUND && ctx->local()->m_fFlags() & FL_ONGROUND)
{
if (config->rage.weapon[ctx->weapon_config].extended_teleport && ctx->local()->m_vecVelocity().Length2D() > 5.0f)
{
if (abs(forwardmove) > 5.0f)
{
teleporting = true;
forwardmove = copysign(convars_manager->convars[CONVAR_CL_FORWARDSPEED]->GetFloat(), forwardmove);
}
else
forwardmove = 0.0f;
if (abs(sidemove) > 5.0f)
{
teleporting = true;
sidemove = copysign(convars_manager->convars[CONVAR_CL_SIDESPEED]->GetFloat(), sidemove);
}
else
sidemove = 0.0f;
}
else
{
forwardmove = 0.0f;
sidemove = 0.0f;
}
}
auto additional_stop_ticks = 0;
if (teleporting && in_attack)
{
auto backup_tickbase = ctx->tickbase;
auto backup_next_attack = ctx->local()->m_flNextAttack();
auto backup_next_primary_attack = ctx->weapon()->m_flNextPrimaryAttack();
ctx->local()->m_flNextAttack() = TICKS_TO_TIME(ctx->tickbase) + ctx->weapon_data()->cycle_time;
ctx->weapon()->m_flNextPrimaryAttack() = TICKS_TO_TIME(ctx->tickbase) + ctx->weapon_data()->cycle_time; //-V656
auto next_tickbase = ctx->tickbase + ticks;
for (auto tickbase = next_tickbase; tickbase < next_tickbase + 14; ++tickbase)
{
ctx->tickbase = tickbase;
if (ctx->local()->can_shoot())
break;
++additional_stop_ticks;
}
ctx->tickbase = backup_tickbase;
ctx->local()->m_flNextAttack() = backup_next_attack;
ctx->weapon()->m_flNextPrimaryAttack() = backup_next_primary_attack;
}
auto backup_tickbase = ctx->local()->m_nTickBase();
auto backup_curtime = globals->curtime;
movehelper->set_host(ctx->local().get());
globals->curtime = TICKS_TO_TIME(ctx->local()->m_nTickBase());
ctx->local()->post_think();
++ctx->local()->m_nTickBase();
movehelper->set_host(nullptr);
auto commands_to_add = 0;
auto next_command_number = cmd->command_number + 1;
CUserCmd next_cmd;
memcpy(&next_cmd, cmd.get(), sizeof(CUserCmd));
next_cmd.command_number = next_command_number;
next_cmd.buttons &= ~IN_ATTACK;
next_cmd.buttons &= ~IN_ATTACK2;
next_cmd.forwardmove = forwardmove;
next_cmd.sidemove = sidemove;
do
{
auto sequence_number = commands_to_add + next_cmd.command_number;
auto command = crypt_ptr <CUserCmd> (input->GetUserCmd(sequence_number));
auto verified_command = crypt_ptr <CVerifiedUserCmd> (input->GetVerifiedUserCmd(sequence_number));
auto view_angles = movement_system->wish_angle;
memcpy(command.get(), &next_cmd, sizeof(CUserCmd));
command->command_number = sequence_number;
command->predicted = true;
command->buttons |= engine_prediction->buttons & IN_JUMP;
command->viewangles = view_angles;
if (ctx->local()->m_fFlags() & FL_ONGROUND && !(command->buttons & IN_JUMP))
{
if (ctx->automatic_peek && !ctx->automatic_peek_position.IsZero() && movement_system->holding_automatic_peek)
{
auto delta = ctx->automatic_peek_position - ctx->local()->m_vecOrigin();
if (delta.Length() >= 10.0f)
{
view_angles.y = math::calculate_angle(ctx->local()->m_vecOrigin(), ctx->automatic_peek_position).y;
command->forwardmove = convars_manager->convars[CONVAR_CL_FORWARDSPEED]->GetFloat();
command->sidemove = 0.0f;
}
}
else if (teleporting && in_attack)
{
RestoreData restore_data;
engine_prediction->store_restore_data(restore_data);
CUserCmd predict_command;
memcpy(&predict_command, command.get(), sizeof(CUserCmd)); //-V598
auto ticks_to_stop = 0;
for (ticks_to_stop = 0; ticks_to_stop < 14; ++ticks_to_stop)
{
if (ctx->local()->m_vecVelocity().Length2D() + 1.0f < ctx->max_speed * 0.34f)
break;
Vector angle;
math::vector_angles(ctx->local()->m_vecVelocity() * -1.0f, angle);
angle.y = math::normalize_yaw(view_angles.y - angle.y);
Vector direction;
math::angle_vectors(angle, &direction, nullptr, nullptr);
auto stop = direction * ctx->local()->m_vecVelocity().Length2D(); //-V688
predict_command.forwardmove = stop.x;
predict_command.sidemove = stop.y;
engine_prediction->start(&predict_command);
}
if (ticks_to_stop)
{
engine_prediction->apply_restore_data(restore_data);
if (commands_to_add >= ticks - ticks_to_stop - 1 + additional_stop_ticks)
{
Vector angle;
math::vector_angles(ctx->local()->m_vecVelocity() * -1.0f, angle);
angle.y = math::normalize_yaw(view_angles.y - angle.y);
Vector direction;
math::angle_vectors(angle, &direction, nullptr, nullptr);
auto stop = direction * ctx->local()->m_vecVelocity().Length2D(); //-V688
command->forwardmove = stop.x;
command->sidemove = stop.y;
}
}
}
}
else if (!(ctx->local()->m_fFlags() & FL_ONGROUND) && command->buttons & IN_JUMP)
command->buttons &= ~IN_JUMP;
anti_aim->force_disable_desync = true;
anti_aim->run(command);
anti_aim->force_disable_desync = false;
movement_system->fix_movement(command, view_angles, abs(command->viewangles.z) > 0.0f);
movehelper->set_host(ctx->local().get());
prediction->RunCommand(ctx->local().get(), command.get(), movehelper.get());
movehelper->set_host(nullptr);
--ctx->local()->m_nTickBase();
local_animations->run(command, false);
++ctx->local()->m_nTickBase();
movement_system->edge_jump(command);
command->predicted = false;
memcpy(&verified_command->m_cmd, command.get(), sizeof(CUserCmd));
verified_command->m_crc = command->GetChecksum();
++clientstate->m_nChokedCommands;
if (clientstate->m_NetChannel)
{
++clientstate->m_NetChannel->m_nChokedPackets;
++clientstate->m_NetChannel->m_nOutSequenceNr;
}
++commands_to_add;
}
while (commands_to_add != ticks);
if (!previous_tickbase_shift)
tickbase_adjust = commands_to_add;
ctx->local()->m_nTickBase() = backup_tickbase;
globals->curtime = backup_curtime;
prediction->m_bPreviousAckHadErrors = true;
prediction->m_nCommandsPredicted = 0;
*ctx->send_packet.get() = true;
}
void Exploits::shift_tickbase(crypt_ptr <CUserCmd> cmd)
{
if (!tickbase_shift)
return;
if (!*ctx->send_packet.get())
return;
auto command_number = cmd->command_number;
auto ticks = tickbase_shift;
do
{
auto command = crypt_ptr <CUserCmd> (input->GetUserCmd(++command_number));
if (command.get() != cmd.get())
memcpy(command.get(), cmd.get(), sizeof(CUserCmd));
command->command_number = command_number;
command->tickcount = 0x7F7FFFFF;
command->predicted = true;
command->buttons |= cmd->buttons & (IN_BULLRUSH | IN_SPEED | IN_DUCK);
auto verified_cmd = crypt_ptr <CVerifiedUserCmd> (input->GetVerifiedUserCmd(command_number));
memcpy(&verified_cmd->m_cmd, command.get(), sizeof(CUserCmd));
verified_cmd->m_crc = command->GetChecksum();
++clientstate->m_nChokedCommands;
--ticks;
}
while (ticks);
}