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