#pragma once

namespace Components
{
	class PlayerMovement : public Component
	{
	public:
		PlayerMovement();

	private:
		enum BouncesSettings { DISABLED, ENABLED, DOUBLE };

		static Dvar::Var BGRocketJump;
		static Dvar::Var BGRocketJumpScale;
		static Dvar::Var BGPlayerEjection;
		static Dvar::Var BGPlayerCollision;
		// Can't use Var class inside assembly stubs
		static const Game::dvar_t* CGNoclipScaler;
		static const Game::dvar_t* CGUfoScaler;
		static const Game::dvar_t* PlayerSpectateSpeedScale;
		static const Game::dvar_t* BGBounces;
		static const Game::dvar_t* BGBouncesAllAngles;
		static const Game::dvar_t* PlayerDuckedSpeedScale;
		static const Game::dvar_t* PlayerProneSpeedScale;

		static void PM_PlayerDuckedSpeedScaleStub();
		static void PM_PlayerProneSpeedScaleStub();

		static void PM_MoveScale_Noclip();
		static void PM_MoveScale_Ufo();
		static void PM_MoveScale_Spectate();

		// Bounce logic
		static void PM_StepSlideMoveStub();
		static void PM_ProjectVelocityStub();
		static void Jump_ClearState_Hk(Game::playerState_s* ps);

		static Game::gentity_s* Weapon_RocketLauncher_Fire_Hk(Game::gentity_s* ent, unsigned int weaponIndex, float spread, Game::weaponParms* wp, const float* gunVel, Game::lockonFireParms* lockParms, bool a7);

		// Player collison
		static int StuckInClient_Hk(Game::gentity_s* self);
		static void CM_TransformedCapsuleTrace_Hk(Game::trace_t* results, const float* start, const float* end, const Game::Bounds* bounds, const Game::Bounds* capsule, int contents, const float* origin, const float* angles);

		static void GScr_IsSprinting(Game::scr_entref_t entref);

		static const Game::dvar_t* Dvar_RegisterSpectateSpeedScale(const char* dvarName, float value, float min, float max, unsigned __int16 flags, const char* description);

		static void RegisterMovementDvars();
	};
}
