Implement raw entity handle accessors (#1830)
* Implement raw entity handle accessors * Fix FromPseudoAddress calls on 64-bit * fixup: Remove unnecessary ent deref * fixup: Correct param index in thrown error
This commit is contained in:
parent
ecb707e38d
commit
2130c60fd9
@ -706,6 +706,36 @@ static cell_t GetEntDataEnt2(IPluginContext *pContext, const cell_t *params)
|
|||||||
return g_HL2.EntityToBCompatRef(pHandleEntity);
|
return g_HL2.EntityToBCompatRef(pHandleEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//memory addresses below 0x10000 are automatically considered invalid for dereferencing
|
||||||
|
//this is copied over from smn_core.cpp
|
||||||
|
#define VALID_MINIMUM_MEMORY_ADDRESS 0x10000
|
||||||
|
|
||||||
|
static cell_t LoadEntityFromHandleAddress(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
|
void *addr = reinterpret_cast<void*>(params[1]);
|
||||||
|
#else
|
||||||
|
void *addr = g_SourceMod.FromPseudoAddress(params[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (addr == NULL)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Address cannot be null");
|
||||||
|
}
|
||||||
|
else if (reinterpret_cast<uintptr_t>(addr) < VALID_MINIMUM_MEMORY_ADDRESS)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid address 0x%x is pointing to reserved memory.", addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
CBaseHandle &hndl = *reinterpret_cast<CBaseHandle*>(addr);
|
||||||
|
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
|
||||||
|
|
||||||
|
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return g_HL2.EntityToBCompatRef(pHandleEntity);
|
||||||
|
}
|
||||||
|
|
||||||
/* THIS GUY IS DEPRECATED. */
|
/* THIS GUY IS DEPRECATED. */
|
||||||
static cell_t SetEntDataEnt(IPluginContext *pContext, const cell_t *params)
|
static cell_t SetEntDataEnt(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
@ -791,6 +821,44 @@ static cell_t SetEntDataEnt2(IPluginContext *pContext, const cell_t *params)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t StoreEntityToHandleAddress(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
|
void *addr = reinterpret_cast<void*>(params[1]);
|
||||||
|
#else
|
||||||
|
void *addr = g_SourceMod.FromPseudoAddress(params[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (addr == NULL)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Address cannot be null");
|
||||||
|
}
|
||||||
|
else if (reinterpret_cast<uintptr_t>(addr) < VALID_MINIMUM_MEMORY_ADDRESS)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid address 0x%x is pointing to reserved memory.", addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
CBaseHandle &hndl = *reinterpret_cast<CBaseHandle*>(addr);
|
||||||
|
|
||||||
|
if ((unsigned)params[2] == INVALID_EHANDLE_INDEX)
|
||||||
|
{
|
||||||
|
hndl.Set(NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CBaseEntity *pOther = GetEntity(params[2]);
|
||||||
|
|
||||||
|
if (!pOther)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[2]), params[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
IHandleEntity *pHandleEnt = (IHandleEntity *)pOther;
|
||||||
|
hndl.Set(pHandleEnt);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static cell_t ChangeEdictState(IPluginContext *pContext, const cell_t *params)
|
static cell_t ChangeEdictState(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
edict_t *pEdict = GetEdict(params[1]);
|
edict_t *pEdict = GetEdict(params[1]);
|
||||||
@ -2752,5 +2820,7 @@ REGISTER_NATIVES(entityNatives)
|
|||||||
{"SetEntPropVector", SetEntPropVector},
|
{"SetEntPropVector", SetEntPropVector},
|
||||||
{"GetEntityAddress", GetEntityAddress},
|
{"GetEntityAddress", GetEntityAddress},
|
||||||
{"FindDataMapInfo", FindDataMapInfo},
|
{"FindDataMapInfo", FindDataMapInfo},
|
||||||
|
{"LoadEntityFromHandleAddress", LoadEntityFromHandleAddress},
|
||||||
|
{"StoreEntityToHandleAddress", StoreEntityToHandleAddress},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -767,3 +767,19 @@ stock bool GetEntityClassname(int entity, char[] clsname, int maxlength)
|
|||||||
{
|
{
|
||||||
return !!GetEntPropString(entity, Prop_Data, "m_iClassname", clsname, maxlength);
|
return !!GetEntPropString(entity, Prop_Data, "m_iClassname", clsname, maxlength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interprets the address as an entity handle and returns the associated entity.
|
||||||
|
*
|
||||||
|
* @param addr Address to a memory location.
|
||||||
|
* @return Entity index at the given location. If there is no entity, or the stored entity is invalid, then -1 is returned.
|
||||||
|
*/
|
||||||
|
native int LoadEntityFromHandleAddress(Address addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interprets the address as an entity handle and sets the entity.
|
||||||
|
*
|
||||||
|
* @param addr Address to a memory location.
|
||||||
|
* @param entity Entity index to set, or -1 to clear.
|
||||||
|
*/
|
||||||
|
native void StoreEntityToHandleAddress(Address addr, int entity);
|
||||||
|
Loading…
Reference in New Issue
Block a user