cstrike15_src/game/shared/portal/portal_player_shared.h
2025-06-04 03:22:50 +02:00

343 lines
8.5 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
#ifndef PORTAL_PLAYER_SHARED_H
#define PORTAL_PLAYER_SHARED_H
#pragma once
#include "studio.h"
#include "paint_color_manager.h"
#include "cegclientwrapper.h"
#define PORTAL_PUSHAWAY_THINK_INTERVAL (1.0f / 20.0f)
// Max mass the player can lift with +use
#define PORTAL_PLAYER_MAX_LIFT_MASS 85
#define PORTAL_PLAYER_MAX_LIFT_SIZE 128
#define PLAYERPORTALDEBUGSPEW 0
const char *GetEggBotModel( bool bLowRes = false );
const char *GetBallBotModel( bool bLowRes = false );
class ISignifierTarget
{
public:
virtual bool OverrideSignifierPosition( void ) = 0;
virtual bool GetSignifierPosition( const Vector &vSource, Vector &vPositionOut, Vector &vNormalOut ) = 0;
virtual bool GetSignifierDesignation( char *lpszBuffer, unsigned int nBufferSize ) = 0;
virtual bool UseSelectionGlow( void ) = 0;
};
class CSignifierTarget : public ISignifierTarget
{
public:
virtual bool UseSelectionGlow( void ) { return true; }
virtual bool OverrideSignifierPosition( void ) { return false; }
virtual bool GetSignifierPosition( const Vector &vSource, Vector &vPositionOut, Vector &vNormalOut ) { return false; }
virtual bool GetSignifierDesignation( char *lpszBuffer, unsigned int nBufferSize )
{
V_memset( lpszBuffer, 0, nBufferSize );
return false;
}
};
enum
{
PLAYER_SOUNDS_CITIZEN = 0,
PLAYER_SOUNDS_COMBINESOLDIER,
PLAYER_SOUNDS_METROPOLICE,
PLAYER_SOUNDS_MAX,
};
enum
{
CONCEPT_CHELL_IDLE,
CONCEPT_CHELL_DEAD,
};
const float PLAYER_HULL_REDUCTION = 0.70f;
extern const char *g_pszChellConcepts[];
int GetChellConceptIndexFromString( const char *pszConcept );
extern ConVar sv_portal_coop_ping_hud_indicitator_duration;
struct PaintPowerInfo_t;
const float STEEP_SLOPE = 0.7;
char const* const PORTAL_PREDICTED_CONTEXT = "Portal Predicted Powers";
enum JumpButtonPress
{
JUMP_ON_TOUCH = 0,
PRESS_JUMP_TO_BOUNCE,
HOLD_JUMP_TO_BOUNCE,
TRAMPOLINE_BOUNCE
};
enum InAirState
{
ON_GROUND,
IN_AIR_JUMPED,
IN_AIR_BOUNCED,
IN_AIR_FELL
};
enum PaintSurfaceType
{
FLOOR_SURFACE = 0,
WALL_SURFACE,
CEILING_SURFACE
};
enum StickCameraState
{
STICK_CAMERA_SURFACE_TRANSITION = 0,
STICK_CAMERA_ROLL_CORRECT,
STICK_CAMERA_PORTAL,
STICK_CAMERA_WALL_STICK_DEACTIVATE_TRANSITION,
STICK_CAMERA_SWITCH_TO_ABS_UP_MODE,
STICK_CAMERA_ABS_UP_MODE,
STICK_CAMERA_SWITCH_TO_LOCAL_UP,
STICK_CAMERA_SWITCH_TO_LOCAL_UP_LOOKING_UP,
STICK_CAMERA_LOCAL_UP_LOOKING_UP,
STICK_CAMERA_UPRIGHT
};
enum StickCameraCorrectionMethod
{
QUATERNION_CORRECT = 0,
ROTATE_UP,
SNAP_UP,
DO_NOTHING
};
//=============================================================================
// Paint Power Helper Functions
//=============================================================================
const Vector ComputeBouncePostVelocityNoReflect( const Vector& preVelocity,
const Vector& normal,
const Vector& up );
const Vector ComputeBouncePostVelocityReflection( const Vector& preVelocity,
const Vector& normal,
const Vector& localUp );
void ExpandAABB( Vector& boxMin, Vector& boxMax, const Vector& sweepVector );
//=============================================================================
// Paint Power Choice
//=============================================================================
struct PaintPowerChoiceCriteria_t
{
Vector vNormInputDir;
Vector vNormVelocity;
bool bInPortal;
};
struct PaintPowerChoiceResult_t
{
const PaintPowerInfo_t* pPaintPower;
float flInputCos;
float flVelocityCos;
bool bWasIgnored;
inline void Initialize()
{
pPaintPower = NULL;
flInputCos = 1.0f;
flVelocityCos = 2.0f;
bWasIgnored = false;
}
};
typedef CUtlVectorFixed< PaintPowerChoiceResult_t, PAINT_POWER_TYPE_COUNT_PLUS_NO_POWER > PaintPowerChoiceResultArray;
struct CachedPaintPowerChoiceResult
{
Vector surfaceNormal;
CBaseHandle surfaceEntity;
bool wasValid;
bool wasIgnored;
inline void Initialize()
{
surfaceNormal = Vector( 0, 0, 0 );
surfaceEntity = NULL;
wasValid = false;
wasIgnored = false;
}
};
//=============================================================================
// Contact Determination (used for determining available paint powers)
//=============================================================================
const int ALL_CONTENT = 0xFFFFFFFF;
struct BrushContact
{
Vector point;
Vector normal;
CBaseEntity* pBrushEntity;
bool isOnThinSurface;
void Initialize( const Vector& contactPt,
const Vector& normal,
CBaseEntity* pBrushEntity,
bool onThinSurface );
void Initialize( const fltx4& contactPt,
const fltx4& normal,
CBaseEntity* pBrushEntity,
bool onThinSurface );
};
typedef CUtlVector<BrushContact> ContactVector;
typedef CUtlVector<cplane_t> CollisionPlaneVector;
void ComputeAABBContactsWithBrushEntity( ContactVector& contacts, const Vector& boxOrigin, const Vector& boxMin, const Vector& boxMax, CBaseEntity* pBrushEntity, int contentsMask = CONTENTS_BRUSH_PAINT );
void ComputeAABBContactsWithBrushEntity( ContactVector& contacts, const cplane_t *pClipPlanes, int iClipPlaneCount, const Vector& boxOrigin, const Vector& boxMin, const Vector& boxMax, CBaseEntity* pBrushEntity, int contentsMask = CONTENTS_BRUSH_PAINT );
#ifndef CLIENT_DLL
class CPortal_Player;
#else
class C_Portal_Player;
#define CPortal_Player C_Portal_Player
#endif
void TracePlayerBoxAgainstCollidables( trace_t& trace,
const CPortal_Player* player,
const Vector& startPos,
const Vector& endPos,
const Vector& boxLocalMin,
const Vector& boxLocalMax );
struct StringCompare_t
{
StringCompare_t( char const* str ) : m_str( str ) {}
char const* const m_str;
inline bool operator()( char const* str ) const
{
return V_strcmp( m_str, str ) == 0;
}
};
#define PERMANENT_CONDITION -1
// Player conditions for animations
enum
{
PORTAL_COND_TAUNTING = 0,
PORTAL_COND_POINTING,
PORTAL_COND_DROWNING,
PORTAL_COND_DEATH_CRUSH,
PORTAL_COND_DEATH_GIB,
PORTAL_COND_LAST
};
class CPortalPlayerShared
{
public:
// Client specific.
#ifdef CLIENT_DLL
friend class C_Portal_Player;
typedef C_Portal_Player OuterClass;
DECLARE_PREDICTABLE();
// Server specific.
#else
friend class CPortal_Player;
typedef CPortal_Player OuterClass;
#endif
DECLARE_EMBEDDED_NETWORKVAR()
DECLARE_CLASS_NOBASE( CPortalPlayerShared );
// Initialization.
CPortalPlayerShared();
void Init( OuterClass *pOuter );
// Condition (PORTAL_COND_*)
int GetCond() const { return m_nPlayerCond; }
void SetCond( int nCond ) { m_nPlayerCond = nCond; }
void AddCond( int nCond, float flDuration = PERMANENT_CONDITION );
void RemoveCond( int nCond );
bool InCond( int nCond );
void RemoveAllCond();
void OnConditionAdded( int nCond );
void OnConditionRemoved( int nCond );
void ConditionThink( void );
float GetConditionDuration( int nCond );
void ConditionGameRulesThink( void );
void DebugPrintConditions( void );
bool IsLoadoutUnavailable( void ) { return m_bLoadoutUnavailable; }
void SetLoadoutUnavailable( bool bUnavailable ) { m_bLoadoutUnavailable = bUnavailable; }
#ifdef CLIENT_DLL
// This class only receives calls for these from C_TFPlayer, not
// natively from the networking system
virtual void OnPreDataChanged( void );
virtual void OnDataChanged( void );
// check the newly networked conditions for changes
void UpdateConditions( void );
#endif
private:
// Vars that are networked.
CNetworkVar( int, m_nPlayerCond ); // Player condition flags.
CNetworkVar( bool, m_bLoadoutUnavailable );
float m_flCondExpireTimeLeft[PORTAL_COND_LAST]; // Time until each condition expires
// Vars that are not networked.
OuterClass *m_pOuter; // C_TFPlayer or CTFPlayer (client/server).
int m_nOldConditions;
#ifdef GAME_DLL
float m_flNextCritUpdate;
// FIXME: CUtlVector<CTFDamageEvent> m_DamageEvents;
float m_flTauntRemoveTime;
// store damage info, so we can kill the player with this damage after crush animation is done
CTakeDamageInfo m_damageInfo;
#endif
};
struct PortalPlayerStatistics_t
{
DECLARE_CLASS_NOBASE( PortalPlayerStatistics_t );
DECLARE_EMBEDDED_NETWORKVAR();
#ifdef GAME_DLL
DECLARE_SIMPLE_DATADESC();
#endif
CNetworkVar( int, iNumPortalsPlaced );
CNetworkVar( int, iNumStepsTaken );
CNetworkVar( float, fNumSecondsTaken );
CNetworkVar( float, fDistanceTaken );
};
#if defined( CLIENT_DLL )
#define CPortal_Player C_Portal_Player
#define CPortalPlayerLocalData C_PortalPlayerLocalData
#endif
#endif //PORTAL_PLAYER_SHARED_h