2
0
mirror of https://github.com/rehlds/reapi.git synced 2024-12-29 08:05:36 +03:00

Add hook for SV_WriteFullClientUpdate

(cherry picked from commit 77f6cfb8a713937c0ab424353a6ab83c08fb977d)

# Conflicts:
#	reapi/src/hook_list.cpp
This commit is contained in:
asmodai 2017-06-17 00:51:33 +03:00 committed by s1lent
parent b9f817a5ae
commit b06b1915eb
No known key found for this signature in database
GPG Key ID: 0FE401DC73916B5C
9 changed files with 94 additions and 10 deletions

View File

@ -1,3 +1,3 @@
majorVersion=5 majorVersion=5
minorVersion=1 minorVersion=2
maintenanceVersion=0 maintenanceVersion=0

View File

@ -88,3 +88,28 @@ native bool:rh_emit_sound2(const entity, const recipient, const channel, const s
* @noreturn * @noreturn
*/ */
native rh_update_user_info(playerEntIndex); native rh_update_user_info(playerEntIndex);
/*
* Gets value for key in buffer
*
* @param pbuffer Pointer to buffer
* @param key Key string
* @param value Buffer to copy value to
* @param maxlen Maximum size of the buffer
*
* @return Number of cells written to buffer
* @error If the index is not within the range of 1 to MaxClients or
* the client is not connected, an error will be thrown.
*/
native rh_get_key_value(const pbuffer, const key[], value[], maxlen)
/*
* Sets value for key in buffer
*
* @param pbuffer Pointer to buffer
* @param key Key string
* @param value Value to set
*
* @noreturn
*/
native rh_set_key_value(const pbuffer, const key[], const value[])

View File

@ -40,6 +40,12 @@ enum EngineFunc
* Params: (pcvar, const value[]) * Params: (pcvar, const value[])
*/ */
RH_Cvar_DirectSet, RH_Cvar_DirectSet,
/*
* Description: Receiver is player index or 0 when update will be sended to all.
* Params: (client, receiver, pinfo)
*/
RH_SV_WriteFullClientUpdate,
}; };
enum EntVars enum EntVars

View File

@ -46,6 +46,26 @@ void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *
callVoidForward(RH_Cvar_DirectSet, original, var, value); callVoidForward(RH_Cvar_DirectSet, original, var, value);
} }
void SV_WriteFullClientUpdate(IRehldsHook_SV_WriteFullClientUpdate *chain, IGameClient *client, char *info, size_t maxlen, sizebuf_t *sb, IGameClient *receiver)
{
int receiver_id = 0;
if (receiver)
receiver_id = receiver->GetId() + 1;
auto original = [chain, sb](int _client, int _receiver, int _pinfo)
{
sizebuf_t* dest = sb;
IGameClient* receiver = nullptr;
if (_receiver) {
receiver = g_RehldsSvs->GetClient(_receiver - 1);
dest = receiver->GetNetChan()->GetMessageBuf();
}
chain->callNext(g_RehldsSvs->GetClient(_client - 1), (char *)_pinfo, MAX_INFO_STRING, dest, receiver);
};
callVoidForward(RH_SV_WriteFullClientUpdate, original, client->GetId() + 1, receiver_id, int(info));
}
/* /*
* ReGameDLL functions * ReGameDLL functions
*/ */

View File

@ -299,6 +299,7 @@ void SV_StartSound(IRehldsHook_SV_StartSound *chain, int recipients, edict_t *en
void SV_DropClient(IRehldsHook_SV_DropClient *chain, IGameClient *cl, bool crash, const char *fmt); void SV_DropClient(IRehldsHook_SV_DropClient *chain, IGameClient *cl, bool crash, const char *fmt);
void SV_ActivateServer(IRehldsHook_SV_ActivateServer *chain, int runPhysics); void SV_ActivateServer(IRehldsHook_SV_ActivateServer *chain, int runPhysics);
void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *value); void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *value);
void SV_WriteFullClientUpdate(IRehldsHook_SV_WriteFullClientUpdate *chain, IGameClient *client, char *info, size_t maxlen, sizebuf_t *sb, IGameClient *receiver);
// regamedll functions // regamedll functions
int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver); int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver);

View File

@ -1,13 +1,13 @@
#include "precompiled.h" #include "precompiled.h"
inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(short)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(size_t)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(short)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(uint32)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(Vector&)) { return FP_ARRAY; } inline size_t getFwdParamType(void(*)(Vector&)) { return FP_ARRAY; }
inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(WeaponIdType)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(WeaponIdType)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(RewardType)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(RewardType)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(ScenarioEventEndRound)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(ScenarioEventEndRound)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(ItemID)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(ItemID)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(ItemRestType)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(ItemRestType)) { return FP_CELL; }
@ -74,7 +74,8 @@ hook_t hooklist_engine[] = {
ENG(SV_StartSound), ENG(SV_StartSound),
ENG(SV_DropClient), ENG(SV_DropClient),
ENG(SV_ActivateServer), ENG(SV_ActivateServer),
ENG(Cvar_DirectSet) ENG(Cvar_DirectSet),
ENG(SV_WriteFullClientUpdate)
}; };
#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }} #define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }}

View File

@ -80,6 +80,7 @@ enum EngineFunc
RH_SV_DropClient, RH_SV_DropClient,
RH_SV_ActivateServer, RH_SV_ActivateServer,
RH_Cvar_DirectSet, RH_Cvar_DirectSet,
RH_SV_WriteFullClientUpdate
// [...] // [...]
}; };

View File

@ -2012,6 +2012,28 @@ cell AMX_NATIVE_CALL rh_update_user_info(AMX *amx, cell *params)
return TRUE; return TRUE;
} }
cell AMX_NATIVE_CALL rh_get_key_value(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_buffer, arg_key, arg_value, arg_maxlen };
char *buffer = getAmxString(amx, params[arg_buffer]);
const char *key = getAmxString(amx, params[arg_key]);
return g_amxxapi.SetAmxString(amx, params[arg_value], g_engfuncs.pfnInfoKeyValue(buffer, key), params[arg_maxlen]);
}
cell AMX_NATIVE_CALL rh_set_key_value(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_buffer, arg_key, arg_value };
char *buffer = getAmxString(amx, params[arg_buffer]);
const char *key = getAmxString(amx, params[arg_key]);
const char *value = getAmxString(amx, params[arg_value]);
g_engfuncs.pfnSetKeyValue(buffer, key, value);
return 1;
}
AMX_NATIVE_INFO Misc_Natives_RH[] = AMX_NATIVE_INFO Misc_Natives_RH[] =
{ {
{ "rh_set_mapname", rh_set_mapname }, { "rh_set_mapname", rh_set_mapname },
@ -2019,6 +2041,8 @@ AMX_NATIVE_INFO Misc_Natives_RH[] =
{ "rh_reset_mapname", rh_reset_mapname }, { "rh_reset_mapname", rh_reset_mapname },
{ "rh_emit_sound2", rh_emit_sound2 }, { "rh_emit_sound2", rh_emit_sound2 },
{ "rh_update_user_info", rh_update_user_info }, { "rh_update_user_info", rh_update_user_info },
{ "rh_get_key_value", rh_get_key_value },
{ "rh_set_key_value", rh_set_key_value },
{ nullptr, nullptr } { nullptr, nullptr }
}; };

View File

@ -1,5 +1,11 @@
#pragma once #pragma once
enum
{
MAX_KV_LEN = 127,
MAX_INFO_STRING = 256
};
enum WpnInfo enum WpnInfo
{ {
WI_ID, WI_ID,