Files
2026-08-09 05:16:51 -07:00

280 lines
8.1 KiB
C++

#pragma once
#include "gamelib/physics/clip.h"
#include "gamelib/physics/physics_actor.h"
#include "idlib/math/angles.h"
#include <cstdint>
class idMaterial;
class idPush;
class idSerializer;
enum pmtype_t : int {
PM_NORMAL = 0,
PM_DEAD = 1,
PM_SPECTATOR = 2,
PM_FREEZE = 3,
PM_NOCLIP = 4,
PM_VEHICLE_NOCLIP = 5,
PM_PERFECTORIGIN = 6,
PM_EXPLICIT = 7,
PM_SLIDE = 8,
PM_MAX = 9
};
enum swimdepthstate_t : int {
SWIMDEPTH_STATE_NONE = 0,
SWIMDEPTH_STATE_ON_SURFACE = 1,
SWIMDEPTH_STATE_UNDER_SURFACE = 2
};
struct playerExplicitMove_t {
enum velocityType_t : int {
VEL_EXPLICIT = 0,
VEL_OVERRIDE = 1,
VEL_CURRENT = 2
};
idVec3 delta;
bool clipMove;
velocityType_t velocityType;
idVec3 overrideVelocity;
int ignoreEntityNum;
};
struct playerPState_t {
idVec3 localOrigin;
idVec3 worldOrigin;
idVec3 velocity;
idVec3 pushVelocity;
idAngles deltaViewAngles;
float stepUp;
pmtype_t movementType;
int movementFlags;
int movementTime;
};
#ifndef ID_USERCMD_T_DEFINED
#define ID_USERCMD_T_DEFINED
struct alignas(4) usercmd_t {
int buttons;
std::int16_t buttons2;
char forwardmove;
char rightmove;
char upmove;
std::uint8_t reserved : 6;
std::uint8_t fromBot : 1;
std::uint8_t inhibited : 1;
std::int16_t angles[3];
int clientGameFrame;
float pos[3];
std::int16_t pitch;
std::int16_t yaw;
std::int16_t roll;
std::uint8_t predictionStateBits;
int serverGameTime;
std::uint16_t fireCount;
std::int16_t fireAngles[2];
std::int16_t firePos[3];
std::uint8_t vehicleThrottle;
std::uint8_t speed;
};
#endif
class idPhysics_Player : public idPhysics_Actor {
public:
using playerMoveHandler_t = bool (*)(int, const idVec3*,
const idVec3*, const idVec3*, const idVec3*, const usercmd_t*);
idPhysics_Player();
~idPhysics_Player() override;
void SetClipModel(idClipModel*, float, int, bool) override;
void SetOrigin(const idVec3*, int) override;
void SetAxis(const idMat3*, int) override;
void Translate(const idVec3*, int) override;
void Rotate(const idRotation*, int) override;
const idVec3* GetLocalOrigin(int) override;
const idMat3* GetLocalAxis(int) override;
void SetLinearVelocity(const idVec3*, int) override;
void SetAngularVelocity(const idVec3*, int) override;
idVec3* GetLinearVelocity(idVec3*, int) override;
idVec3* GetAngularVelocity(idVec3*, int) override;
void SetWaterLevel(float, int) override;
void SetWaterEntNum(int) override;
int GetWaterEntNum() override;
void SetWaterSurfaceWrldHeight(float) override;
float GetWaterSurfaceWrldHeight() override;
void GetImpactInfo(int, const idVec3*, impactInfo_t*) override;
void ApplyImpulse(int, const idVec3*, const idVec3*) override;
void ApplyForce(int, const idVec3*, const idVec3*) override;
void Activate() override;
void PutToRest() override;
bool IsAtRest() override;
bool IsPushable(int) override;
void SaveState() override;
void RestoreState() override;
bool Evaluate(int, int) override;
void UpdateTime(int) override;
void SetPushed(int) override;
idVec3* GetPushedLinearVelocity(idVec3*, int) override;
idVec3* GetPushedAngularVelocity(idVec3*, int) override;
void SetMaster(bool, const idVec3*, const idMat3*, bindFlags_t) override;
void SetLocalOrigin(const idVec3*, int) override;
void SetLocalAxis(const idMat3*, int) override;
int GetBlockingEntityNum() override;
int GetLinearEndTime() override;
int GetAngularEndTime() override;
void RestoreStateFromState(playerPState_t*);
void ClearPushedVelocity();
void Serialize(idSerializer*, playerPState_t*);
void SerializeNonPredictiveState(idSerializer*);
void SetSlideFriction(float);
bool HasJumped() const;
bool HasCrouched() const;
bool HasStoodUp() const;
bool HasSteppedUp() const;
float GetStepUp() const;
bool IsCrouching() const;
void SetClientCrouch(bool);
void SetSprintSliding(bool);
void SetClipModelStanding(idClipModel*);
void SetWalkFriction(float);
void SetSpeed(float, float);
void SetMaxStepHeight(float);
void SetMaxJumpHeight(float);
void SetMovementType(pmtype_t);
void SetKnockBack(int, bool);
void SetDebugLevel(bool);
void SetSwimStroke(const idVec3&, int, bool, bool);
bool GetIsUnderWater() const;
void StartPerfectOrigin(const idVec3&, int);
void SetClientDeferredOrigin(const idVec3&);
void SetPlayerInput(const usercmd_t&, const idAngles&);
bool ClientPusherLocked(bool*);
void UpdateNonPredictiveClip();
bool CanStand();
bool CanStand(const idVec3&);
void CheckGround();
void CheckLadder(bool);
void ForcePhysicsQuery();
void ClearCrouch();
void SetCrouch(bool);
playerExplicitMove_t explicitMove;
playerExplicitMove_t explicitMove2;
playerPState_t current;
playerPState_t previous;
playerPState_t saved;
idClipModel* clipModel_standing;
idClipModel* clipModel_crouched;
idClipModel* clipModel_sprintSlide;
idClipModel* clipModel_dead;
const idMaterial* overrideClipMaterial;
idPush* pusher;
idClipQuery slideMoveQuery;
idClipQuery ladderQuery1;
idClipQuery ladderQuery2;
idClipQuery contentsQuery;
int lastContents;
float walkSpeed;
float crouchSpeed;
float maxStepHeight;
float maxJumpHeight;
int debugLevel;
float walkAccelerate;
float airAccelerate;
float flyAccelerate;
float waterAccelerate;
float walkFriction;
float airFriction;
float flyFriction;
float waterFriction;
float slideFriction;
usercmd_t command;
usercmd_t prevcmd;
idAngles viewAngles;
int framemsec;
float frametime;
float playerSpeed;
idVec3 viewForward;
idVec3 viewRight;
bool walking;
bool startedOnGround;
bool groundPlane;
trace_t groundTrace;
int groundSurfaceFlags;
bool inhibitSprint;
bool inhibitJump;
bool toggleCrouch;
bool ladder;
idVec3 ladderNormal;
bool canLadder;
swimdepthstate_t currentSwimDepthState;
idVec3 swimStrokeVelocity;
int swimStrokeTimeLeft;
int swimStrokeTime;
bool swimStrokeAltCurve;
bool swimStrokeIgnoreInput;
int currentWaterEnt;
float currentWaterSurfaceHeight;
float blockedAccelerationPercent;
idVec3 blockedAccelerationVec;
float modifiedMovementMaxPercent;
float modifiedMovementAngle;
idVec3 modifiedAccelerationVec;
bool canCrouchSprint;
int lastJumpChance;
idVec3 perfectOriginPosition;
int perfectOriginDuration;
int perfectOriginTime;
idVec3 externalVelocity;
bool clientOriginSet;
idVec3 nextClientOrigin;
bool forcedClientCrouchState;
bool clientPusherLocked;
float pushDeltaZ;
playerMoveHandler_t ownerJumpHandler;
playerMoveHandler_t ownerCrouchHandler;
playerMoveHandler_t ownerCrouchJumpHandler;
private:
float CmdScale(const usercmd_t&) const;
void Accelerate(const idVec3&, float, float);
void UpdateExternalVelocity();
void SlideMoveDeferred(bool, bool, bool, bool);
void SlideMoveNonDeferred(bool, bool, bool, bool);
void SlideMove(bool, bool, bool, bool);
void Friction();
void NoclipMove();
void CorrectAllSolid(trace_t&, int);
bool CheckJump();
void WaterJumpMove();
void SwimMove();
void AirMove();
void WalkMove();
void PerfectOriginMove(int);
void DeadMove();
void SpectatorMove();
void LadderMove();
void ExplicitMove(playerExplicitMove_t&);
void CheckDuck();
void ResolveSlideMove();
void MovePlayer(int);
void SelectClipModel(idClipModel*);
};
static_assert(sizeof(playerExplicitMove_t) == 36,
"Recovered explicit player movement ABI changed");
static_assert(sizeof(playerPState_t) == 76,
"Recovered player physics state ABI changed");
static_assert(sizeof(usercmd_t) == 60,
"Recovered user command ABI changed");
#if defined(_WIN32) && !defined(_WIN64)
static_assert(sizeof(idPhysics_Player) == 1352,
"Recovered idPhysics_Player ABI changed");
#endif