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 
Warning:In most games, 
 Source can have up to 2048 edicts allocated at any one time. Going over will cause the engine to crash with an error message.
Note:This limit is raised to 4096 in 
 Portal 2 and 8192 in 
 Garry's Mod and 
 Portal 2: Community Edition.
 Counter-Strike: Global Offensive and 
 Team Fortress 2 have the default limit of 2048. 
Tip:
 GoldSrc has a maximum of 1200 edicts by default (900 prior to 25th-anniversary update), but this can be raised to 2048 in a mod by editing its liblist.gam to include the line 
 Confirm:What about 
 Sven Co-op? 
Tip:
 Confirm:Do they count towards the non-edict entity limit when being initially processed?
		
	
mNo edit summary  | 
				SirYodaJedi (talk | contribs)   (→Avoiding:  compiler-only entities don't count towards edict limits)  | 
				||
| Line 21: | Line 21: | ||
Edict-less entities count toward non-networked entity limit, which is also 2048.  | Edict-less entities count toward non-networked entity limit, which is also 2048.  | ||
Entities which are not recognized by the game code (such as compiler-only entities like [[func_null]]) do not count as an edict, as they are not spawned.  | |||
{{modernConfirm|Do they count towards the non-edict entity limit when being initially processed?}}  | |||
== Getting ==  | == Getting ==  | ||
Revision as of 11:08, 11 August 2024
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. It cannot be used on the client.
CHandle for long-term storage.edict_t or CBaseEdict. If the memory footprint of either changes, engine DLLs will start accessing invalid addresses.Limitations
edicts "2048".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.
Entities which are not recognized by the game code (such as compiler-only entities like func_null) do not count as an edict, as they are not spawned.
Getting
edict_t* CBaseEntity::edict()- Simple accessor. Returns null if there is no edict.
 edict_t* INDEXENT( int iEdictNum )int ENTINDEX( edict_t* pEdict )- Converts between an entity index and its attached 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 
CServerNetworkPropertyobject. 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.