Implemented IsPlayerAlive native.

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401245
This commit is contained in:
Phong Dang 2007-08-01 06:55:55 +00:00
parent 0f410208de
commit c611ba9ea5
5 changed files with 53 additions and 1 deletions

View File

@ -52,6 +52,7 @@ IBinTools *g_pBinTools = NULL;
IGameConfig *g_pGameConf = NULL;
IGameHelpers *g_pGameHelpers = NULL;
IServerGameClients *serverClients = NULL;
IPlayerInfoManager *playerinfomngr = NULL;
HandleType_t g_CallHandle = 0;
HandleType_t g_TraceHandle = 0;
IVoiceServer *voiceserver = NULL;
@ -132,6 +133,7 @@ bool SDKTools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool
GET_V_IFACE_ANY(engineFactory, pluginhelpers, IServerPluginHelpers, INTERFACEVERSION_ISERVERPLUGINHELPERS);
GET_V_IFACE_ANY(serverFactory, serverClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS);
GET_V_IFACE_ANY(engineFactory, voiceserver, IVoiceServer, INTERFACEVERSION_VOICESERVER);
GET_V_IFACE_ANY(serverFactory, playerinfomngr, IPlayerInfoManager, INTERFACEVERSION_PLAYERINFOMANAGER);
return true;
}

View File

@ -45,6 +45,7 @@
#include <IEngineTrace.h>
#include <IEngineSound.h>
#include <ivoiceserver.h>
#include <iplayerinfo.h>
#include <convar.h>
/**
@ -90,6 +91,7 @@ extern INetworkStringTableContainer *netstringtables;
extern IServerPluginHelpers *pluginhelpers;
extern IServerGameClients *serverClients;
extern IVoiceServer *voiceserver;
extern IPlayerInfoManager *playerinfomngr;
/* Interfaces from SourceMod */
extern IBinTools *g_pBinTools;
extern IGameConfig *g_pGameConf;

View File

@ -564,6 +564,40 @@ static cell_t GetClientEyeAngles(IPluginContext *pContext, const cell_t *params)
return 1;
}
static cell_t IsPlayerAlive(IPluginContext *pContext, const cell_t *params)
{
IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
if (player == NULL)
{
return pContext->ThrowNativeError("Invalid client index %d", params[1]);
} else if (!player->IsInGame())
{
return pContext->ThrowNativeError("Client %d is not in game", params[1]);
}
edict_t *pEdict = player->GetEdict();
CBaseEntity *pEntity = pEdict->GetUnknown()->GetBaseEntity();
static int lifeState_off = 0;
static bool lifeState_setup = false;
if (!lifeState_setup)
{
lifeState_setup = true;
g_pGameConf->GetOffset("m_lifeState", &lifeState_off);
}
if (!lifeState_off)
{
IPlayerInfo *info = playerinfomngr->GetPlayerInfo(pEdict);
if (info)
{
return info->IsDead() ? 0 : 1;
}
}
return (*((uint8_t *)pEntity + lifeState_off) == LIFE_ALIVE) ? 1: 0;
}
sp_nativeinfo_t g_Natives[] =
{
{"ExtinguishPlayer", ExtinguishPlayer},
@ -581,6 +615,6 @@ sp_nativeinfo_t g_Natives[] =
{"SlapPlayer", SlapPlayer},
{"GetClientEyePosition", GetClientEyePosition},
{"GetClientEyeAngles", GetClientEyeAngles},
{"IsPlayerAlive", IsPlayerAlive},
{NULL, NULL},
};

View File

@ -18,6 +18,11 @@
"class" "CBasePlayer"
"prop" "m_iHealth"
}
"m_lifeState"
{
"class" "CBasePlayer"
"prop" "m_lifeState"
}
}
}

View File

@ -114,6 +114,15 @@ native SlapPlayer(client, health=5, bool:sound=true);
*/
native GetClientEyeAngles(client, Float:ang[3]);
/**
* Returns if the client is alive or dead.
*
* @param client Player's index.
* @return True if the client is dead, false otherwise.
* @error Invalid client index, client not in game, or no mod support.
*/
native bool:IsPlayerAlive(client);
/**
* @deprecated
*/