Difference between revisions of "Entity References (SourceMod)"
Joinedsenses (talk | contribs) m (Update highlighting) |
m (Reverted edits by Joinedsenses (talk) to last revision by Xerox8521) (Tag: Rollback) |
||
Line 1: | Line 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. Most Sourcemod-provided natives should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will use the serial to check that the entity index contained in the reference is the same as when the reference was created. If you find a native that does not seem to support references in place of indexes, please file a bug report. | An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. Most Sourcemod-provided natives should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will use the serial to check that the entity index contained in the reference is the same as when the reference was created. If you find a native that does not seem to support references in place of indexes, please file a bug report. | ||
Line 98: | Line 5: | ||
==Converting a backwards-compat index/ref to a guaranteed reference for safely caching== | ==Converting a backwards-compat index/ref to a guaranteed reference for safely caching== | ||
− | < | + | <pawn> |
int index = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); | int index = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); | ||
/* Convert our backwards-compat index/ref to a guaranteed reference */ | /* Convert our backwards-compat index/ref to a guaranteed reference */ | ||
int ref = EntIndexToEntRef(index); | int ref = EntIndexToEntRef(index); | ||
− | </ | + | </pawn> |
==Converting a reference back to an entity index== | ==Converting a reference back to an entity index== | ||
− | < | + | <pawn> |
int index = EntRefToEntIndex(ref); | int index = EntRefToEntIndex(ref); | ||
if (index == INVALID_ENT_REFERENCE) | if (index == INVALID_ENT_REFERENCE) | ||
{ | { | ||
− | + | /* Reference wasn't valid - Entity must have been deleted */ | |
} | } | ||
− | </ | + | </pawn> |
==Using References to handle a logic entity== | ==Using References to handle a logic entity== | ||
− | < | + | <pawn> |
int ent = -1; | int ent = -1; | ||
Line 133: | Line 40: | ||
} | } | ||
− | </ | + | </pawn> |
[[Category:SourceMod Scripting]] | [[Category:SourceMod Scripting]] |
Revision as of 08:24, 4 May 2020
An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. Most Sourcemod-provided natives should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will use the serial to check that the entity index contained in the reference is the same as when the reference was created. If you find a native that does not seem to support references in place of indexes, please file a bug report.
SourceMod now also supports handling of logical (non-networked entities) and these use references exclusively. Natives that used to return an entity index will continue to do so in the case of networked entities (for backwards compatability) and will only return a reference for non-networked ones.
Converting a backwards-compat index/ref to a guaranteed reference for safely caching
int index = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); /* Convert our backwards-compat index/ref to a guaranteed reference */ int ref = EntIndexToEntRef(index);
Converting a reference back to an entity index
int index = EntRefToEntIndex(ref); if (index == INVALID_ENT_REFERENCE) { /* Reference wasn't valid - Entity must have been deleted */ }
Using References to handle a logic entity
int ent = -1; while ((ent = FindEntityByClassname(ent, "logic_auto")) != -1) { /** * Get the entity index from this reference - This works on references and indexes for convenience. * Should be a number >2048 since logic_auto is a non networked entity */ int ref = EntIndexToEntRef(ent); /* Fire an input on this entity - We use the reference version since this includes a serial check */ AcceptEntityInput(ref, "Kill"); }