mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 14:25:38 +03:00
Add [Get|Set]ModelCollisionBox and [Get|Set]ModelBoundingBox (bug 3527, r=joropito)
Former-commit-id: 4d174007b1
This commit is contained in:
parent
c0fcf06c96
commit
83e70d7dd7
@ -150,12 +150,181 @@ static cell AMX_NATIVE_CALL set_controller(AMX* amx, cell* params)
|
|||||||
return amx_ftoc(setting * (1.0 / 255.0) * (pbonecontroller->end - pbonecontroller->start) + pbonecontroller->start);
|
return amx_ftoc(setting * (1.0 / 255.0) * (pbonecontroller->end - pbonecontroller->start) + pbonecontroller->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Model_DefaultSize = -2,
|
||||||
|
Model_CurrentSequence = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
// GetModelCollisionBox( index, Float:mins[3], Float:maxs[3] );
|
||||||
|
static cell AMX_NATIVE_CALL GetModelCollisionBox(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int entityIndex = params[1];
|
||||||
|
|
||||||
|
CHECK_ENTITY(entityIndex);
|
||||||
|
|
||||||
|
edict_t *pEdict = INDEXENT2(entityIndex);
|
||||||
|
|
||||||
|
if (!FNullEnt(pEdict))
|
||||||
|
{
|
||||||
|
studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pEdict));
|
||||||
|
|
||||||
|
if (!pStudiohdr)
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *cmins = MF_GetAmxAddr(amx, params[2]);
|
||||||
|
cell *cmaxs = MF_GetAmxAddr(amx, params[3]);
|
||||||
|
|
||||||
|
cmins[0] = amx_ftoc(pStudiohdr->bbmin.x);
|
||||||
|
cmins[1] = amx_ftoc(pStudiohdr->bbmin.y);
|
||||||
|
cmins[2] = amx_ftoc(pStudiohdr->bbmin.z);
|
||||||
|
|
||||||
|
cmaxs[0] = amx_ftoc(pStudiohdr->bbmax.x);
|
||||||
|
cmaxs[1] = amx_ftoc(pStudiohdr->bbmax.y);
|
||||||
|
cmaxs[2] = amx_ftoc(pStudiohdr->bbmax.z);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// GetModelBoundingBox( index, Float:mins[3], Float:maxs[3], sequence = Model_DefaultSize );
|
||||||
|
static cell AMX_NATIVE_CALL GetModelBoundingBox(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int entityIndex = params[1];
|
||||||
|
|
||||||
|
CHECK_ENTITY(entityIndex);
|
||||||
|
|
||||||
|
edict_t *pentModel = INDEXENT2(entityIndex);
|
||||||
|
|
||||||
|
if (!FNullEnt(pentModel))
|
||||||
|
{
|
||||||
|
studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel));
|
||||||
|
|
||||||
|
if (!pStudiohdr)
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *bbmins = MF_GetAmxAddr(amx, params[2]);
|
||||||
|
cell *bbmaxs = MF_GetAmxAddr(amx, params[3]);
|
||||||
|
|
||||||
|
int sequence = params[4];
|
||||||
|
|
||||||
|
if (sequence <= Model_DefaultSize)
|
||||||
|
{
|
||||||
|
bbmins[0] = amx_ftoc(pStudiohdr->min.x);
|
||||||
|
bbmins[1] = amx_ftoc(pStudiohdr->min.y);
|
||||||
|
bbmins[2] = amx_ftoc(pStudiohdr->min.z);
|
||||||
|
|
||||||
|
bbmaxs[0] = amx_ftoc(pStudiohdr->max.x);
|
||||||
|
bbmaxs[1] = amx_ftoc(pStudiohdr->max.y);
|
||||||
|
bbmaxs[2] = amx_ftoc(pStudiohdr->max.z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sequence <= Model_CurrentSequence || sequence >= pStudiohdr->numseq)
|
||||||
|
sequence = pentModel->v.sequence;
|
||||||
|
|
||||||
|
mstudioseqdesc_t *pSeqdesc;
|
||||||
|
pSeqdesc = (mstudioseqdesc_t*)((byte*)pStudiohdr + pStudiohdr->seqindex);
|
||||||
|
|
||||||
|
bbmins[0] = amx_ftoc(pSeqdesc[sequence].bbmin.x);
|
||||||
|
bbmins[1] = amx_ftoc(pSeqdesc[sequence].bbmin.y);
|
||||||
|
bbmins[2] = amx_ftoc(pSeqdesc[sequence].bbmin.z);
|
||||||
|
|
||||||
|
bbmaxs[0] = amx_ftoc(pSeqdesc[sequence].bbmax.x);
|
||||||
|
bbmaxs[1] = amx_ftoc(pSeqdesc[sequence].bbmax.y);
|
||||||
|
bbmaxs[2] = amx_ftoc(pSeqdesc[sequence].bbmax.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// SetModelCollisionBox( index );
|
||||||
|
static cell AMX_NATIVE_CALL SetModelCollisionBox(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int entityIndex = params[1];
|
||||||
|
|
||||||
|
CHECK_ENTITY(entityIndex);
|
||||||
|
|
||||||
|
edict_t *pentModel = INDEXENT2(entityIndex);
|
||||||
|
|
||||||
|
if (!FNullEnt(pentModel))
|
||||||
|
{
|
||||||
|
studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel));
|
||||||
|
|
||||||
|
if (!pStudiohdr)
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_SIZE(pentModel, pStudiohdr->bbmin, pStudiohdr->bbmax);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// SetModelBoudingBox( index, sequence = Model_DefaultSize );
|
||||||
|
static cell AMX_NATIVE_CALL SetModelBoundingBox(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int entityIndex = params[1];
|
||||||
|
|
||||||
|
CHECK_ENTITY(entityIndex);
|
||||||
|
|
||||||
|
edict_t *pentModel = INDEXENT2(entityIndex);
|
||||||
|
|
||||||
|
if (!FNullEnt(pentModel))
|
||||||
|
{
|
||||||
|
studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel));
|
||||||
|
|
||||||
|
if (!pStudiohdr)
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sequence = params[2];
|
||||||
|
|
||||||
|
if (sequence <= Model_DefaultSize)
|
||||||
|
{
|
||||||
|
SET_SIZE(pentModel, pStudiohdr->min, pStudiohdr->max);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sequence <= Model_CurrentSequence || sequence >= pStudiohdr->numseq)
|
||||||
|
sequence = pentModel->v.sequence;
|
||||||
|
|
||||||
|
mstudioseqdesc_t *pSeqdesc;
|
||||||
|
pSeqdesc = (mstudioseqdesc_t*)((byte*)pStudiohdr + pStudiohdr->seqindex);
|
||||||
|
|
||||||
|
SET_SIZE(pentModel, pSeqdesc[sequence].bbmin, pSeqdesc[sequence].bbmax);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
AMX_NATIVE_INFO misc_natives[] = {
|
AMX_NATIVE_INFO misc_natives[] = {
|
||||||
{ "copy_infokey_buffer", copy_infokey_buffer },
|
{ "copy_infokey_buffer", copy_infokey_buffer },
|
||||||
{ "lookup_sequence", lookup_sequence },
|
{ "lookup_sequence", lookup_sequence },
|
||||||
{ "set_controller", set_controller },
|
{ "set_controller", set_controller },
|
||||||
|
{ "GetModelCollisionBox", GetModelCollisionBox },
|
||||||
|
{ "SetModelCollisionBox", SetModelCollisionBox },
|
||||||
|
{ "GetModelBoundingBox", GetModelBoundingBox },
|
||||||
|
{ "SetModelBoundingBox", SetModelBoundingBox },
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
@ -536,3 +536,70 @@ native lookup_sequence(entity, const name[], &Float:framerate = 0.0, &bool:loops
|
|||||||
* @return The percentage that the controller is extended (0.0 through 1.0)
|
* @return The percentage that the controller is extended (0.0 through 1.0)
|
||||||
*/
|
*/
|
||||||
native Float:set_controller(entity, controller, Float:value);
|
native Float:set_controller(entity, controller, Float:value);
|
||||||
|
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Model_DefaultSize = -2,
|
||||||
|
Model_CurrentSequence = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets size of the entity models collision box.
|
||||||
|
*
|
||||||
|
* @param entity The entity index to use.
|
||||||
|
* @param mins The local negative collision box distance.
|
||||||
|
* @param maxs The local positive collision box distance.
|
||||||
|
*
|
||||||
|
* @return 1 on success, 0 on faillure.
|
||||||
|
*
|
||||||
|
* @error Invalid entity.
|
||||||
|
* Invalid model pointer.
|
||||||
|
*/
|
||||||
|
native GetModelCollisionBox( entity, Float:mins[3], Float:maxs[3] );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets entity size to the models collision box.
|
||||||
|
*
|
||||||
|
* @param entity The entity index to set the value on.
|
||||||
|
*
|
||||||
|
* @return 1 on success, 0 on faillure.
|
||||||
|
*
|
||||||
|
* @error Invalid entity.
|
||||||
|
* Invalid model pointer.
|
||||||
|
*/
|
||||||
|
native SetModelCollisionBox( entity );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets size of a model bounding box.
|
||||||
|
*
|
||||||
|
* @param entity The entity index to use.
|
||||||
|
* @param mins The local negative bounding box distance.
|
||||||
|
* @param maxs The local positive bounding box distance.
|
||||||
|
* @param sequence The animation sequence to retrieve.
|
||||||
|
* Model_DefaultSize retrieves ideal moevement hull size.
|
||||||
|
* Model_CurrentSequence retrieves hull size of the current sequence.
|
||||||
|
* Values >= 0 will specify which sequence to retrieve size from.
|
||||||
|
*
|
||||||
|
* @return 1 on success, 0 on faillure.
|
||||||
|
*
|
||||||
|
* @error Invalid entity.
|
||||||
|
* Invalid model pointer.
|
||||||
|
*/
|
||||||
|
native GetModelBoundingBox( entity, Float:mins[3], Float:maxs[3], sequence = Model_DefaultSize );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets size to a model bounding box.
|
||||||
|
*
|
||||||
|
* @param entity The entity index to set the value on.
|
||||||
|
* @param sequence The sequence to apply.
|
||||||
|
* Model_DefaultSize sets size of ideal movement hull.
|
||||||
|
* Model_CurrentSequence sets size of the current sequence.
|
||||||
|
* Values >= 0 will specify which sequence to use.
|
||||||
|
*
|
||||||
|
* @return 1 on success, 0 on faillure.
|
||||||
|
*
|
||||||
|
* @error Invalid entity.
|
||||||
|
* Invalid model pointer.
|
||||||
|
*/
|
||||||
|
native SetModelBoundingBox( index, sequence = Model_DefaultSize );
|
||||||
|
Loading…
Reference in New Issue
Block a user