Merge pull request #313 from alliedmodders/set-client-name
Add SetClientName native.
This commit is contained in:
@@ -50,6 +50,9 @@
|
||||
*/
|
||||
|
||||
SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool);
|
||||
#if SOURCE_ENGINE == SE_CSS
|
||||
SH_DECL_HOOK1_void_vafmt(IVEngineServer, ClientCommand, SH_NOATTRIB, 0, edict_t *);
|
||||
#endif
|
||||
|
||||
SDKTools g_SdkTools; /**< Global singleton for extension's main interface */
|
||||
IServerGameEnts *gameents = NULL;
|
||||
@@ -261,6 +264,10 @@ bool SDKTools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool
|
||||
#endif
|
||||
GET_V_IFACE_ANY(GetEngineFactory, soundemitterbase, ISoundEmitterSystemBase, SOUNDEMITTERSYSTEM_INTERFACE_VERSION);
|
||||
|
||||
#if SOURCE_ENGINE == SE_CSS
|
||||
SH_ADD_HOOK(IVEngineServer, ClientCommand, engine, SH_MEMBER(this, &SDKTools::OnSendClientCommand), false);
|
||||
#endif
|
||||
|
||||
gpGlobals = ismm->GetCGlobals();
|
||||
enginePatch = SH_GET_CALLCLASS(engine);
|
||||
enginesoundPatch = SH_GET_CALLCLASS(engsound);
|
||||
@@ -268,6 +275,14 @@ bool SDKTools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SDKTools::SDK_OnMetamodUnload(char *error, size_t maxlen)
|
||||
{
|
||||
#if SOURCE_ENGINE == SE_CSS
|
||||
SH_REMOVE_HOOK(IVEngineServer, ClientCommand, engine, SH_MEMBER(this, &SDKTools::OnSendClientCommand), false);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
void SDKTools::SDK_OnAllLoaded()
|
||||
{
|
||||
SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools);
|
||||
@@ -456,6 +471,21 @@ void SDKTools::OnClientPutInServer(int client)
|
||||
g_Hooks.OnClientPutInServer(client);
|
||||
}
|
||||
|
||||
#if SOURCE_ENGINE == SE_CSS
|
||||
void SDKTools::OnSendClientCommand(edict_t *pPlayer, const char *szFormat)
|
||||
{
|
||||
// Due to legacy code, CS:S still sends "name \"newname\"" to the client after a
|
||||
// name change. The engine has a change hook on name causing it to reset to the
|
||||
// player's Steam name. This quashes that to make SetClientName work properly.
|
||||
if (!strncmp(szFormat, "name ", 5))
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
#endif
|
||||
|
||||
class SDKTools_API : public ISDKTools
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -83,7 +83,7 @@ public: //public SDKExtension
|
||||
public:
|
||||
#if defined SMEXT_CONF_METAMOD
|
||||
virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late);
|
||||
//virtual bool SDK_OnMetamodUnload(char *error, size_t maxlen);
|
||||
virtual bool SDK_OnMetamodUnload(char *error, size_t maxlen);
|
||||
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlen);
|
||||
#endif
|
||||
public: //IConCommandBaseAccessor
|
||||
@@ -101,6 +101,9 @@ public: // IVoiceServer
|
||||
#else
|
||||
void OnClientCommand(edict_t *pEntity);
|
||||
#endif
|
||||
#if SOURCE_ENGINE == SE_CSS
|
||||
void OnSendClientCommand(edict_t *pPlayer, const char *szFormat);
|
||||
#endif
|
||||
|
||||
public: //ICommandTargetProcessor
|
||||
bool ProcessCommandTarget(cmd_target_info_t *info);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* vim: set ts=4 :
|
||||
* =============================================================================
|
||||
* SourceMod SDKTools Extension
|
||||
* Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
|
||||
* Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
|
||||
* =============================================================================
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
@@ -1267,6 +1267,61 @@ static cell_t ActivateEntity(IPluginContext *pContext, const cell_t *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t SetClientName(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
if (iserver == NULL)
|
||||
{
|
||||
return pContext->ThrowNativeError("IServer interface not supported, file a bug report.");
|
||||
}
|
||||
|
||||
IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
|
||||
IClient *pClient = iserver->GetClient(params[1] - 1);
|
||||
|
||||
if (player == NULL || pClient == NULL)
|
||||
{
|
||||
return pContext->ThrowNativeError("Invalid client index %d", params[1]);
|
||||
}
|
||||
if (!player->IsConnected())
|
||||
{
|
||||
return pContext->ThrowNativeError("Client %d is not connected", params[1]);
|
||||
}
|
||||
|
||||
static ValveCall *pCall = NULL;
|
||||
if (!pCall)
|
||||
{
|
||||
ValvePassInfo params[1];
|
||||
InitPass(params[0], Valve_String, PassType_Basic, PASSFLAG_BYVAL);
|
||||
|
||||
if (!CreateBaseCall("SetClientName", ValveCall_Entity, NULL, params, 1, &pCall))
|
||||
{
|
||||
return pContext->ThrowNativeError("\"SetClientName\" not supported by this mod");
|
||||
}
|
||||
else if (!pCall)
|
||||
{
|
||||
return pContext->ThrowNativeError("\"SetClientName\" wrapper failed to initialize");
|
||||
}
|
||||
}
|
||||
|
||||
// The IClient vtable is +4 from the CBaseClient vtable due to multiple inheritance.
|
||||
void *pGameClient = (void *)((intptr_t)pClient - 4);
|
||||
|
||||
// Change the name in the engine.
|
||||
START_CALL();
|
||||
void **ebuf = (void **)vptr;
|
||||
*ebuf = pGameClient;
|
||||
DECODE_VALVE_PARAM(2, vparams, 0);
|
||||
FINISH_CALL_SIMPLE(NULL);
|
||||
|
||||
// Notify the server of the change.
|
||||
#if SOURCE_ENGINE == SE_DOTA
|
||||
serverClients->ClientSettingsChanged(player->GetIndex());
|
||||
#else
|
||||
serverClients->ClientSettingsChanged(player->GetEdict());
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t SetClientInfo(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
if (iserver == NULL)
|
||||
@@ -1418,6 +1473,7 @@ sp_nativeinfo_t g_Natives[] =
|
||||
{"EquipPlayerWeapon", WeaponEquip},
|
||||
{"ActivateEntity", ActivateEntity},
|
||||
{"SetClientInfo", SetClientInfo},
|
||||
{"SetClientName", SetClientName},
|
||||
{"GetPlayerResourceEntity", GetPlayerResourceEntity},
|
||||
{"GivePlayerAmmo", GivePlayerAmmo},
|
||||
{NULL, NULL},
|
||||
|
||||
Reference in New Issue
Block a user