You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.4 KiB
134 lines
3.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: implementation of player info manager |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "player.h" |
|
#include "playerinfomanager.h" |
|
#include "edict.h" |
|
|
|
extern CGlobalVars *gpGlobals; |
|
static CPlayerInfoManager s_PlayerInfoManager; |
|
static CPluginBotManager s_BotManager; |
|
|
|
namespace |
|
{ |
|
|
|
// |
|
// Old version support |
|
// |
|
abstract_class IPlayerInfo_V1 |
|
{ |
|
public: |
|
// returns the players name (UTF-8 encoded) |
|
virtual const char *GetName() = 0; |
|
// returns the userid (slot number) |
|
virtual int GetUserID() = 0; |
|
// returns the string of their network (i.e Steam) ID |
|
virtual const char *GetNetworkIDString() = 0; |
|
// returns the team the player is on |
|
virtual int GetTeamIndex() = 0; |
|
// changes the player to a new team (if the game dll logic allows it) |
|
virtual void ChangeTeam( int iTeamNum ) = 0; |
|
// returns the number of kills this player has (exact meaning is mod dependent) |
|
virtual int GetFragCount() = 0; |
|
// returns the number of deaths this player has (exact meaning is mod dependent) |
|
virtual int GetDeathCount() = 0; |
|
// returns if this player slot is actually valid |
|
virtual bool IsConnected() = 0; |
|
// returns the armor/health of the player (exact meaning is mod dependent) |
|
virtual int GetArmorValue() = 0; |
|
}; |
|
|
|
abstract_class IPlayerInfoManager_V1 |
|
{ |
|
public: |
|
virtual IPlayerInfo_V1 *GetPlayerInfo( edict_t *pEdict ) = 0; |
|
}; |
|
|
|
|
|
class CPlayerInfoManager_V1: public IPlayerInfoManager_V1 |
|
{ |
|
public: |
|
virtual IPlayerInfo_V1 *GetPlayerInfo( edict_t *pEdict ); |
|
}; |
|
|
|
static CPlayerInfoManager_V1 s_PlayerInfoManager_V1; |
|
|
|
|
|
IPlayerInfo_V1 *CPlayerInfoManager_V1::GetPlayerInfo( edict_t *pEdict ) |
|
{ |
|
CBasePlayer *pPlayer = ( ( CBasePlayer * )CBaseEntity::Instance( pEdict )); |
|
if ( pPlayer ) |
|
{ |
|
return (IPlayerInfo_V1 *)pPlayer->GetPlayerInfo(); |
|
} |
|
else |
|
{ |
|
return NULL; |
|
} |
|
} |
|
|
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CPlayerInfoManager_V1, IPlayerInfoManager_V1, "PlayerInfoManager001", s_PlayerInfoManager_V1); |
|
} |
|
|
|
IPlayerInfo *CPlayerInfoManager::GetPlayerInfo( edict_t *pEdict ) |
|
{ |
|
CBasePlayer *pPlayer = ( ( CBasePlayer * )CBaseEntity::Instance( pEdict )); |
|
if ( pPlayer ) |
|
{ |
|
return pPlayer->GetPlayerInfo(); |
|
} |
|
else |
|
{ |
|
return NULL; |
|
} |
|
} |
|
|
|
CGlobalVars *CPlayerInfoManager::GetGlobalVars() |
|
{ |
|
return gpGlobals; |
|
} |
|
|
|
|
|
|
|
IBotController *CPluginBotManager::GetBotController( edict_t *pEdict ) |
|
{ |
|
CBasePlayer *pPlayer = ( ( CBasePlayer * )CBaseEntity::Instance( pEdict )); |
|
if ( pPlayer && pPlayer->IsBot() ) |
|
{ |
|
return pPlayer->GetBotController(); |
|
} |
|
else |
|
{ |
|
return NULL; |
|
} |
|
} |
|
|
|
edict_t *CPluginBotManager::CreateBot( const char *botname ) |
|
{ |
|
edict_t *pEdict = engine->CreateFakeClient( botname ); |
|
if (!pEdict) |
|
{ |
|
Msg( "Failed to create Bot.\n"); |
|
return NULL; |
|
} |
|
|
|
// Allocate a player entity for the bot, and call spawn |
|
CBasePlayer *pPlayer = ((CBasePlayer*)CBaseEntity::Instance( pEdict )); |
|
|
|
pPlayer->ClearFlags(); |
|
pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT ); |
|
|
|
pPlayer->ChangeTeam( TEAM_UNASSIGNED ); |
|
pPlayer->RemoveAllItems( true ); |
|
pPlayer->Spawn(); |
|
|
|
return pEdict; |
|
} |
|
|
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CPlayerInfoManager, IPlayerInfoManager, INTERFACEVERSION_PLAYERINFOMANAGER, s_PlayerInfoManager); |
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CPluginBotManager, IBotManager, INTERFACEVERSION_PLAYERBOTMANAGER, s_BotManager); |
|
|
|
|