2
0
mirror of https://github.com/s1lentq/reapi.git synced 2024-10-16 15:27:06 +03:00

SV_CheckUserInfo: Refer to 'userinfo' argument as a pointer instead of an AMX string buffer

Added natives:
- set_netadr/get_netaddr
- set_key_value_buffer(buffer, "\\name\\ololo") overwrite a entire buffer
- get_key_value_buffer(buffer, userinfo, charsmax(userinfo)) get userinfo as AMX string presentation
Minor cleanup
Bump minor
This commit is contained in:
s1lentq 2023-10-07 21:21:32 +07:00
parent 08210bec75
commit ed57d7b309
15 changed files with 298 additions and 41 deletions

View File

@ -79,7 +79,8 @@ enum members_tables_e
mt_rebuystruct,
mt_mapinfo,
mt_csplayerweapon,
mt_gib
mt_gib,
mt_netadr
};
#define ReAPIFunc {EngineFunc, GamedllFunc, GamedllFunc_CBaseAnimating, GamedllFunc_CBasePlayer, GamedllFunc_CSGameRules, GamedllFunc_CGrenade, GamedllFunc_CWeaponBox, ReCheckerFunc, GamedllFunc_CBasePlayerWeapon, GamedllFunc_CGib, GamedllFunc_CBaseEntity, GamedllFunc_CBotManager}

View File

@ -30,6 +30,24 @@ native set_ucmd(const ucmd, const UCmd:var, any:...);
*/
native any:get_ucmd(const ucmd, const UCmd:var, any:...);
/*
* Sets a NetAdr var.
*
* @param var The specified mvar, look at the enum NetAdrVars
*
* @return 1 on success.
*/
native set_netadr(const adr, const NetAdrVars:var, any:...);
/*
* Returns a NetAdr var
*
* @param var The specified mvar, look at the enum NetAdrVars
*
* @return If an integer or boolean or one byte, array or everything else is passed via the 3rd argument and more, look at the argument list for the specified mvar
*/
native any:get_netadr(const adr, const NetAdrVars:var, any:...);
/*
* Gets value for key in buffer
*
@ -55,6 +73,28 @@ native get_key_value(const pbuffer, const key[], const value[], const maxlen);
*/
native set_key_value(const pbuffer, const key[], const value[]);
/*
* Gets an AMXX string buffer from a infobuffer pointer
*
* @param buffer Info string pointer
* @param value String to copy value to
* @param maxlen Maximum size of the output buffer
*
* @return Returns a string buffer on infobuffer pointer
*/
native get_key_value_buffer(const pbuffer, const output[], const maxlen);
/*
* Sets value string to entire buffer
*
* @param buffer Pointer to buffer
* @param value Value to set
* @param maxlen Maximum size of the value buffer to set, -1 means copy all characters
*
* @return 1 on success, 0 otherwise
*/
native set_key_value_buffer(const pbuffer, const value[], const maxlen = -1);
/*
* Gets the position of the bone
*

View File

@ -115,7 +115,7 @@ enum EngineFunc
/*
* Description: Called when a player's userinfo is being checked.
* Params: (adr, userinfo[], bool:reconnect, reconnectSlot, name[])
* Params: (adr, buffer, bool:reconnect, reconnectSlot, name[])
*
* @note Param adr is unused, guaranteed to return nothing also, don't send anything through it.
* @note In order for param name work, hook needs to be registered as Post.
@ -1268,3 +1268,40 @@ enum UCmd
*/
ucmd_impact_position
};
enum NetAdrType
{
NA_NULL = 0,
NA_LOOPBACK,
NA_BROADCAST,
NA_IP,
NA_IPX, // Deprecated: GoldSrc
NA_BROADCAST_IPX, // Deprecated: GoldSrc
};
enum NetAdrVars
{
/*
* Description: -
* Member type: NetAdrType
* Get params: get_netadr(const NetAdr:adr, const NetAdrVars:var);
* Set params: set_netadr(const NetAdr:adr, const NetAdrVars:var, const value);
*/
netadr_type = BEGIN_MEMBER_REGION(netadr),
/*
* Description: -
* Member type: unsigned char [4]
* Get params: get_netadr(const NetAdr:adr, const NetAdrVars:var, dest[], const lenght); // Also returns a iplong value
* Set params: set_netadr(const NetAdr:adr, const NetAdrVars:var, const iplong_value); // Only iplong can to set
*/
netadr_ip,
/*
* Description: -
* Member type: unsigned short
* Get params: get_netadr(const NetAdr:adr, const NetAdrVars:var);
* Set params: set_netadr(const NetAdr:adr, const NetAdrVars:var, const value);
*/
netadr_port
};

