/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __GAME_PLAYER_H__ #define __GAME_PLAYER_H__ #include "PredictedValue.h" /* =============================================================================== Player entity. =============================================================================== */ class idMenuHandler_PDA; class idMenuHandler_HUD; class idMenuScreen_HUD; class idTarget_SetPrimaryObjective; extern const idEventDef EV_Player_GetButtons; extern const idEventDef EV_Player_GetMove; extern const idEventDef EV_Player_GetViewAngles; extern const idEventDef EV_Player_EnableWeapon; extern const idEventDef EV_Player_DisableWeapon; extern const idEventDef EV_Player_ExitTeleporter; extern const idEventDef EV_Player_SelectWeapon; extern const idEventDef EV_SpectatorTouch; const float THIRD_PERSON_FOCUS_DISTANCE = 512.0f; const int LAND_DEFLECT_TIME = 150; const int LAND_RETURN_TIME = 300; const int FOCUS_TIME = 300; const int FOCUS_GUI_TIME = 500; const int NUM_QUICK_SLOTS = 4; const int MAX_WEAPONS = 32; const int DEAD_HEARTRATE = 0; // fall to as you die const int LOWHEALTH_HEARTRATE_ADJ = 20; // const int DYING_HEARTRATE = 30; // used for volumen calc when dying/dead const int BASE_HEARTRATE = 70; // default const int ZEROSTAMINA_HEARTRATE = 115; // no stamina const int MAX_HEARTRATE = 130; // maximum const int ZERO_VOLUME = -40; // volume at zero const int DMG_VOLUME = 5; // volume when taking damage const int DEATH_VOLUME = 15; // volume at death const int SAVING_THROW_TIME = 5000; // maximum one "saving throw" every five seconds const int ASYNC_PLAYER_INV_AMMO_BITS = idMath::BitsForInteger( 3000 ); const int ASYNC_PLAYER_INV_CLIP_BITS = -7; // -7 bits to cover the range [-1, 60] enum gameExpansionType_t { GAME_BASE, GAME_D3XP, GAME_D3LE, GAME_UNKNOWN }; struct idObjectiveInfo { idStr title; idStr text; const idMaterial * screenshot; }; struct idLevelTriggerInfo { idStr levelName; idStr triggerName; }; // powerups - the "type" in item .def must match enum { BERSERK = 0, INVISIBILITY, MEGAHEALTH, ADRENALINE, INVULNERABILITY, HELLTIME, ENVIROSUIT, //HASTE, ENVIROTIME, MAX_POWERUPS }; // powerup modifiers enum { SPEED = 0, PROJECTILE_DAMAGE, MELEE_DAMAGE, MELEE_DISTANCE }; // influence levels enum { INFLUENCE_NONE = 0, // none INFLUENCE_LEVEL1, // no gun or hud INFLUENCE_LEVEL2, // no gun, hud, movement INFLUENCE_LEVEL3, // slow player movement }; typedef struct { int ammo; int rechargeTime; char ammoName[128]; } RechargeAmmo_t; typedef struct { char name[64]; idList toggleList; int lastUsed; } WeaponToggle_t; class idInventory { public: int maxHealth; int weapons; int powerups; int armor; int maxarmor; int powerupEndTime[ MAX_POWERUPS ]; RechargeAmmo_t rechargeAmmo[ AMMO_NUMTYPES ]; // mp int ammoPredictTime; // Unused now but kept for save file compatibility. int deplete_armor; float deplete_rate; int deplete_ammount; int nextArmorDepleteTime; int pdasViewed[4]; // 128 bit flags for indicating if a pda has been viewed int selPDA; int selEMail; int selVideo; int selAudio; bool pdaOpened; idList items; idList pdaSecurity; idList pdas; idList videos; idList emails; bool ammoPulse; bool weaponPulse; bool armorPulse; int lastGiveTime; idList levelTriggers; idInventory() { Clear(); } ~idInventory() { Clear(); } // save games void Save( idSaveGame *savefile ) const; // archives object for save game file void Restore( idRestoreGame *savefile ); // unarchives object from save game file void Clear(); void GivePowerUp( idPlayer *player, int powerup, int msec ); void ClearPowerUps(); void GetPersistantData( idDict &dict ); void RestoreInventory( idPlayer *owner, const idDict &dict ); bool Give( idPlayer *owner, const idDict &spawnArgs, const char *statname, const char *value, idPredictedValue< int > * idealWeapon, bool updateHud, unsigned int giveFlags ); void Drop( const idDict &spawnArgs, const char *weapon_classname, int weapon_index ); ammo_t AmmoIndexForAmmoClass( const char *ammo_classname ) const; int MaxAmmoForAmmoClass( const idPlayer *owner, const char *ammo_classname ) const; int WeaponIndexForAmmoClass( const idDict & spawnArgs, const char *ammo_classname ) const; ammo_t AmmoIndexForWeaponClass( const char *weapon_classname, int *ammoRequired ); const char * AmmoPickupNameForIndex( ammo_t ammonum ) const; void AddPickupName( const char * name, idPlayer * owner ); //_D3XP int HasAmmo( ammo_t type, int amount ); bool UseAmmo( ammo_t type, int amount ); int HasAmmo( const char *weapon_classname, bool includeClip = false, idPlayer* owner = NULL ); // _D3XP bool HasEmptyClipCannotRefill(const char *weapon_classname, idPlayer* owner); void UpdateArmor(); void SetInventoryAmmoForType( const int ammoType, const int amount ); void SetClipAmmoForWeapon( const int weapon, const int amount ); int GetInventoryAmmoForType( const int ammoType ) const; int GetClipAmmoForWeapon( const int weapon ) const; void WriteAmmoToSnapshot( idBitMsg & msg ) const; void ReadAmmoFromSnapshot( const idBitMsg & msg, int ownerEntityNumber ); void SetRemoteClientAmmo( const int ownerEntityNumber ); int nextItemPickup; int nextItemNum; int onePickupTime; idList pickupItemNames; idList objectiveNames; void InitRechargeAmmo(idPlayer *owner); void RechargeAmmo(idPlayer *owner); bool CanGive( idPlayer *owner, const idDict &spawnArgs, const char *statname, const char *value ); private: idArray< idPredictedValue< int >, AMMO_NUMTYPES > ammo; idArray< idPredictedValue< int >, MAX_WEAPONS > clip; }; typedef struct { int time; idVec3 dir; // scaled larger for running } loggedAccel_t; typedef struct { int areaNum; idVec3 pos; } aasLocation_t; class idPlayer : public idActor { public: enum { EVENT_IMPULSE = idEntity::EVENT_MAXEVENTS, EVENT_EXIT_TELEPORTER, EVENT_ABORT_TELEPORTER, EVENT_POWERUP, EVENT_SPECTATE, EVENT_PICKUPNAME, EVENT_FORCE_ORIGIN, EVENT_KNOCKBACK, EVENT_MAXEVENTS }; static const int MAX_PLAYER_PDA = 100; static const int MAX_PLAYER_VIDEO = 100; static const int MAX_PLAYER_AUDIO = 100; static const int MAX_PLAYER_AUDIO_ENTRIES = 2; usercmd_t oldCmd; usercmd_t usercmd; class idPlayerView playerView; // handles damage kicks and effects renderEntity_t laserSightRenderEntity; // replace crosshair for 3DTV qhandle_t laserSightHandle; bool noclip; bool godmode; bool spawnAnglesSet; // on first usercmd, we must set deltaAngles idAngles spawnAngles; idAngles viewAngles; // player view angles idAngles cmdAngles; // player cmd angles float independentWeaponPitchAngle; // viewAngles[PITCH} when head tracking is active // For interpolating angles between snapshots idQuat previousViewQuat; idQuat nextViewQuat; int buttonMask; int oldButtons; int oldImpulseSequence; int lastHitTime; // last time projectile fired by player hit target int lastSndHitTime; // MP hit sound - != lastHitTime because we throttle int lastSavingThrowTime; // for the "free miss" effect bool pdaHasBeenRead[ MAX_PLAYER_PDA ]; bool videoHasBeenViewed[ MAX_PLAYER_VIDEO ]; bool audioHasBeenHeard[ MAX_PLAYER_AUDIO ][ MAX_PLAYER_AUDIO_ENTRIES ]; idScriptBool AI_FORWARD; idScriptBool AI_BACKWARD; idScriptBool AI_STRAFE_LEFT; idScriptBool AI_STRAFE_RIGHT; idScriptBool AI_ATTACK_HELD; idScriptBool AI_WEAPON_FIRED; idScriptBool AI_JUMP; idScriptBool AI_CROUCH; idScriptBool AI_ONGROUND; idScriptBool AI_ONLADDER; idScriptBool AI_DEAD; idScriptBool AI_RUN; idScriptBool AI_PAIN; idScriptBool AI_HARDLANDING; idScriptBool AI_SOFTLANDING; idScriptBool AI_RELOAD; idScriptBool AI_TELEPORT; idScriptBool AI_TURN_LEFT; idScriptBool AI_TURN_RIGHT; // inventory idInventory inventory; idTarget_SetPrimaryObjective * primaryObjective; int flashlightBattery; idEntityPtr flashlight; idEntityPtr weapon; idMenuHandler_HUD * hudManager; idMenuScreen_HUD * hud; idMenuHandler_PDA * pdaMenu; idSWF * mpMessages; bool objectiveSystemOpen; int quickSlot[ NUM_QUICK_SLOTS ]; int weapon_soulcube; int weapon_pda; int weapon_fists; int weapon_flashlight; int weapon_chainsaw; int weapon_bloodstone; int weapon_bloodstone_active1; int weapon_bloodstone_active2; int weapon_bloodstone_active3; bool harvest_lock; int heartRate; idInterpolate heartInfo; int lastHeartAdjust; int lastHeartBeat; int lastDmgTime; int deathClearContentsTime; bool doingDeathSkin; int lastArmorPulse; // lastDmgTime if we had armor at time of hit float stamina; float healthPool; // amount of health to give over time int nextHealthPulse; bool healthPulse; bool healthTake; int nextHealthTake; //----------------------------------------------------------------- // controller shake parms //----------------------------------------------------------------- const static int MAX_SHAKE_BUFFER = 3; float controllerShakeHighMag[ MAX_SHAKE_BUFFER ]; // magnitude of the high frequency controller shake float controllerShakeLowMag[ MAX_SHAKE_BUFFER ]; // magnitude of the low frequency controller shake int controllerShakeHighTime[ MAX_SHAKE_BUFFER ]; // time the controller shake ends for high frequency. int controllerShakeLowTime[ MAX_SHAKE_BUFFER ]; // time the controller shake ends for low frequency. int controllerShakeTimeGroup; bool hiddenWeapon; // if the weapon is hidden ( in noWeapons maps ) idEntityPtr soulCubeProjectile; idAimAssist aimAssist; int spectator; bool forceScoreBoard; bool forceRespawn; bool spectating; int lastSpectateTeleport; bool lastHitToggle; bool wantSpectate; // from userInfo bool weaponGone; // force stop firing bool useInitialSpawns; // toggled by a map restart to be active for the first game spawn int tourneyRank; // for tourney cycling - the higher, the more likely to play next - server int tourneyLine; // client side - our spot in the wait line. 0 means no info. int spawnedTime; // when client first enters the game bool carryingFlag; // is the player carrying the flag? idEntityPtr teleportEntity; // while being teleported, this is set to the entity we'll use for exit int teleportKiller; // entity number of an entity killing us at teleporter exit bool lastManOver; // can't respawn in last man anymore (srv only) bool lastManPlayAgain; // play again when end game delay is cancelled out before expiring (srv only) bool lastManPresent; // true when player was in when game started (spectators can't join a running LMS) bool isLagged; // replicated from server, true if packets haven't been received from client. int isChatting; // replicated from server, true if the player is chatting. // timers int minRespawnTime; // can respawn when time > this, force after g_forcerespawn int maxRespawnTime; // force respawn after this time // the first person view values are always calculated, even // if a third person view is used idVec3 firstPersonViewOrigin; idMat3 firstPersonViewAxis; idDragEntity dragEntity; idFuncMountedObject * mountedObject; idEntityPtr enviroSuitLight; bool healthRecharge; int lastHealthRechargeTime; int rechargeSpeed; float new_g_damageScale; bool bloomEnabled; float bloomSpeed; float bloomIntensity; public: CLASS_PROTOTYPE( idPlayer ); idPlayer(); virtual ~idPlayer(); void Spawn(); void Think(); void UpdateLaserSight(); // save games void Save( idSaveGame *savefile ) const; // archives object for save game file void Restore( idRestoreGame *savefile ); // unarchives object from save game file virtual void Hide(); virtual void Show(); void Init(); void PrepareForRestart(); virtual void Restart(); void LinkScriptVariables(); void SetupWeaponEntity(); void SelectInitialSpawnPoint( idVec3 &origin, idAngles &angles ); void SpawnFromSpawnSpot(); void SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_angles ); void SetClipModel(); // spectator mode uses a different bbox size void SavePersistantInfo(); void RestorePersistantInfo(); void SetLevelTrigger( const char *levelName, const char *triggerName ); void CacheWeapons(); void EnterCinematic(); void ExitCinematic(); void UpdateConditions(); void SetViewAngles( const idAngles &angles ); // Controller Shake void ControllerShakeFromDamage( int damage ); void SetControllerShake( float highMagnitude, int highDuration, float lowMagnitude, int lowDuration ); void ResetControllerShake(); void GetControllerShake( int & highMagnitude, int & lowMagnitude ) const; idAimAssist * GetAimAssist() { return &aimAssist; } // delta view angles to allow movers to rotate the view of the player void UpdateDeltaViewAngles( const idAngles &angles ); virtual bool Collide( const trace_t &collision, const idVec3 &velocity ); virtual void GetAASLocation( idAAS *aas, idVec3 &pos, int &areaNum ) const; virtual void GetAIAimTargets( const idVec3 &lastSightPos, idVec3 &headPos, idVec3 &chestPos ); virtual void DamageFeedback( idEntity *victim, idEntity *inflictor, int &damage ); void CalcDamagePoints( idEntity *inflictor, idEntity *attacker, const idDict *damageDef, const float damageScale, const int location, int *health, int *armor ); virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location ); // New damage path for instant client feedback. void ServerDealDamage( int damage, idEntity & inflictor, idEntity & attacker, const idVec3 & dir, const char * damageDefName, const int location ); // Actually updates the player's health independent of feedback. int AdjustDamageAmount( const int inputDamage ); // use exitEntityNum to specify a teleport with private camera view and delayed exit virtual void Teleport( const idVec3 &origin, const idAngles &angles, idEntity *destination ); void Kill( bool delayRespawn, bool nodamage ); virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location ); void StartFxOnBone(const char *fx, const char *bone); renderView_t * GetRenderView(); void CalculateRenderView(); // called every tic by player code void CalculateFirstPersonView(); void AddChatMessage( int index, int alpha, const idStr & message ); void UpdateSpectatingText(); void ClearChatMessage( int index ); void DrawHUD( idMenuHandler_HUD * hudManager ); void WeaponFireFeedback( const idDict *weaponDef ); float DefaultFov() const; float CalcFov( bool honorZoom ); void CalculateViewWeaponPos( idVec3 &origin, idMat3 &axis ); idVec3 GetEyePosition() const; void GetViewPos( idVec3 &origin, idMat3 &axis ) const; void OffsetThirdPersonView( float angle, float range, float height, bool clip ); bool Give( const char *statname, const char *value, unsigned int giveFlags ); bool GiveItem( idItem *item, unsigned int giveFlags ); void GiveItem( const char *name ); void GiveHealthPool( float amt ); void SetPrimaryObjective( idTarget_SetPrimaryObjective * target ) { primaryObjective = target; } idTarget_SetPrimaryObjective * GetPrimaryObjective() { return primaryObjective; } idInventory & GetInventory() { return inventory; } bool GiveInventoryItem( idDict *item, unsigned int giveFlags ); void RemoveInventoryItem( idDict *item ); bool GiveInventoryItem( const char *name ); void RemoveInventoryItem( const char *name ); idDict * FindInventoryItem( const char *name ); idDict * FindInventoryItem( int index ); int GetNumInventoryItems(); void PlayAudioLog( const idSoundShader * sound ); void EndAudioLog(); void PlayVideoDisk( const idDeclVideo * decl ); void EndVideoDisk(); const idMaterial * GetVideoMaterial() { return pdaVideoMat; } void SetQuickSlot( int index, int val ); int GetQuickSlot( int index ); void GivePDA( const idDeclPDA * pda, const char * securityItem ); void GiveVideo( const idDeclVideo * video, const char * itemName ); void GiveEmail( const idDeclEmail * email ); void GiveSecurity( const char * security ); void GiveObjective( const char * title, const char * text, const idMaterial * screenshot ); void CompleteObjective( const char * title ); bool GivePowerUp( int powerup, int time, unsigned int giveFlags ); void ClearPowerUps(); bool PowerUpActive( int powerup ) const; float PowerUpModifier( int type ); int SlotForWeapon( const char *weaponName ); void Reload(); void NextWeapon(); void NextBestWeapon(); void PrevWeapon(); void SetPreviousWeapon( int num ) { previousWeapon = num; } void SelectWeapon( int num, bool force ); void DropWeapon( bool died ) ; void StealWeapon( idPlayer *player ); void AddProjectilesFired( int count ); void AddProjectileHits( int count ); void SetLastHitTime( int time ); void LowerWeapon(); void RaiseWeapon(); void WeaponLoweringCallback(); void WeaponRisingCallback(); void RemoveWeapon( const char *weap ); void RemoveAllButEssentialWeapons(); bool CanShowWeaponViewmodel() const; void AddAIKill(); void SetSoulCubeProjectile( idProjectile *projectile ); void AdjustHeartRate( int target, float timeInSecs, float delay, bool force ); void SetCurrentHeartRate(); int GetBaseHeartRate(); void UpdateAir(); void UpdatePowerupHud(); virtual bool HandleSingleGuiCommand( idEntity *entityGui, idLexer *src ); bool GuiActive() { return focusGUIent != NULL; } bool HandleGuiEvents( const sysEvent_t * ev ); void PerformImpulse( int impulse ); void Spectate( bool spectate, bool force = false ); void TogglePDA(); void RouteGuiMouse( idUserInterface *gui ); void UpdateHud(); const idDeclPDA * GetPDA() const; bool GetPDAOpen() const { return objectiveSystemOpen; } const idDeclVideo * GetVideo( int index ); void SetInfluenceFov( float fov ); void SetInfluenceView( const char *mtr, const char *skinname, float radius, idEntity *ent ); void SetInfluenceLevel( int level ); int GetInfluenceLevel() { return influenceActive; }; void SetPrivateCameraView( idCamera *camView ); idCamera * GetPrivateCameraView() const { return privateCameraView; } void StartFxFov( float duration ); void UpdateHudWeapon( bool flashWeapon = true ); void UpdateChattingHud(); void UpdateHudStats( idMenuHandler_HUD * hudManager ); void Event_StopAudioLog(); bool IsSoundChannelPlaying( const s_channelType channel = SND_CHANNEL_ANY ); void ShowTip( const char *title, const char *tip, bool autoHide ); void HideTip(); bool IsTipVisible() { return tipUp; }; void HideObjective(); virtual void ClientThink( const int curTime, const float fraction, const bool predict ); virtual void WriteToSnapshot( idBitMsg &msg ) const; virtual void ReadFromSnapshot( const idBitMsg &msg ); void WritePlayerStateToSnapshot( idBitMsg &msg ) const; void ReadPlayerStateFromSnapshot( const idBitMsg &msg ); virtual bool ServerReceiveEvent( int event, int time, const idBitMsg &msg ); virtual bool GetPhysicsToVisualTransform( idVec3 &origin, idMat3 &axis ); virtual bool GetPhysicsToSoundTransform( idVec3 &origin, idMat3 &axis ); virtual bool ClientReceiveEvent( int event, int time, const idBitMsg &msg ); bool IsRespawning(); bool IsInTeleport(); int GetSkinIndex() const { return skinIndex; } idEntity *GetInfluenceEntity() { return influenceEntity; }; const idMaterial *GetInfluenceMaterial() { return influenceMaterial; }; float GetInfluenceRadius() { return influenceRadius; }; // server side work for in/out of spectate. takes care of spawning it into the world as well void ServerSpectate( bool spectate ); // for very specific usage. != GetPhysics() idPhysics *GetPlayerPhysics(); void TeleportDeath( int killer ); void SetLeader( bool lead ); bool IsLeader(); void UpdateSkinSetup(); bool OnLadder() const; virtual void UpdatePlayerIcons(); virtual void DrawPlayerIcons(); virtual void HidePlayerIcons(); bool NeedsIcon(); void StartHealthRecharge(int speed); void StopHealthRecharge(); idStr GetCurrentWeapon(); int GetCurrentWeaponSlot() { return currentWeapon; } int GetIdealWeapon() { return idealWeapon.Get(); } idHashTable GetWeaponToggles() const { return weaponToggles; } bool CanGive( const char *statname, const char *value ); void StopHelltime( bool quick = true ); void PlayHelltimeStopSound(); void DropFlag(); // drop CTF item void ReturnFlag(); virtual void FreeModelDef(); bool SelfSmooth(); void SetSelfSmooth( bool b ); const idAngles & GetViewBobAngles() { return viewBobAngles; } const idVec3 & GetViewBob() { return viewBob; } idAchievementManager & GetAchievementManager() { return achievementManager; } const idAchievementManager & GetAchievementManager() const { return achievementManager; } int GetPlayedTime() const { return playedTimeSecs; } void HandleUserCmds( const usercmd_t & newcmd ); int GetClientFireCount() const { return clientFireCount; } void IncrementFireCount() { ++clientFireCount; } void ShowRespawnHudMessage(); void HideRespawnHudMessage(); bool IsLocallyControlled() const { return entityNumber == gameLocal.GetLocalClientNum(); } gameExpansionType_t GetExpansionType() const; void AddProjectileKills() { numProjectileKills++; } int GetProjectileKills() const { return numProjectileKills; } void ResetProjectileKills() { numProjectileKills = 0; } private: // Stats & achievements idAchievementManager achievementManager; int playedTimeSecs; int playedTimeResidual; jointHandle_t hipJoint; jointHandle_t chestJoint; jointHandle_t headJoint; idPhysics_Player physicsObj; // player physics idList aasLocation; // for AI tracking the player int bobFoot; float bobFrac; float bobfracsin; int bobCycle; // for view bobbing and footstep generation float xyspeed; int stepUpTime; float stepUpDelta; float idealLegsYaw; float legsYaw; bool legsForward; float oldViewYaw; idAngles viewBobAngles; idVec3 viewBob; int landChange; int landTime; int currentWeapon; idPredictedValue< int > idealWeapon; int previousWeapon; int weaponSwitchTime; bool weaponEnabled; int skinIndex; const idDeclSkin * skin; const idDeclSkin * powerUpSkin; int numProjectilesFired; // number of projectiles fired int numProjectileHits; // number of hits on mobs int numProjectileKills; // number of kills with a projectile. bool airless; int airMsec; // set to pm_airMsec at start, drops in vacuum int lastAirDamage; bool gibDeath; bool gibsLaunched; idVec3 gibsDir; idInterpolate zoomFov; idInterpolate centerView; bool fxFov; float influenceFov; int influenceActive; // level of influence.. 1 == no gun or hud .. 2 == 1 + no movement idEntity * influenceEntity; const idMaterial * influenceMaterial; float influenceRadius; const idDeclSkin * influenceSkin; idCamera * privateCameraView; static const int NUM_LOGGED_VIEW_ANGLES = 64; // for weapon turning angle offsets idAngles loggedViewAngles[NUM_LOGGED_VIEW_ANGLES]; // [gameLocal.framenum&(LOGGED_VIEW_ANGLES-1)] static const int NUM_LOGGED_ACCELS = 16; // for weapon turning angle offsets loggedAccel_t loggedAccel[NUM_LOGGED_ACCELS]; // [currentLoggedAccel & (NUM_LOGGED_ACCELS-1)] int currentLoggedAccel; // if there is a focusGUIent, the attack button will be changed into mouse clicks idEntity * focusGUIent; idUserInterface * focusUI; // focusGUIent->renderEntity.gui, gui2, or gui3 idAI * focusCharacter; int talkCursor; // show the state of the focusCharacter (0 == can't talk/dead, 1 == ready to talk, 2 == busy talking) int focusTime; idAFEntity_Vehicle * focusVehicle; idUserInterface * cursor; // full screen guis track mouse movements directly int oldMouseX; int oldMouseY; const idMaterial * pdaVideoMat; bool tipUp; bool objectiveUp; int lastDamageDef; idVec3 lastDamageDir; int lastDamageLocation; int smoothedFrame; bool smoothedOriginUpdated; idVec3 smoothedOrigin; idAngles smoothedAngles; idHashTable weaponToggles; int hudPowerup; int lastHudPowerup; int hudPowerupDuration; // mp bool respawning; // set to true while in SpawnToPoint for telefrag checks bool leader; // for sudden death situations int lastSpectateChange; int lastTeleFX; bool weaponCatchup; // raise up the weapon silently ( state catchups ) int MPAim; // player num in aim int lastMPAim; int lastMPAimTime; // last time the aim changed int MPAimFadeTime; // for GUI fade bool MPAimHighlight; bool isTelefragged; // proper obituaries int serverOverridePositionTime; int clientFireCount; idPlayerIcon playerIcon; bool selfSmooth; netBoolEvent_t respawn_netEvent; void LookAtKiller( idEntity *inflictor, idEntity *attacker ); void StopFiring(); void FireWeapon(); void Weapon_Combat(); void Weapon_NPC(); void Weapon_GUI(); void UpdateWeapon(); void UpdateFlashlight(); void FlashlightOn(); void FlashlightOff(); void UpdateSpectating(); void SpectateFreeFly( bool force ); // ignore the timeout to force when followed spec is no longer valid void SpectateCycle(); idAngles GunTurningOffset(); idVec3 GunAcceleratingOffset(); void UseObjects(); void CrashLand( const idVec3 &oldOrigin, const idVec3 &oldVelocity ); void BobCycle( const idVec3 &pushVelocity ); void UpdateViewAngles(); void EvaluateControls(); void AdjustSpeed(); void AdjustBodyAngles(); void InitAASLocation(); void SetAASLocation(); void Move(); void Move_Interpolated( float fraction ); void RunPhysics_RemoteClientCorrection(); void UpdatePowerUps(); void UpdateDeathSkin( bool state_hitch ); void ClearPowerup( int i ); void SetSpectateOrigin(); bool AllowClientAuthPhysics(); virtual int GetPhysicsTimeStep() const; void ClearFocus(); void UpdateFocus(); void UpdateLocation(); idUserInterface * ActiveGui(); // mp void Respawn_Shared(); bool WeaponAvailable( const char* name ); void UseVehicle(); void Event_GetButtons(); void Event_GetMove(); void Event_GetViewAngles(); void Event_StopFxFov(); void Event_EnableWeapon(); void Event_DisableWeapon(); void Event_GetCurrentWeapon(); void Event_GetPreviousWeapon(); void Event_SelectWeapon( const char *weaponName ); void Event_GetWeaponEntity(); void Event_OpenPDA(); void Event_PDAAvailable(); void Event_InPDA(); void Event_ExitTeleporter(); void Event_HideTip(); void Event_LevelTrigger(); void Event_Gibbed(); void Event_ForceOrigin( idVec3 & origin, idAngles & angles ); void Event_GiveInventoryItem( const char* name ); void Event_RemoveInventoryItem( const char* name ); void Event_GetIdealWeapon(); void Event_WeaponAvailable( const char* name ); void Event_SetPowerupTime( int powerup, int time ); void Event_IsPowerupActive( int powerup ); void Event_StartWarp(); void Event_StopHelltime( int mode ); void Event_ToggleBloom( int on ); void Event_SetBloomParms( float speed, float intensity ); }; ID_INLINE bool idPlayer::IsRespawning() { return respawning; } ID_INLINE idPhysics* idPlayer::GetPlayerPhysics() { return &physicsObj; } ID_INLINE bool idPlayer::IsInTeleport() { return ( teleportEntity.GetEntity() != NULL ); } ID_INLINE void idPlayer::SetLeader( bool lead ) { leader = lead; } ID_INLINE bool idPlayer::IsLeader() { return leader; } ID_INLINE bool idPlayer::SelfSmooth() { return selfSmooth; } ID_INLINE void idPlayer::SetSelfSmooth( bool b ) { selfSmooth = b; } extern idCVar g_infiniteAmmo; #endif /* !__GAME_PLAYER_H__ */