View Single Post
Mani
Veteran Member
Join Date: Dec 2004
Location: UK
Old 04-19-2006 , 12:50  
Reply With Quote #6

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
__________________
Installation files, documentation and help can be found at: -

www.mani-admin-plugin.com
Mani is offline