Add movement features (auto-strafe, jumpbug, edgejump, longjump, fast-stop, slow walk)
This commit is contained in:
@@ -477,6 +477,8 @@ auto CMisc::OnCreateMove( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void
|
||||
}
|
||||
}
|
||||
|
||||
RunMovement( pInput , pUserCmd );
|
||||
|
||||
if ( Settings::Misc::FOVChanger )
|
||||
{
|
||||
auto* pLocalPawn = GetCL_Players()->GetLocalPlayerPawn();
|
||||
@@ -489,6 +491,144 @@ auto CMisc::OnCreateMove( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void
|
||||
}
|
||||
}
|
||||
|
||||
auto CMisc::RunMovement( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void
|
||||
{
|
||||
auto* pLocalPawn = GetCL_Players()->GetLocalPlayerPawn();
|
||||
|
||||
if ( !pLocalPawn || !pLocalPawn->IsAlive() )
|
||||
{
|
||||
m_bWasOnGround = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const auto flFlags = pLocalPawn->m_fFlags();
|
||||
|
||||
constexpr uint32 FL_ONGROUND = 1u;
|
||||
|
||||
const bool bOnGround = ( flFlags & FL_ONGROUND ) != 0;
|
||||
|
||||
if ( Settings::Misc::AutoStrafe )
|
||||
RunAutoStrafe( pInput , pUserCmd , pLocalPawn , bOnGround );
|
||||
|
||||
if ( Settings::Misc::JumpBug )
|
||||
{
|
||||
if ( !bOnGround && pLocalPawn->m_flFallVelocity() > 430.f )
|
||||
GetCL_Bypass()->SetJump( pUserCmd , true );
|
||||
}
|
||||
|
||||
if ( Settings::Misc::EdgeJump )
|
||||
{
|
||||
if ( m_bWasOnGround && !bOnGround )
|
||||
{
|
||||
if ( pUserCmd->button_states.buttonstate1 & ( IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT ) )
|
||||
GetCL_Bypass()->SetJump( pUserCmd , true );
|
||||
}
|
||||
}
|
||||
|
||||
if ( Settings::Misc::LongJump )
|
||||
{
|
||||
if ( !bOnGround )
|
||||
pUserCmd->button_states.buttonstate1 |= IN_DUCK;
|
||||
}
|
||||
|
||||
if ( Settings::Misc::FastStop )
|
||||
{
|
||||
if ( bOnGround )
|
||||
{
|
||||
if ( !( pUserCmd->button_states.buttonstate1 & ( IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT ) ) )
|
||||
{
|
||||
const Vector3 Velocity = pLocalPawn->m_vecVelocity();
|
||||
|
||||
const float flSpeed = Velocity.Length2D();
|
||||
|
||||
if ( flSpeed > 5.f )
|
||||
{
|
||||
constexpr float k_Pi = 3.14159265358979f;
|
||||
|
||||
const float flVelYaw = std::atan2f( Velocity.m_y , Velocity.m_x ) * ( 180.f / k_Pi );
|
||||
|
||||
auto* pViewAngles = CCSGOInput_GetViewAngles( pInput , 0 );
|
||||
|
||||
if ( pViewAngles )
|
||||
{
|
||||
float flDelta = flVelYaw - pViewAngles->m_y;
|
||||
|
||||
while ( flDelta > 180.f )
|
||||
flDelta -= 360.f;
|
||||
|
||||
while ( flDelta < -180.f )
|
||||
flDelta += 360.f;
|
||||
|
||||
if ( flDelta > -45.f && flDelta <= 45.f )
|
||||
pUserCmd->button_states.buttonstate1 |= IN_BACK;
|
||||
else if ( flDelta > 45.f && flDelta <= 135.f )
|
||||
pUserCmd->button_states.buttonstate1 |= IN_MOVELEFT;
|
||||
else if ( flDelta > 135.f || flDelta <= -135.f )
|
||||
pUserCmd->button_states.buttonstate1 |= IN_FORWARD;
|
||||
else
|
||||
pUserCmd->button_states.buttonstate1 |= IN_MOVERIGHT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( Settings::Misc::SlowWalk )
|
||||
pUserCmd->button_states.buttonstate1 |= IN_SPEED;
|
||||
|
||||
m_bWasOnGround = bOnGround;
|
||||
}
|
||||
|
||||
auto CMisc::RunAutoStrafe( CCSGOInput* pInput , CUserCmd* pUserCmd , C_CSPlayerPawn* pLocalPawn , bool bOnGround ) -> void
|
||||
{
|
||||
if ( bOnGround )
|
||||
return;
|
||||
|
||||
if ( pUserCmd->button_states.buttonstate1 & ( IN_FORWARD | IN_BACK ) )
|
||||
return;
|
||||
|
||||
const Vector3 Velocity = pLocalPawn->m_vecVelocity();
|
||||
|
||||
const float flSpeed = Velocity.Length2D();
|
||||
|
||||
if ( flSpeed < 0.1f )
|
||||
return;
|
||||
|
||||
constexpr float k_Pi = 3.14159265358979f;
|
||||
|
||||
const float flVelYaw = std::atan2f( Velocity.m_y , Velocity.m_x ) * ( 180.f / k_Pi );
|
||||
|
||||
auto* pViewAngles = CCSGOInput_GetViewAngles( pInput , 0 );
|
||||
|
||||
if ( !pViewAngles )
|
||||
return;
|
||||
|
||||
float flDelta = flVelYaw - pViewAngles->m_y;
|
||||
|
||||
while ( flDelta > 180.f )
|
||||
flDelta -= 360.f;
|
||||
|
||||
while ( flDelta < -180.f )
|
||||
flDelta += 360.f;
|
||||
|
||||
constexpr float k_TurnSpeed = 5.f;
|
||||
|
||||
QAngle NewAngles = *pViewAngles;
|
||||
|
||||
if ( flDelta > 0.f )
|
||||
{
|
||||
NewAngles.m_y += k_TurnSpeed;
|
||||
pUserCmd->button_states.buttonstate1 |= IN_MOVERIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
NewAngles.m_y -= k_TurnSpeed;
|
||||
pUserCmd->button_states.buttonstate1 |= IN_MOVELEFT;
|
||||
}
|
||||
|
||||
GetCL_Bypass()->SetViewAngles( &NewAngles , pInput , pUserCmd );
|
||||
}
|
||||
|
||||
auto CMisc::RunTriggerbot( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void
|
||||
{
|
||||
auto Reset = [ & ]()
|
||||
|
||||
@@ -37,6 +37,9 @@ private:
|
||||
auto CalculateHitchance( CCSGOInput* pInput , C_CSPlayerPawn* pTarget , const QAngle& ViewAngles , const int Samples ) -> float;
|
||||
auto CalculateSeedDirection( CCSGOInput* pInput , CUserCmd* pUserCmd , Vector3* vOutDirection ) -> bool;
|
||||
|
||||
auto RunMovement( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void;
|
||||
auto RunAutoStrafe( CCSGOInput* pInput , CUserCmd* pUserCmd , C_CSPlayerPawn* pLocalPawn , bool bOnGround ) -> void;
|
||||
|
||||
private:
|
||||
std::chrono::steady_clock::time_point m_HitTime{};
|
||||
std::chrono::steady_clock::time_point m_HitSoundTime{};
|
||||
@@ -50,6 +53,8 @@ private:
|
||||
|
||||
std::atomic_bool m_bTargetInCrosshair = false;
|
||||
std::atomic_bool m_bTriggerFiring = false;
|
||||
|
||||
bool m_bWasOnGround = false;
|
||||
};
|
||||
|
||||
auto GetMisc() -> CMisc*;
|
||||
|
||||
@@ -332,6 +332,12 @@ auto CAndromedaMenu::RenderMiscPanel() -> void
|
||||
ImGui::SeparatorText( "Movement" );
|
||||
|
||||
Checkbox( "Bunnyhop" , Settings::Misc::Bunnyhop );
|
||||
Checkbox( "Auto-Strafe" , Settings::Misc::AutoStrafe );
|
||||
Checkbox( "JumpBug" , Settings::Misc::JumpBug );
|
||||
Checkbox( "EdgeJump" , Settings::Misc::EdgeJump );
|
||||
Checkbox( "Fast-Stop" , Settings::Misc::FastStop );
|
||||
Checkbox( "LongJump" , Settings::Misc::LongJump );
|
||||
Checkbox( "Slow Walk" , Settings::Misc::SlowWalk );
|
||||
Checkbox( "No Flash" , Settings::Misc::NoFlash );
|
||||
|
||||
ImGui::SeparatorText( "Camera" );
|
||||
|
||||
@@ -44,6 +44,12 @@ namespace Settings
|
||||
namespace Misc
|
||||
{
|
||||
inline auto Bunnyhop = false;
|
||||
inline auto AutoStrafe = false;
|
||||
inline auto JumpBug = false;
|
||||
inline auto EdgeJump = false;
|
||||
inline auto FastStop = false;
|
||||
inline auto LongJump = false;
|
||||
inline auto SlowWalk = false;
|
||||
inline auto NoFlash = false;
|
||||
inline auto FOVChanger = false;
|
||||
inline auto FOV = 90;
|
||||
|
||||
@@ -242,6 +242,7 @@ public:
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_iTeamNum" , m_iTeamNum , uint8 );
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_fFlags" , m_fFlags , uint32 );
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_MoveType" , m_MoveType , MoveType_t );
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_vecVelocity" , m_vecVelocity , Vector3 );
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_hOwnerEntity" , m_hOwnerEntity , CHandle );
|
||||
SCHEMA_OFFSET( "C_BaseEntity" , "m_nSubclassID" , m_nSubclassID , CUtlStringToken );
|
||||
};
|
||||
@@ -425,6 +426,8 @@ public:
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_pObserverServices" , m_pObserverServices , CPlayer_ObserverServices* );
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_pCameraServices" , m_pCameraServices , CCSPlayerBase_CameraServices* );
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_vOldOrigin" , m_vOldOrigin , Vector3 );
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_flFallVelocity" , m_flFallVelocity , float32 );
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_bDucked" , m_bDucked , bool );
|
||||
SCHEMA_OFFSET( "C_BasePlayerPawn" , "m_hController" , m_hController , CHandle ); // CCSPlayerController
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user