mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
Fixed prototype of set_offset_short
Fixed all offset natives (they checked ent index above maxClients, should've been maxEntities (some also checked if player is online)) Added s/get_offset_char() Fixed set_pdata_float to set float value from parameter properly Fixed set_pdata_short to set short value from parameter properly Reimplemented find_ent_by_owner
This commit is contained in:
parent
66a1f11387
commit
b21bbcbf90
@ -376,18 +376,18 @@ static cell AMX_NATIVE_CALL set_offset_short(AMX *amx, cell *params)
|
|||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*((short *)Player->pvPrivateData + off) = params[3];
|
*((short *)pEnt->pvPrivateData + off) = (short)params[3];
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -399,18 +399,18 @@ static cell AMX_NATIVE_CALL set_offset(AMX *amx, cell *params)
|
|||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*((int *)Player->pvPrivateData + off) = params[3];
|
*((int *)pEnt->pvPrivateData + off) = params[3];
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -422,18 +422,18 @@ static cell AMX_NATIVE_CALL set_offset_float(AMX *amx, cell *params)
|
|||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*((float *)Player->pvPrivateData + off) = params[3];
|
*((float *)pEnt->pvPrivateData + off) = *(float *)((void *)¶ms[3]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -445,23 +445,23 @@ static cell AMX_NATIVE_CALL get_offset_short(AMX *amx, cell *params)
|
|||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_PlayerOn[index]) {
|
/*if (!is_PlayerOn[index]) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (int)*((short *)Player->pvPrivateData + off);
|
return (int)*((short *)pEnt->pvPrivateData + off);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,24 +472,23 @@ static cell AMX_NATIVE_CALL get_offset(AMX *amx, cell *params)
|
|||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_PlayerOn[index]) {
|
/*if (!is_PlayerOn[index]) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (int)*((int *)Player->pvPrivateData + off);
|
return *((int *)pEnt->pvPrivateData + off);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//(BAILOPAN)
|
//(BAILOPAN)
|
||||||
@ -498,29 +497,28 @@ static cell AMX_NATIVE_CALL get_offset_float(AMX *amx, cell *params)
|
|||||||
{
|
{
|
||||||
int index = params[1];
|
int index = params[1];
|
||||||
int off = params[2];
|
int off = params[2];
|
||||||
float retVal;
|
//float retVal;
|
||||||
|
|
||||||
if (index < 1 || index > gpGlobals->maxClients) {
|
if (index < 1 || index > gpGlobals->maxEntities) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_PlayerOn[index]) {
|
/*if (!is_PlayerOn[index]) {
|
||||||
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
edict_t *Player = INDEXENT(index);
|
edict_t *pEnt = INDEXENT(index);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
off -= 5;
|
off -= 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
retVal = ((float)*((float *)Player->pvPrivateData + off));
|
//retVal = ((float)*((float *)pEnt->pvPrivateData + off));
|
||||||
|
|
||||||
return *(cell*)((void *)&retVal);
|
//return *(cell*)((void *)&retVal);
|
||||||
|
return *((float *)pEnt->pvPrivateData + off);
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//is an entity valid?
|
//is an entity valid?
|
||||||
@ -1986,10 +1984,44 @@ static cell AMX_NATIVE_CALL find_ent_by_tname(AMX *amx, cell *params) {
|
|||||||
return iReturnEnt;
|
return iReturnEnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) // native find_ent_by_owner(start_from_ent, classname[], owner_index); = 3 params
|
||||||
|
{
|
||||||
|
// Check index to start searching at, 0 must be possible.
|
||||||
|
if (params[1] < 0 || params[1] > gpGlobals->maxEntities) {
|
||||||
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check index of owner
|
||||||
|
if (params[3] < 1 || params[3] > gpGlobals->maxEntities) {
|
||||||
|
AMX_RAISEERROR(amx, AMX_ERR_NATIVE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
edict_t *pEnt = INDEXENT(params[1]);
|
||||||
|
edict_t *entOwner = INDEXENT(params[3]);
|
||||||
|
|
||||||
|
// No need to check if there is a real ent where entOwner points at since we don't access it anyway.
|
||||||
|
|
||||||
|
int len;
|
||||||
|
char* classname = GET_AMXSTRING(amx, params[2], 1, len);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
pEnt = FIND_ENTITY_BY_STRING(pEnt, "classname", classname);
|
||||||
|
if (!pEnt || FNullEnt(pEnt)) // break and return 0 if bad
|
||||||
|
break;
|
||||||
|
else if (pEnt->v.owner == entOwner) // compare pointers
|
||||||
|
return ENTINDEX(pEnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it comes here, the while loop ended because an ent failed (FNullEnt() == true)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// FindEntityByOwner (BAILOPAN)
|
// FindEntityByOwner (BAILOPAN)
|
||||||
// Works like FindEntity except only returns by owner.
|
// Works like FindEntity except only returns by owner.
|
||||||
// Searches by classname.
|
// Searches by classname.
|
||||||
static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) {
|
/*static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) {
|
||||||
int iStartEnt = params[1];
|
int iStartEnt = params[1];
|
||||||
int iEntOwner = params[3];
|
int iEntOwner = params[3];
|
||||||
int iLengthSearchStrn;
|
int iLengthSearchStrn;
|
||||||
@ -2002,7 +2034,7 @@ static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) {
|
|||||||
} else {
|
} else {
|
||||||
pStartEnt = INDEXENT(iStartEnt);
|
pStartEnt = INDEXENT(iStartEnt);
|
||||||
|
|
||||||
if(FNullEnt(pStartEnt)) {
|
if(FNullEnt(pStartEnt)) { // Impossible to have this line. Sending in starting ent of 0 must be possible if FIND_ENTITY_BY_STRING should work properly below...
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2010,7 +2042,7 @@ static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) {
|
|||||||
int checkEnt = ENTINDEX(FIND_ENTITY_BY_STRING(pStartEnt, "classname", szValue));
|
int checkEnt = ENTINDEX(FIND_ENTITY_BY_STRING(pStartEnt, "classname", szValue));
|
||||||
int iOwner = -1;
|
int iOwner = -1;
|
||||||
|
|
||||||
while ((checkEnt && FNullEnt(checkEnt)) && (iOwner!=-1)) {
|
while ((checkEnt && FNullEnt(checkEnt)) && (iOwner!=-1)) { // Err..? iOwner != -1 ? you just inited it to -1??
|
||||||
iOwner = ENTINDEX(pStartEnt->v.owner);
|
iOwner = ENTINDEX(pStartEnt->v.owner);
|
||||||
if (iOwner == iEntOwner) {
|
if (iOwner == iEntOwner) {
|
||||||
return checkEnt;
|
return checkEnt;
|
||||||
@ -2025,7 +2057,7 @@ static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return checkEnt;
|
return checkEnt;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
//returns current number of entities in game (BAILOPAN)
|
//returns current number of entities in game (BAILOPAN)
|
||||||
static cell AMX_NATIVE_CALL entity_count(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL entity_count(AMX *amx, cell *params)
|
||||||
|
@ -51,11 +51,13 @@ native set_msg_arg_string(argn, szString[]);
|
|||||||
native get_offset(id, offset);
|
native get_offset(id, offset);
|
||||||
native Float:get_offset_float(id, offset);
|
native Float:get_offset_float(id, offset);
|
||||||
native get_offset_short(id, offset);
|
native get_offset_short(id, offset);
|
||||||
|
native get_offset_char(id, offset);
|
||||||
|
|
||||||
/* sets pvPrivateData offset. */
|
/* sets pvPrivateData offset. */
|
||||||
native set_offset(id, offset, value);
|
native set_offset(id, offset, value);
|
||||||
native set_offset_float(id, offset, Float:value);
|
native set_offset_float(id, offset, Float:value);
|
||||||
native set_offset_short(id, offset);
|
native set_offset_short(id, offset, value);
|
||||||
|
native set_offset_char(id, offset, value);
|
||||||
|
|
||||||
/* Precaches any file. */
|
/* Precaches any file. */
|
||||||
native precache_generic(szFile[]);
|
native precache_generic(szFile[]);
|
||||||
|
Loading…
Reference in New Issue
Block a user