const char *CHalfLifeTeamplay::SetDefaultPlayerTeam( CBasePlayer *pPlayer ) { // copy out the team name from the model char *mdls = g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "model" ); strncpy( pPlayer->m_szTeamName, mdls, TEAM_NAME_LENGTH ); RecountTeams(); // update the current player of the team he is joining if ( pPlayer->m_szTeamName[0] == '\0' || !IsValidTeam( pPlayer->m_szTeamName ) || defaultteam.value ) { const char *pTeamName = NULL; if ( defaultteam.value ) { pTeamName = team_names[0]; } else { pTeamName = TeamWithFewestPlayers(); } strncpy( pPlayer->m_szTeamName, pTeamName, TEAM_NAME_LENGTH ); } return pPlayer->m_szTeamName; }
bool CGenericClassBasedReplay::Read( KeyValues *pIn ) { if ( !BaseClass::Read( pIn ) ) return false; // Read player class m_nPlayerClass = pIn->GetInt( "player_class" ); Assert( IsValidClass( m_nPlayerClass ) ); // Read player team m_nPlayerTeam = pIn->GetInt( "player_team" ); Assert( IsValidTeam( m_nPlayerTeam ) ); // Read killer info m_nKillerClass = pIn->GetInt( "killer_class" ); V_strcpy_safe( m_szKillerName, pIn->GetString( "killer_name" ) ); // Make sure vector is clear Assert( GetKillCount() == 0 ); // Read all kill data and add the kills vector KeyValues *pKills = pIn->FindKey( "kills" ); if ( pKills ) { FOR_EACH_TRUE_SUBKEY( pKills, pKill ) { // Create the kill data AddKill( pKill->GetString( "victim_name" ), pKill->GetInt( "victim_class" ) ); } }
const char *CHalfLifeTeamplay::SetDefaultPlayerTeam( CBasePlayer *pPlayer ) { // copy out the team name from the model char *mdls = g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "model" ); pPlayer->SetTeamID(mdls); RecountTeams(); // update the current player of the team he is joining const char* theTeamName = pPlayer->TeamID(); if ( theTeamName == '\0' || !IsValidTeam( theTeamName ) || defaultteam.value ) { const char *pTeamName = NULL; if ( defaultteam.value ) { pTeamName = team_names[0]; } else { pTeamName = TeamWithFewestPlayers(); } pPlayer->SetTeamID(pTeamName); } return pPlayer->TeamID(); }
void CDDom::Kill( CUser* pAttack, CUser* pTarget ) { if( GetRunTime() != RUN_FIGHT ) return; if( IsInvalidObj( pAttack ) || IsInvalidObj( pTarget ) ) return; if( IsValidTeam( pAttack->m_ddomTeam, pTarget->m_ddomTeam ) ) { CDDomTeam* pDomAttack = &m_DomTeam[ pAttack->m_ddomTeam ]; CDDomTeam* pDomDefend = &m_DomTeam[ pTarget->m_ddomTeam ]; if( pDomAttack == NULL || pDomDefend == NULL ) return; //Increase( pAttack->m_ddomTeam, INC_KILL ); //Increase( pTarget->m_ddomTeam, INC_DEATH ); pDomAttack->Increase( pAttack->m_idPlayer, INC_KILL ); pDomDefend->Increase( pTarget->m_idPlayer, INC_DEATH ); CString strKill; strKill.Format( "[%s] %s has killed [%s] %s", GetName( pAttack->m_ddomTeam ), pAttack->GetName(), GetName( pTarget->m_ddomTeam ), pTarget->GetName() ); Send( strKill, FONT_MIDMED, DoubleDom::Color::nGoldCol ); } }
const char *CTeamplayRules::SetDefaultPlayerTeam( CBasePlayer *pPlayer ) { // copy out the team name from the model char *mdls = engine->InfoKeyValue( engine->GetInfoKeyBuffer( pPlayer->edict() ), "model" ); pPlayer->SetTeamName( mdls ); RecountTeams(); // update the current player of the team he is joining if ( (pPlayer->TeamName())[0] == '\0' || !IsValidTeam( pPlayer->TeamName() ) || defaultteam.GetFloat() ) { const char *pTeamName = NULL; if ( defaultteam.GetFloat() ) { pTeamName = team_names[0]; } else { pTeamName = TeamWithFewestPlayers(); } pPlayer->SetTeamName( pTeamName ); } return pPlayer->TeamName(); }
//========================================================= // ClientUserInfoChanged //========================================================= void CHalfLifeTeamplay::ClientUserInfoChanged( CBasePlayer *pPlayer, char *infobuffer ) { char text[1024]; // prevent skin/color/model changes char *mdls = g_engfuncs.pfnInfoKeyValue( infobuffer, "model" ); if ( !stricmp( mdls, pPlayer->TeamID() ) ) return; if ( defaultteam.value ) { int clientIndex = pPlayer->entindex(); g_engfuncs.pfnSetClientKeyValue( clientIndex, g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "model", pPlayer->TeamID() ); g_engfuncs.pfnSetClientKeyValue( clientIndex, g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "team", pPlayer->TeamID() ); sprintf( text, "* Not allowed to change teams in this game!\n" ); UTIL_SayText( text, pPlayer ); return; } if ( defaultteam.value || !IsValidTeam( mdls ) ) { int clientIndex = pPlayer->entindex(); g_engfuncs.pfnSetClientKeyValue( clientIndex, g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "model", pPlayer->TeamID() ); sprintf( text, "* Can't change team to \'%s\'\n", mdls ); UTIL_SayText( text, pPlayer ); sprintf( text, "* Server limits teams to \'%s\'\n", m_szTeamList ); UTIL_SayText( text, pPlayer ); return; } // notify everyone of the team change sprintf( text, "* %s has changed to team \'%s\'\n", STRING(pPlayer->pev->netname), mdls ); UTIL_SayTextAll( text, pPlayer ); UTIL_LogPrintf( "\"%s<%i><%s><%s>\" joined team \"%s\"\n", STRING(pPlayer->pev->netname), GETPLAYERUSERID( pPlayer->edict() ), #ifdef USE_UPP UPPUtil_GetNetworkID(pPlayer->edict()).c_str(), #else AvHSUGetPlayerAuthIDString( pPlayer->edict() ).c_str(), #endif pPlayer->TeamID(), mdls ); ChangePlayerTeam( pPlayer, mdls, TRUE, TRUE ); // recound stuff RecountTeams(); }
//========================================================= // InitHUD //========================================================= void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer ) { int i; SetDefaultPlayerTeam( pPlayer ); CHalfLifeMultiplay::InitHUD( pPlayer ); // Send down the team names MESSAGE_BEGIN( MSG_ONE, gmsgTeamNames, NULL, pPlayer->edict() ); WRITE_BYTE( num_teams ); for ( i = 0; i < num_teams; i++ ) { WRITE_STRING( team_names[ i ] ); } MESSAGE_END(); RecountTeams(); char *mdls = g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "model" ); // update the current player of the team he is joining char text[1024]; if ( !strcmp( mdls, pPlayer->m_szTeamName ) ) { sprintf( text, "* you are on team \'%s\'\n", pPlayer->m_szTeamName ); } else { sprintf( text, "* assigned to team %s\n", pPlayer->m_szTeamName ); } ChangePlayerTeam( pPlayer, pPlayer->m_szTeamName, FALSE, FALSE ); UTIL_SayText( text, pPlayer ); int clientIndex = pPlayer->entindex(); RecountTeams(); // update this player with all the other players team info // loop through all active players and send their team info to the new client for ( i = 1; i <= gpGlobals->maxClients; i++ ) { CBaseEntity *plr = UTIL_PlayerByIndex( i ); if ( plr && IsValidTeam( plr->TeamID() ) ) { MESSAGE_BEGIN( MSG_ONE, gmsgTeamInfo, NULL, pPlayer->edict() ); WRITE_BYTE( plr->entindex() ); WRITE_STRING( plr->TeamID() ); MESSAGE_END(); } } }
//========================================================= // ClientUserInfoChanged //========================================================= void CTeamplayRules::ClientUserInfoChanged( CBasePlayer *pPlayer, char *infobuffer ) { char text[1024]; // prevent skin/color/model changes char *mdls = engine->InfoKeyValue( infobuffer, "model" ); if ( !stricmp( mdls, pPlayer->TeamName() ) ) return; if ( defaultteam.GetFloat() ) { int clientIndex = pPlayer->entindex(); engine->SetClientKeyValue( clientIndex, engine->GetInfoKeyBuffer( pPlayer->edict() ), "model", pPlayer->TeamName() ); engine->SetClientKeyValue( clientIndex, engine->GetInfoKeyBuffer( pPlayer->edict() ), "team", pPlayer->TeamName() ); UTIL_SayText( "Not allowed to change teams in this game!\n", pPlayer ); return; } if ( defaultteam.GetFloat() || !IsValidTeam( mdls ) ) { int clientIndex = pPlayer->entindex(); engine->SetClientKeyValue( clientIndex, engine->GetInfoKeyBuffer( pPlayer->edict() ), "model", pPlayer->TeamName() ); Q_snprintf( text,sizeof(text), "Can't change team to \'%s\'\n", mdls ); UTIL_SayText( text, pPlayer ); Q_snprintf( text,sizeof(text), "Server limits teams to \'%s\'\n", m_szTeamList ); UTIL_SayText( text, pPlayer ); return; } // notify everyone of the team change if ( Q_strlen( STRING(pPlayer->pl.netname) ) > 0 ) { Q_snprintf( text,sizeof(text), "%s has changed to team \'%s\'\n", STRING(pPlayer->pl.netname), mdls ); UTIL_SayTextAll( text, pPlayer ); } UTIL_LogPrintf( "\"%s<%i>\" changed to team %s\n", STRING( pPlayer->pl.netname ), engine->GetPlayerUserId( pPlayer->edict() ), mdls ); ChangePlayerTeam( pPlayer, mdls, true, true ); // recound stuff RecountTeams(); }
//========================================================= //========================================================= void CHalfLifeTeamplay::RecountTeams( BOOL bResendInfo ) { char *pName; char teamlist[TEAMPLAY_TEAMLISTLENGTH]; // loop through all teams, recounting everything num_teams = 0; // Copy all of the teams from the teamlist // make a copy because strtok is destructive strcpy( teamlist, m_szTeamList ); pName = teamlist; pName = strtok( pName, ";" ); while ( pName != NULL && *pName ) { if ( GetTeamIndex( pName ) < 0 ) { strcpy( team_names[num_teams], pName ); num_teams++; } pName = strtok( NULL, ";" ); } if ( num_teams < 2 ) { num_teams = 0; m_teamLimit = FALSE; } // Sanity check memset( team_scores, 0, sizeof(team_scores) ); // loop through all clients for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBaseEntity *plr = UTIL_PlayerByIndex( i ); if ( plr ) { const char *pTeamName = plr->TeamID(); // try add to existing team int tm = GetTeamIndex( pTeamName ); if ( tm < 0 ) // no team match found { if ( !m_teamLimit ) { // add to new team tm = num_teams; num_teams++; team_scores[tm] = 0; strncpy( team_names[tm], pTeamName, MAX_TEAMNAME_LENGTH ); } } if ( tm >= 0 ) { team_scores[tm] += plr->pev->frags; } if ( bResendInfo ) //Someone's info changed, let's send the team info again. { if ( plr && IsValidTeam( plr->TeamID() ) ) { MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo, NULL ); WRITE_BYTE( plr->entindex() ); WRITE_STRING( plr->TeamID() ); MESSAGE_END(); } } } } }