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
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:Never modify 
 Warning:In most games,
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.
 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
Note:This limit is raised to 4096 in  Portal 2 and 8192 in
 Portal 2 and 8192 in  Garry's Mod and
 Garry's Mod and  Portal 2: Community Edition.
 Portal 2: Community Edition.
 Counter-Strike: Global Offensive and
 Counter-Strike: Global Offensive and  Team Fortress 2 have the default limit of 2048.
 Team Fortress 2 have the default limit of 2048. 
 Tip:
Tip: GoldSrc has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its liblist.gam to include the line
 GoldSrc has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its liblist.gam to include the line  Confirm:What about
 Confirm:What about  Sven Co-op?
 Sven Co-op? 
 Tip:
Tip:
		
	
| SirYodaJedi (talk | contribs) m (→Limitations) | mNo edit summary | ||
| Line 9: | Line 9: | ||
| == Limitations == | == Limitations == | ||
| {{warning|In most games, {{src|2}} can have [[entity limit|up to 2048]] edicts allocated at any one time. Going over will cause the engine to crash with an error message. | {{warning|In most games, {{src|2}} can have [[entity limit|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 {{portal2|2}} and 8192 in {{gmod|2}}.<br>{{csgo|2}} and {{tf2|2}} have the default limit of 2048.}} }} | {{note|This limit is raised to 4096 in {{portal2|2}} and 8192 in {{gmod|2}} and {{p2ce|2}}.<br>{{csgo|2}} and {{tf2|2}} have the default limit of 2048.}} }} | ||
| {{tip|{{GoldSrc|2}} has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its [[liblist.gam]] to include the line {{code|edicts{{nbsp}}"2048"}}.{{modernConfirm|What about {{sven|2}}?}} }} | {{tip|{{GoldSrc|2}} has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its [[liblist.gam]] to include the line {{code|edicts{{nbsp}}"2048"}}.{{modernConfirm|What about {{sven|2}}?}} }} | ||
Revision as of 12:40, 2 October 2023
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.
 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
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 CHandle for long-term storage. Warning:Never modify
Warning:Never modify edict_t or CBaseEdict. If the memory footprint of either changes, engine DLLs will start accessing invalid addresses.Limitations
 Warning:In most games,
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.
 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
Note:This limit is raised to 4096 in  Portal 2 and 8192 in
 Portal 2 and 8192 in  Garry's Mod and
 Garry's Mod and  Portal 2: Community Edition.
 Portal 2: Community Edition. Counter-Strike: Global Offensive and
 Counter-Strike: Global Offensive and  Team Fortress 2 have the default limit of 2048.
 Team Fortress 2 have the default limit of 2048. Tip:
Tip: GoldSrc has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its liblist.gam to include the line
 GoldSrc has a maximum of 900 edicts by default, but this can be raised to 2048 in a mod by editing its liblist.gam to include the line edicts "2048". Confirm:What about
 Confirm:What about  Sven Co-op?
 Sven Co-op?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 */ }
 Tip:
Tip: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* 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.