From da3d13a9c027f764d0506273fca2ac71a75719c7 Mon Sep 17 00:00:00 2001 From: Vincent Herbet Date: Tue, 2 Jul 2013 16:05:39 +0200 Subject: [PATCH] Add [get|set]_pdata_[bool|byte|short|vector|ehandle] and set_pdata_ent (bug 5770, r=joropito) --- dlls/fakemeta/fakemeta_amxx.h | 2 + dlls/fakemeta/pdata.cpp | 373 +++++++++++++++++++++++++++++++--- plugins/include/fakemeta.inc | 308 ++++++++++++++++++++++++++-- 3 files changed, 640 insertions(+), 43 deletions(-) diff --git a/dlls/fakemeta/fakemeta_amxx.h b/dlls/fakemeta/fakemeta_amxx.h index 4fdc5268..4bc72ccf 100755 --- a/dlls/fakemeta/fakemeta_amxx.h +++ b/dlls/fakemeta/fakemeta_amxx.h @@ -42,6 +42,8 @@ inline edict_t* INDEXENT2( int iEdictNum ) #endif #define CHECK_ENTITY(x) if (x != 0 && (FNullEnt(INDEXENT2(x)) || x < 0 || x > gpGlobals->maxEntities)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity"); return 0; } +#define CHECK_OFFSET(x) if (x < 0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset"); return 0; } + extern AMX_NATIVE_INFO engfunc_natives[]; extern AMX_NATIVE_INFO dllfunc_natives[]; extern AMX_NATIVE_INFO forward_natives[]; diff --git a/dlls/fakemeta/pdata.cpp b/dlls/fakemeta/pdata.cpp index 30766a95..cf8d3af0 100755 --- a/dlls/fakemeta/pdata.cpp +++ b/dlls/fakemeta/pdata.cpp @@ -31,12 +31,13 @@ static cell AMX_NATIVE_CALL set_pdata_int(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); + int iOffset=params[2]; - if (iOffset <0) - return 1; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[4]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 4) iOffset += params[4]; @@ -51,12 +52,13 @@ static cell AMX_NATIVE_CALL get_pdata_int(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); + int iOffset=params[2]; - if (iOffset <0) - return 0; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[3]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 3) iOffset += params[3]; @@ -71,12 +73,13 @@ static cell AMX_NATIVE_CALL set_pdata_float(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); + int iOffset=params[2]; - if (iOffset <0) - return 1; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[4]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 4) iOffset += params[4]; @@ -92,12 +95,13 @@ static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); + int iOffset=params[2]; - if (iOffset <0) - return 1; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[3]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 3) iOffset += params[3]; @@ -114,11 +118,11 @@ static cell AMX_NATIVE_CALL get_pdata_string(AMX *amx, cell *params) CHECK_ENTITY(index); int iOffset=params[2]; - if (iOffset <0) - return 1; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[6]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 6 || params[7] == CELL_MIN) iOffset += params[6]; @@ -152,11 +156,11 @@ static cell AMX_NATIVE_CALL set_pdata_string(AMX *amx, cell *params) CHECK_ENTITY(index); int iOffset=params[2]; - if (iOffset <0) - return 1; -#ifdef __linux__ + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[5]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 5 || params[6] == CELL_MIN) iOffset += params[5]; @@ -197,13 +201,14 @@ static cell AMX_NATIVE_CALL set_pdata_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_ent(AMX *amx, cell *params) { int index=params[1]; - int iOffset=params[2]; - CHECK_ENTITY(index); -#ifdef __linux__ + int iOffset=params[2]; + CHECK_OFFSET(iOffset); + +#if defined( __linux__ ) iOffset += params[3]; -#elif defined __APPLE__ +#elif defined( __APPLE__ ) // Use Linux offset in older plugins if (params[0] / sizeof(cell) == 3) iOffset += params[3]; @@ -234,6 +239,307 @@ static cell AMX_NATIVE_CALL get_pdata_ent(AMX *amx, cell *params) return ent; } +static cell AMX_NATIVE_CALL set_pdata_ent( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + + int entity = params[3]; + CHECK_ENTITY( entity ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + *( edict_t** )( ( char* )( INDEXENT2( index )->pvPrivateData ) + offset ) = INDEXENT2( entity ); + + return 1; +} + +static cell AMX_NATIVE_CALL get_pdata_bool( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[3]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 3 ) + offset += params[3]; + else + offset += params[4]; +#endif + + return *( bool* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ) ? TRUE : FALSE; +} + +static cell AMX_NATIVE_CALL set_pdata_bool( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + + bool value = params[3] ? true : false; + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + *( bool* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ) = value; + + return 1; +} + +static cell AMX_NATIVE_CALL get_pdata_byte( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[3]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 3 ) + offset += params[3]; + else + offset += params[4]; +#endif + + return static_cast< cell >( *( ( byte* )INDEXENT2( index )->pvPrivateData + offset ) ); +} + +static cell AMX_NATIVE_CALL set_pdata_byte( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + + byte value = static_cast< byte >( params[3] ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + *( ( byte* )INDEXENT2( index )->pvPrivateData + offset ) = value; + + return 1; +} + +static cell AMX_NATIVE_CALL get_pdata_short( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[3]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 3 ) + offset += params[3]; + else + offset += params[4]; +#endif + + return static_cast< cell >( *( short* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ) ); +} + +static cell AMX_NATIVE_CALL set_pdata_short( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + + short value = static_cast< short >( params[3] ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + *( short* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ) = value; + + return 1; +} + +static cell AMX_NATIVE_CALL get_pdata_vector( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + cell *cpvec = MF_GetAmxAddr( amx, params[3] ); + + Vector vec = *( Vector* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ); + + cpvec[0] = amx_ftoc( vec.x ); + cpvec[1] = amx_ftoc( vec.y ); + cpvec[2] = amx_ftoc( vec.z ); + + return 1; +} + +static cell AMX_NATIVE_CALL set_pdata_vector( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + cell *pcvec = MF_GetAmxAddr( amx, params[3] ); + + Vector vec( amx_ctof( pcvec[0] ), amx_ctof( pcvec[1] ), amx_ctof( pcvec[2] ) ); + + *( Vector* )( ( char* )INDEXENT2( index )->pvPrivateData + offset ) = vec; + + return 1; +} + +static cell AMX_NATIVE_CALL get_pdata_ehandle( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + +#if defined( __linux__ ) + offset += params[3]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 3 ) + offset += params[3]; + else + offset += params[4]; +#endif + + edict_t *pEdict = *( edict_t** )( ( char* )( INDEXENT2( index )->pvPrivateData ) + offset ); + + if( pEdict == NULL ) + { + return -1; + } + + edict_t *pWorld = INDEXENT( 0 ); + int ent = pEdict - pWorld; + + if( ent < 0 || ent > gpGlobals->maxEntities ) + { + return -2; + } + + if( pEdict->free || pEdict->pvPrivateData == NULL ) + { + return -1; + } + + int serialnumber = *( int* )( ( char* )INDEXENT2( index )->pvPrivateData + offset + 4 ); + + if( pEdict->serialnumber != serialnumber ) + { + return 0; + } + + return ent; +} + +static cell AMX_NATIVE_CALL set_pdata_ehandle( AMX *amx, cell *params ) +{ + int index = params[1]; + CHECK_ENTITY( index ); + + int offset = params[2]; + CHECK_OFFSET( offset ); + + int entity = params[3]; + CHECK_ENTITY( entity ); + +#if defined( __linux__ ) + offset += params[4]; +#elif defined( __APPLE__ ) + // Use Linux offset in older plugins + if( params[0] / sizeof( cell ) == 4 ) + offset += params[4]; + else + offset += params[5]; +#endif + + edict_t *pEntity = INDEXENT2( entity ); + + *( edict_t** )( ( char* )( INDEXENT2( index )->pvPrivateData ) + offset ) = pEntity; + + if( pEntity ) + { + *( int* )( ( char* )INDEXENT2( index )->pvPrivateData + offset + 4 ) = pEntity->serialnumber; + } + + return 1; +} + AMX_NATIVE_INFO pdata_natives[] = { { "get_pdata_int", get_pdata_int }, @@ -243,5 +549,16 @@ AMX_NATIVE_INFO pdata_natives[] = { "set_pdata_string", set_pdata_string }, { "get_pdata_string", get_pdata_string }, { "get_pdata_ent", get_pdata_ent }, + { "set_pdata_ent", set_pdata_ent }, + { "get_pdata_bool", get_pdata_bool }, + { "set_pdata_bool", set_pdata_bool }, + { "get_pdata_byte", get_pdata_byte }, + { "set_pdata_byte", set_pdata_byte }, + { "get_pdata_short", get_pdata_short }, + { "set_pdata_short", set_pdata_short }, + { "get_pdata_vector", get_pdata_vector }, + { "set_pdata_vector", set_pdata_vector }, + { "get_pdata_ehandle", get_pdata_ehandle }, + { "set_pdata_ehandle", set_pdata_ehandle }, { NULL, NULL } }; diff --git a/plugins/include/fakemeta.inc b/plugins/include/fakemeta.inc index 3e76dd56..c9d22e89 100755 --- a/plugins/include/fakemeta.inc +++ b/plugins/include/fakemeta.inc @@ -98,33 +98,311 @@ native pev_serial(entindex); */ native global_get(_value, any:...); -/* Returns an integer from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native get_pdata_int(_index,_Offset,_linuxdiff=5,_macdiff=5); - -/* Sets an integer from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native set_pdata_int(_index,_Offset,_Value,_linuxdiff=5,_macdiff=5); - -/* Returns a float from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native Float:get_pdata_float(_index,_Offset,_linuxdiff=5,_macdiff=5); - -/* Sets a float from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native set_pdata_float(_index,_Offset,Float:_Value,_linuxdiff=5,_macdiff=5); +/** + * Returns a integer from an entity's private data. + * + * _linuxdiff value is what to add to the _Offset for linux servers. + * _macdiff value is what to add to the _Offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _Offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return An integer value is returned. + */ +native get_pdata_int( _index, _Offset, _linuxdiff = 5, _macdiff = 5 ); /** - * Tries to retrieve an edict (entity encapsulation) pointer from an entity's private data. + * Sets an integer to an entity's private data. + * + * _linuxdiff value is what to add to the _Offset for linux servers. + * _macdiff value is what to add to the _Offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _Offset Offset to search. + * @param _Value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_int( _index, _Offset, _Value, _linuxdiff = 5, _macdiff = 5 ); + +/** + * Returns a float from an entity's private data. + * + * _linuxdiff value is what to add to the _Offset for linux servers. + * _macdiff value is what to add to the _Offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _Offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return An float value is returned. + */ +native Float:get_pdata_float( _index, _Offset, _linuxdiff = 5, _macdiff = 5 ); + +/** + * Sets a float to an entity's private data. + * + * _linuxdiff value is what to add to the _Offset for linux servers. + * _macdiff value is what to add to the _Offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _Offset Offset to search. + * @param _Value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_float( _index, _Offset, Float:_Value, _linuxdiff = 5, _macdiff = 5 ); + +/** + * Tries to retrieve an edict pointer from an entity's private data. * * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, - * get_pdata_end searches in increments of 1. + * get_pdata_ent searches in increments of 1. * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * * @param _index Entity index. * @param _offset Offset to search. - * @param _linuxdiff Linux difference. + * @param _linuxdiff Linux difference. * @param _macdiff Mac OS X difference. * @return -2 if an invalid entity was found. * -1 if an empty entity was found. * Otherwise, an entity index is returned. */ -native get_pdata_ent(_index, _offset, _linuxdiff=20, _macdiff=20); +native get_pdata_ent( _index, _offset, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets an edict pointer to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_ent searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_ent( _index, _offset, _value, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Returns a boolean from an entity's private data. + * + * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, + * get_pdata_bool searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return An boolean value is returned. + */ +native bool:get_pdata_bool( _index, _offset, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets a boolean to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_bool searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_bool( _index, _offset, bool:_value, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Returns a byte value from an entity's private data. + * + * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, + * get_pdata_byte searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return A byte value is returned. + */ +native get_pdata_byte( _index, _offset, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets a byte value to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_byte searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_byte( _index, _offset, _value, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Returns a short value from an entity's private data. + * + * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, + * get_pdata_short searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return A short value is returned. + */ +native get_pdata_short( _index, _offset, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets a short value to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_short searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_short( _index, _offset, _value, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Returns a vector from an entity's private data. + * + * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, + * get_pdata_vector searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _output Vector returned by reference. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native get_pdata_vector( _index, _offset, Float:_output[3], _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets a vector to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_vector searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _origin Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_vector( _index, _offset, Float:_origin[3], _linuxdiff = 20, _macdiff = 20 ); + +/** + * Tries to retrieve an edict (entity encapsulation) pointer from an entity's private data. + * + * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, + * get_pdata_ehandle searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return -2 if an invalid entity was found. + * -1 if an empty entity was found. + * 0 if serialnumber is not matching. + * Otherwise, an entity index is returned. + */ +native get_pdata_ehandle( _index, _offset, _linuxdiff = 20, _macdiff = 20 ); + +/** + * Sets an edict (entity encapsulation) pointer to an entity's private data. + * + * This function is byte-addressable. Unlike set_pdata_int() which searches in byte increments of 4, + * set_pdata_ehandle searches in increments of 1. + * + * _linuxdiff value is what to add to the _offset for linux servers. + * _macdiff value is what to add to the _offset for os x servers. + * + * A log error is thrown on invalid _index and _Offset. + * + * @param _index Entity index. + * @param _offset Offset to search. + * @param _value Value to set. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. + * @return 1 on success. + */ +native set_pdata_ehandle( _index, _offset, _value, _linuxdiff = 20, _macdiff = 20 ); /* Registers a forward. * Returns an id you can pass to unregister_forward