View File

@ -150,14 +150,19 @@ bool SV_AllowPhysent(IRehldsHook_SV_AllowPhysent* chain, edict_t* check, edict_t
return callForward<bool>(RH_SV_AllowPhysent, original, indexOfEdict(check), indexOfEdict(sv_player));
}
int SV_CheckUserInfo(IRehldsHook_SV_CheckUserInfo *chain, netadr_t *adr, char *userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name)
BOOL SV_CheckUserInfo_AMXX(IRehldsHook_SV_CheckUserInfo *chain, netadr_t *adr, size_t userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name)
{
auto original = [chain](netadr_t *_adr, char *_userinfo, qboolean _bIsReconnecting, int _iReconnectSlot, char *_name)
auto original = [chain](netadr_t *_adr, cell _userinfo, qboolean _bIsReconnecting, int _iReconnectSlot, char *_name)
{
return chain->callNext(_adr, _userinfo, _bIsReconnecting, _iReconnectSlot, _name);
return chain->callNext(_adr, (char *)_userinfo, _bIsReconnecting, _iReconnectSlot, _name);
};
return callForward<int>(RH_SV_CheckUserInfo, original, adr, userinfo, bIsReconnecting, iReconnectSlot, name);
return callForward<BOOL>(RH_SV_CheckUserInfo, original, adr, userinfo, bIsReconnecting, iReconnectSlot, name);
}
BOOL SV_CheckUserInfo(IRehldsHook_SV_CheckUserInfo *chain, netadr_t *adr, char *userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name)
{
return SV_CheckUserInfo_AMXX(chain, adr, (size_t)userinfo, bIsReconnecting, iReconnectSlot, name);
}
int PF_precache_generic_I(IRehldsHook_PF_precache_generic_I *chain, const char *s)

View File

