本文整理汇总了C++中PLAYERNUM函数的典型用法代码示例。如果您正苦于以下问题:C++ PLAYERNUM函数的具体用法?C++ PLAYERNUM怎么用?C++ PLAYERNUM使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PLAYERNUM函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: G_Match_Ready
/*
* G_Match_Ready
*/
void G_Match_Ready( edict_t *ent )
{
if( ent->r.svflags & SVF_FAKECLIENT && level.ready[PLAYERNUM( ent )] == true )
return;
if( ent->s.team == TEAM_SPECTATOR )
{
G_PrintMsg( ent, "Join the game first\n" );
return;
}
if( GS_MatchState() != MATCH_STATE_WARMUP )
{
if( !( ent->r.svflags & SVF_FAKECLIENT ) )
G_PrintMsg( ent, "We're not in warmup.\n" );
return;
}
if( level.ready[PLAYERNUM( ent )] )
{
G_PrintMsg( ent, "You are already ready.\n" );
return;
}
level.ready[PLAYERNUM( ent )] = true;
G_PrintMsg( NULL, "%s%s is ready!\n", ent->r.client->netname, S_COLOR_WHITE );
G_UpdatePlayerMatchMsg( ent );
G_Match_CheckReadys();
}
示例2: G_EndServerFrames_UpdateChaseCam
/*
* G_EndServerFrames_UpdateChaseCam
*/
void G_EndServerFrames_UpdateChaseCam( void )
{
int i, team;
edict_t *ent;
// do it by teams, so spectators can copy the chasecam information from players
for( team = TEAM_PLAYERS; team < GS_MAX_TEAMS; team++ )
{
for( i = 0; i < teamlist[team].numplayers; i++ )
{
ent = game.edicts + teamlist[team].playerIndices[i];
if( trap_GetClientState( PLAYERNUM(ent) ) < CS_SPAWNED )
{
G_Chase_SetChaseActive( ent, false );
continue;
}
G_EndFrame_UpdateChaseCam( ent );
}
}
// Do spectators last
team = TEAM_SPECTATOR;
for( i = 0; i < teamlist[team].numplayers; i++ )
{
ent = game.edicts + teamlist[team].playerIndices[i];
if( trap_GetClientState( PLAYERNUM(ent) ) < CS_SPAWNED )
{
G_Chase_SetChaseActive( ent, false );
continue;
}
G_EndFrame_UpdateChaseCam( ent );
}
}
示例3: TVM_ClientConnect
/*
* TVM_ClientConnect
*/
void TVM_ClientConnect( tvm_relay_t *relay, edict_t *ent, char *userinfo )
{
edict_t *spec;
assert( relay );
assert( ent );
assert( userinfo );
// make sure we start with known default
if( ent->relay->playernum < 0 )
spec = NULL;
else
spec = ent->relay->edicts + ent->relay->playernum + 1;
ent->local = true;
ent->relay = relay;
ent->r.inuse = true;
ent->r.svflags = SVF_NOCLIENT;
ent->s.team = spec ? spec->s.team : 0;
ent->r.client = relay->local_clients + PLAYERNUM( ent );
memset( ent->r.client, 0, sizeof( *ent->r.client ) );
ent->r.client->ps.playerNum = PLAYERNUM( ent );
InitClientPersistant( ent->r.client );
TVM_ClientUserinfoChanged( relay, ent, userinfo );
//TVM_Printf( "Connect: %s\n", ent->r.client->pers.netname );
ent->r.client->pers.connected = true;
ent->r.client->pers.connecting = true;
}
示例4: G_Match_NotReady
/*
* G_Match_NotReady
*/
void G_Match_NotReady( edict_t *ent )
{
if( ent->s.team == TEAM_SPECTATOR )
{
G_PrintMsg( ent, "Join the game first\n" );
return;
}
if( GS_MatchState() != MATCH_STATE_WARMUP && GS_MatchState() != MATCH_STATE_COUNTDOWN )
{
G_PrintMsg( ent, "A match is not being setup.\n" );
return;
}
if( !level.ready[PLAYERNUM( ent )] )
{
G_PrintMsg( ent, "You weren't ready.\n" );
return;
}
level.ready[PLAYERNUM( ent )] = false;
G_PrintMsg( NULL, "%s%s is no longer ready.\n", ent->r.client->netname, S_COLOR_WHITE );
G_UpdatePlayerMatchMsg( ent );
G_Match_CheckReadys();
}
示例5: G_ScoreboardMessage_AddChasers
void G_ScoreboardMessage_AddChasers( int entnum, int entnum_self )
{
char entry[MAX_TOKEN_CHARS];
int i;
edict_t *e;
size_t len;
len = strlen( scoreboardString );
if( !len )
return;
// add personal spectators
Q_strncpyz( entry, "&y ", sizeof( entry ) );
ADD_SCOREBOARD_ENTRY( scoreboardString, len, entry );
for( i = 0; i < teamlist[TEAM_SPECTATOR].numplayers; i++ )
{
e = game.edicts + teamlist[TEAM_SPECTATOR].playerIndices[i];
if( ENTNUM( e ) == entnum_self )
continue;
if( e->r.client->connecting || trap_GetClientState( PLAYERNUM( e ) ) < CS_SPAWNED )
continue;
if( !e->r.client->resp.chase.active || e->r.client->resp.chase.target != entnum )
continue;
Q_snprintfz( entry, sizeof( entry ), "%i ", PLAYERNUM( e ) );
ADD_SCOREBOARD_ENTRY( scoreboardString, len, entry );
}
}
示例6: G_Teams_JoinChallengersQueue
/*
* G_Teams_JoinChallengersQueue
*/
void G_Teams_JoinChallengersQueue( edict_t *ent )
{
int pos = 0;
edict_t *e;
if( !GS_HasChallengers() )
{
ent->r.client->queueTimeStamp = 0;
return;
}
if( ent->s.team != TEAM_SPECTATOR )
return;
// enter the challengers queue
if( !ent->r.client->queueTimeStamp )
{ // enter the line
ent->r.client->queueTimeStamp = game.realtime;
for( e = game.edicts + 1; PLAYERNUM( e ) < gs.maxclients; e++ )
{
if( !e->r.inuse || !e->r.client || trap_GetClientState( PLAYERNUM(e) ) < CS_SPAWNED )
continue;
if( !e->r.client->queueTimeStamp || e->s.team != TEAM_SPECTATOR )
continue;
// if there are other players with the same timestamp, increase ours
if( e->r.client->queueTimeStamp >= ent->r.client->queueTimeStamp )
ent->r.client->queueTimeStamp = e->r.client->queueTimeStamp+1;
if( e->r.client->queueTimeStamp < ent->r.client->queueTimeStamp )
pos++;
}
G_PrintMsg( ent, "%sYou entered the challengers queue in position %i\n", S_COLOR_CYAN, pos+1 );
G_UpdatePlayerMatchMsg( ent );
}
}
示例7: TVM_ClientUserinfoChanged
/*
* TVM_ClientUserInfoChanged
*
* called whenever the player updates a userinfo variable.
*
* The game can override any of the settings in place
* (forcing skins or names, etc) before copying it off.
*/
void TVM_ClientUserinfoChanged( tvm_relay_t *relay, edict_t *ent, char *userinfo )
{
gclient_t *cl;
char *s;
assert( ent && ent->local && ent->r.client );
cl = ent->r.client;
// check for malformed or illegal info strings
if( !Info_Validate( userinfo ) )
{
trap_DropClient( relay, PLAYERNUM( ent ), DROP_TYPE_GENERAL, "Error: Invalid userinfo" );
return;
}
if( !Info_ValueForKey( userinfo, "name" ) )
{
trap_DropClient( relay, PLAYERNUM( ent ), DROP_TYPE_GENERAL, "Error: No name set" );
return;
}
// set name, it's validated and possibly changed first
Q_strncpyz( cl->pers.netname, Info_ValueForKey( userinfo, "name" ), sizeof( cl->pers.netname ) );
// fov
s = Info_ValueForKey( userinfo, "fov" );
if( !s )
{
cl->pers.fov = 100;
}
else
{
cl->pers.fov = atoi( s );
clamp( cl->pers.fov, 1, 140 );
}
s = Info_ValueForKey( userinfo, "zoomfov" );
if( !s )
{
cl->pers.zoomfov = 30;
}
else
{
cl->pers.zoomfov = atoi( s );
clamp( cl->pers.zoomfov, 1, 60 );
}
// save off the userinfo in case we want to check something later
Q_strncpyz( cl->pers.userinfo, userinfo, sizeof( cl->pers.userinfo ) );
}
示例8: TVM_Cmd_PlayersExt_f
/*
* TVM_Cmd_PlayersExt_f
*/
static void TVM_Cmd_PlayersExt_f( edict_t *ent, bool onlyspecs ) {
int i;
int count = 0;
int start = 0;
char line[64];
char msg[1024];
edict_t *e;
tvm_relay_t *relay = ent->relay;
if( trap_Cmd_Argc() > 1 ) {
start = atoi( trap_Cmd_Argv( 1 ) );
}
clamp( start, 0, relay->maxclients - 1 );
// print information
msg[0] = 0;
for( i = start + 1; PLAYERNUM( ( relay->edicts + i ) ) < relay->maxclients; i++ ) {
e = relay->edicts + i;
if( e->r.inuse && !e->local && e->r.client ) {
char *userinfo;
userinfo = relay->configStrings[CS_PLAYERINFOS + PLAYERNUM( e )];
Q_snprintfz( line, sizeof( line ), "%3i %s\n", i, Info_ValueForKey( userinfo, "name" ) );
if( strlen( line ) + strlen( msg ) > sizeof( msg ) - 100 ) {
// can't print all of them in one packet
Q_strncatz( msg, "...\n", sizeof( msg ) );
break;
}
if( count == 0 ) {
Q_strncatz( msg, "num name\n", sizeof( msg ) );
Q_strncatz( msg, "--- ---------------\n", sizeof( msg ) );
}
Q_strncatz( msg, line, sizeof( msg ) );
count++;
}
}
if( count ) {
Q_strncatz( msg, "--- ---------------\n", sizeof( msg ) );
}
Q_strncatz( msg, va( "%3i %s\n", count, trap_Cmd_Argv( 0 ) ), sizeof( msg ) );
TVM_PrintMsg( relay, ent, "%s", msg );
if( i < relay->maxclients ) {
TVM_PrintMsg( relay, ent, "Type '%s %i' for more %s\n", trap_Cmd_Argv( 0 ), i, trap_Cmd_Argv( 0 ) );
}
}
示例9: Q_snprintfz
char *G_Gametype_GENERIC_ScoreboardMessage( void )
{
char entry[MAX_TOKEN_CHARS];
size_t len;
int i;
edict_t *e;
int carrierIcon;
*scoreboardString = 0;
len = 0;
Q_snprintfz( entry, sizeof(entry), "&t %i 0 0 ", TEAM_PLAYERS );
if( SCOREBOARD_MSG_MAXSIZE - len > strlen( entry ) )
{
Q_strncatz( scoreboardString, entry, sizeof( scoreboardString ) );
len = strlen( scoreboardString );
}
// players
for( i = 0; i < teamlist[TEAM_PLAYERS].numplayers; i++ )
{
e = game.edicts + teamlist[TEAM_PLAYERS].playerIndices[i];
if( e->s.effects & EF_CARRIER )
carrierIcon = trap_ImageIndex( ( e->s.team == TEAM_BETA ) ? PATH_ALPHAFLAG_ICON : PATH_BETAFLAG_ICON );
else if( e->s.effects & EF_QUAD )
carrierIcon = trap_ImageIndex( PATH_QUAD_ICON );
else if( e->s.effects & EF_SHELL )
carrierIcon = trap_ImageIndex( PATH_SHELL_ICON );
else if( e->s.effects & EF_REGEN )
carrierIcon = trap_ImageIndex( PATH_REGEN_ICON );
else
carrierIcon = 0;
Q_snprintfz( entry, sizeof( entry ), "&p %i %i %i %i %i ",
PLAYERNUM( e ),
e->r.client->level.stats.score,
e->r.client->r.ping > 999 ? 999 : e->r.client->r.ping,
carrierIcon,
( level.ready[PLAYERNUM( e )] || GS_MatchState() >= MATCH_STATE_PLAYTIME ) ? trap_ImageIndex( PATH_VSAY_YES_ICON ) : 0
);
if( SCOREBOARD_MSG_MAXSIZE - len > strlen( entry ) )
{
Q_strncatz( scoreboardString, entry, sizeof( scoreboardString ) );
len = strlen( scoreboardString );
}
}
return scoreboardString;
}
示例10: AITools_Frame
//==========================================
// AITools_Frame
// Gives think time to the debug tools found
// in this archive (those witch need it)
//==========================================
void AITools_Frame( void )
{
edict_t *ent;
for( ent = game.edicts + 1; PLAYERNUM( ent ) < gs.maxclients; ent++ )
{
if( !ent->r.inuse )
continue;
if( trap_GetClientState( PLAYERNUM( ent ) ) < CS_SPAWNED )
continue;
AITools_DropNodes( ent );
AITools_ShowPlinks( ent );
}
}
示例11: ClientDisconnect
/*
* ClientDisconnect
* Called when a player drops from the server.
* Will not be called between levels.
*/
void ClientDisconnect( edict_t *ent, const char *reason )
{
int team;
if( !ent->r.client || !ent->r.inuse )
return;
// always report in RACE mode
if( GS_RaceGametype()
|| ( ent->r.client->team != TEAM_SPECTATOR && ( GS_MatchState() == MATCH_STATE_PLAYTIME || GS_MatchState() == MATCH_STATE_POSTMATCH ) ) )
G_AddPlayerReport( ent, GS_MatchState() == MATCH_STATE_POSTMATCH );
for( team = TEAM_PLAYERS; team < GS_MAX_TEAMS; team++ )
G_Teams_UnInvitePlayer( team, ent );
if( !level.gametype.disableObituaries || !(ent->r.svflags & SVF_FAKECLIENT ) )
{
if( !reason )
G_PrintMsg( NULL, "%s" S_COLOR_WHITE " disconnected\n", ent->r.client->netname );
else
G_PrintMsg( NULL, "%s" S_COLOR_WHITE " disconnected (%s" S_COLOR_WHITE ")\n", ent->r.client->netname, reason );
}
// send effect
if( ent->s.team > TEAM_SPECTATOR )
G_TeleportEffect( ent, false );
ent->r.client->team = TEAM_SPECTATOR;
G_ClientRespawn( ent, true ); // respawn as ghost
ent->movetype = MOVETYPE_NOCLIP; // allow freefly
// let the gametype scripts know this client just disconnected
G_Gametype_ScoreEvent( ent->r.client, "disconnect", NULL );
G_FreeAI( ent );
AI_EnemyRemoved( ent );
ent->r.inuse = false;
ent->r.svflags = SVF_NOCLIENT;
memset( ent->r.client, 0, sizeof( *ent->r.client ) );
ent->r.client->ps.playerNum = PLAYERNUM( ent );
trap_ConfigString( CS_PLAYERINFOS+PLAYERNUM( ent ), "" );
GClip_UnlinkEntity( ent );
G_Match_CheckReadys();
}
示例12: G_PlayerAward
void G_PlayerAward( edict_t *ent, const char *awardMsg )
{
edict_t *other;
char cmd[MAX_STRING_CHARS];
gameaward_t *ga;
int i, size;
score_stats_t *stats;
if( !awardMsg || !awardMsg[0] || !ent->r.client )
return;
Q_snprintfz( cmd, sizeof( cmd ), "aw \"%s\"", awardMsg );
trap_GameCmd( ent, cmd );
if( dedicated->integer )
G_Printf( "%s", COM_RemoveColorTokens( va( "%s receives a '%s' award.\n", ent->r.client->netname, awardMsg ) ) );
ent->r.client->level.stats.awards++;
teamlist[ent->s.team].stats.awards++;
G_Gametype_ScoreEvent( ent->r.client, "award", awardMsg );
stats = &ent->r.client->level.stats;
if( !stats->awardAllocator )
stats->awardAllocator = LinearAllocator( sizeof( gameaward_t ), 0, _G_LevelMalloc, _G_LevelFree );
// ch : this doesnt work for race right?
if( GS_MatchState() == MATCH_STATE_PLAYTIME || GS_MatchState() == MATCH_STATE_POSTMATCH )
{
// ch : we store this locally to send to MM
// first check if we already have this one on the clients list
size = LA_Size( stats->awardAllocator );
ga = NULL;
for( i = 0; i < size; i++ )
{
ga = ( gameaward_t * )LA_Pointer( stats->awardAllocator, i );
if( !strncmp( ga->name, awardMsg, sizeof(ga->name)-1 ) )
break;
}
if( i >= size )
{
ga = ( gameaward_t * )LA_Alloc( stats->awardAllocator );
memset( ga, 0, sizeof(*ga) );
ga->name = G_RegisterLevelString( awardMsg );
}
if( ga )
ga->count++;
}
// add it to every player who's chasing this player
for( other = game.edicts + 1; PLAYERNUM( other ) < gs.maxclients; other++ )
{
if( !other->r.client || !other->r.inuse || !other->r.client->resp.chase.active )
continue;
if( other->r.client->resp.chase.target == ENTNUM( ent ) )
trap_GameCmd( other, cmd );
}
}
示例13: G_Chase_IsValidTarget
/*
* G_Chase_IsValidTarget
*/
static bool G_Chase_IsValidTarget( edict_t *ent, edict_t *target, bool teamonly ) {
if( !ent || !target ) {
return false;
}
if( !target->r.inuse || !target->r.client || trap_GetClientState( PLAYERNUM( target ) ) < CS_SPAWNED ) {
return false;
}
if( target->s.team < TEAM_PLAYERS || target->s.team >= GS_MAX_TEAMS || target == ent ) {
return false;
}
if( teamonly && !ent->r.client->teamstate.is_coach && G_ISGHOSTING( target ) ) {
return false;
}
if( teamonly && target->s.team != ent->s.team ) {
return false;
}
if( G_ISGHOSTING( target ) && !target->deadflag && target->s.team != TEAM_SPECTATOR ) {
return false; // ghosts that are neither dead, nor speccing (probably originating from gt-specific rules)
}
return true;
}
示例14: G_Teams_Invite_f
/*
* G_Teams_Invite_f
*/
void G_Teams_Invite_f( edict_t *ent )
{
char *text;
edict_t *toinvite;
int team;
if( ( !ent->r.inuse || !ent->r.client ) )
return;
text = trap_Cmd_Argv( 1 );
if( !text || !strlen( text ) )
{
int i;
edict_t *e;
char msg[1024];
msg[0] = 0;
Q_strncatz( msg, "Usage: invite <player>\n", sizeof( msg ) );
Q_strncatz( msg, "- List of current players:\n", sizeof( msg ) );
for( i = 0, e = game.edicts+1; i < gs.maxclients; i++, e++ )
{
if( !e->r.inuse )
continue;
Q_strncatz( msg, va( "%3i: %s\n", PLAYERNUM( e ), e->r.client->netname ), sizeof( msg ) );
}
G_PrintMsg( ent, "%s", msg );
return;
}
team = ent->s.team;
if( !G_Teams_TeamIsLocked( team ) )
{
G_PrintMsg( ent, "Your team is not locked.\n" );
return;
}
toinvite = G_PlayerForText( text );
if( !toinvite )
{
G_PrintMsg( ent, "No such player.\n" );
return;
}
if( G_Teams_PlayerIsInvited( team, toinvite ) )
{
G_PrintMsg( ent, "%s%s is already invited to your team.\n", toinvite->r.client->netname, S_COLOR_WHITE );
return;
}
G_Teams_InvitePlayer( team, toinvite );
G_PrintMsg( NULL, "%s%s invited %s%s to team %s%s.\n", ent->r.client->netname, S_COLOR_WHITE,
toinvite->r.client->netname, S_COLOR_WHITE, GS_TeamName( team ), S_COLOR_WHITE );
}
示例15: G_Match_ScorelimitHit
/*
* G_Match_ScorelimitHit
*/
bool G_Match_ScorelimitHit( void )
{
edict_t *e;
if( GS_MatchState() != MATCH_STATE_PLAYTIME )
return false;
if( g_scorelimit->integer )
{
if( !GS_TeamBasedGametype() )
{
for( e = game.edicts+1; PLAYERNUM( e ) < gs.maxclients; e++ )
{
if( !e->r.inuse )
continue;
if( e->r.client->level.stats.score >= g_scorelimit->integer )
return true;
}
}
else
{
int team;
for( team = TEAM_ALPHA; team < GS_MAX_TEAMS; team++ )
{
if( teamlist[team].stats.score >= g_scorelimit->integer )
return true;
}
}
}
return false;
}