Edict t: Difference between revisions
Jump to navigation
Jump to search
Note:An edict is not reliable between frames, as it can be freed from one entity and and reallocated to another at any time. Use
Warning:Never modify
Tip:
TomEdwards (talk | contribs) (edicts are specifically for networking) |
TomEdwards (talk | contribs) m (→Avoiding) |
||
Line 15: | Line 15: | ||
Edicts are assigned by <code>[[CBaseEntity]]::PostConstructor()</code>. If your entity won't ever need to be transmitted to the client, [[Constructor|construct]] it like so: | Edicts are assigned by <code>[[CBaseEntity]]::PostConstructor()</code>. If your entity won't ever need to be transmitted to the client, [[Constructor|construct]] it like so: | ||
<source lang=cpp>CMyEntity() : CBaseEntity(true) { /* | <source lang=cpp>CMyEntity() : CBaseEntity(true) { /* your constructor code */ }</source> | ||
{{tip|<code>CServerOnlyEntity</code> already does this. <code>[[CLogicalEntity]]</code> inherits, and as such none of Valve's [[Special:PrefixIndex/logic_|logic entities]] or [[:Category:Constraints|VPhysics constraints]] have edicts.}} | {{tip|<code>CServerOnlyEntity</code> already does this. <code>[[CLogicalEntity]]</code> inherits, and as such none of Valve's [[Special:PrefixIndex/logic_|logic entities]] or [[:Category:Constraints|VPhysics constraints]] have edicts.}} |
Revision as of 08:26, 7 May 2010
edict_t
("entity dictionary") is an interface struct that allows entities to cross the client/server divide: with one attached, an entity has the same index at both ends. The edict also manages the state of the entity's DataTable and provides a common representation across all DLLs.

CHandle
for long-term storage.
edict_t
or CBaseEdict
. If the memory footprint of either changes, engine DLLs will start accessing invalid addresses.Edict limit
Source can have up to 2048 edicts allocated at any one time. Going over will cause the engine to exit with an error message.
Avoiding
Edicts are assigned by CBaseEntity::PostConstructor()
. If your entity won't ever need to be transmitted to the client, construct it like so:
CMyEntity() : CBaseEntity(true) { /* your constructor code */ }

CServerOnlyEntity
already does this. CLogicalEntity
inherits, and as such none of Valve's logic entities or VPhysics constraints have edicts.Edict-less entities count toward non-networked entity limit, which is also 2048.
Getting
edict_t* CBaseEntity::edict()
- Simple accessor. Returns null if there is no edict.
edict_t* PEntityOfEntIndex(int iEntIndex)
- Given an entity index, returns a pointer to the corresponding edict.
int GetEntityCount()
- Returns the current number of assigned edicts (not entities).
Setting
void CBaseEntity::NetworkProp()->AttachEdict(edict_t* pRequiredEdict);
- Assigns an edict via the entity's
CServerNetworkProperty
object. Pass NULL unless a specific edict is required. void CBaseEntity::NetworkProp()->DetachEdict()
- Detaches the entity's assigned edict. It will go back into the edict pool for re-use.
Notable members
CBaseEntity* GetUnknown()->GetBaseEntity()
- Pointer to the entity's local representation.
char* GetClassName()
- The classname of the assigned entity.
bool IsFree()
- Whether there is currently an entity assigned to this edict.
float freetime
- The server timestamp at which the edict was last freed. Can be used to avoid reallocating the edict immediately.
bool HasStateChanged()
- Whether anything in the DataTable needs transmission.
void StateChanged()
- Tell the edict of a change to the entity's DataTable that needs transmission.
IServerEntity* GetIServerEntity()
IServerNetworkable* GetNetworkable()
ICollideable* GetCollideable()
- Accessors to various interfaces.