Add RemoveEntity native. (bug 5714) (#745)
This commit is contained in:
parent
847261b6c9
commit
083ab81035
@ -94,6 +94,7 @@ enum PropFieldType
|
||||
PropField_Variant, /**< Valid for variants/any. (User must know type) */
|
||||
};
|
||||
|
||||
// From game/server/variant_t.h, same on all supported games.
|
||||
class variant_t
|
||||
{
|
||||
public:
|
||||
@ -111,6 +112,15 @@ public:
|
||||
fieldtype_t fieldType;
|
||||
};
|
||||
|
||||
// From game/server/baseentity.h, same on all supported games.
|
||||
struct inputdata_t
|
||||
{
|
||||
CBaseEntity *pActivator; // The entity that initially caused this chain of output events.
|
||||
CBaseEntity *pCaller; // The entity that fired this particular output.
|
||||
variant_t value; // The data parameter for this output.
|
||||
int nOutputID; // The unique ID of the output that was fired.
|
||||
};
|
||||
|
||||
inline bool CanSetPropName(const char *pszPropName)
|
||||
{
|
||||
#if SOURCE_ENGINE == SE_CSGO
|
||||
@ -280,6 +290,47 @@ static cell_t RemoveEdict(IPluginContext *pContext, const cell_t *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t RemoveEntity(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
auto *pEntity = GetEntity(params[1]);
|
||||
if (!pEntity)
|
||||
{
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is not a valid entity", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
// Some games have UTIL_Remove exposed on IServerTools, but for consistence, we'll
|
||||
// use this method for all. Results in DeathNotice( this ) being called on parent,
|
||||
// and parent being cleared (both if any parent) before UTIL_Remove is called.
|
||||
static inputfunc_t fnKillEntity = nullptr;
|
||||
if (!fnKillEntity)
|
||||
{
|
||||
// Get world, as other ents aren't guaranteed to inherit full datadesc (but kill func is same for all)
|
||||
CBaseEntity *pGetterEnt = g_HL2.ReferenceToEntity(0);
|
||||
if (pGetterEnt == nullptr)
|
||||
{
|
||||
// If we don't have a world entity yet, we'll have to rely on the given entity. Does this even make sense???
|
||||
pGetterEnt = pEntity;
|
||||
}
|
||||
|
||||
datamap_t *pMap = g_HL2.GetDataMap(pGetterEnt);
|
||||
|
||||
sm_datatable_info_t info;
|
||||
if (!g_HL2.FindDataMapInfo(pMap, "InputKill", &info))
|
||||
{
|
||||
return pContext->ThrowNativeError("Failed to find Kill input!");
|
||||
}
|
||||
|
||||
fnKillEntity = info.prop->inputFunc;
|
||||
}
|
||||
|
||||
// Input data is ignored for this. No need to initialize
|
||||
static inputdata_t data;
|
||||
|
||||
(pEntity->*fnKillEntity)(data);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t IsValidEdict(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
edict_t *pEdict = GetEdict(params[1]);
|
||||
@ -2640,6 +2691,7 @@ REGISTER_NATIVES(entityNatives)
|
||||
{"IsEntNetworkable", IsEntNetworkable},
|
||||
{"IsValidEdict", IsValidEdict},
|
||||
{"IsValidEntity", IsValidEntity},
|
||||
{"RemoveEntity", RemoveEntity},
|
||||
{"RemoveEdict", RemoveEdict},
|
||||
{"SetEdictFlags", SetEdictFlags},
|
||||
{"SetEntData", SetEntData},
|
||||
|
@ -142,6 +142,14 @@ native int CreateEdict();
|
||||
*/
|
||||
native void RemoveEdict(int edict);
|
||||
|
||||
/**
|
||||
* Marks an entity for deletion.
|
||||
*
|
||||
* @param entity Index of the entity.
|
||||
* @error Invalid entity index.
|
||||
*/
|
||||
native void RemoveEntity(int entity);
|
||||
|
||||
/**
|
||||
* Returns the flags on an edict. These are not the same as entity flags.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user