You can make it much faster and remove the loop by creating a small 64k array lookup buffer, user ids are defined as the short type.
The setup calls are identical to the VSP names, Load(), Unload(), which must be called in priority order. i.e don't call gpManiTrackUser->Load() as the last thing in the Load() callback.
To get the player index, use gpManiTrackUser->GetIndex(user_id), if it's -1 they don't exist.
mani_trackuser.h
Code:
#ifndef MANI_TRACK_USER_H
#define MANI_TRACK_USER_H
class ManiTrackUser
{
public:
ManiTrackUser();
~ManiTrackUser();
void ClientActive(edict_t *pEntity);
void ClientDisconnect(player_t *player_ptr);
void Load(void);
void Unload(void);
void LevelInit(void);
int GetIndex(int user_id) { return (int) user_table[user_id]; }
}
private:
// Table of user ids
char user_table[65536];
};
extern ManiTrackUser *gpManiTrackUser;
#endif
mani_trackuser.cpp
Code:
// Add your includes here
#include "mani_trackuser.h"
ManiTrackUser::ManiTrackUser()
{
// Setup table for search speed lookup
for (int i = 0; i < 65536; i ++)
{
user_table[i] = -1;
}
gpManiTrackUser = this;
}
ManiTrackUser::~ManiTrackUser()
{
// Cleanup
}
//---------------------------------------------------------------------------------
// Purpose: Plugin Loaded
//---------------------------------------------------------------------------------
void ManiTrackUser::Load(void)
{
for (int i = 0; i < 65536; i ++)
{
user_table[i] = -1;
}
for (int i = 1; i <= max_players; i++)
{
player_t player;
player.index = i;
if (!FindPlayerByIndex(&player)) continue;
user_table[player.user_id] = i;
}
}
//---------------------------------------------------------------------------------
// Purpose: Plugin Unloaded
//---------------------------------------------------------------------------------
void ManiTrackUser::Unload(void)
{
for (int i = 0; i < 65536; i ++)
{
user_table[i] = -1;
}
}
//---------------------------------------------------------------------------------
// Purpose: Level Loaded
//---------------------------------------------------------------------------------
void ManiTrackUser::LevelInit(void)
{
for (int i = 0; i < 65536; i ++)
{
user_table[i] = -1;
}
}
//---------------------------------------------------------------------------------
// Purpose: Client Active
//---------------------------------------------------------------------------------
void ManiTrackUser::ClientActive(edict_t *pEntity)
{
if(pEntity && !pEntity->IsFree() )
{
IPlayerInfo *playerinfo = playerinfomanager->GetPlayerInfo( pEntity );
if (playerinfo && playerinfo->IsConnected())
{
user_table[playerinfo->GetUserID()] = engine->IndexOfEdict(pEntity);
}
}
}
//---------------------------------------------------------------------------------
// Purpose: Check Player on disconnect
//---------------------------------------------------------------------------------
void ManiTrackUser::ClientDisconnect(player_t *player_ptr)
{
user_table[player_ptr->user_id] = -1;
}
ManiTrackUser g_ManiTrackUser;
ManiTrackUser *gpManiTrackUser;
Mani
__________________