added a playerinfo function to kick this off
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40650
This commit is contained in:
parent
88eae4ad1e
commit
49c9ab6e25
@ -196,8 +196,11 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
|
|||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
m_AuthQueue[++m_AuthQueue[0]] = client;
|
if (!m_Players[client].IsAuthorized())
|
||||||
g_SourceMod.SetAuthChecking(true);
|
{
|
||||||
|
m_AuthQueue[++m_AuthQueue[0]] = client;
|
||||||
|
g_SourceMod.SetAuthChecking(true);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
RETURN_META_VALUE(MRES_SUPERCEDE, false);
|
RETURN_META_VALUE(MRES_SUPERCEDE, false);
|
||||||
}
|
}
|
||||||
@ -229,10 +232,13 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
|
|||||||
int client = engine->IndexOfEdict(pEntity);
|
int client = engine->IndexOfEdict(pEntity);
|
||||||
|
|
||||||
CPlayer *pPlayer = GetPlayerByIndex(client);
|
CPlayer *pPlayer = GetPlayerByIndex(client);
|
||||||
|
/* If they're not connected, they're a bot */
|
||||||
if (!pPlayer->IsConnected())
|
if (!pPlayer->IsConnected())
|
||||||
{
|
{
|
||||||
/* Run manual connection routines */
|
/* Run manual connection routines */
|
||||||
char error[255];
|
char error[255];
|
||||||
|
const char *authid = engine->GetPlayerNetworkIDString(pEntity);
|
||||||
|
pPlayer->Authorize(authid);
|
||||||
if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error)))
|
if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error)))
|
||||||
{
|
{
|
||||||
/* :TODO: kick the bot if it's rejected */
|
/* :TODO: kick the bot if it's rejected */
|
||||||
@ -244,7 +250,35 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
|
|||||||
{
|
{
|
||||||
pListener = (*iter);
|
pListener = (*iter);
|
||||||
pListener->OnClientConnected(client);
|
pListener->OnClientConnected(client);
|
||||||
|
/* See if bot was kicked */
|
||||||
|
if (!pPlayer->IsConnected())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
/* Now do authorization */
|
||||||
|
for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
|
||||||
|
{
|
||||||
|
pListener = (*iter);
|
||||||
|
pListener->OnClientAuthorized(client, authid);
|
||||||
|
/* See if bot was kicked */
|
||||||
|
if (!pPlayer->IsConnected())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Finally, tell plugins */
|
||||||
|
if (m_clauth->GetFunctionCount())
|
||||||
|
{
|
||||||
|
m_clauth->PushCell(client);
|
||||||
|
m_clauth->PushString(authid);
|
||||||
|
m_clauth->Execute(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playerinfo)
|
||||||
|
{
|
||||||
|
pPlayer->m_Info = playerinfo->GetPlayerInfo(pEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IClientListener *>::iterator iter;
|
List<IClientListener *>::iterator iter;
|
||||||
@ -253,6 +287,11 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
|
|||||||
{
|
{
|
||||||
pListener = (*iter);
|
pListener = (*iter);
|
||||||
pListener->OnClientPutInServer(client);
|
pListener->OnClientPutInServer(client);
|
||||||
|
/* See if player was kicked */
|
||||||
|
if (!pPlayer->IsConnected())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Players[client].Connect();
|
m_Players[client].Connect();
|
||||||
@ -432,6 +471,7 @@ CPlayer::CPlayer()
|
|||||||
m_pEdict = NULL;
|
m_pEdict = NULL;
|
||||||
m_Admin = INVALID_ADMIN_ID;
|
m_Admin = INVALID_ADMIN_ID;
|
||||||
m_TempAdmin = false;
|
m_TempAdmin = false;
|
||||||
|
m_Info = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
|
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
|
||||||
@ -463,6 +503,7 @@ void CPlayer::Disconnect()
|
|||||||
m_Ip.clear();
|
m_Ip.clear();
|
||||||
m_AuthID.clear();
|
m_AuthID.clear();
|
||||||
m_pEdict = NULL;
|
m_pEdict = NULL;
|
||||||
|
m_Info = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::SetName(const char *name)
|
void CPlayer::SetName(const char *name)
|
||||||
@ -505,6 +546,11 @@ bool CPlayer::IsAuthorized()
|
|||||||
return m_IsAuthorized;
|
return m_IsAuthorized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IPlayerInfo *CPlayer::GetPlayerInfo()
|
||||||
|
{
|
||||||
|
return m_Info;
|
||||||
|
}
|
||||||
|
|
||||||
bool CPlayer::IsFakeClient()
|
bool CPlayer::IsFakeClient()
|
||||||
{
|
{
|
||||||
return (strcmp(m_AuthID.c_str(), "BOT") == 0);
|
return (strcmp(m_AuthID.c_str(), "BOT") == 0);
|
||||||
|
@ -42,6 +42,8 @@ public:
|
|||||||
bool IsFakeClient();
|
bool IsFakeClient();
|
||||||
void SetAdminId(AdminId id, bool temporary);
|
void SetAdminId(AdminId id, bool temporary);
|
||||||
AdminId GetAdminId();
|
AdminId GetAdminId();
|
||||||
|
public:
|
||||||
|
IPlayerInfo *GetPlayerInfo();
|
||||||
private:
|
private:
|
||||||
void Initialize(const char *name, const char *ip, edict_t *pEntity);
|
void Initialize(const char *name, const char *ip, edict_t *pEntity);
|
||||||
void Connect();
|
void Connect();
|
||||||
@ -59,6 +61,7 @@ private:
|
|||||||
AdminId m_Admin;
|
AdminId m_Admin;
|
||||||
bool m_TempAdmin;
|
bool m_TempAdmin;
|
||||||
edict_t *m_pEdict;
|
edict_t *m_pEdict;
|
||||||
|
IPlayerInfo *m_Info;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlayerManager :
|
class PlayerManager :
|
||||||
|
@ -369,26 +369,48 @@ static cell_t CanUserTarget(IPluginContext *pContext, const cell_t *params)
|
|||||||
return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0;
|
return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t GetClientTeam(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
int client = params[1];
|
||||||
|
|
||||||
|
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
|
||||||
|
if (!pPlayer)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Player %d is not a valid client", client);
|
||||||
|
} else if (!pPlayer->IsInGame()) {
|
||||||
|
return pContext->ThrowNativeError("Player %d is not in game", client);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
|
||||||
|
if (!pInfo)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("IPlayerInfo not supported by game");
|
||||||
|
}
|
||||||
|
|
||||||
|
return pInfo->GetTeamIndex();
|
||||||
|
}
|
||||||
|
|
||||||
REGISTER_NATIVES(playernatives)
|
REGISTER_NATIVES(playernatives)
|
||||||
{
|
{
|
||||||
{"GetMaxClients", sm_GetMaxClients},
|
|
||||||
{"GetClientCount", sm_GetClientCount},
|
|
||||||
{"GetClientName", sm_GetClientName},
|
|
||||||
{"GetClientIP", sm_GetClientIP},
|
|
||||||
{"GetClientAuthString", sm_GetClientAuthStr},
|
|
||||||
{"IsClientConnected", sm_IsPlayerConnected},
|
|
||||||
{"IsPlayerInGame", sm_IsPlayerIngame},
|
|
||||||
{"IsClientAuthorized", sm_IsPlayerAuthorized},
|
|
||||||
{"IsFakeClient", sm_IsPlayerFakeClient},
|
|
||||||
{"GetClientInfo", sm_GetClientInfo},
|
|
||||||
{"SetUserAdmin", SetUserAdmin},
|
|
||||||
{"GetUserAdmin", GetUserAdmin},
|
|
||||||
{"AddUserFlags", AddUserFlags},
|
{"AddUserFlags", AddUserFlags},
|
||||||
{"RemoveUserFlags", RemoveUserFlags},
|
|
||||||
{"SetUserFlagBits", SetUserFlagBits},
|
|
||||||
{"GetUserFlagBits", GetUserFlagBits},
|
|
||||||
{"GetClientUserId", GetClientUserId},
|
|
||||||
{"CanUserTarget", CanUserTarget},
|
{"CanUserTarget", CanUserTarget},
|
||||||
|
{"GetClientAuthString", sm_GetClientAuthStr},
|
||||||
|
{"GetClientCount", sm_GetClientCount},
|
||||||
|
{"GetClientInfo", sm_GetClientInfo},
|
||||||
|
{"GetClientIP", sm_GetClientIP},
|
||||||
|
{"GetClientName", sm_GetClientName},
|
||||||
|
{"GetClientTeam", GetClientTeam},
|
||||||
|
{"GetClientUserId", GetClientUserId},
|
||||||
|
{"GetMaxClients", sm_GetMaxClients},
|
||||||
|
{"GetUserAdmin", GetUserAdmin},
|
||||||
|
{"GetUserFlagBits", GetUserFlagBits},
|
||||||
|
{"IsClientAuthorized", sm_IsPlayerAuthorized},
|
||||||
|
{"IsClientConnected", sm_IsPlayerConnected},
|
||||||
|
{"IsFakeClient", sm_IsPlayerFakeClient},
|
||||||
|
{"IsPlayerInGame", sm_IsPlayerIngame},
|
||||||
|
{"RemoveUserFlags", RemoveUserFlags},
|
||||||
|
{"SetUserAdmin", SetUserAdmin},
|
||||||
|
{"SetUserFlagBits", SetUserFlagBits},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ IGameEventManager2 *gameevents = NULL;
|
|||||||
IUniformRandomStream *engrandom = NULL;
|
IUniformRandomStream *engrandom = NULL;
|
||||||
CallClass<IVEngineServer> *enginePatch = NULL;
|
CallClass<IVEngineServer> *enginePatch = NULL;
|
||||||
CallClass<IServerGameDLL> *gamedllPatch = NULL;
|
CallClass<IServerGameDLL> *gamedllPatch = NULL;
|
||||||
|
IPlayerInfoManager *playerinfo = NULL;
|
||||||
|
|
||||||
PLUGIN_EXPOSE(SourceMod, g_SourceMod_Core);
|
PLUGIN_EXPOSE(SourceMod, g_SourceMod_Core);
|
||||||
|
|
||||||
@ -41,6 +42,9 @@ bool SourceMod_Core::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen
|
|||||||
GET_V_IFACE_CURRENT(engineFactory, gameevents, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
|
GET_V_IFACE_CURRENT(engineFactory, gameevents, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
|
||||||
GET_V_IFACE_CURRENT(engineFactory, engrandom, IUniformRandomStream, VENGINE_SERVER_RANDOM_INTERFACE_VERSION);
|
GET_V_IFACE_CURRENT(engineFactory, engrandom, IUniformRandomStream, VENGINE_SERVER_RANDOM_INTERFACE_VERSION);
|
||||||
|
|
||||||
|
/* :TODO: Make this optional and... make it find earlier versions [?] */
|
||||||
|
GET_V_IFACE_CURRENT(serverFactory, playerinfo, IPlayerInfoManager, INTERFACEVERSION_PLAYERINFOMANAGER);
|
||||||
|
|
||||||
if ((g_pMMPlugins = (ISmmPluginManager *)g_SMAPI->MetaFactory(MMIFACE_PLMANAGER, NULL, NULL)) == NULL)
|
if ((g_pMMPlugins = (ISmmPluginManager *)g_SMAPI->MetaFactory(MMIFACE_PLMANAGER, NULL, NULL)) == NULL)
|
||||||
{
|
{
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <ISmmPlugin.h>
|
#include <ISmmPlugin.h>
|
||||||
#include <eiface.h>
|
#include <eiface.h>
|
||||||
#include <igameevents.h>
|
#include <igameevents.h>
|
||||||
|
#include <iplayerinfo.h>
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,6 +55,7 @@ extern IGameEventManager2 *gameevents;
|
|||||||
extern SourceHook::CallClass<IVEngineServer> *enginePatch;
|
extern SourceHook::CallClass<IVEngineServer> *enginePatch;
|
||||||
extern SourceHook::CallClass<IServerGameDLL> *gamedllPatch;
|
extern SourceHook::CallClass<IServerGameDLL> *gamedllPatch;
|
||||||
extern IUniformRandomStream *engrandom;
|
extern IUniformRandomStream *engrandom;
|
||||||
|
extern IPlayerInfoManager *playerinfo;
|
||||||
|
|
||||||
#define ENGINE_CALL(func) SH_CALL(enginePatch, &IVEngineServer::func)
|
#define ENGINE_CALL(func) SH_CALL(enginePatch, &IVEngineServer::func)
|
||||||
#define SERVER_CALL(func) SH_CALL(gamedllPatch, &IServerGameDLL::func)
|
#define SERVER_CALL(func) SH_CALL(gamedllPatch, &IServerGameDLL::func)
|
||||||
|
@ -181,6 +181,15 @@ native bool:IsFakeClient(client);
|
|||||||
*/
|
*/
|
||||||
native bool:GetClientInfo(client, const String:key[], String:value[], maxlen);
|
native bool:GetClientInfo(client, const String:key[], String:value[], maxlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a client's team index.
|
||||||
|
*
|
||||||
|
* @param client Player's index.
|
||||||
|
* @return Team index the client is on (mod specific).
|
||||||
|
* @error Invalid client index, client not in game, or no mod support.
|
||||||
|
*/
|
||||||
|
native GetClientTeam(client);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a client's AdminId.
|
* Sets a client's AdminId.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user