sqwarmed/sdk_src/game/server/swarm/asw_player.h

274 lines
11 KiB
C++

#ifndef ASW_PLAYER_H
#define ASW_PLAYER_H
#ifdef _WIN32
#pragma once
#endif
#include "asw_shareddefs.h"
#include "asw_player_shared.h"
#include "player.h"
#include "asw_playerlocaldata.h"
#include "server_class.h"
#include "asw_playeranimstate.h"
#include "asw_game_resource.h"
#include "asw_info_message_shared.h"
#include "basemultiplayerplayer.h"
#include "steam/steam_api.h"
class CASW_Marine;
class CRagdollProp;
class CASW_Voting_Missions;
//=============================================================================
// >> Swarm player
//=============================================================================
class CASW_Player : public CBaseMultiplayerPlayer, public IASWPlayerAnimStateHelpers
{
public:
DECLARE_CLASS( CASW_Player, CBaseMultiplayerPlayer );
DECLARE_SERVERCLASS();
DECLARE_DATADESC();
CASW_Player();
virtual ~CASW_Player();
virtual int UpdateTransmitState();
static CASW_Player *CreatePlayer( const char *className, edict_t *ed );
static CASW_Player* Instance( int iEnt );
// This passes the event to the client's and server's CPlayerAnimState.
void DoAnimationEvent( PlayerAnimEvent_t event );
virtual void PreThink();
virtual void PostThink();
virtual void Spawn();
virtual void Precache();
virtual void UpdateBattery( void ) { }
void DriveMarineMovement( CUserCmd *ucmd, IMoveHelper *moveHelper );
void PushawayThink();
virtual void AvoidPhysicsProps( CUserCmd *pCmd );
virtual bool ClientCommand( const CCommand &args );
void EmitPrivateSound( const char *soundName, bool bFromMarine = false );
// eye position is above the marine we're remote controlling
virtual Vector EyePosition(void);
virtual Vector EarPosition( void );
virtual CBaseEntity *GetSoundscapeListener();
Vector m_vecLastMarineOrigin; // remember last known position to keep camera there when gibbing
Vector m_vecFreeCamOrigin; // if the player is using freecam cheat to look around, he'll tell us about that position
bool m_bUsedFreeCam; // has the player ever sent a freecam message (if he has, we started adding the freecam's pos to PVS)
const QAngle& EyeAngles();
virtual const QAngle& EyeAnglesWithCursorRoll();
const Vector& GetCrosshairTracePos() { return m_vecCrosshairTracePos; }
void SetCrosshairTracePos( const Vector &vecPos ) { m_vecCrosshairTracePos = vecPos; }
virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize );
virtual void HandleSpeedChanges( void );
virtual bool CanBeSeenBy( CAI_BaseNPC *pNPC ) { return false; } // Players are never seen by NPCs
CNetworkHandle (CASW_Marine, m_hMarine);
bool ShouldAutoReload() { return m_bAutoReload; }
bool m_bAutoReload;
// anim state helper
virtual CBaseCombatWeapon* ASWAnim_GetActiveWeapon();
virtual bool ASWAnim_CanMove();
// spectating
void SpectateNextMarine();
void SetSpectatingMarine(CASW_Marine *d);
CASW_Marine* GetSpectatingMarine();
CNetworkHandle (CASW_Marine, m_hSpectatingMarine);
bool m_bLastAttackButton; // used to detect left clicks for cycling through marines
bool m_bRequestedSpectator; // this player requested to be a spectator since the start of a match (won't be considered for leader, campaign votes, etc.)
float m_fLastControlledMarineTime;
void BecomeNonSolid();
void OnMarineCommanded( const CASW_Marine *pMarine );
void SetMarine( CASW_Marine *pMarine );
CASW_Marine* GetMarine();
CASW_Marine* GetMarine() const;
void SelectNextMarine( bool bReverse );
bool CanSwitchToMarine( int num );
void SwitchMarine( int num );
void OrderMarineFace( int iMarine, float fYaw, Vector &vecOrderPos );
void LeaveMarines();
bool HasLiveMarines();
virtual bool IsAlive( void );
CNetworkHandle(CASW_Marine, m_hOrderingMarine)
CASW_Game_Resource* GetGNI();
// This player's Infested specific data that should only be replicated to
// the player and not to other players.
CNetworkVarEmbedded( CASWPlayerLocalData, m_ASWLocal );
// gets the firing direction when the player is firing through a marine
Vector GetAutoaimVectorForMarine(CASW_Marine* marine, float flDelta, float flNearMissDelta);
QAngle MarineAutoaimDeflection( Vector &vecSrc, float flDist, float flDelta, float flNearMissDelta);
QAngle m_angMarineAutoAim;
void FlashlightTurnOn( void );
void FlashlightTurnOff( void );
// Marine position prediction (used by AI to compensate for player lag times)
void MoveMarineToPredictedPosition();
void RestoreMarinePosition();
Vector m_vecStoredPosition;
virtual CBaseCombatCharacter *ActivePlayerCombatCharacter( void );
// shared code
void ItemPostFrame();
void ASWSelectWeapon(CBaseCombatWeapon* pWeapon, int subtype); // for switching weapons on the current marine
virtual bool Weapon_CanUse( CBaseCombatWeapon *pWeapon );
virtual CBaseCombatWeapon* Weapon_OwnsThisType( const char *pszWeapon, int iSubType = 0 ) const; // True if already owns a weapon of this class
virtual int Weapon_GetSlot( const char *pszWeapon, int iSubType = 0 ) const; // Returns -1 if they don't have one
// searches for nearby entities that we can use (pickups, buttons, etc)
virtual void PlayerUse();
virtual void FindUseEntities();
void SortUsePair( CBaseEntity **pEnt1, CBaseEntity **pEnt2, int *pnFirstPriority, int *pnSecondPriority );
int GetUsePriority(CBaseEntity* pEnt);
void ActivateUseIcon( int iUseEntityIndex, int nHoldType );
CBaseEntity* GetUseEntity( int i );
int GetNumUseEntities() { return m_iUseEntities; }
EHANDLE m_hUseEntities[ ASW_PLAYER_MAX_USE_ENTS ];
int m_iUseEntities;
CNetworkVar( float, m_flUseKeyDownTime );
CNetworkVar( EHANDLE, m_hUseKeyDownEnt );
// looking at an info panel
void ShowInfoMessage(CASW_Info_Message* pMessage);
CNetworkHandle (CASW_Info_Message, m_pCurrentInfoMessage);
float m_fClearInfoMessageTime;
virtual void SetAnimation( PLAYER_ANIM playerAnim );
// ragdoll blend test
void RagdollBlendTest();
CRagdollProp* m_pBlendRagdoll;
float m_fBlendAmount;
// AI perf debugging
float m_fLastAICountTime;
// changing name
bool CanChangeName() { return true; }
void ChangeName(const char *pszNewName);
bool HasFullyJoined() { return m_bSentJoinedMessage; }
bool m_bSentJoinedMessage; // has this player told everyone that he's fully joined yet
// voting
int m_iKLVotesStarted; // how many kick or leader votes this player has started, if he starts too many, flood control will be applied to the announcements
float m_fLastKLVoteTime; // last time we started a kick or leader vote
CNetworkVar(int, m_iLeaderVoteIndex); // entindex of the player we want to be leader
CNetworkVar(int, m_iKickVoteIndex); // entindex of the player we want to be kicked
void VoteMissionList(int nMissionOffset, int iNumSlots); // player wants to see a list of missions he can vote for
void VoteCampaignMissionList(int nCampaignIndex, int nMissionOffset, int iNumSlots); // player wants to see a list of missions within a specific campaign
void VoteCampaignList(int nCampaignOffset, int iNumSlots); // player wants to see a list of new campaigns he can vote for
void VoteSavedCampaignList(int nSaveOffset, int iNumSlots); // player wants to see a list of saved campaign games he can vote for
CNetworkHandle(CASW_Voting_Missions, m_hVotingMissions); // handle to voting missions entity that will network down the list of missions/campaigns/saves
const char* GetASWNetworkID();
CNetworkVar( int, m_iMapVoted ); // 0 = didn't vote, 1 = "no" vote, 2 = "yes" vote
// client stat counts (these are numbers each client stores and provides to the server on player creation, so server can decide to award medals)
int m_iClientKills;
int m_iClientMissionsCompleted;
int m_iClientCampaignsCompleted;
// char array of medals awarded (used for stats upload)
CUtlVector<unsigned char> m_CharMedals;
// have we notified other players that we're impatiently waiting on them?
bool m_bPrintedWantStartMessage;
bool m_bPrintedWantsContinueMessage;
virtual void CreateViewModel( int viewmodelindex = 0 ) { return; } // ASW players don't have viewmodels
virtual void SetPunchAngle( const QAngle &punchAngle ) { return; } // ASW players never use punch angle
void StartWalking( void );
void StopWalking( void );
bool IsWalking( void ) { return m_fIsWalking; }
// random map generation
CNetworkVar( float, m_fMapGenerationProgress ); // how far this player is through generating their local copy of the next random map
virtual CBaseEntity* FindPickerEntity();
// entity this player is highlighting with his mouse cursor
void SetHighlightEntity( CBaseEntity* pEnt ) { m_hHighlightEntity = pEnt; }
CBaseEntity* GetHighlightEntity() const { return m_hHighlightEntity.Get(); }
EHANDLE m_hHighlightEntity;
// status of selecting marine/weapons in the briefing
CNetworkVar( int, m_nChangingSlot );
// experience
int GetLevel();
int GetLevelBeforeDebrief();
int GetExperience();
int GetExperienceBeforeDebrief() { return m_iExperienceBeforeDebrief; }
void SetNetworkedExperience( int iExperience ) { m_iNetworkedXP = iExperience; }
void SetNetworkedPromotion( int iPromotion ) { m_iNetworkedPromotion = iPromotion; }
int GetPromotion();
int GetEarnedXP( CASW_Earned_XP_t nType ) { return m_iEarnedXP[ nType ]; }
void CalculateEarnedXP();
void AwardExperience(); // calculates earned XP. Steam stat setting actually happens on the client.
void RequestExperience(); // asks Steam for your current XP
int32 m_iExperience;
int32 m_iExperienceBeforeDebrief;
int32 m_iPromotion;
int32 m_iEarnedXP[ ASW_NUM_XP_TYPES ];
int32 m_iStatNumXP[ ASW_NUM_XP_TYPES ];
CNetworkVar( int, m_iNetworkedXP );
CNetworkVar( int, m_iNetworkedPromotion );
bool m_bHasAwardedXP;
bool m_bPendingSteamStats;
float m_flPendingSteamStatsStart;
bool m_bSentPromotedMessage;
#if !defined(NO_STEAM)
CCallResult< CASW_Player, GSStatsReceived_t > m_CallbackGSStatsReceived;
void Steam_OnGSStatsReceived( GSStatsReceived_t *pGSStatsReceived, bool bError );
#endif
private:
// Copyed from EyeAngles() so we can send it to the client.
CNetworkQAngle( m_angEyeAngles );
Vector m_vecCrosshairTracePos; // the world location directly beneath the player's crosshair
CNetworkVarForDerived( bool, m_fIsWalking );
IPlayerAnimState *m_PlayerAnimState;
bool m_bFirstInhabit;
};
extern void TE_MarineAnimEvent( CASW_Marine *pMarine, PlayerAnimEvent_t event );
extern void TE_MarineAnimEventExceptCommander( CASW_Marine *pMarine, PlayerAnimEvent_t event );
extern void TE_MarineAnimEventJustCommander( CASW_Marine *pMarine, PlayerAnimEvent_t event );
void OrderNearbyMarines(CASW_Player *pPlayer, ASW_Orders NewOrders, bool bAcknowledge = true );
inline CASW_Player *ToASW_Player( CBaseEntity *pEntity )
{
if ( !pEntity || !pEntity->IsPlayer() )
return NULL;
#ifdef _DEBUG
Assert( dynamic_cast<CASW_Player*>( pEntity ) != 0 );
#endif
return static_cast< CASW_Player* >( pEntity );
}
#endif // ASW_PLAYER_H