mirror of
https://github.com/rehlds/reapi.git
synced 2025-01-16 08:38:08 +03:00
Changed work native rg_find_ent_by_owner.
Added edictByIndexAmx for safe use.
This commit is contained in:
parent
c1c59ce26c
commit
88f0a66c0b
@ -228,10 +228,10 @@ native rg_find_ent_by_class(start_index, const classname[]);
|
|||||||
* @param start_index Entity index to start searching from. -1 to start from the first entity
|
* @param start_index Entity index to start searching from. -1 to start from the first entity
|
||||||
* @param classname Classname to search for
|
* @param classname Classname to search for
|
||||||
*
|
*
|
||||||
* @return Entity index > 0 if found, 0 otherwise
|
* @return 1 if found, 0 otherwise
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
native rg_find_ent_by_owner(start_index, const classname[], owner);
|
native rg_find_ent_by_owner(&start_index, const classname[], owner);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns some information about a weapon.
|
* Returns some information about a weapon.
|
||||||
|
@ -11,6 +11,10 @@
|
|||||||
#define SIGNAL_ESCAPE (1<<3)
|
#define SIGNAL_ESCAPE (1<<3)
|
||||||
#define SIGNAL_VIPSAFETY (1<<4)
|
#define SIGNAL_VIPSAFETY (1<<4)
|
||||||
|
|
||||||
|
// Returns 1, if round ended by expired time
|
||||||
|
// NOTE: Use this for hookchain RG_RoundEnd with the parametr ScenarioEventEndRound:event
|
||||||
|
#define HadRoundExpired(event) (1<<event) & (1<<ROUND_TARGET_SAVED) | (1<<ROUND_HOSTAGE_NOT_RESCUED) | (1<<ROUND_TERRORISTS_NOT_ESCAPED) | (1<<ROUND_VIP_NOT_ESCAPED)
|
||||||
|
|
||||||
enum WeaponIdType
|
enum WeaponIdType
|
||||||
{
|
{
|
||||||
WEAPON_NONE,
|
WEAPON_NONE,
|
||||||
@ -47,16 +51,16 @@ enum WeaponIdType
|
|||||||
WEAPON_SHIELDGUN = 99
|
WEAPON_SHIELDGUN = 99
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Weapon info types for use with rg_get_weapon_info() */
|
// Weapon info types for use with rg_get_weapon_info()
|
||||||
enum WpnInfo
|
enum WpnInfo
|
||||||
{
|
{
|
||||||
WPINFO_COST,
|
WI_COST,
|
||||||
WPINFO_CLIP_COST,
|
WI_CLIP_COST,
|
||||||
WPINFO_BUY_CLIP_SIZE,
|
WI_BUY_CLIP_SIZE,
|
||||||
WPINFO_GUN_CLIP_SIZE,
|
WI_GUN_CLIP_SIZE,
|
||||||
WPINFO_MAX_ROUNDS,
|
WI_MAX_ROUNDS,
|
||||||
WPINFO_AMMO_TYPE,
|
WI_AMMO_TYPE,
|
||||||
WPINFO_NAME
|
WI_NAME
|
||||||
};
|
};
|
||||||
|
|
||||||
enum WinStatus
|
enum WinStatus
|
||||||
|
@ -9,7 +9,7 @@ void SV_StartSound(IRehldsHook_SV_StartSound *chain, int recipients, edict_t *en
|
|||||||
{
|
{
|
||||||
auto original = [chain](int _recipients, int _entity, int _channel, const char *_sample, int _volume, float _attenuation, int _fFlags, int _pitch)
|
auto original = [chain](int _recipients, int _entity, int _channel, const char *_sample, int _volume, float _attenuation, int _fFlags, int _pitch)
|
||||||
{
|
{
|
||||||
chain->callNext(_recipients, INDEXENT(_entity), _channel, _sample, _volume, _attenuation, _fFlags, _pitch);
|
chain->callNext(_recipients, edictByIndexAmx(_entity), _channel, _sample, _volume, _attenuation, _fFlags, _pitch);
|
||||||
};
|
};
|
||||||
|
|
||||||
callVoidForward(RH_SV_StartSound, original, recipients, indexOfEdict(entity), channel, sample, volume, attenuation, fFlags, pitch);
|
callVoidForward(RH_SV_StartSound, original, recipients, indexOfEdict(entity), channel, sample, volume, attenuation, fFlags, pitch);
|
||||||
|
@ -148,7 +148,7 @@ cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ATYPE_CLASSPTR:
|
case ATYPE_CLASSPTR:
|
||||||
retVal._classptr = CBaseEntity::Instance(INDEXENT(*srcAddr));
|
retVal._classptr = getPrivate<CBaseEntity>(*srcAddr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -258,7 +258,7 @@ cell AMX_NATIVE_CALL SetHookChainArg(AMX *amx, cell *params)
|
|||||||
*(char **)destAddr = getAmxStringTemp(srcAddr, temp_strings[number], sizeof temp_strings[0] - 1);
|
*(char **)destAddr = getAmxStringTemp(srcAddr, temp_strings[number], sizeof temp_strings[0] - 1);
|
||||||
break;
|
break;
|
||||||
case ATYPE_CLASSPTR:
|
case ATYPE_CLASSPTR:
|
||||||
*(CBaseEntity **)destAddr = CBaseEntity::Instance(INDEXENT(*srcAddr));
|
*(CBaseEntity **)destAddr = getPrivate<CBaseEntity>(*srcAddr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ cell AMX_NATIVE_CALL set_member(AMX *amx, cell *params)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *pEdict = INDEXENT(params[arg_index]);
|
edict_t *pEdict = edictByIndexAmx(params[arg_index]);
|
||||||
if (pEdict == nullptr || pEdict->pvPrivateData == nullptr) {
|
if (pEdict == nullptr || pEdict->pvPrivateData == nullptr) {
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "%s: invalid or uninitialized entity", __FUNCTION__);
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: invalid or uninitialized entity", __FUNCTION__);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -34,7 +34,7 @@ cell AMX_NATIVE_CALL get_member(AMX *amx, cell *params)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *pEdict = INDEXENT(params[arg_index]);
|
edict_t *pEdict = edictByIndexAmx(params[arg_index]);
|
||||||
if (pEdict == nullptr || pEdict->pvPrivateData == nullptr) {
|
if (pEdict == nullptr || pEdict->pvPrivateData == nullptr) {
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "%s: invalid or uninitialized entity", __FUNCTION__);
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: invalid or uninitialized entity", __FUNCTION__);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -155,7 +155,7 @@ BOOL set_member(void* pdata, const member_t *member, size_t element, cell* value
|
|||||||
case MEMBER_CLASSPTR:
|
case MEMBER_CLASSPTR:
|
||||||
{
|
{
|
||||||
// native set_member(_index, any:_member, _value, _elem);
|
// native set_member(_index, any:_member, _value, _elem);
|
||||||
CBaseEntity *pEntity = CBaseEntity::Instance(INDEXENT(*value));
|
CBaseEntity *pEntity = getPrivate<CBaseEntity>(*value);
|
||||||
set_member<CBaseEntity *>(pdata, member->offset, pEntity, element);
|
set_member<CBaseEntity *>(pdata, member->offset, pEntity, element);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -163,14 +163,14 @@ BOOL set_member(void* pdata, const member_t *member, size_t element, cell* value
|
|||||||
{
|
{
|
||||||
// native set_member(_index, any:_member, _value, _elem);
|
// native set_member(_index, any:_member, _value, _elem);
|
||||||
EHANDLE& ehandle = get_member<EHANDLE>(pdata, member->offset, element);
|
EHANDLE& ehandle = get_member<EHANDLE>(pdata, member->offset, element);
|
||||||
edict_t *pEdictValue = INDEXENT(*value);
|
edict_t *pEdictValue = edictByIndexAmx(*value);
|
||||||
ehandle.Set(pEdictValue);
|
ehandle.Set(pEdictValue);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
case MEMBER_EDICT:
|
case MEMBER_EDICT:
|
||||||
{
|
{
|
||||||
// native set_member(_index, any:_member, _value, _elem);
|
// native set_member(_index, any:_member, _value, _elem);
|
||||||
edict_t *pEdictValue = INDEXENT(*value);
|
edict_t *pEdictValue = edictByIndexAmx(*value);
|
||||||
set_member<edict_t *>(pdata, member->offset, pEdictValue, element);
|
set_member<edict_t *>(pdata, member->offset, pEdictValue, element);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -261,7 +261,7 @@ cell get_member(void* pdata, const member_t *member, size_t element, cell* dest)
|
|||||||
EHANDLE ehandle = get_member<EHANDLE>(pdata, member->offset, element);
|
EHANDLE ehandle = get_member<EHANDLE>(pdata, member->offset, element);
|
||||||
edict_t *pEntity = ehandle.Get();
|
edict_t *pEntity = ehandle.Get();
|
||||||
if (pEntity != nullptr) {
|
if (pEntity != nullptr) {
|
||||||
return ENTINDEX(pEntity);
|
return indexOfEdict(pEntity);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -270,7 +270,7 @@ cell get_member(void* pdata, const member_t *member, size_t element, cell* dest)
|
|||||||
// native any:get_member(_index, any:_member, element);
|
// native any:get_member(_index, any:_member, element);
|
||||||
edict_t *pEntity = get_member<edict_t *>(pdata, member->offset, element);
|
edict_t *pEntity = get_member<edict_t *>(pdata, member->offset, element);
|
||||||
if (pEntity != nullptr) {
|
if (pEntity != nullptr) {
|
||||||
return ENTINDEX(pEntity);
|
return indexOfEdict(pEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -281,11 +281,7 @@ cell get_member(void* pdata, const member_t *member, size_t element, cell* dest)
|
|||||||
if (!dest)
|
if (!dest)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cell* vecSrc = get_member_direct<cell *>(pdata, member->offset, element);
|
dest = get_member_direct<cell *>(pdata, member->offset, element);
|
||||||
|
|
||||||
dest[0] = vecSrc[0];
|
|
||||||
dest[1] = vecSrc[1];
|
|
||||||
dest[2] = vecSrc[2];
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case MEMBER_STRING:
|
case MEMBER_STRING:
|
||||||
|
@ -422,7 +422,6 @@ cell AMX_NATIVE_CALL rg_update_teamscores(AMX *amx, cell *params)
|
|||||||
*/
|
*/
|
||||||
cell AMX_NATIVE_CALL rg_create_entity(AMX *amx, cell *params)
|
cell AMX_NATIVE_CALL rg_create_entity(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
//g_ReGameFuncs->CREATE_NAMED_ENTITY2();
|
|
||||||
enum args_e { arg_count, arg_classname };
|
enum args_e { arg_count, arg_classname };
|
||||||
|
|
||||||
string_t iClass = g_engfuncs.pfnAllocString(getAmxString(amx, params[arg_classname]));
|
string_t iClass = g_engfuncs.pfnAllocString(getAmxString(amx, params[arg_classname]));
|
||||||
@ -430,7 +429,7 @@ cell AMX_NATIVE_CALL rg_create_entity(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (pEnt != nullptr)
|
if (pEnt != nullptr)
|
||||||
{
|
{
|
||||||
return ENTINDEX(pEnt);
|
return indexOfEdict(pEnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -468,9 +467,9 @@ cell AMX_NATIVE_CALL rg_find_ent_by_class(AMX *amx, cell *params)
|
|||||||
* @param start_index Entity index to start searching from. -1 to start from the first entity
|
* @param start_index Entity index to start searching from. -1 to start from the first entity
|
||||||
* @param classname Classname to search for
|
* @param classname Classname to search for
|
||||||
*
|
*
|
||||||
* @return Entity index > 0 if found, 0 otherwise
|
* @return 1 if found, 0 otherwise
|
||||||
*
|
*
|
||||||
* native rg_find_ent_by_owner(start_index, const classname[], owner);
|
* native rg_find_ent_by_owner(&start_index, const classname[], owner);
|
||||||
*/
|
*/
|
||||||
cell AMX_NATIVE_CALL rg_find_ent_by_owner(AMX *amx, cell *params)
|
cell AMX_NATIVE_CALL rg_find_ent_by_owner(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
@ -478,24 +477,35 @@ cell AMX_NATIVE_CALL rg_find_ent_by_owner(AMX *amx, cell *params)
|
|||||||
|
|
||||||
CHECK_ISENTITY(arg_onwer);
|
CHECK_ISENTITY(arg_onwer);
|
||||||
|
|
||||||
|
cell& startIndex = *getAmxAddr(amx, params[arg_start_index]);
|
||||||
const char* value = getAmxString(amx, params[arg_classname]);
|
const char* value = getAmxString(amx, params[arg_classname]);
|
||||||
edict_t *pOwner = edictByIndex(params[arg_onwer]);
|
edict_t* pOwner = edictByIndexAmx(params[arg_onwer]);
|
||||||
edict_t *pEntity = g_pEdicts;
|
edict_t* pEntity = &g_pEdicts[startIndex];
|
||||||
|
|
||||||
for (int i = 0; i < gpGlobals->maxEntities; i++, pEntity++)
|
for (int i = startIndex; i < gpGlobals->maxEntities; i++, pEntity++)
|
||||||
{
|
{
|
||||||
if (pEntity->v.owner == pOwner && !strcmp(STRING(pEntity->v.classname), value))
|
if (pEntity->v.owner != pOwner)
|
||||||
return i;
|
continue;
|
||||||
|
|
||||||
|
// yet not allocated
|
||||||
|
if (!pEntity->pvPrivateData || pEntity->free)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!strcmp(STRING(pEntity->v.classname), value))
|
||||||
|
{
|
||||||
|
startIndex = i;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns some information about a weapon.
|
* Returns some information about a weapon.
|
||||||
*
|
*
|
||||||
* @param weapon_id Weapon id, see WEAPON_* constants
|
* @param weapon_id Weapon id, see WEAPON_* constants
|
||||||
* @param type Info type, see WPINFO_* constants
|
* @param type Info type, see WI_* constants
|
||||||
*
|
*
|
||||||
* @return Weapon information value
|
* @return Weapon information value
|
||||||
* @error If weapon_id and type are out of bound, an error will be thrown.
|
* @error If weapon_id and type are out of bound, an error will be thrown.
|
||||||
@ -518,19 +528,19 @@ cell AMX_NATIVE_CALL rg_get_weapon_info(AMX *amx, cell *params)
|
|||||||
|
|
||||||
switch (info_type)
|
switch (info_type)
|
||||||
{
|
{
|
||||||
case WPINFO_COST:
|
case WI_COST:
|
||||||
return info->cost;
|
return info->cost;
|
||||||
case WPINFO_CLIP_COST:
|
case WI_CLIP_COST:
|
||||||
return info->clipCost;
|
return info->clipCost;
|
||||||
case WPINFO_BUY_CLIP_SIZE:
|
case WI_BUY_CLIP_SIZE:
|
||||||
return info->buyClipSize;
|
return info->buyClipSize;
|
||||||
case WPINFO_GUN_CLIP_SIZE:
|
case WI_GUN_CLIP_SIZE:
|
||||||
return info->gunClipSize;
|
return info->gunClipSize;
|
||||||
case WPINFO_MAX_ROUNDS:
|
case WI_MAX_ROUNDS:
|
||||||
return info->maxRounds;
|
return info->maxRounds;
|
||||||
case WPINFO_AMMO_TYPE:
|
case WI_AMMO_TYPE:
|
||||||
return info->ammoType;
|
return info->ammoType;
|
||||||
case WPINFO_NAME:
|
case WI_NAME:
|
||||||
{
|
{
|
||||||
if (PARAMS_COUNT != arg_4) {
|
if (PARAMS_COUNT != arg_4) {
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "%s: bad parameter count, got %i, expected %i", __FUNCTION__, PARAMS_COUNT, arg_4);
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: bad parameter count, got %i, expected %i", __FUNCTION__, PARAMS_COUNT, arg_4);
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
enum WpnInfo
|
enum WpnInfo
|
||||||
{
|
{
|
||||||
WPINFO_COST,
|
WI_COST,
|
||||||
WPINFO_CLIP_COST,
|
WI_CLIP_COST,
|
||||||
WPINFO_BUY_CLIP_SIZE,
|
WI_BUY_CLIP_SIZE,
|
||||||
WPINFO_GUN_CLIP_SIZE,
|
WI_GUN_CLIP_SIZE,
|
||||||
WPINFO_MAX_ROUNDS,
|
WI_MAX_ROUNDS,
|
||||||
WPINFO_AMMO_TYPE,
|
WI_AMMO_TYPE,
|
||||||
WPINFO_NAME
|
WI_NAME
|
||||||
};
|
};
|
||||||
|
|
||||||
void RegisterNatives_Misc();
|
void RegisterNatives_Misc();
|
||||||
|
@ -19,7 +19,15 @@ inline size_t indexOfEdict(entvars_t* pev)
|
|||||||
return indexOfEdict(pev->pContainingEntity);
|
return indexOfEdict(pev->pContainingEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline edict_t* edictByIndex(size_t index)
|
// safe to index -1
|
||||||
|
inline edict_t* edictByIndexAmx(int index)
|
||||||
|
{
|
||||||
|
auto ed = g_pEdicts + index;
|
||||||
|
return index < 0 ? nullptr : ed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fast
|
||||||
|
inline edict_t* edictByIndex(int index)
|
||||||
{
|
{
|
||||||
return g_pEdicts + index;
|
return g_pEdicts + index;
|
||||||
}
|
}
|
||||||
@ -27,16 +35,12 @@ inline edict_t* edictByIndex(size_t index)
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
T* getPrivate(int index)
|
T* getPrivate(int index)
|
||||||
{
|
{
|
||||||
edict_t* pent = edictByIndex(index);
|
return (T *)GET_PRIVATE(edictByIndexAmx(index));
|
||||||
if (pent)
|
|
||||||
return (T *)pent->pvPrivateData;
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline entvars_t* PEV(int index)
|
inline entvars_t* PEV(int index)
|
||||||
{
|
{
|
||||||
return &edictByIndex(index)->v;
|
return VARS(edictByIndexAmx(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
// HLTypeConversion.h -> AMXModX
|
// HLTypeConversion.h -> AMXModX
|
||||||
|
Loading…
x
Reference in New Issue
Block a user