Add [get|set]_pdata_[bool|byte|short|vector|ehandle] and set_pdata_ent (bug 5770, r=joropito)

Former-commit-id: da3d13a9c027f764d0506273fca2ac71a75719c7
This commit is contained in:
Vincent Herbet 2013-07-02 16:05:39 +02:00
parent 21a00e00a2
commit c0fcf06c96
3 changed files with 640 additions and 43 deletions

View File

@ -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[];

View File

@ -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 }
};

View File

@ -98,23 +98,82 @@ 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. */
/**
* 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 );
/* Sets an integer from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */
/**
* 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 private data. _linuxdiff is added into the _Offset if it's used on a linux server. */
/**
* 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 from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */
/**
* 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 (entity encapsulation) pointer from an entity's private data.
* 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.
@ -126,6 +185,225 @@ native set_pdata_float(_index,_Offset,Float:_Value,_linuxdiff=5,_macdiff=5);
*/
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
*/