@ -338,7 +338,8 @@ void SV_ActivateServer(IRehldsHook_SV_ActivateServer *chain, int runPhysics);
void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *value);
void ClientConnected(IRehldsHook_ClientConnected* chain, IGameClient* cl);
void SV_ConnectClient(IRehldsHook_SV_ConnectClient* chain);
int SV_CheckUserInfo(IRehldsHook_SV_CheckUserInfo* chain, netadr_t *adr, char *userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name);
BOOL SV_CheckUserInfo(IRehldsHook_SV_CheckUserInfo *chain, netadr_t *adr, char *userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name);
BOOL SV_CheckUserInfo_AMXX(IRehldsHook_SV_CheckUserInfo *chain, netadr_t *adr, size_t userinfo, qboolean bIsReconnecting, int iReconnectSlot, char *name);
struct SV_WriteFullClientUpdate_args_t
{

View File

@ -99,7 +99,7 @@ hook_t hooklist_engine[] = {
ENG(ED_Alloc),
ENG(ED_Free),
ENG(Con_Printf),
ENG(SV_CheckUserInfo),
ENG(SV_CheckUserInfo, _AMXX),
ENG(PF_precache_generic_I),
ENG(PF_precache_model_I),
ENG(PF_precache_sound_I),

View File

@ -30,6 +30,7 @@
#define MOVEVAR_MEMBERS(mx) STRUCT_MEMBERS(movevars_t, mx, mv_##mx)
#define UCMD_MEMBERS(mx) STRUCT_MEMBERS(usercmd_s, mx, ucmd_##mx)
#define PMTRACE_MEMBERS(mx) STRUCT_MEMBERS(pmtrace_s, mx, pmt_##mx)
#define NETADR_MEMBERS(mx) STRUCT_MEMBERS(netadr_t, mx, netadr_##mx)
#define CSPL_MEMBERS(mx) CLASS_MEMBERS(CCSPlayer, mx, mx)
#define BASEITEM_MEMBERS(mx) CLASS_MEMBERS(CBasePlayerItem, mx, mx)
#define BASEWPN_MEMBERS(mx) CLASS_MEMBERS_PREF(CBasePlayerWeapon, mx, m_Weapon_##mx, m_)
@ -111,6 +112,7 @@ inline MType getMemberType(MONSTERSTATE) { return MEMBER_INTEGER; }
inline MType getMemberType(ArmorType) { return MEMBER_INTEGER; }
inline MType getMemberType(ArmouryItemPack) { return MEMBER_INTEGER; }
inline MType getMemberType(InfoMapBuyParam) { return MEMBER_INTEGER; }
inline MType getMemberType(netadrtype_t) { return MEMBER_INTEGER; }
inline MType getMemberType(TraceResult) { return MEMBER_TRACERESULT; }
@ -1048,6 +1050,12 @@ member_t memberlist_gib[] = {
GIB_MEMBERS(lifeTime),
};
member_t memberlist_netadr[] = {
NETADR_MEMBERS(type),
NETADR_MEMBERS(ip),
NETADR_MEMBERS(port)
};
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif // #ifdef __GNUC__
@ -1111,6 +1119,7 @@ member_t *memberlist_t::operator[](size_t members) const
CASE(mapinfo)
CASE(csplayerweapon)
CASE(gib)
CASE(netadr)
}
#undef CASE

View File

@ -83,6 +83,7 @@ struct memberlist_t
mt_mapinfo,
mt_csplayerweapon,
mt_gib,
mt_netadr
};
};
@ -735,6 +736,13 @@ enum PMTrace
pmt_hitgroup
};
enum NetAdr
{
netadr_type = BEGIN_MEMBER_REGION(netadr),
netadr_ip,
netadr_port
};
// CCSPlayer
enum CSPlayer_Members
{

View File

@ -113,6 +113,61 @@ cell AMX_NATIVE_CALL amx_get_viewent(AMX *amx, cell *params)
return indexOfEdictAmx(pClient->pViewEntity);
}
/*
* Sets value string to entire buffer
*
* @param buffer Pointer to buffer
* @param value Value to set
* @param maxlen Maximum size of the value buffer to set, -1 means copy all characters
*
* @return 1 on success, 0 otherwise
*
* native set_key_value_buffer(const pbuffer, const value[], const maxlen = -1);
*/
cell AMX_NATIVE_CALL amx_set_key_value_buffer(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_buffer, arg_value, arg_maxlen };
char *buffer = reinterpret_cast<char *>(params[arg_buffer]);
if (!buffer)
{
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid buffer", __FUNCTION__);
return FALSE;
}
size_t maxlen = (params[arg_maxlen] > 0) ? min(params[arg_maxlen], MAX_INFO_STRING) : MAX_INFO_STRING;
char infobuf[MAX_INFO_STRING];
const char *value = getAmxString(amx, params[arg_value], infobuf);
size_t len = min<size_t>(Q_strlen(value) + 1, maxlen);
Q_strnlcpy(buffer, value, len);
return TRUE;
}
/*
* Gets an AMXX string buffer from a infobuffer pointer
*
* @param buffer Info string pointer
* @param value String to copy value to
* @param maxlen Maximum size of the output buffer
*
* @return Returns a string buffer on infobuffer pointer
*
* native get_key_value_buffer(const pbuffer, const output[], const maxlen);
*/
cell AMX_NATIVE_CALL amx_get_key_value_buffer(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_buffer, arg_output, arg_maxlen };
char *buffer = reinterpret_cast<char *>(params[arg_buffer]);
if (!buffer)
{
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid buffer", __FUNCTION__);
return FALSE;
}
return g_amxxapi.SetAmxString(amx, params[arg_output], buffer, params[arg_maxlen]);
}
/*
* Gets value for key in buffer
*
@ -486,6 +541,8 @@ AMX_NATIVE_INFO Natives_Common[] =
{ "get_viewent", amx_get_viewent },
{ "get_key_value", amx_get_key_value },
{ "set_key_value", amx_set_key_value },
{ "get_key_value_buffer", amx_get_key_value_buffer },
{ "set_key_value_buffer", amx_set_key_value_buffer },
{ "GetBonePosition", amx_GetBonePosition },
{ "GetAttachment", amx_GetAttachment },
{ "SetThink", amx_SetThink },

View File

@ -667,6 +667,96 @@ cell AMX_NATIVE_CALL get_pmtrace(AMX *amx, cell *params)
return get_member(tr, member, dest, element);
}
/*
* Sets a NetAdr var.
*
* @param var The specified mvar, look at the enum NetAdrVars
*
* @return 1 on success.
*
* native set_netadr(const adr, const NetAdrVars:var, any:...);
*/
cell AMX_NATIVE_CALL set_netadr(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_adr, arg_var, arg_value };
member_t *member = memberlist[params[arg_var]];
if (unlikely(member == nullptr)) {
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: unknown member id %i", __FUNCTION__, params[arg_var]);
return FALSE;
}
netadr_t *adr = (netadr_t *)params[arg_adr];
if (unlikely(adr == nullptr)) {
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid network address", __FUNCTION__);
return FALSE;
}
switch (params[arg_var])
{
case netadr_type:
adr->type = (netadrtype_t)params[arg_value];
break;
case netadr_port:
adr->port = ntohs(params[arg_value] & 0xFFFF); // cap short
break;
case netadr_ip:
*(size_t *)adr->ip = htonl(params[arg_value] & 0xFFFFFFFF); // cap int
break;
default:
return FALSE;
}
return TRUE;
}
/*
* Returns a NetAdr var
*
* @param var The specified mvar, look at the enum NetAdrVars
*
* @return If an integer or boolean or one byte, array or everything else is passed via the 3rd argument and more, look at the argument list for the specified mvar
*
* native any:get_netadr(const adr, const NetAdrVars:var, any:...);
*/
cell AMX_NATIVE_CALL get_netadr(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_adr, arg_var, arg_3, arg_4 };
member_t *member = memberlist[params[arg_var]];
if (unlikely(member == nullptr)) {
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: unknown member id %i", __FUNCTION__, params[arg_var]);
return FALSE;
}
netadr_t *adr = (netadr_t *)params[arg_adr];
if (unlikely(adr == nullptr)) {
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid network address", __FUNCTION__);
return FALSE;
}
switch (params[arg_var])
{
case netadr_type: return adr->type;
case netadr_port: return ntohs(adr->port);
case netadr_ip:
{
if (PARAMS_COUNT == 4)
{
cell *dest = getAmxAddr(amx, params[arg_3]);
size_t length = *getAmxAddr(amx, params[arg_4]);
setAmxString(dest, NET_AdrToString(*adr, true /*no port*/), length);
}
return htonl(*(size_t *)adr->ip);
}
default:
break;
}
return FALSE;
}
/*
* Sets a RebuyStruct member.
*
@ -757,6 +847,9 @@ AMX_NATIVE_INFO ReGameVars_Natives[] =
{ "set_pmtrace", set_pmtrace },
{ "get_pmtrace", get_pmtrace },
{ "set_netadr", set_netadr },
{ "get_netadr", get_netadr },
{ nullptr, nullptr }
};

View File

@ -2861,7 +2861,7 @@ cell AMX_NATIVE_CALL rh_get_net_from(AMX* amx, cell* params)
enum args_e { arg_count, arg_output, arg_maxlen };
cell *dest = getAmxAddr(amx, params[arg_output]);
char *addr = NET_AdrToString(*g_RehldsData->GetNetFrom());
const char *addr = NET_AdrToString(*g_RehldsData->GetNetFrom());
setAmxString(dest, addr, params[arg_maxlen]);

View File

@ -262,7 +262,7 @@ const char *getATypeStr(AType type)
return s_ATypes[type];
}
char* NET_AdrToString(const netadr_t& a)
const char *NET_AdrToString(const netadr_t &a, bool onlyBase)
{
static char s[64];
@ -270,8 +270,14 @@ char* NET_AdrToString(const netadr_t& a)
if (a.type == NA_LOOPBACK)
Q_snprintf(s, sizeof(s), "loopback");
else if (a.type == NA_IP)
{
if (onlyBase)
Q_snprintf(s, sizeof(s), "%i.%i.%i.%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3]);
else
Q_snprintf(s, sizeof(s), "%i.%i.%i.%i:%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3], ntohs(a.port));
}
#ifdef _WIN32
else // NA_IPX
Q_snprintf(s, sizeof(s), "%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%i", a.ipx[0], a.ipx[1], a.ipx[2], a.ipx[3], a.ipx[4], a.ipx[5], a.ipx[6], a.ipx[7], a.ipx[8], a.ipx[9], ntohs(a.port));

View File

@ -59,6 +59,6 @@ void RemoveOrDropItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, GiveType typ
const char *getATypeStr(AType type);
char *NET_AdrToString(const netadr_t& a);
const char *NET_AdrToString(const netadr_t &a, bool onlyBase = false);
extern void NORETURN UTIL_SysError(const char *fmt, ...);

View File

@ -6,5 +6,5 @@
#pragma once
#define VERSION_MAJOR 5
#define VERSION_MINOR 23
#define VERSION_MINOR 24
#define VERSION_MAINTENANCE 0