// Copyright (C) 2007 Id Software, Inc. // #ifndef __GAME_LOCAL_H__ #define __GAME_LOCAL_H__ void gameError( const char *fmt, ... ); #include "physics/Clip.h" #include "physics/ClipModel.h" #include "physics/TraceModelCache.h" #include "physics/Push.h" #include "Game.h" #include "Game_network.h" #include "Pvs.h" #include "roles/RoleManager.h" // Gordon: FIXME: get rid of this #include "Entity.h" #include "PlayerProperties.h" #include "LimboProperties.h" #include "UpdateManager.h" #include "rules/GUIDState.h" #include "decls/HeightMap.h" #include "physics/PhysicsEvent.h" #include "proficiency/ProficiencyManager.h" #include "PlayerView.h" #include "AORManager.h" #include "proficiency/StatsTracker.h" #ifndef _XENON #include "sdnet/SDNetManager.h" #endif //_XENON // Gordon: FIXME: Remove these #include "anim/Anim.h" #include "decls/GameDeclInfo.h" #include "decls/DeclAmmoType.h" #include "decls/DeclCampaign.h" #include "decls/DeclDamage.h" #include "decls/DeclDamageFilter.h" #include "decls/DeclDeployableObject.h" #include "decls/DeclDeployableZone.h" #include "decls/DeclInvItem.h" #include "decls/DeclInvItemType.h" #include "decls/DeclInvSlot.h" #include "decls/DeclItemPackage.h" #include "decls/DeclMapInfo.h" #include "decls/DeclProficiencyItem.h" #include "decls/DeclProficiencyType.h" #include "decls/DeclQuickChat.h" #include "decls/DeclRank.h" #include "decls/DeclStringMap.h" #include "decls/DeclTargetInfo.h" #include "decls/DeclToolTip.h" #include "decls/declVehicleScript.h" #include "decls/DeclPlayerClass.h" #include "decls/DeclGUI.h" #include "decls/DeclGUITheme.h" #include "decls/DeclPlayerTask.h" #include "decls/DeclRequirement.h" #include "decls/DeclVehiclePath.h" #include "decls/DeclKeyBinding.h" #include "decls/DeclRadialMenu.h" #include "decls/DeclAOR.h" #include "decls/DeclRating.h" #include "decls/DeclHeightMap.h" #include "decls/DeclDeployMask.h" #include "../decllib/declAF.h" #include "../decllib/declAtmosphere.h" #include "../decllib/declEntityDef.h" #include "../decllib/declSkin.h" #include "../decllib/declTable.h" #include "../decllib/declStuffType.h" #include "../decllib/declDecal.h" #include "../decllib/declLocStr.h" #include "gamesys/Pvs.h" // Gordon: For oob access prevention template< typename T, const int MAX > class sdSafeArray { public: ID_INLINE T& operator[] ( int index ) { assert( index >= 0 && index < MAX ); return data[ index ]; } ID_INLINE const T& operator[] ( int index ) const { assert( index >= 0 && index < MAX ); return data[ index ]; } ID_INLINE void Memset( int value ) { memset( data, value, sizeof( data ) ); } private: T data[ MAX ]; }; class sdLoggedTrace : public idClass { public: CLASS_PROTOTYPE( sdLoggedTrace ); sdLoggedTrace( void ); ~sdLoggedTrace( void ); void Init( int index, const trace_t& _trace ); idScriptObject* GetScriptObject( void ) { return object; } const trace_t* GetTrace( void ) const { return &trace; } int GetIndex( void ) const { return index; } void Event_GetTraceFraction( void ); void Event_GetTraceEndPos( void ); void Event_GetTracePoint( void ); void Event_GetTraceNormal( void ); void Event_GetTraceEntity( void ); void Event_GetTraceSurfaceFlags( void ); void Event_GetTraceSurfaceType( void ); void Event_GetTraceSurfaceColor( void ); void Event_GetTraceJoint( void ); void Event_GetTraceBody( void ); private: idScriptObject* object; trace_t trace; int index; }; class sdUIScopeParser { public: sdUIScopeParser( const char* text ); bool IsLastEntry( void ) const { return entryIndex == entries.Num(); } const char* GetNextEntry( void ) { if ( entryIndex < entries.Num() ) { return entries[ entryIndex++ ]; } return NULL; } void Revert( void ) { entryIndex--; assert( entryIndex >= 0 ); } private: char entryText[ 256 ]; idStaticList< const char*, 32 > entries; int entryIndex; }; struct userInfo_t { void ToDict( idDict& info ) const; void FromDict( const idDict& info ); idStr name; idStr baseName; idStr rawName; idStr cleanName; idWStr wideName; bool showGun; bool ignoreExplosiveWeapons; bool autoSwitchEmptyWeapons; bool postArmFindBestWeapon; bool advancedFlightControls; bool rememberCameraMode; bool drivingCameraFreelook; bool isBot; bool voipReceiveGlobal; bool voipReceiveTeam; bool voipReceiveFireTeam; bool showComplaints; bool swapFlightYawAndRoll; }; /* =============================================================================== Local implementation of the public game interface. =============================================================================== */ const int LAGO_IMG_WIDTH = 64; const int LAGO_IMG_HEIGHT = 64; const int LAGO_WIDTH = 64; const int LAGO_HEIGHT = 44; #define LAGO_MATERIAL "textures/sfx/lagometer" #define LAGO_IMAGE "textures/sfx/lagometer.tga" const int MAX_BATTLESENSE_RANKS = 5; // if set to 1 the server sends the client PVS with snapshots and the client compares against what it sees #ifndef ASYNC_WRITE_PVS #define ASYNC_WRITE_PVS 0 #endif // the "gameversion" client command will print this plus compile date #define GAME_VERSION "baseETQW-1" const int NUM_RENDER_PORTAL_BITS = idMath::BitsForInteger( PS_BLOCK_ALL ); const unsigned short DOF_VIEWWEAPON_VIEW_ID = 0xFFFD; // classes used by idGameLocal class idPlayerStart; class idEntity; class idActor; class idPlayer; class idCamera; class idWorldspawn; class idTestModel; class idTypeInfo; class idEditEntities; class idRenderWorld; class idSoundWorld; class sdGameRules; class sdDeclMapInfo; class sdDeclDamage; class sdTeamInfo; class idGameLocal; class sdVehiclePathGrid; class sdDeployMask; class sdDeployRequest; class sdDeployZone; class sdProgram; class sdKeyCommand; class sdBindContext; class sdPlayerStatEntry; extern idRenderWorld* gameRenderWorld; extern idSoundWorld* gameSoundWorld; #ifdef _XENON class LiveManager; //Forward Declarations to prevent rebuild all class LiveService; //downside is anyone who used it must include the header. extern LiveService* liveService; extern LiveManager* liveManager; #endif extern idCVar com_timescale; extern idCVar com_timeServer; extern idCVar g_debugPlayerList; extern idCVar g_skipLocalizedPrecipitation; //============================================================================ class sdPlayZone { public: enum playZoneFlags_t { PZF_COMMANDMAP = BITT< 0 >::VALUE, PZF_PLAYZONE = BITT< 1 >::VALUE, PZF_DEPLOYMENT = BITT< 2 >::VALUE, PZF_PATH = BITT< 3 >::VALUE, PZF_HEIGHTMAP = BITT< 4 >::VALUE, PZF_VEHICLEROUTE = BITT< 5 >::VALUE, PZF_WORLD = BITT< 6 >::VALUE, PZF_CHOOSABLE = BITT< 7 >::VALUE, }; sdPlayZone( const idDict& info, const idBounds& bounds ); ~sdPlayZone( void ); const idVec2& GetSize( void ) const { return _size; } const sdBounds2D& GetBounds( void ) const { return _bounds; } int GetFlags( void ) const { return _flags; } const sdDeployMaskInstance* GetMask( qhandle_t handle ) const; int GetPriority( void ) const { return _priority; } const char* GetTarget( void ) const { return _target; } sdVehiclePathGrid* GetPath( const char* name ) const; const sdHeightMapInstance& GetHeightMap( void ) const { return _heightMap; } void SaveMasks( void ); const idMaterial* GetCommandMapMaterial( void ) const { return _commandmapMaterial; } const sdDeclLocStr* GetTitle( void ) const { return _title; } private: sdBounds2D _bounds; idVec2 _size; idList< sdDeployMaskInstance > _masks; int _flags; int _priority; idStr _target; const idMaterial* _commandmapMaterial; sdHeightMapInstance _heightMap; const sdDeclLocStr* _title; typedef sdPair< idStr, sdVehiclePathGrid* > playzonePath_t; idList< playzonePath_t > _paths; }; /* ============ serverInfo_t ============ */ struct serverInfo_t { int timeLimit; bool adminStart; bool votingDisabled; bool noProficiency; int minPlayers; float readyPercent; bool gameReviewReadyWait; }; /* ============ gameDecalInfo_t ============ */ struct gameDecalInfo_t { qhandle_t renderEntityHandle; renderEntity_t renderEntity; }; enum radiusPushFlags_t { RP_GROUNDONLY = BITT< 0 >::VALUE, }; /* ============ sdSpawnPoint ============ */ class sdSpawnPoint { public: sdSpawnPoint( void ) { _lastUsedTime = 0; _relativePosition = true; _parachute = false; _inUse = false; } void Clear( void ); idEntity* GetOwner( void ) const; const sdRequirementContainer& GetRequirements( void ) const { return _requirements; } const idVec3& GetOffset( void ) const { return _offset; } const idAngles& GetAngles( void ) const { return _angles; } bool GetRelativePositioning( void ) const { return _relativePosition; } int GetLastUsedTime( void ) const { return _lastUsedTime; } void SetLastUsedTime( int lastTime ) const { _lastUsedTime = lastTime; } sdRequirementContainer& GetRequirements( void ) { return _requirements; } void SetOwner( idEntity* owner ); void SetPosition( const idVec3& offset, const idAngles& angles ) { _offset = offset; _angles = angles; } void SetRelativePositioning( bool value ) { _relativePosition = value; } bool GetParachute( void ) const { return _parachute; } void SetParachute( bool parachute ) { _parachute = parachute; } void SetInUse( bool inUse ) { _inUse = inUse; } bool InUse( void ) const { return _inUse; } private: idEntityPtr< idEntity > _owner; idVec3 _offset; idAngles _angles; sdRequirementContainer _requirements; bool _relativePosition; bool _parachute; mutable int _lastUsedTime; bool _inUse; }; /* ============ surfaceProperties_t ============ */ struct surfaceProperties_t { surfaceProperties_t() : friction( 1.0f ) {} float friction; }; /* =============================================================================== sdEntityCollection =============================================================================== */ class sdEntityCollection { public: sdEntityCollection( void ) { } ~sdEntityCollection( void ) { } void SetName( const char* _name ) { name = _name; } void Add( idEntity* entity ) { mask.Set( entity->entityNumber ); list.Alloc() = entity; } void Remove( idEntity* entity ); int Num( void ) const { return list.Num(); } idEntity* operator[]( int index ) const { return list[ index ]; } const char* GetName( void ) const { return name; } bool Contains( idEntity* entity ) const { return Contains( entity->entityNumber ); } bool Contains( int entityNumber ) const { return mask[ entityNumber ] != 0; } void Clear( void ) { mask.Clear(); list.SetNum( 0, false ); } private: idStr name; sdBitField< MAX_GENTITIES > mask; idList< idEntityPtr< idEntity > > list; }; /* ============ sdEntityNetEvent ============ */ class sdEntityNetEvent { public: typedef idLinkList< sdEntityNetEvent > nodeType_t; static const size_t MAX_EVENT_PARAM_SIZE = 128; sdEntityNetEvent( void ); void Create( const idEntity* _entity, int _event, bool _saveEvent, const idBitMsg* _msg ); void Create( const sdEntityNetEvent& other ); void Read( const idBitMsg& msg ); void Write( idBitMsg& msg ) const; void OutputParms( idBitMsg& msg ) const; void Write( idFile* file ) const; void Read( idFile* file ); int GetEntityNumber( void ) const { return ( spawnId & ( ( 1 << GENTITYNUM_BITS ) - 1 ) ); } int GetId( void ) const { return spawnId >> GENTITYNUM_BITS; } int GetSpawnId( void ) const { return spawnId; } int GetEvent( void ) const { return event; } int GetTime( void ) const { return time; } int GetParamsSize( void ) const { return paramsSize; } const byte* GetParams( void ) const { return paramsBuf; } bool ShouldSaveEvent( void ) const { return saveEvent; } int GetTotalSize( void ) const; nodeType_t& GetNode( void ) { return node; } const nodeType_t& GetNode( void ) const { return node; } private: int spawnId; int event; int time; bool saveEvent; int paramsSize; byte paramsBuf[ MAX_EVENT_PARAM_SIZE ]; nodeType_t node; }; /* ============ sdUnreliableEntityNetEvent ============ */ class sdUnreliableEntityNetEvent : public sdEntityNetEvent { public: typedef idLinkList< sdUnreliableEntityNetEvent > unreliableNodeType_t; sdUnreliableEntityNetEvent( void ); void ClearSent( void ); void SetSent( int clientTo ); bool GetSent( int clientTo ) const; #ifdef SD_SUPPORT_REPEATER void SetRepeaterSent( int clientTo ); bool GetRepeaterSent( int clientTo ) const; #endif // SD_SUPPORT_REPEATER bool HasExpired( void ) const; unreliableNodeType_t& GetUnreliableNode( void ) { return unreliableNode; } const unreliableNodeType_t& GetUnreliableNode( void ) const { return unreliableNode; } private: sdBitField< MAX_CLIENTS+1 > sentClients; #ifdef SD_SUPPORT_REPEATER sdBitField_Dynamic sentRepeaterClients; int numRepeaterClients; #endif // SD_SUPPORT_REPEATER unreliableNodeType_t unreliableNode; }; /* ============ sdEnvDefinition ============ */ struct sdEnvDefinition { idVec3 origin; idStr name; int size; }; class sdEntityDebugInfo { public: enum operation_t { OP_CREATE, OP_DESTROY, OP_NONE, }; public: sdEntityDebugInfo( void ); void OnCreate( idEntity* self ); void OnDestroy( idEntity* self ); void PrintStatus( int index ); int lastOperationTime; operation_t lastOperation; idTypeInfo* type; idStr name; }; struct savedPlayerStat_t { const sdDeclRank* rank; const sdTeamInfo* team; idStr name; float value; float data[ MAX_CLIENTS ]; }; //=============================================================== //============================================================================ class sdUserInterfaceLocal; class sdUIWindow; const int NUM_DEPLOY_REQUESTS = MAX_CLIENTS; const int GUI_GLOBALS_HANDLE = -999; struct persistentRank_t { int rank; bool calculated; }; struct lifeStat_t { idStr stat; const sdDeclLocStr* text; // used for lists const sdDeclLocStr* textLong; // used for in-game announcements bool isTimeBased; }; struct quickChatMuteEntry_t { idStr name; }; class idGameLocal : public idGame { public: idDict serverInfo; // all the tunable parameters, like numclients, etc serverInfo_t serverInfoData; int numClients; // pulled from serverInfo and verified // [ usercmd_t usercmds[ MAX_CLIENTS ]; // client input commands sdDeployRequest* deployRequests[ NUM_DEPLOY_REQUESTS ]; bool clientConnected[ MAX_CLIENTS ]; persistentRank_t clientRanks[ MAX_CLIENTS ]; sdNetStatKeyValList clientStatsList[ MAX_CLIENTS ]; idHashIndex clientStatsHash[ MAX_CLIENTS ]; int clientLastBanIndexReceived[ MAX_CLIENTS ]; bool clientStatsRequestsPending; #if !defined( SD_DEMO_BUILD ) sdNetTask* clientStatsRequestTask; int clientStatsRequestIndex; #endif /* !SD_DEMO_BUILD */ int clientCompaintCount[ MAX_CLIENTS ]; idList< sdNetClientId > clientUniqueComplaints[ MAX_CLIENTS ]; sdBitField< MAX_CLIENTS >clientMuteMask[ MAX_CLIENTS ]; // Mask of people who have muted this player idList< quickChatMuteEntry_t > clientQuickChatMuteList; // List of players the local client has muted for quickchat // ] // [ sdSafeArray< idEntity*, MAX_GENTITIES > entities;// index to entities int spawnIds[ MAX_GENTITIES ];// for use in idEntityPtr sdEntityDebugInfo entityDebugInfo[ MAX_GENTITIES ]; // for debugging ( mainly network ) issues // ] int firstFreeIndex; // first free index in the entities array int numEntities; // current number <= MAX_GENTITIES idHashIndex entityHash; // hash table to quickly find entities by name idWorldspawn* world; // world entity idLinkList< idEntity > spawnedEntities; // all spawned entities idLinkList< idEntity > networkedEntities; // all entities that want to send/receive network traffic idLinkList< idEntity > nonNetworkedEntities; // all entities that dont send/receive network traffic idLinkList< idEntity > activeEntities; // all thinking entities (idEntity::thinkFlags != 0) idLinkList< idEntity > activeNetworkEntities; // all thinking entities (idEntity::thinkFlags != 0) idLinkList< idEntity > postThinkEntities; // idList< idEntityPtr< idEntity > > changedEntities; bool sortPushers; // true if active lists needs to be reordered to place pushers at the front bool sortTeamMasters; // true if active lists needs to be reordered to place physics team masters before their slaves bool insideExecuteMapChange; idTraceModelCache traceModelCache; sdLock clientEntLock; class rvClientEntity* clientEntities[ MAX_CENTITIES ]; // index to client entities int clientSpawnIds[ MAX_CENTITIES ]; // for use in idClientEntityPtr idLinkList clientSpawnedEntities; // all client side entities int num_clientEntities; // current number of client entities int firstFreeClientIndex; // first free index in the client entities array int mapLoadCount; sdPlayerStatEntry* totalShotsFiredStat; sdPlayerStatEntry* totalShotsHitStat; sdPhysicsEvent::nodeType_t physicsEvents; idPlayerView playerView; // handles damage kicks and effects idRandom random; // random number generator used throughout the game sdProgram* program; // currently loaded script and data space sdProgramThread* frameCommandThread; idClip clip; // collision detection idPush push; // geometric pushing idPVS pvs; // potential visible set sdAORManagerLocal aorManager; sdPersistentRankInfo rankInfo; sdPersistentRankInfo::sdRankInstance rankScratchInfo; idTestModel * testmodel; // for development testing of models sdGameRules* rules; const sdDeclMapInfo* mapInfo; const idDict* mapMetaData; const idDict defaultMetaData; const sdDeclStringMap* mapSkinPool; qhandle_t playzoneMask; const sdDeclProficiencyItem* battleSenseBonus[ MAX_BATTLESENSE_RANKS ]; idEditEntities * editEntities; // in game editing typedef struct targetTimer_s { idStr name; int endTimes[ MAX_CLIENTS ]; int serverHandle; } targetTimer_t; idList< targetTimer_t> targetTimers; idList< int > targetTimerLookup; int numServerTimers; idList< savedPlayerStat_t > endGameStats; idList< lifeStat_t > lifeStats; int framenum; int startTime; int previousTime; // time in msec of last frame int time; // in msec int timeOffset; // int msec; // time since last update in milliseconds int localViewChangedTime; // time that the local player view changed int playerSpawnTime; // time at which players are allowed to spawn again int nextTeamBalanceCheckTime; bool isServer; // set if the game is run for a dedicated or listen server bool isClient; // set if the game is run for a client bool isRepeater; bool serverIsRepeater; bool snapShotClientIsRepeater; mutable int repeaterClientFollowIndex; bool isPaused; bool pauseViewInited; idVec3 pauseViewOrg; idAngles pauseViewAngles; idAngles pauseViewAnglesBase; int pauseStartGuiTime; // discriminates between the RunFrame path and the ClientPrediction path // NOTE: on a listen server, isClient is false int localClientNum; // number of the local client. MP: -1 on a dedicated idLinkList snapshotEntities; // entities from the last snapshot idLinkList snapshotVisbileEntities;// entities from the last snapshot that are actually visible int realClientTime; // real client time bool isNewFrame; // true if this is a new game frame, not a rerun due to prediction bool predictionUpdateRequired; float flightCeilingLower; float flightCeilingUpper; idHashIndex entityCollectionsHash; idList< sdEntityCollection* > entityCollections; sdGUIDFile guidFile; sdPlayerProperties localPlayerProperties; sdGlobalProperties globalProperties; sdLimboProperties limboProperties; sdUpdateManager updateManager; idFile* proficiencyLog; idFile* networkLog; idFile* objectiveLog; float globalShaderParms[ MAX_GLOBAL_SHADER_PARMS ]; sdBindContext* defaultBindContext; // fps unlock idCVar *com_unlockFPS; // shortcut to the core cvar idLinkList interpolateEntities; // entities marked for interpolation struct idUnlock { bool canUnlockFrames; // tracks when extra view and angles updates are allowed bool unlockedDraw; // differenciate between doing draws for unlocked frames and regular draws idVec3 originlog[2]; // log last two origins idAngles minAngles; idAngles maxAngles; idAngles refAngles; int lastFullDrawFrame; bool doWeapon; idVec3 viewOrigin; idVec3 weaponOrigin; idMat3 weaponAxis; idVec3 weaponGUIOrigin; idMat3 weaponGUIAxis; } unlock; // ---------------------- Public idGame Interface ------------------- idGameLocal(); const idList< guiScope_t >& GetUIScopes() const { return uiScopes; } sdEntityCollection* GetEntityCollection( const char* name, bool allowCreate = false ); qhandle_t GetPlayZoneMask( void ) const { return playzoneMask; } void LoadScript( void ); void OnPreMapStart( void ); void OnNewMapLoad( const char* mapName ); void OnMapStart( void ); static void CleanName( idStr& name ); bool IsMultiPlayer( void ); bool IsMetaDataValidForPlay( const metaDataContext_t& context, bool checkBrowserStatus ); virtual void Init( void ); virtual void Shutdown( void ); virtual void UserInfoChanged( int clientNum ); virtual bool ValidateUserInfo( int clientNum, idDict& _userInfo ); virtual void SetServerInfo( const idDict &serverInfo ); void ParseServerInfo( void ); void LoadLifeStatsData( void ); void PushChangedEntity( idEntity* ent ); sdDeployZone* TerritoryForPoint( const idVec3& point, sdTeamInfo* team = NULL, bool requireTeam = false, bool requireActive = false ) const; void MakeRules( void ); idTypeInfo* GetRulesType( bool errorOnFail ); void ChangeLocalSpectateClient( int spectateeNum ); int GetRepeaterFollowClientIndex( void ) const; #ifdef SD_SUPPORT_REPEATER virtual void RepeaterClientDisconnect( int clientNum ); virtual void RepeaterWriteInitialReliableMessages( int clientNum ); virtual void RepeaterWriteSnapshot( int clientNum, int sequence, idBitMsg &msg, idBitMsg &ucmdmsg, const repeaterUserOrigin_t& userOrigin, bool clientIsRepeater ); virtual allowReply_t RepeaterAllowClient( int numViewers, int maxViewers, const clientNetworkAddress_t& address, const sdNetClientId& netClientId, const char *guid, const char *password, allowFailureReason_t& reason, bool isRepeater ); virtual void RepeaterClientBegin( int clientNum ); virtual void SetRepeaterState( bool isRepeater ); virtual bool RepeaterApplySnapshot( int clientNum, int sequence ); virtual void RepeaterProcessReliableMessage( int clientNum, const idBitMsg &msg ); void BuildRepeaterInfo( idDict &repeaterInfo ); void UpdateRepeaterInfo( void ); int GetNumRepeaterClients( void ) const; bool IsRepeaterClientConnected( int clientNum ) const; void ShutdownRepeatersNetworkStates( void ); void ShutdownRepeatersNetworkState( int clientNum ); #endif // SD_SUPPORT_REPEATER virtual void InitFromNewMap( const char *mapName, idRenderWorld *renderWorld, idSoundWorld *soundWorld, bool isServer, bool isClient, int randSeed, int startTime, bool isUserChange ); virtual void MapShutdown( void ); void CacheDictionaryMedia_r( const idTypeInfo* cls, const idDict& dict ); virtual void CacheDictionaryMedia( const idDict& dict ); void DumpOggSounds(); void GetShakeSounds( const idDict& dict ); virtual void FinishBuild( void ); virtual void SpawnPlayer( int clientNum, bool isBot ); virtual void RunFrame( const usercmd_t* clientCmds, int elapsedTime ); virtual bool Draw(); virtual bool Draw2D(); bool IsPaused( void ); void SetPaused( bool value ); void OnPausedChanged( void ); void SendPauseInfo( const sdReliableMessageClientInfoBase& info ); int ToGuiTime( int time ) { return time + timeOffset; } void GetPausedView( idVec3& origin, idMat3& axis ); void UpdatePauseNoClip( usercmd_t& cmd ); void SetActionCommand( const char* action ); sdBindContext* GetDefaultBindContext( void ) { return defaultBindContext; } idPlayer* GetActiveViewer( void ) const; virtual void OnServerShutdown( void ); virtual allowReply_t ServerAllowClient( int numClients, int numBots, const clientNetworkAddress_t& address, const sdNetClientId& netClientId, const char *guid, const char *password, allowFailureReason_t& reason ); void HandleGuiScriptMessage( idPlayer* player, idEntity* entity, const char* message ); void HandleNetworkMessage( idPlayer* player, idEntity* entity, const char* message ); void HandleNetworkEvent( idEntity* entity, const char* message ); virtual void PacifierUpdate(); sdNetworkStateObject& GetGameStateObject( extNetworkStateMode_t mode ); void WriteGameState( extNetworkStateMode_t mode, snapshot_t* snapshot, clientNetworkInfo_t& info, idBitMsg& msg ); void ReadGameState( extNetworkStateMode_t mode, snapshot_t* snapshot, const idBitMsg& msg ); void ResetGameState( extNetworkStateMode_t mode ); void ParseClamp( angleClamp_t& clamp, const char* prefix, const idDict& dict ); void FreeGameState( sdGameState* state ); void FreeNetworkState( sdEntityState* state ); void CreateNetworkState( int entityNum ); void CreateNetworkState( clientNetworkInfo_t& networkInfo, int entityNum ); void FreeNetworkState( clientNetworkInfo_t& networkInfo, int entityNum ); void FreeNetworkState( int entityNum ); void ClientSpawn( int entityNum, int spawnId, int typeNum, int entityDefNumber, int mapSpawnId ); void OnEntityCreateMessage( const idBitMsg& msg ); snapshot_t* AllocateSnapshot( int sequence, clientNetworkInfo_t& nwInfo ); void WriteSnapshotGameStates( snapshot_t* snapshot, clientNetworkInfo_t& nwInfo, idBitMsg& msg ); void WriteSnapshotEntityStates( snapshot_t* snapshot, clientNetworkInfo_t& nwInfo, int clientNum, idBitMsg& msg, bool useAOR ); void WriteSnapshotUserCmds( snapshot_t* snapshot, idBitMsg& msg, int ignoreClientNum, bool useAOR ); void WriteInitialReliableMessages( const sdReliableMessageClientInfoBase& target ); void HandleNewEntityEvent( const idBitMsg &msg ); virtual void ServerClientConnect( int clientNum ); virtual void ServerClientBegin( int clientNum, bool isBot ); virtual void SetClientNum( int clientNum, bool server ); virtual void ServerClientDisconnect( int clientNum ); virtual void ServerWriteInitialReliableMessages( int clientNum ); virtual void ServerWriteSnapshot( int clientNum, int sequence, idBitMsg &msg, idBitMsg &ucmdmsg ); virtual bool ServerApplySnapshot( int clientNum, int sequence ); virtual void ServerProcessReliableMessage( int clientNum, const idBitMsg &msg ); void EnsureAlloced( int entityNum, idEntity* ent, const char* oldState, const char* currentState ); void ClientWriteGameState( idFile* file ); void ClientReadGameState( idFile* file ); bool SetupClientAoR( void ); virtual bool ClientReadSnapshot( int sequence, const int gameFrame, const int gameTime, const int numDuplicatedUsercmds, const int aheadOfServer, const idBitMsg &msg, const idBitMsg &ucmdmsg ); virtual bool ClientApplySnapshot( int sequence ); virtual void ClientProcessReliableMessage( const idBitMsg &msg ); virtual void ClientPrediction( const usercmd_t* clientCmds, const usercmd_t* demoCmd ); virtual void OnSnapshotHitch( int snapshotTime ); virtual void OnClientDisconnected( void ); virtual void ClientUpdateView( const usercmd_t &cmd, int timeLeft ); virtual void WriteClientNetworkInfo( idFile* file ); virtual void ReadClientNetworkInfo( idFile* file ); virtual void WriteUserInfo( idBitMsg& msg, const idDict& info ); virtual void ReadUserInfo( const idBitMsg& msg, idDict& info ); virtual void CreateStatusResponseDict( const idDict& serverInfo, idDict& statusResponseDict ); virtual int GetProbeTime() const; virtual byte GetProbeState() const; virtual void WriteExtendedProbeData( idBitMsg& msg ); void LogComplaint( idPlayer* player, idPlayer* attacker ); bool DoSkyCheck( const idVec3& location ) const; virtual bool HandleGuiEvent( const sdSysEvent* event ); virtual bool TranslateGuiBind( const idKey& key, sdKeyCommand** cmd ); virtual void ShowMainMenu(); virtual void HideMainMenu(); virtual bool IsMainMenuActive(); virtual void DrawMainMenu(); virtual void DrawLoadScreen(); virtual void DrawPureWaitScreen(); virtual void DrawSystemUI(); virtual void GuiFrameEvents( bool outOfSequence ); virtual void AddChatLine( const wchar_t* text ); virtual userMapChangeResult_e OnUserStartMap( const char* text, idStr& reason, idStr& mapName ); virtual void ArgCompletion_StartGame( const idCmdArgs& args, argCompletionCallback_t callback ); virtual void RunFrame(); virtual bool DownloadRequest( const char *IP, const char *guid, const char *paks, char urls[ MAX_STRING_CHARS ] ); virtual bool HTTPRequest( const char *IP, const char *file, bool isGamePak ); #ifdef ID_DEBUG_MEMORY virtual void MemDump( const char* fileName ) { Mem_Dump( fileName ); } virtual void MemDumpCompressed( const char *fileName, memoryGroupType_t memGroup, memorySortType_t memSort, int sortCallStack, int numFrames, bool xlFriendly ) { Mem_DumpCompressed( fileName, memGroup, memSort, sortCallStack, numFrames, xlFriendly ); } virtual void MemDumpPerClass( const char* fileName ) { Mem_DumpPerClass( fileName ); } #endif virtual void OnInputInit( void ); virtual void OnInputShutdown( void ); virtual void OnLanguageInit( void ); virtual void OnLanguageShutdown( void ); virtual sdKeyCommand* Translate( const idKey& key ); virtual usercmdbuttonType_t SetupBinding( const char* binding, int& action ); virtual void HandleLocalImpulse( int action, bool down ); virtual int GetBotFPS( void ) const; virtual botDebugInfo_t GetBotDebugInfo( int clientNum ); virtual bool GetRandomBotName( int clientNum, idStr& botName ); const char* GetCookieString( const char* value ); int GetCookieInt( const char* value ); void SetCookieString( const char* key, const char* value ); void SetCookieInt( const char* key, int value ); sdProficiencyTable& GetProficiencyTable( int entityNumber ) { return proficiencyTables[ entityNumber ]; } const sdProficiencyTable& GetProficiencyTable( int entityNumber ) const { return proficiencyTables[ entityNumber ]; } int ClassCount( const sdDeclPlayerClass* pc, idPlayer* skip, sdTeamInfo* team ); void SetTargetTimer( qhandle_t timerHandle, idPlayer* player, int t ); qhandle_t AllocTargetTimer( const char* targetName ); qhandle_t GetTargetTimerForServerHandle( qhandle_t timerHandle ); const char* GetTargetTimerName( qhandle_t timerHandle ) { return targetTimers[ timerHandle ].name; } int GetTargetTimerValue( qhandle_t timerHandle, idPlayer* player ); void ClearTargetTimers(); void StartRecordingDemo( void ); void GetDemoName( idStr& output ); sdDeployRequest* GetDeploymentRequest( idPlayer* player ); bool RequestDeployment( idPlayer* player, const sdDeclDeployableObject* object, const idVec3& position, float rotation, int delayMS ); void UpdateDeploymentRequests( void ); void ClearDeployRequests( void ); void ClearDeployRequest( int deployIndex ); deployResult_t CheckDeploymentRequestBlock( const idBounds& bounds ); bool IsDeveloper( void ) const { return cvarSystem->GetCVarBool( "developer" ); } virtual sdUserInterfaceManager* GetUIManager(); virtual void MessageBox( msgBoxType_t type, const wchar_t* message, const sdDeclLocStr* title ); virtual void CloseMessageBox(); virtual void SetUpdateAvailability( updateAvailability_t type ); virtual void SetUpdateState( updateState_t state ); virtual void SetUpdateFromServer( bool fromServer ); virtual guiUpdateResponse_t GetUpdateResponse(); virtual void SetUpdateProgress( float percent ); virtual void SetUpdateMessage( const wchar_t* text ); virtual void AddSystemNotification( const wchar_t* text ); virtual void UpdateLevelLoadScreen( const wchar_t* status ); // RAVEN BEGIN // bdube: added effect calls const rvDeclEffect * FindEffect( const char* name, bool makeDefault = true ); virtual rvClientEffect* PlayEffect ( const int effectHandle, const idVec3& color, const idVec3& origin, const idMat3& axis, bool loop = false, const idVec3& endOrigin = vec3_origin, float distanceOffset = 0.0f ); rvClientEffect* PlayEffect ( const idDict& args, const idVec3& color, const char* effectName, const char* materialType, const idVec3& origin, const idMat3& axis, bool loop = false, const idVec3& endOrigin = vec3_origin ); int GetEffectHandle ( const idDict& args, const char* effectName, const char* materialType ); int GetDecal ( const idDict& args, const char* decalName, const char* materialType ); // jscott: for effects system virtual void StartViewEffect( int type, float time, float scale ); virtual void GetPlayerView( idVec3& origin, idMat3& axis, float& fovx ); virtual void TracePoint( trace_t& trace, const idVec3 &source, const idVec3 &dest, int clipMask ); virtual void Translation( trace_t &trace, const idVec3 &source, const idVec3 &dest, const idTraceModel &trm, int clipMask ); virtual rvClientMoveable* SpawnClientMoveable( const char* name, int lifetime, const idVec3& origin, const idMat3& axis, const idVec3& velocity, const idVec3& angular_velocity, int effectSet = 0 ); // RAVEN END void AddCheapDecal( const idDict& decalDict, idEntity *attachTo, idVec3 &origin, idVec3 &normal, int jointIdx, int id, const char* decalName, const char* materialName ); virtual bool ClientsOnSameTeam( int clientNum1, int clientNum2, voiceMode_t voiceMode ); virtual bool AllowClientAudio( int clientNum1, voiceMode_t voiceMode ); // Setup game rules void SetRules( idTypeInfo* type ); bool HasMapInfo( void ) const { return mapInfo != NULL; } const sdDeclMapInfo& GetMapInfo( void ) const { assert( mapInfo ); return *mapInfo; } const idDict& GetMapMetaData( void ) const { assert( mapMetaData ); return *mapMetaData; } int GetNumMapEntities( void ) const { return mapFile == NULL ? 0 : mapFile->GetNumEntities(); } virtual bool KeyMove( char forward, char right, char up, usercmd_t& cmd ); virtual void ControllerMove( bool doGameCallback, const int numControllers, const int* controllerNumbers, const float** controllerAxis, idVec3& viewAngles, usercmd_t& cmd ); virtual void MouseMove( const idVec3& angleBase, idVec3& angleDelta ); virtual bool GetSensitivity( float& scaleX, float& scaleY ); virtual void UsercommandCallback( usercmd_t& cmd ); virtual void ShowLevelLoadScreen( const char* mapName ); virtual void HideLevelLoadScreen( void ); bool NextMap( void ); virtual void BeginLevelLoad(); virtual void EndLevelLoad(); void StartAutorecording(); void StopAutorecording(); void GetScoreboardShotName( idStr& output ); void OnEndGameScoreboardActive(); virtual void DrawLCD( sdLogitechLCDSystem* lcd ); void MutePlayerLocal( idPlayer* player, int clientIndex ); void UnMutePlayerLocal( idPlayer* player, int clientIndex ); void MutePlayerQuickChatLocal( int clientIndex ); void UnMutePlayerQuickChatLocal( int clientIndex ); bool IsClientQuickChatMuted( idPlayer* player ); void OnUserNameChanged( idPlayer* player, idStr oldName, idStr newName ); guiHandle_t LoadUserInterface( const char* name, bool requireUnique, bool permanent, const char* theme = "default", sdHudModule* module = NULL ); void FreeUserInterface( guiHandle_t handle ); sdUserInterfaceLocal* GetUserInterface( guiHandle_t handle ); sdUIWindow* GetUserInterfaceWindow( const guiHandle_t handle, const char* windowName ); sdProperties::sdProperty* GetUserInterfaceProperty( const guiHandle_t handle, const char* propertyName, sdProperties::ePropertyType expectedType ); sdProperties::sdProperty* GetUserInterfaceProperty_r( const guiHandle_t handle, const char* propertyName, sdProperties::ePropertyType expectedType ); sdUserInterfaceScope* GetGlobalUserInterfaceScope( sdUserInterfaceScope& scope, const char* name ); sdUserInterfaceScope* GetUserInterfaceScope( sdUserInterfaceScope& scope, idLexer* src ); sdUserInterfaceScope* GetUserInterfaceScope( sdUserInterfaceScope& scope, sdUIScopeParser& src ); void SetGUIInt( int handle, const char* name, int value ); void SetGUIFloat( int handle, const char* name, float value ); void SetGUIVec2( int handle, const char* name, const idVec2& value ); void SetGUIVec3( int handle, const char* name, const idVec3& value ); void SetGUIVec4( int handle, const char* name, const idVec4& value ); void SetGUIString( int handle, const char* name, const char* value ); void SetGUIWString( int handle, const char* name, const wchar_t* value ); void SetGUITheme( guiHandle_t handle, const char* theme ); void GUIPostNamedEvent( int handle, const char* window, const char* name ); float GetGUIFloat( int handle, const char* name ); void ResetEntityStates( void ); void SetupGameStateBase( clientNetworkInfo_t& networkInfo ); void SetupEntityStateBase( clientNetworkInfo_t& networkInfo ); qhandle_t GetDeploymentMask( const char* name ); // playzone manipulation void CreatePlayZone( const idDict& info, const idBounds& bounds ); void SavePlayZoneMasks( void ); void ClearPlayZones( void ); void DebugDeploymentMask( qhandle_t handle ); void SetPlayZoneAreaName( int index, const char* name ); void LinkPlayZoneAreas( void ); const sdDeclTargetInfo* GetMDFExportTargets( void ) { return declTargetInfoType[ "target_mdfExport" ]; } // playzone querying int GetWorldPlayZoneIndex( const idVec3& point ) const; const sdPlayZone* GetPlayZone( const idVec3& point, int flags ) const; const sdPlayZone* GetChoosablePlayZone( int id ) const; int GetIndexForChoosablePlayZone( const sdPlayZone* zone ) const; int GetNumChoosablePlayZones() const; const sdPlayZone* ClosestPlayZone( const idVec3& point, float& dist, int flags ) const; sdSpawnPoint& RegisterSpawnPoint( idEntity* owner, const idVec3& offset, const idAngles& angles ); void UnRegisterSpawnPoint( sdSpawnPoint* point ); void RegisterTargetEntity( idLinkList< idEntity >& node ); void RegisterIconEntity( idLinkList< idEntity >& node ); sdEntityState* AllocEntityState( networkStateMode_t mode, idEntity* ent ) const; sdGameState* AllocGameState( const sdNetworkStateObject& object ) const; int AllocEndGameStat( void ); void SetEndGameStatValue( int index, idPlayer* player, float value ); void SetEndGameStatWinner( int statIndex, idPlayer* player ); void SendEndGameStats( const sdReliableMessageClientInfoBase& target ); void ClearEndGameStats( void ); void OnEndGameStatsReceived( void ); public: // ---------------------- Public idGameLocal Interface ------------------- void Printf( const char *fmt, ... ) const; void DPrintf( const char *fmt, ... ) const; void Warning( const char *fmt, ... ) const; void DWarning( const char *fmt, ... ) const; void Error( const char *fmt, ... ) const; void LoadMap( const char *mapName, int randSeed, int startTime ); void OnLocalMapRestart( void ); void LocalMapRestart( void ); void MapRestart( void ); static void MapRestart_f( const idCmdArgs &args ); static void NextMap_f( const idCmdArgs &args ); static void StartDemos_f( const idCmdArgs &args ); idPlayer* GetClient( int i ) const { assert( i >= 0 && i < MAX_CLIENTS ); return reinterpret_cast< idPlayer * >( entities[ i ] ); } idMapFile * GetLevelMap( void ); const char * GetMapName( void ) const; bool CheatsOk( bool requirePlayer = true ); gameState_t GameState( void ) const; template< typename T > T* SpawnEntityTypeT( bool callPostMapSpawn, const idDict *args = NULL ) { return static_cast< T* >( SpawnEntityType( T::Type, callPostMapSpawn, args ) ); } idEntity * SpawnEntityType( const idTypeInfo &classdef, bool callPostMapSpawn, const idDict *args = NULL ); bool SpawnEntityDef( const idDict &args, bool callPostMapSpawn, idEntity **ent = NULL, int entityNum = -1, int mapSpawnId = -1 ); bool SpawnClientEntityDef( const idDict &args, rvClientEntity **ent = NULL, int mapSpawnId = -1 ); int GetSpawnId( const idEntity* ent ) const { return ent ? ( ( spawnIds[ ent->entityNumber ] << GENTITYNUM_BITS ) | ent->entityNumber ) : 0; } int SpawnNumForSpawnId( int spawnId ) const { return spawnId >> GENTITYNUM_BITS; } int EntityNumForSpawnId( int spawnId ) const { return spawnId & ( ( 1 << GENTITYNUM_BITS ) - 1 ); } idEntity* EntityForSpawnId( int spawnId ) const { int entityNum = EntityNumForSpawnId( spawnId ); return ( ( spawnId >> GENTITYNUM_BITS ) == spawnIds[ entityNum ] ) ? entities[ entityNum ] : NULL; } void CallSpawnFuncs( idEntity* entity, const idDict *args ); idEntity* CreateEntityType( const idTypeInfo &classdef ); const idDict* FindEntityDefDict( const char *name, bool makeDefault = false ) const; // RAVEN BEGIN void RegisterClientEntity( rvClientEntity *cent ); void UnregisterClientEntity( rvClientEntity *cent ); // RAVEN END float RangeSquare( const idEntity* ent1, const idEntity* ent2 ) const { return ( ent1->GetPhysics()->GetOrigin() - ent2->GetPhysics()->GetOrigin() ).LengthSqr(); } void ToggleGodMode( idPlayer* player ) const; void ToggleNoclipMode( idPlayer* player ) const; void NetworkSpawn( const char* classname, idPlayer* player ); void RegisterEntity( idEntity *ent ); void UnregisterEntity( idEntity *ent ); void ForceNetworkUpdate( idEntity *ent ); void SetCamera( idCamera *cam ); idCamera * GetCamera( void ) const; void CalcFov( float base_fov, float &fov_x, float &fov_y, const int width = SCREEN_WIDTH, const int height = SCREEN_HEIGHT, const float correctYAspect = 0.f ) const; void AddEntityToHash( const char *name, idEntity *ent ); bool RemoveEntityFromHash( const char *name, idEntity *ent ); int GetTargets( const idDict &args, idList< idEntityPtr > &list, const char *ref ) const; // returns the master entity of a trace. for example, if the trace entity is the player's head, it will return the player. idEntity * GetTraceEntity( const trace_t &trace ) const; static void ArgCompletion_EntityName( const idCmdArgs &args, void(*callback)( const char *s ) ); idEntity* FindTraceEntity( idVec3 start, idVec3 end, const idTypeInfo &c, const idEntity *skip ) const; idEntity* FindEntity( const char *name ) const; idEntity* FindEntityByType( idEntity *from, const idDeclEntityDef* type ) const; idEntity* FindClassType( idEntity *from, const idTypeInfo& type, idEntity *ignore = NULL ) const; idEntity* FindClassTypeReverse( idEntity *from, const idTypeInfo& type, idEntity *ignore = NULL ) const; idEntity* FindClassTypeInRadius( const idVec3& org, float radius, idEntity *from, const idTypeInfo& type, idEntity *ignore = NULL ) const; template< typename T > T* FindClassTypeT( idEntity *from ) const; template< typename T > T* EntityFromRenderEntity( renderEntity_t* entity ) const { idEntity* other = EntityForSpawnId( entity->spawnID ); if ( other == NULL || !other->IsType( T::Type ) ) { return NULL; } return static_cast< T* >( other ); } int EntitiesWithinRadius( const idVec3 org, float radius, idEntity **entityList, int maxCount ) const; int EntitiesOfClass( const char *name, idList< idEntityPtr > &list ) const; void KillBox( idEntity *ent ); void RadiusDamage( const idVec3 &origin, idEntity *inflictor, idEntity *attacker, idEntity *ignoreDamage, idEntity *ignorePush, const sdDeclDamage* damage, float dmgPower = 1.f, float radiusScale = 1.f ); void RadiusPush( const idVec3 &origin, float radius, const sdDeclDamage* damageDecl, float pushScale, const idEntity *inflictor, const idEntity *ignore, int flags, bool saveEvent ); void RadiusPushClipModel( const idVec3 &origin, const float push, const idClipModel *clipModel ); void RadiusPushEntities( const idVec3& origin, float force, float radius ); void ProjectDecal( const idVec3 &origin, const idVec3 &dir, float depth, bool parallel, float size, const char *material, float angle = 0 ); void CreateProjectedDecal( const idVec3 &origin, const idVec3 &dir, float depth, bool parallel, float width, float height, float angle, const idVec4& color, idRenderModel* model ); void ProjectDecal( const idVec3 &origin, const idVec3 &dir, float depth, bool parallel, float size, const idMaterial *material, float angle = 0 ); void CallFrameCommand( const sdProgram::sdFunction* frameCommand ); void CallFrameCommand( idScriptObject* object, const sdProgram::sdFunction* frameCommand ); void CallObjectFrameCommand( idScriptObject* object, const char *frameCommand, bool allowError ); const idVec3& GetGravity( void ) const; const idVec3& GetWindVector( const idVec3 & origin ) const; // added the following to assist licensees with merge issues int GetFrameNum() const { return framenum; } int GetTime() const { return time; } int GetMSec() const { return msec; } idPlayer* GetClientByName( const char *name ) const; void OnLocalViewPlayerChanged( void ); void OnLocalViewPlayerTeamChanged( void ); void ResetTeamAssets( void ); void CheckTeamBalance( void ); sdTeamInfo* FindUnbalancedTeam( sdTeamInfo** lowest ); idPlayer* GetLocalViewPlayer( void ) const; idPlayer* GetLocalPlayer( void ) const { if ( localClientNum == ASYNC_DEMO_CLIENT_INDEX ) { return NULL; } #ifdef SD_SUPPORT_REPEATER if ( localClientNum == REPEATER_CLIENT_INDEX ) { return NULL; } #endif // SD_SUPPORT_REPEATER return GetClient( localClientNum ); } idPlayer* GetSnapshotPlayer( void ) const { return snapShotPlayer; } void SetSnapShotPlayer( idPlayer* player ); idPlayer* GetSnapshotClient( void ) const { return snapShotClient; } void SetSnapShotClient( idPlayer* client ); void UpdatePlayerShadows( void ); const snapshot_t* GetActiveSnapshot( void ) { return activeSnapshot; } bool IsLocalViewPlayer( const idEntity* player ) const; bool IsLocalPlayer( const idEntity* player ) const { return player->entityNumber == localClientNum; } bool DoClientSideStuff() const; void LogDamage( const char* message ); void LogProficiency( const char* message ); void LogNetwork( const char* message ); void LogObjective( const char* message ); void LogDebugText( const idEntity* entFrom, const char* fmt, ... ); int GetNumEntityDefBits( void ) const { return numEntityDefBits; } int GetNumDamageDeclBits( void ) const { return numDamageDeclBits; } int GetNumInvItemBits( void ) const { return numInvItemBits; } int GetNumSkinDeclBits( void ) const { return numSkinDeclBits; } int GetNumDeployObjectBits( void ) const { return numDeployObjectBits; } int GetNumPlayerClassBits( void ) const { return numPlayerClassBits; } int GetNumClientIndexBits( void ) const { return numClientIndexBits; } bool SelectInitialSpawnPointForRepeaterClient( idVec3& outputOrg, idAngles& outputAngles ); const sdSpawnPoint* SelectInitialSpawnPoint( idPlayer *player, idVec3& outputOrg, idAngles& outputAngles ); static int SortSpawnsByAge( const void* a, const void* b ); void SetPortalState( qhandle_t portal, int blockingBits ); void SaveEntityNetworkEvent( const sdEntityNetEvent& oldEvent ); void FreeEntityNetworkEvents( const idEntity *ent, int event ); void SendUnreliableEntityNetworkEvent( const idEntity *ent, int event, const idBitMsg *msg ); void SendUnreliableEntityNetworkEvent( const sdUnreliableEntityNetEvent& oldEvent ); void WriteUnreliableEntityNetEvents( int clientNum, bool repeaterClient, idBitMsg &msg ); void SetGlobalMaterial( const idMaterial *mat ); const idMaterial * GetGlobalMaterial(); void ServerSendQuickChatMessage( idPlayer* player, const sdDeclQuickChat* quickChat, idPlayer* recipient = NULL, idEntity* target = NULL ); #ifdef SD_SUPPORT_REPEATER clientNetworkInfo_t& GetRepeaterNetworkInfo( int clientNum ) { assert( repeaterNetworkInfo[ clientNum ] != NULL ); return *repeaterNetworkInfo[ clientNum ]; } const clientNetworkInfo_t& GetRepeaterNetworkInfo( int clientNum ) const { assert( repeaterNetworkInfo[ clientNum ] != NULL ); return *repeaterNetworkInfo[ clientNum ]; } #endif // SD_SUPPORT_REPEATER clientNetworkInfo_t& GetNetworkInfo( int clientNum ) { if ( clientNum == ASYNC_DEMO_CLIENT_INDEX ) { return demoClientNetworkInfo; } #ifdef SD_SUPPORT_REPEATER if ( clientNum == REPEATER_CLIENT_INDEX ) { return repeaterClientNetworkInfo; } #endif // SD_SUPPORT_REPEATER return clientNetworkInfo[ clientNum ]; } const clientNetworkInfo_t& GetNetworkInfo( int clientNum ) const { if ( clientNum == ASYNC_DEMO_CLIENT_INDEX ) { return demoClientNetworkInfo; } #ifdef SD_SUPPORT_REPEATER if ( clientNum == REPEATER_CLIENT_INDEX ) { return repeaterClientNetworkInfo; } #endif // SD_SUPPORT_REPEATER return clientNetworkInfo[ clientNum ]; } enum { EVENT_MAXEVENTS }; int GetLastMarker( int clientNum, int entityNum ) const { return GetNetworkInfo( clientNum ).lastMarker[ entityNum ]; } sdLoggedTrace* RegisterLoggedTrace( const trace_t& trace ); void FreeLoggedTrace( sdLoggedTrace* trace ); int RegisterLoggedDecal( const idMaterial* material = NULL ); gameDecalInfo_t* GetLoggedDecal( int handle ); void FreeLoggedDecal( int index ); void ResetLoggedDecal( int index ); void NetworkEventWarning( const sdEntityNetEvent& event, const char *fmt, ... ); void UnreliableNetworkEventWarning( const sdUnreliableEntityNetEvent& event, const char *fmt, ... ); void ShutdownClientNetworkState( int clientNum ); static surfaceProperties_t& GetSurfaceTypeForIndex( int index ); void AddEnvDefinition( sdEnvDefinition &envDef ) { envDefs.Append( envDef ); } const idList& GetEnvDefinitions( void ) { return envDefs; } // GUIs const guiHandle_t& GetMainMenuGui() const { return uiMainMenuHandle; } void ApplyRulesData( const sdEntityStateNetworkData& newState ); void ReadRulesData( const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, const idBitMsg& msg ) const; void WriteRulesData( const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, idBitMsg& msg ) const; bool CheckRulesData( const sdEntityStateNetworkData& baseState ) const; sdEntityStateNetworkData* CreateRulesData( void ) const; #ifndef _XENON void UpdateGameSession( void ); sdNetManager& GetSDNet() { return sdnet; } #endif idLinkList< idEntity >* GetTargetEntities( void ) { return targetEntities.NextNode(); } idLinkList< idEntity >* GetIconEntities( void ) { return iconEntities.NextNode(); } //int GetBytesNeededForMapLoad( void ) const { return bytesNeededForMapLoad; } const idCmdArgs& GetActionArgs( void ) { return actionArgs; } void PurgeAndLoadTeamAssets( const sdDeclStringMap* newPartialLoadTeamAssets ); const idList< idEntity* >& GetOcclusionQueryList() const { return occlusionQueryList; } qhandle_t AddEntityOcclusionQuery( idEntity *ent ); void FreeEntityOcclusionQuery( idEntity *ent ); const idWStrList& GetSystemNotifications() { return systemNotifications; } const char* GetTimeText( void ) { sysTime_t time; sys->RealTime( &time ); return va( "%d-%02d-%02d %02d:%02d:%02d", 1900 + time.tm_year, 1 + time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec ); } sdGameRules* GetRulesInstance( const char* type ) const; bool IsDoingMapRestart( void ) const { return doingMapRestart; } int GetMaxPrivateClients( void ); void EnablePlayerHeadModels( void ); void DisablePlayerHeadModels( void ); void StartSendingBanList( idPlayer* player ); void SendBanList( idPlayer* player ); private: // int GetBytesNeededForMapLoad( const char* map ); // void SetBytesNeededForMapLoad( const char* map, int numBytes ); void UpdateLagometer( int aheadOfServer, int numDuplicatedUsercmds ); void ReserveClientSlot( const sdNetClientId& netClientId ); void CheckForExpiredReservedSlots( void ); void UpdateCampaignStats( bool allowMedia ); static void SurfaceTypePostParse( idDecl* decl ); void LoadMainMenuPartialMedia( bool blocking ); void PurgeMainMenuPartialMedia(); void ControlBotPopulation( void ); void TouchMedia(); private: int nextBotPopulationCheck; static idList< surfaceProperties_t > surfaceTypes; idWStrList systemNotifications; const static int INITIAL_SPAWN_COUNT = 1; int commandmapOverlayIndex; idLinkList< idEntity > targetEntities; idLinkList< idEntity > iconEntities; int numEntityDefBits; // bits required to store an entity def number int numDamageDeclBits; // int numInvItemBits; // bits required to store an inventory item number int numSkinDeclBits; // bits required to store a skin index int numDeployObjectBits; // int numPlayerClassBits; // int numClientIndexBits; // bits required for a clientnumber bool reloadingSameMap; // only guaranteed to be correct during map load idStr mapFileName; // name of the map, empty string if no map loaded idMapFile * mapFile; // will be NULL during the game unless in-game editing is used bool doingMapRestart; bool useSimpleEffect; idMapFile * botMapFile; // the bot's map file info. int spawnCount; idStrList deploymentMasks; idList< sdPlayZone* > playZones; idList< sdPlayZone* > worldPlayZones; idList< sdPlayZone* > choosablePlayZones; idEntityPtr< idCamera > camera; const idMaterial * globalMaterial; // for overriding everything idDict spawnArgs; // spawn args used during entity spawning FIXME: shouldn't be necessary anymore idVec3 gravity; // global gravity vector gameState_t gamestate; // keeps track of whether we're spawning, shutting down, or normal gameplay clientNetworkInfo_t clientNetworkInfo[ MAX_CLIENTS ]; clientNetworkInfo_t demoClientNetworkInfo; #ifdef SD_SUPPORT_REPEATER clientNetworkInfo_t repeaterClientNetworkInfo; idList< clientNetworkInfo_t* > repeaterNetworkInfo; #endif // SD_SUPPORT_REPEATER sdProficiencyTable proficiencyTables[ MAX_CLIENTS ]; idBlockAlloc< snapshot_t, 64 > snapshotAllocator; sdEntityNetEvent::nodeType_t entityNetEventQueue; sdEntityNetEvent::nodeType_t savedEntityNetEventQueue; sdUnreliableEntityNetEvent::unreliableNodeType_t unreliableEntityNetEventQueue; idBlockAlloc< sdEntityNetEvent, 32 > entityNetEventAllocator; idBlockAlloc< sdUnreliableEntityNetEvent, 32 > unreliableEntityNetEventAllocator; idCmdArgs actionArgs; sdNetworkStateObject_Generic< idGameLocal, &idGameLocal::ApplyRulesData, &idGameLocal::ReadRulesData, &idGameLocal::WriteRulesData, &idGameLocal::CheckRulesData, &idGameLocal::CreateRulesData > rulesStateObject; idStaticList< sdSpawnPoint, 256 > spawnSpots; idList< idList< sdPlayZone* >* > playZoneAreas; idStrList playZoneAreaNames; idPlayer* snapShotPlayer; idPlayer* snapShotClient; snapshot_t* activeSnapshot; idFile* damageLogFile; idFile* debugLogFile; idDict newInfo; int bytesNeededForMapLoad; idStaticList< sdLoggedTrace*, MAX_LOGGED_TRACES > loggedTraces; idStaticList< gameDecalInfo_t*, MAX_LOGGED_DECALS > loggedDecals; // Defines name + origin of ambient cubemaps, can be rendered out with the makeEnvMaps command idList envDefs; guiHandle_t uiMainMenuHandle; guiHandle_t uiSystemUIHandle; guiHandle_t uiLevelLoadHandle; guiHandle_t pureWaitHandle; const idMaterial* lagoMaterial; byte lagometer[ LAGO_IMG_HEIGHT ][ LAGO_IMG_WIDTH ][ 4 ]; #ifndef _XENON sdNetManager sdnet; #endif idStrList shakeSounds; const sdDeclStringMap* currentPartialLoadTeamAssets; static idList< qhandle_t > taskListHandles; idList< guiScope_t > uiScopes; // clients allowed access to the reserved slots, setup when a client gets invited to a session struct reservedSlot_t { sdNetClientId netClientId; int time; }; idStaticList< reservedSlot_t, MAX_CLIENTS > reservedClientSlots; idList< idEntity* > occlusionQueryList; enum fireTeamListType_t { FIRETEAMLIST_MYFIRETEAM = 0, FIRETEAMLIST_MAIN, FIRETEAMLIST_JOIN, FIRETEAMLIST_INVITE, FIRETEAMLIST_KICK, FIRETEAMLIST_PROMOTE, FIRETEAMLIST_MANAGE }; static const int FIRETEAMLIST_PAGE_NUM_PLAYERS = 8; // keep an instance of each type of game rules around // we use these in various places where we need to use virtual functions on // an instance that doesn't match the current local rules // (eg, the server browser needs to query information from rules running on servers) typedef sdHashMapGeneric< idStr, sdGameRules*, sdHashCompareStrCmp > rulesMap_t; rulesMap_t rulesCache; bool isAutorecording; bool hasTakenScoreShot; public: void Clear( void ); // returns true if the entity shouldn't be spawned at all in this game type or difficulty level bool InhibitEntitySpawn( idDict &spawnArgs ); // spawn entities from the map file void SpawnMapEntities( void ); // commons used by init, shutdown, and restart void MapClear( bool clearClients ); void UpdateGravity( void ); void SortActiveEntityList( void ); void ShowTargets( void ); void RunDebugInfo( void ); void InitScriptForMap( void ); void InitConsoleCommands( void ); void ShutdownConsoleCommands( void ); void UpdateServerRankStats( void ); #if !defined( SD_DEMO_BUILD ) void FreeClientStatsRequestTask( void ); void FinishClientStatsRequest( void ); bool StartClientStatsRequest( int clientIndex ); #endif /* !SD_DEMO_BUILD */ void CreateClientStatsHash( int clientIndex ); void GetGlobalStatsValueMax( int clientIndex, const char* name, sdPlayerStatEntry::statValue_t& value ); void SetupFixedClientRank( int clientIndex ); const sdDeclRank* FindRankForLevel( int rankLevel ); void UpdateLoggedDecals( void ); void InitAsyncNetwork( void ); void ShutdownAsyncNetwork( void ); void InitLocalClient( int clientNum, bool server ); void FreeSnapshotsOlderThanSequence( clientNetworkInfo_t& nwInfo, int sequence ); bool ApplySnapshot( clientNetworkInfo_t& nwInfo, int sequence ); void ClientProcessEntityNetworkEventQueue( void ); void ClientShowSnapshot( int clientNum ) const; void ClientShowAOR( int clientNum ) const; bool ClientReceiveEvent( const idVec3& origin, int event, int time, const idBitMsg &msg ); // call after any change to serverInfo. Will update various quick-access flags void UpdateServerInfoFlags( void ); void UpdateHudStats( idPlayer* player ); static void CreateDemoList( sdUIList* list ); static void CreateModList( sdUIList* list ); static void CreateCrosshairList( sdUIList* list ); static void CreateKeyBindingList( sdUIList* list ); static void CreateActiveTaskList( sdUIList* list ); static qhandle_t GetTaskListHandle( int index ); static void CreateVehiclePlayerList( sdUIList* list ); static void CreateFireTeamListEntry( sdUIList* list, int index, idPlayer* player ); static void CreateFireTeamList( sdUIList* list ); static void CreateInventoryList( sdUIList* list ); static void CreateScoreboardList( sdUIList* list ); static void CreatePlayerAdminList( sdUIList* list ); static void CreateUserGroupList( sdUIList* list ); static void CreateServerConfigList( sdUIList* list ); static void CreateVideoModeList( sdUIList* list ); static void CreateCampaignList( sdUIList* list ); static void CreateMapList( sdUIList* list ); static void CreateWeaponSwitchList( sdUIList* list ); static void CreateColorList( sdUIList* list ); static void CreateSpawnLocationList( sdUIList* list ); static void CreateMSAAList( sdUIList* list ); static void CreateSoundPlaybackList( sdUIList* list ); static void CreateSoundCaptureList( sdUIList* list ); static void CreateFireTeamList_MyFireTeam( sdUIList* list ); static void CreateFireTeamList_Main( sdUIList* list ); static void CreateFireTeamList_Join( sdUIList* list ); static void CreateFireTeamList_Invite( sdUIList* list ); static void CreateFireTeamList_Kick( sdUIList* list ); static void CreateFireTeamList_Promote( sdUIList* list ); static void CreateFireTeamList_Manage( sdUIList* list ); static void CreateLifeStatsList( sdUIList* list ); static void CreatePredictedUpgradesList( sdUIList* list ); static void CreateUpgradesReviewList( sdUIList* list ); static void GeneratePlayerListForTask( idStr& playerList, const sdPlayerTask* task ); static int InsertTask( sdUIList* list, const sdPlayerTask* task, bool highlightActive ); static void TestGUI_f( const idCmdArgs& args ); static void ListClientEntities_f( const idCmdArgs& args ); void SetupMapMetaData( const char* mapName ); public: idDeclTypeTemplate< idDeclModelDef, &declModelDefInfo > declModelDefType; idDeclTypeTemplate< idDecl, &declExportDefInfo > declExportDefType; idDeclTypeTemplate< sdDeclVehicleScript, &declVehicleScriptDefInfo > declVehicleScriptDefType; idDeclTypeTemplate< sdDeclAmmoType, &declAmmoTypeInfo > declAmmoTypeType; idDeclTypeTemplate< sdDeclInvSlot, &declInvSlotInfo > declInvSlotType; idDeclTypeTemplate< sdDeclInvItemType, &declInvItemTypeInfo > declInvItemTypeType; idDeclTypeTemplate< sdDeclInvItem, &declInvItemInfo > declInvItemType; idDeclTypeTemplate< sdDeclItemPackage, &declItemPackageInfo > declItemPackageType; idDeclTypeTemplate< sdDeclStringMap, &declStringMapInfo > declStringMapType; idDeclTypeTemplate< sdDeclDamage, &declDamageInfo > declDamageType; idDeclTypeTemplate< sdDeclDamageFilter, &declDamageFilterInfo > declDamageFilterType; idDeclTypeTemplate< sdDeclCampaign, &declCampaignInfo > declCampaignType; idDeclTypeTemplate< sdDeclQuickChat, &declQuickChatInfo > declQuickChatType; idDeclTypeTemplate< sdDeclMapInfo, &declMapInfoInfo > declMapInfoType; idDeclTypeTemplate< sdDeclToolTip, &declToolTipInfo > declToolTipType; idDeclTypeTemplate< sdDeclTargetInfo, &declTargetInfoInfo > declTargetInfoType; idDeclTypeTemplate< sdDeclProficiencyType, &declProficiencyTypeInfo > declProficiencyTypeType; idDeclTypeTemplate< sdDeclProficiencyItem, &declProficiencyItemInfo > declProficiencyItemType; idDeclTypeTemplate< sdDeclRank, &declRankInfo > declRankType; idDeclTypeTemplate< sdDeclDeployableObject, &declDeployableObjectInfo > declDeployableObjectType; idDeclTypeTemplate< sdDeclDeployableZone, &declDeployableZoneInfo > declDeployableZoneType; idDeclTypeTemplate< sdDeclPlayerClass, &declPlayerClassInfo > declPlayerClassType; idDeclTypeTemplate< sdDeclKeyBinding, &declKeyBindingInfo > declKeyBindingType; idDeclTypeTemplate< sdDeclGUI, &declGUIInfo > declGUIType; idDeclTypeTemplate< sdDeclGUITheme, &declGUIThemeInfo > declGUIThemeType; idDeclTypeTemplate< sdDeclStringMap, &declTeamInfoInfo > declTeamInfoType; idDeclTypeTemplate< sdDeclPlayerTask, &declPlayerTaskInfo > declPlayerTaskType; idDeclTypeTemplate< sdDeclRequirement, &declRequirementInfo > declRequirementType; idDeclTypeTemplate< sdDeclVehiclePath, &declVehiclePathInfo > declVehiclePathType; idDeclTypeTemplate< sdDeclRadialMenu, &declRadialMenuInfo > declRadialMenuType; idDeclTypeTemplate< sdDeclAOR, &declAreaOfRelevanceInfo > declAORType; idDeclTypeTemplate< sdDeclRating, &declRatingInfo > declRatingType; idDeclTypeTemplate< sdDeclHeightMap, &declHeightMapInfo > declHeightMapType; idDeclTypeTemplate< sdDeclDeployMask, &declDeployMaskInfo > declDeployMaskType; sdDeclWrapperTemplate< idDeclTable > declTableType; sdDeclWrapperTemplate< idMaterial > declMaterialType; sdDeclWrapperTemplate< idDeclSkin > declSkinType; sdDeclWrapperTemplate< idSoundShader > declSoundShaderType; sdDeclWrapperTemplate< idDeclEntityDef > declEntityDefType; sdDeclWrapperTemplate< idDeclAF > declAFType; sdDeclWrapperTemplate< class rvDeclEffect > declEffectsType; sdDeclWrapperTemplate< sdDeclAtmosphere > declAtmosphereType; sdDeclWrapperTemplate< sdDeclStuffType > declStuffTypeType; sdDeclWrapperTemplate< sdDeclDecal > declDecalType; sdDeclWrapperTemplate< sdDeclSurfaceType > declSurfaceTypeType; sdAddonMetaDataList* mapMetaDataList; sdAddonMetaDataList* campaignMetaDataList; static idCVar g_cacheDictionaryMedia; }; /* =============== idGameLocal::ProjectDecal =============== */ ID_INLINE void idGameLocal::ProjectDecal( const idVec3 &origin, const idVec3 &dir, float depth, bool parallel, float size, const char *material, float angle ) { ProjectDecal( origin, dir, depth, parallel, size, declHolder.declMaterialType.LocalFind( material ), angle ); } // RAVEN BEGIN // bdube: inlines ID_INLINE rvClientEffect* idGameLocal::PlayEffect ( const idDict& args, const idVec3& color, const char* effectName, const char* materialType, const idVec3& origin, const idMat3& axis, bool loop, const idVec3& endOrigin ) { return PlayEffect ( GetEffectHandle ( args, effectName, materialType ), color, origin, axis, loop, endOrigin ); } // RAVEN END //============================================================================ extern idGameLocal gameLocal; extern idAnimManager animationLib; //============================================================================ class idGameError : public idException { public: idGameError( const char *text ) : idException( text ) {} }; //============================================================================ // // these defines work for all startsounds from all entity types // make sure to change script/defs.script and def/sound.def if you add any channels, or change their order // typedef enum { SND_ANY = SCHANNEL_ANY, SND_VOICE = SCHANNEL_ONE, SND_BODY, SND_DOOR, SND_ITEM, SND_MUSIC, SND_ENGINE = SND_ANY + 10, SND_ENGINE_LAST = ( SND_ENGINE + /* MAX ENGINE SOUNDS */ 8 ) - 1, SND_WALKER_LEGS = SND_ANY + 20, SND_WALKER_LEGS_LAST = ( SND_WALKER_LEGS + /* MAX WALKER LEG SOUNDS */ 8 ) - 1, // quickchat starts at a crazy number just so that if MAX_CLIENTS // is increased then it won't collide with other channels SND_QUICKCHAT = SND_ANY + 1000, SND_QUICKCHAT_LAST = ( SND_QUICKCHAT + MAX_CLIENTS ) - 1, // // Player sounds SND_PLAYER = SND_ANY + 50, SND_PLAYER_JUMP, SND_PLAYER_LAND, SND_PLAYER_HURT, SND_PLAYER_DEATH, SND_PLAYER_CHAT, SND_PLAYER_VO, SND_PLAYER_VO_MCP_UPDATE, SND_PLAYER_TARGETLOCK, SND_PLAYER_TOOLTIP, SND_PLAYER_FALL, SND_PLAYER_MOVE, SND_PLAYER_ALARM, // // Weapon sounds SND_WEAPON = SND_ANY + 100, SND_WEAPON_BRASS, SND_WEAPON_FIRE, SND_WEAPON_FIRE2, SND_WEAPON_FIRE3, SND_WEAPON_FIRE_FAR, SND_WEAPON_FIRE_LOCAL, SND_WEAPON_RELOAD, SND_WEAPON_COCK, SND_WEAPON_RAISE, SND_WEAPON_LOWER, SND_WEAPON_SIG, SND_WEAPON_MECH, SND_WEAPON_MOVE, SND_WEAPON_FOLEY, SND_WEAPON_BOUNCE, SND_WEAPON_ARM, SND_WEAPON_DISARM, SND_WEAPON_REMOVE, SND_WEAPON_DEPLOY, SND_WEAPON_IDLE, SND_WEAPON_MODE, SND_WEAPON_DRYFIRE, SND_WEAPON_DEPLOY_ROTATION, SND_WEAPON_DEPLOY_MISC, // // Vehicle sounds SND_VEHICLE = SND_ANY + 200, SND_VEHICLE_IDLE, SND_VEHICLE_START, SND_VEHICLE_STOP, SND_VEHICLE_BRAKE, SND_VEHICLE_ENTER, SND_VEHICLE_EXIT, SND_VEHICLE_POWERUP, SND_VEHICLE_POWERDOWN, SND_VEHICLE_DEATH, SND_VEHICLE_DISABLE, SND_VEHICLE_OVERDRIVE, SND_VEHICLE_SKID, SND_VEHICLE_MISC, SND_VEHICLE_RADIO, SND_VEHICLE_ALARM, SND_VEHICLE_OFFROAD, SND_VEHICLE_DRIVE, SND_VEHICLE_DRIVE2, SND_VEHICLE_DRIVE3, SND_VEHICLE_DRIVE4, SND_VEHICLE_DRIVE5, SND_VEHICLE_WALK, SND_VEHICLE_WALK2, SND_VEHICLE_WALK3, SND_VEHICLE_WALK4, SND_VEHICLE_WALK5, SND_VEHICLE_WALK6, SND_VEHICLE_HORN, SND_VEHICLE_REV, SND_VEHICLE_JUMP, SND_VEHICLE_ZOOM, // // Vehicle interior sounds SND_VEHICLE_INTERIOR = SND_ANY + 250, SND_VEHICLE_INTERIOR_IDLE, SND_VEHICLE_INTERIOR_START, SND_VEHICLE_INTERIOR_STOP, SND_VEHICLE_INTERIOR_POWERUP, SND_VEHICLE_INTERIOR_POWERDOWN, SND_VEHICLE_INTERIOR_OFFROAD, SND_VEHICLE_INTERIOR_DRIVE, SND_VEHICLE_INTERIOR_DRIVE2, SND_VEHICLE_INTERIOR_DRIVE3, SND_VEHICLE_INTERIOR_DRIVE4, SND_VEHICLE_INTERIOR_DRIVE5, SND_VEHICLE_INTERIOR_OVERDRIVE, SND_VEHICLE_INTERIOR_LOWHEALTH, // // Deployable sounds SND_DEPLOYABLE = SND_ANY + 300, SND_DEPLOYABLE_BRASS, SND_DEPLOYABLE_FIRE, SND_DEPLOYABLE_FIRE2, SND_DEPLOYABLE_FIRE3, SND_DEPLOYABLE_FIRE_FAR, SND_DEPLOYABLE_RELOAD, SND_DEPLOYABLE_SIG, SND_DEPLOYABLE_MECH, SND_DEPLOYABLE_IDLE, SND_DEPLOYABLE_DEATH, SND_DEPLOYABLE_DEPLOY, SND_DEPLOYABLE_DEPLOY2, SND_DEPLOYABLE_DEPLOY3, SND_DEPLOYABLE_DEPLOY4, SND_DEPLOYABLE_DEPLOY5, SND_DEPLOYABLE_YAW, SND_DEPLOYABLE_PITCH, // // Structure sounds SND_STRUCTURE = SND_ANY + 400, SND_STRUCTURE_IDLE, SND_STRUCTURE_POWERUP, SND_STRUCTURE_POWERDOWN, SND_STRUCTURE_ALARM, SND_STRUCTURE_DEPLOY, SND_STRUCTURE_DEPLOY2, SND_STRUCTURE_DEPLOY3, SND_STRUCTURE_DEPLOY4, SND_STRUCTURE_DEPLOY5, SND_STRUCTURE_SPAWNLOCATION, SND_STRUCTURE_CAPTUREPOINT, // // Motor sounds for vehicles and other script entities SND_MOTOR = SND_ANY + 450, SND_MOTOR_LAST = ( SND_MOTOR + 50 ) - 1, // // Mover sounds SND_MOVER = SND_ANY + 500, SND_MOVER_IDLE, SND_MOVER_POWERUP, SND_MOVER_POWERDOWN, SND_MOVER_ALARM, SND_MOVER_START, SND_MOVER_MOVE, SND_MOVER_STOP, SND_LAST } gameSoundChannel_t; //============================================================================ // TTimo: those can't be inlined in the class declaration, as gameLocal is not defined yet ID_INLINE idEntity* sdSpawnPoint::GetOwner( void ) const { return _owner.GetEntity(); } ID_INLINE void sdSpawnPoint::SetOwner( idEntity* owner ) { _owner = owner; } #include "EntityPtr.h" #include "client/ClientEntityInlines.h" #include "Player.h" #include "ScriptEntity.h" #endif /* !__GAME_LOCAL_H__ */