2018-04-13 18:23:45 +02:00
/***
*
* Copyright ( c ) 1996 - 2002 , Valve LLC . All rights reserved .
2021-01-03 02:28:45 +01:00
*
* This product contains software technology licensed from Id
* Software , Inc . ( " Id Technology " ) . Id Technology ( c ) 1996 Id Software , Inc .
2018-04-13 18:23:45 +02:00
* All Rights Reserved .
*
* Use , distribution , and modification of this source code and / or resulting
* object code is restricted to non - commercial enhancements to products from
* Valve LLC . All other use , distribution , or modification is prohibited
* without written permission from Valve LLC .
*
* * * */
# ifndef EIFACE_H
# define EIFACE_H
# ifdef HLDEMO_BUILD
# define INTERFACE_VERSION 001
# else // !HLDEMO_BUILD, i.e., regular version of HL
# define INTERFACE_VERSION 140
# endif // !HLDEMO_BUILD
# include <stdio.h>
# include "custom.h"
# include "cvardef.h"
//
// Defines entity interface between engine and DLLs.
// This header file included by engine files and DLL files.
//
// Before including this header, DLLs must:
// include progdefs.h
// This is conveniently done for them in extdll.h
//
# ifdef _WIN32
# define DLLEXPORT __stdcall
# else
# define DLLEXPORT /* */
# endif
typedef enum
{
at_notice ,
at_console , // same as at_notice, but forces a ConPrintf, not a message box
at_aiconsole , // same as at_console, but only shown if developer level is 2!
at_warning ,
at_error ,
at_logged // Server print to console ( only in multiplayer games ).
} ALERT_TYPE ;
// 4-22-98 JOHN: added for use in pfnClientPrintf
typedef enum
{
print_console ,
print_center ,
print_chat ,
} PRINT_TYPE ;
// For integrity checking of content on clients
typedef enum
{
force_exactfile , // File on client must exactly match server's file
force_model_samebounds , // For model files only, the geometry must fit in the same bbox
force_model_specifybounds , // For model files only, the geometry must fit in the specified bbox
} FORCE_TYPE ;
// Returned by TraceLine
typedef struct
{
int fAllSolid ; // if true, plane is not valid
int fStartSolid ; // if true, the initial point was in a solid area
int fInOpen ;
int fInWater ;
float flFraction ; // time completed, 1.0 = didn't hit anything
vec3_t vecEndPos ; // final position
float flPlaneDist ;
vec3_t vecPlaneNormal ; // surface normal at impact
edict_t * pHit ; // entity the surface is on
int iHitgroup ; // 0 == generic, non zero is specific body part
} TraceResult ;
// CD audio status
2021-01-03 02:28:45 +01:00
typedef struct
2018-04-13 18:23:45 +02:00
{
int fPlaying ; // is sound playing right now?
int fWasPlaying ; // if not, CD is paused if WasPlaying is true.
int fInitialized ;
int fEnabled ;
int fPlayLooping ;
float cdvolume ;
int fCDRom ;
int fPlayTrack ;
} CDStatus ;
2021-01-03 02:28:45 +01:00
2018-04-23 22:05:49 +02:00
typedef unsigned int CRC32_t ;
2018-04-13 18:23:45 +02:00
2018-04-14 03:26:12 +02:00
typedef struct delta_s delta_t ;
2018-04-20 23:05:08 +02:00
struct entity_state_s ;
2018-04-14 03:26:12 +02:00
2018-04-13 18:23:45 +02:00
// Engine hands this to DLLs for functionality callbacks
typedef struct enginefuncs_s
{
2018-04-23 22:05:49 +02:00
int ( * pfnPrecacheModel ) ( const char * s ) ;
int ( * pfnPrecacheSound ) ( const char * s ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnSetModel ) ( edict_t * e , const char * m ) ;
int ( * pfnModelIndex ) ( const char * m ) ;
int ( * pfnModelFrames ) ( int modelIndex ) ;
void ( * pfnSetSize ) ( edict_t * e , const float * rgflMin , const float * rgflMax ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnChangeLevel ) ( const char * s1 , const char * s2 ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnGetSpawnParms ) ( edict_t * ent ) ;
void ( * pfnSaveSpawnParms ) ( edict_t * ent ) ;
float ( * pfnVecToYaw ) ( const float * rgflVector ) ;
void ( * pfnVecToAngles ) ( const float * rgflVectorIn , float * rgflVectorOut ) ;
void ( * pfnMoveToOrigin ) ( edict_t * ent , const float * pflGoal , float dist , int iMoveType ) ;
void ( * pfnChangeYaw ) ( edict_t * ent ) ;
void ( * pfnChangePitch ) ( edict_t * ent ) ;
edict_t * ( * pfnFindEntityByString ) ( edict_t * pEdictStartSearchAfter , const char * pszField , const char * pszValue ) ;
int ( * pfnGetEntityIllum ) ( edict_t * pEnt ) ;
edict_t * ( * pfnFindEntityInSphere ) ( edict_t * pEdictStartSearchAfter , const float * org , float rad ) ;
edict_t * ( * pfnFindClientInPVS ) ( edict_t * pEdict ) ;
edict_t * ( * pfnEntitiesInPVS ) ( edict_t * pplayer ) ;
void ( * pfnMakeVectors ) ( const float * rgflVector ) ;
void ( * pfnAngleVectors ) ( const float * rgflVector , float * forward , float * right , float * up ) ;
edict_t * ( * pfnCreateEntity ) ( void ) ;
void ( * pfnRemoveEntity ) ( edict_t * e ) ;
edict_t * ( * pfnCreateNamedEntity ) ( int className ) ;
void ( * pfnMakeStatic ) ( edict_t * ent ) ;
int ( * pfnEntIsOnFloor ) ( edict_t * e ) ;
int ( * pfnDropToFloor ) ( edict_t * e ) ;
int ( * pfnWalkMove ) ( edict_t * ent , float yaw , float dist , int iMode ) ;
void ( * pfnSetOrigin ) ( edict_t * e , const float * rgflOrigin ) ;
void ( * pfnEmitSound ) ( edict_t * entity , int channel , const char * sample , /*int*/ float volume , float attenuation , int fFlags , int pitch ) ;
void ( * pfnEmitAmbientSound ) ( edict_t * entity , float * pos , const char * samp , float vol , float attenuation , int fFlags , int pitch ) ;
void ( * pfnTraceLine ) ( const float * v1 , const float * v2 , int fNoMonsters , edict_t * pentToSkip , TraceResult * ptr ) ;
void ( * pfnTraceToss ) ( edict_t * pent , edict_t * pentToIgnore , TraceResult * ptr ) ;
int ( * pfnTraceMonsterHull ) ( edict_t * pEdict , const float * v1 , const float * v2 , int fNoMonsters , edict_t * pentToSkip , TraceResult * ptr ) ;
void ( * pfnTraceHull ) ( const float * v1 , const float * v2 , int fNoMonsters , int hullNumber , edict_t * pentToSkip , TraceResult * ptr ) ;
void ( * pfnTraceModel ) ( const float * v1 , const float * v2 , int hullNumber , edict_t * pent , TraceResult * ptr ) ;
const char * ( * pfnTraceTexture ) ( edict_t * pTextureEntity , const float * v1 , const float * v2 ) ;
void ( * pfnTraceSphere ) ( const float * v1 , const float * v2 , int fNoMonsters , float radius , edict_t * pentToSkip , TraceResult * ptr ) ;
void ( * pfnGetAimVector ) ( edict_t * ent , float speed , float * rgflReturn ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnServerCommand ) ( const char * str ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnServerExecute ) ( void ) ;
void ( * pfnClientCommand ) ( edict_t * pEdict , char * szFmt , . . . ) ;
void ( * pfnParticleEffect ) ( const float * org , const float * dir , float color , float count ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnLightStyle ) ( int style , const char * val ) ;
2018-04-13 18:23:45 +02:00
int ( * pfnDecalIndex ) ( const char * name ) ;
int ( * pfnPointContents ) ( const float * rgflVector ) ;
void ( * pfnMessageBegin ) ( int msg_dest , int msg_type , const float * pOrigin , edict_t * ed ) ;
void ( * pfnMessageEnd ) ( void ) ;
void ( * pfnWriteByte ) ( int iValue ) ;
void ( * pfnWriteChar ) ( int iValue ) ;
void ( * pfnWriteShort ) ( int iValue ) ;
void ( * pfnWriteLong ) ( int iValue ) ;
void ( * pfnWriteAngle ) ( float flValue ) ;
void ( * pfnWriteCoord ) ( float flValue ) ;
void ( * pfnWriteString ) ( const char * sz ) ;
void ( * pfnWriteEntity ) ( int iValue ) ;
void ( * pfnCVarRegister ) ( cvar_t * pCvar ) ;
float ( * pfnCVarGetFloat ) ( const char * szVarName ) ;
const char * ( * pfnCVarGetString ) ( const char * szVarName ) ;
void ( * pfnCVarSetFloat ) ( const char * szVarName , float flValue ) ;
void ( * pfnCVarSetString ) ( const char * szVarName , const char * szValue ) ;
void ( * pfnAlertMessage ) ( ALERT_TYPE atype , char * szFmt , . . . ) ;
void ( * pfnEngineFprintf ) ( FILE * pfile , char * szFmt , . . . ) ;
void * ( * pfnPvAllocEntPrivateData ) ( edict_t * pEdict , long cb ) ;
void * ( * pfnPvEntPrivateData ) ( edict_t * pEdict ) ;
void ( * pfnFreeEntPrivateData ) ( edict_t * pEdict ) ;
const char * ( * pfnSzFromIndex ) ( int iString ) ;
int ( * pfnAllocString ) ( const char * szValue ) ;
struct entvars_s * ( * pfnGetVarsOfEnt ) ( edict_t * pEdict ) ;
edict_t * ( * pfnPEntityOfEntOffset ) ( int iEntOffset ) ;
int ( * pfnEntOffsetOfPEntity ) ( const edict_t * pEdict ) ;
int ( * pfnIndexOfEdict ) ( const edict_t * pEdict ) ;
edict_t * ( * pfnPEntityOfEntIndex ) ( int iEntIndex ) ;
edict_t * ( * pfnFindEntityByVars ) ( struct entvars_s * pvars ) ;
void * ( * pfnGetModelPtr ) ( edict_t * pEdict ) ;
int ( * pfnRegUserMsg ) ( const char * pszName , int iSize ) ;
void ( * pfnAnimationAutomove ) ( const edict_t * pEdict , float flTime ) ;
void ( * pfnGetBonePosition ) ( const edict_t * pEdict , int iBone , float * rgflOrigin , float * rgflAngles ) ;
unsigned long ( * pfnFunctionFromName ) ( const char * pName ) ;
const char * ( * pfnNameForFunction ) ( unsigned long function ) ;
void ( * pfnClientPrintf ) ( edict_t * pEdict , PRINT_TYPE ptype , const char * szMsg ) ; // JOHN: engine callbacks so game DLL can print messages to individual clients
void ( * pfnServerPrint ) ( const char * szMsg ) ;
2021-01-03 02:28:45 +01:00
const char * ( * pfnCmd_Args ) ( void ) ; // these 3 added
const char * ( * pfnCmd_Argv ) ( int argc ) ; // so game DLL can easily
2018-04-13 18:23:45 +02:00
int ( * pfnCmd_Argc ) ( void ) ; // access client 'cmd' strings
void ( * pfnGetAttachment ) ( const edict_t * pEdict , int iAttachment , float * rgflOrigin , float * rgflAngles ) ;
void ( * pfnCRC32_Init ) ( CRC32_t * pulCRC ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnCRC32_ProcessBuffer ) ( CRC32_t * pulCRC , const void * p , int len ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnCRC32_ProcessByte ) ( CRC32_t * pulCRC , unsigned char ch ) ;
CRC32_t ( * pfnCRC32_Final ) ( CRC32_t pulCRC ) ;
2018-04-23 22:05:49 +02:00
int ( * pfnRandomLong ) ( int lLow , int lHigh ) ;
2018-04-13 18:23:45 +02:00
float ( * pfnRandomFloat ) ( float flLow , float flHigh ) ;
void ( * pfnSetView ) ( const edict_t * pClient , const edict_t * pViewent ) ;
float ( * pfnTime ) ( void ) ;
void ( * pfnCrosshairAngle ) ( const edict_t * pClient , float pitch , float yaw ) ;
2018-04-23 22:05:49 +02:00
byte * ( * pfnLoadFileForMe ) ( const char * filename , int * pLength ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnFreeFile ) ( void * buffer ) ;
void ( * pfnEndSection ) ( const char * pszSectionName ) ; // trigger_endsection
2018-04-23 22:05:49 +02:00
int ( * pfnCompareFileTime ) ( const char * filename1 , const char * filename2 , int * iCompare ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnGetGameDir ) ( char * szGetGameDir ) ;
void ( * pfnCvar_RegisterVariable ) ( cvar_t * variable ) ;
void ( * pfnFadeClientVolume ) ( const edict_t * pEdict , int fadePercent , int fadeOutSeconds , int holdTime , int fadeInSeconds ) ;
void ( * pfnSetClientMaxspeed ) ( const edict_t * pEdict , float fNewMaxspeed ) ;
edict_t * ( * pfnCreateFakeClient ) ( const char * netname ) ; // returns NULL if fake client can't be created
void ( * pfnRunPlayerMove ) ( edict_t * fakeclient , const float * viewangles , float forwardmove , float sidemove , float upmove , unsigned short buttons , byte impulse , byte msec ) ;
int ( * pfnNumberOfEntities ) ( void ) ;
char * ( * pfnGetInfoKeyBuffer ) ( edict_t * e ) ; // passing in NULL gets the serverinfo
2018-04-23 22:05:49 +02:00
const char * ( * pfnInfoKeyValue ) ( const char * infobuffer , const char * key ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnSetKeyValue ) ( char * infobuffer , char * key , char * value ) ;
void ( * pfnSetClientKeyValue ) ( int clientIndex , char * infobuffer , char * key , char * value ) ;
int ( * pfnIsMapValid ) ( char * filename ) ;
void ( * pfnStaticDecal ) ( const float * origin , int decalIndex , int entityIndex , int modelIndex ) ;
2018-04-23 22:05:49 +02:00
int ( * pfnPrecacheGeneric ) ( const char * s ) ;
2018-04-13 18:23:45 +02:00
int ( * pfnGetPlayerUserId ) ( edict_t * e ) ; // returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
void ( * pfnBuildSoundMsg ) ( edict_t * entity , int channel , const char * sample , /*int*/ float volume , float attenuation , int fFlags , int pitch , int msg_dest , int msg_type , const float * pOrigin , edict_t * ed ) ;
int ( * pfnIsDedicatedServer ) ( void ) ; // is this a dedicated server?
cvar_t * ( * pfnCVarGetPointer ) ( const char * szVarName ) ;
unsigned int ( * pfnGetPlayerWONId ) ( edict_t * e ) ; // returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
// YWB 8/1/99 TFF Physics additions
void ( * pfnInfo_RemoveKey ) ( char * s , const char * key ) ;
const char * ( * pfnGetPhysicsKeyValue ) ( const edict_t * pClient , const char * key ) ;
void ( * pfnSetPhysicsKeyValue ) ( const edict_t * pClient , const char * key , const char * value ) ;
const char * ( * pfnGetPhysicsInfoString ) ( const edict_t * pClient ) ;
unsigned short ( * pfnPrecacheEvent ) ( int type , const char * psz ) ;
void ( * pfnPlaybackEvent ) ( int flags , const edict_t * pInvoker , unsigned short eventindex , float delay , float * origin , float * angles , float fparam1 , float fparam2 , int iparam1 , int iparam2 , int bparam1 , int bparam2 ) ;
2021-01-03 02:28:45 +01:00
2018-04-23 22:05:49 +02:00
unsigned char * ( * pfnSetFatPVS ) ( const float * org ) ;
unsigned char * ( * pfnSetFatPAS ) ( const float * org ) ;
2018-04-13 18:23:45 +02:00
int ( * pfnCheckVisibility ) ( const edict_t * entity , unsigned char * pset ) ;
2018-07-12 22:13:30 +02:00
void ( * pfnDeltaSetField ) ( struct delta_s * pFields , const char * fieldname ) ;
void ( * pfnDeltaUnsetField ) ( struct delta_s * pFields , const char * fieldname ) ;
void ( * pfnDeltaAddEncoder ) ( char * name , void ( * conditionalencode ) ( struct delta_s * pFields , const unsigned char * from , const unsigned char * to ) ) ;
2018-04-13 18:23:45 +02:00
int ( * pfnGetCurrentPlayer ) ( void ) ;
int ( * pfnCanSkipPlayer ) ( const edict_t * player ) ;
2018-07-12 22:13:30 +02:00
int ( * pfnDeltaFindField ) ( struct delta_s * pFields , const char * fieldname ) ;
void ( * pfnDeltaSetFieldByIndex ) ( struct delta_s * pFields , int fieldNumber ) ;
void ( * pfnDeltaUnsetFieldByIndex ) ( struct delta_s * pFields , int fieldNumber ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnSetGroupMask ) ( int mask , int op ) ;
int ( * pfnCreateInstancedBaseline ) ( int classname , struct entity_state_s * baseline ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnCvar_DirectSet ) ( struct cvar_s * var , const char * value ) ;
2018-04-13 18:23:45 +02:00
// Forces the client and server to be running with the same version of the specified file
// ( e.g., a player model ).
// Calling this has no effect in single player
void ( * pfnForceUnmodified ) ( FORCE_TYPE type , float * mins , float * maxs , const char * filename ) ;
void ( * pfnGetPlayerStats ) ( const edict_t * pClient , int * ping , int * packet_loss ) ;
2018-04-23 22:05:49 +02:00
void ( * pfnAddServerCommand ) ( const char * cmd_name , void ( * function ) ( void ) ) ;
2018-04-13 18:23:45 +02:00
// For voice communications, set which clients hear eachother.
// NOTE: these functions take player entity indices (starting at 1).
qboolean ( * pfnVoice_GetClientListening ) ( int iReceiver , int iSender ) ;
qboolean ( * pfnVoice_SetClientListening ) ( int iReceiver , int iSender , qboolean bListen ) ;
const char * ( * pfnGetPlayerAuthId ) ( edict_t * e ) ;
2019-10-07 05:59:21 +02:00
void * ( * pfnSequenceGet ) ( const char * fileName , const char * entryName ) ;
void * ( * pfnSequencePickSentence ) ( const char * groupName , int pickMethod , int * picked ) ;
2021-03-07 00:46:38 +01:00
int ( * pfnGetFileSize ) ( const char * filename ) ;
2019-10-07 05:59:21 +02:00
unsigned int ( * pfnGetApproxWavePlayLen ) ( const char * filepath ) ;
int ( * pfnIsCareerMatch ) ( void ) ;
int ( * pfnGetLocalizedStringLength ) ( const char * label ) ;
void ( * pfnRegisterTutorMessageShown ) ( int mid ) ;
int ( * pfnGetTimesTutorMessageShown ) ( int mid ) ;
void ( * pfnProcessTutorMessageDecayBuffer ) ( int * buffer , int bufferLength ) ;
void ( * pfnConstructTutorMessageDecayBuffer ) ( int * buffer , int bufferLength ) ;
void ( * pfnResetTutorMessageDecayData ) ( void ) ;
2018-04-13 18:23:45 +02:00
// three useable funcs
void ( * pfnQueryClientCvarValue ) ( const edict_t * player , const char * cvarName ) ;
void ( * pfnQueryClientCvarValue2 ) ( const edict_t * player , const char * cvarName , int requestID ) ;
int ( * pfnCheckParm ) ( char * parm , char * * ppnext ) ;
2022-05-20 17:09:52 +02:00
// added in 8279
edict_t * ( * pfnPEntityOfEntIndexAllEntities ) ( int iEntIndex ) ;
2018-04-13 18:23:45 +02:00
} enginefuncs_t ;
// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138
2021-01-03 02:28:45 +01:00
2018-04-13 18:23:45 +02:00
// Passed to pfnKeyValue
typedef struct KeyValueData_s
{
char * szClassName ; // in: entity classname
char * szKeyName ; // in: name of key
char * szValue ; // in: value of key
2018-12-05 17:57:05 +01:00
int fHandled ; // out: DLL sets to true if key-value pair was understood
2018-04-13 18:23:45 +02:00
} KeyValueData ;
typedef struct
{
char mapName [ 32 ] ;
char landmarkName [ 32 ] ;
edict_t * pentLandmark ;
vec3_t vecLandmarkOrigin ;
} LEVELLIST ;
2021-01-03 02:28:45 +01:00
typedef struct
2018-04-13 18:23:45 +02:00
{
int id ; // Ordinal ID of this entity (used for entity <--> pointer conversions)
edict_t * pent ; // Pointer to the in-game entity
int location ; // Offset from the base data of this entity
int size ; // Byte size of this entity's data
int flags ; // This could be a short -- bit mask of transitions that this entity is in the PVS of
string_t classname ; // entity class name
} ENTITYTABLE ;
# define MAX_LEVEL_CONNECTIONS 16 // These are encoded in the lower 16bits of ENTITYTABLE->flags
# define FENTTABLE_PLAYER 0x80000000
# define FENTTABLE_REMOVED 0x40000000
# define FENTTABLE_MOVEABLE 0x20000000
# define FENTTABLE_GLOBAL 0x10000000
typedef struct saverestore_s
{
char * pBaseData ; // Start of all entity save data
char * pCurrentData ; // Current buffer pointer for sequential access
int size ; // Current data size
int bufferSize ; // Total space for data
int tokenSize ; // Size of the linear list of tokens
int tokenCount ; // Number of elements in the pTokens table
char * * pTokens ; // Hash table of entity strings (sparse)
int currentIndex ; // Holds a global entity table ID
int tableCount ; // Number of elements in the entity table
int connectionCount ; // Number of elements in the levelList[]
ENTITYTABLE * pTable ; // Array of ENTITYTABLE elements (1 for each entity)
LEVELLIST levelList [ MAX_LEVEL_CONNECTIONS ] ; // List of connections from this level
// smooth transition
int fUseLandmark ;
char szLandmarkName [ 20 ] ; // landmark we'll spawn near in next level
vec3_t vecLandmarkOffset ; // for landmark transitions
float time ;
char szCurrentMapName [ 32 ] ; // To check global entities
} SAVERESTOREDATA ;
typedef enum _fieldtypes
{
FIELD_FLOAT = 0 , // Any floating point value
FIELD_STRING , // A string ID (return from ALLOC_STRING)
FIELD_ENTITY , // An entity offset (EOFFSET)
FIELD_CLASSPTR , // CBaseEntity *
FIELD_EHANDLE , // Entity handle
FIELD_EVARS , // EVARS *
FIELD_EDICT , // edict_t *, or edict_t * (same thing)
FIELD_VECTOR , // Any vector
FIELD_POSITION_VECTOR , // A world coordinate (these are fixed up across level transitions automagically)
FIELD_POINTER , // Arbitrary data pointer... to be removed, use an array of FIELD_CHARACTER
FIELD_INTEGER , // Any integer or enum
FIELD_FUNCTION , // A class function pointer (Think, Use, etc)
FIELD_BOOLEAN , // boolean, implemented as an int, I may use this as a hint for compression
FIELD_SHORT , // 2 byte integer
FIELD_CHARACTER , // a byte
FIELD_TIME , // a floating point time (these are fixed up automatically too!)
FIELD_MODELNAME , // Engine string that is a model name (needs precache)
FIELD_SOUNDNAME , // Engine string that is a sound name (needs precache)
FIELD_TYPECOUNT , // MUST BE LAST
} FIELDTYPE ;
# ifndef offsetof
2021-10-03 03:26:22 +02:00
# ifdef __GNUC__
# define offsetof(s,m) __builtin_offsetof(s,m)
# else
# define offsetof(s,m) (size_t)&(((s *)0)->m)
# endif
2018-04-13 18:23:45 +02:00
# endif
# define _FIELD(type,name,fieldtype,count,flags) { fieldtype, #name, offsetof(type, name), count, flags }
# define DEFINE_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, 0)
# define DEFINE_ARRAY(type,name,fieldtype,count) _FIELD(type, name, fieldtype, count, 0)
# define DEFINE_ENTITY_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, 0 )
# define DEFINE_ENTITY_GLOBAL_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, FTYPEDESC_GLOBAL )
# define DEFINE_GLOBAL_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, FTYPEDESC_GLOBAL )
# define FTYPEDESC_GLOBAL 0x0001 // This field is masked for global entity save/restore
# define FTYPEDESC_SAVE 0x0002 // This field is saved to disk
# define FTYPEDESC_KEY 0x0004 // This field can be requested and written to by string name at load time
# define FTYPEDESC_FUNCTIONTABLE 0x0008 // This is a table entry for a member function pointer
2021-01-03 02:28:45 +01:00
typedef struct
2018-04-13 18:23:45 +02:00
{
FIELDTYPE fieldType ;
2021-07-20 15:02:59 +02:00
const char * fieldName ;
2018-04-13 18:23:45 +02:00
int fieldOffset ;
short fieldSize ;
short flags ;
} TYPEDESCRIPTION ;
2018-06-14 19:32:31 +02:00
# undef ARRAYSIZE
2018-04-13 18:23:45 +02:00
# define ARRAYSIZE(p) (sizeof(p) / sizeof(p[0]))
2018-10-06 02:34:01 +02:00
struct weapon_data_s ;
struct playermove_s ;
struct clientdata_s ;
struct usercmd_s ;
struct edict_s ;
2019-03-22 14:36:46 +01:00
struct netadr_s ;
2018-10-06 02:34:01 +02:00
2021-01-03 02:28:45 +01:00
typedef struct
2018-04-13 18:23:45 +02:00
{
// Initialize/shutdown the game (one-time call after loading of game .dll )
2021-01-03 02:28:45 +01:00
void ( * pfnGameInit ) ( void ) ;
2018-04-13 18:23:45 +02:00
int ( * pfnSpawn ) ( edict_t * pent ) ;
void ( * pfnThink ) ( edict_t * pent ) ;
void ( * pfnUse ) ( edict_t * pentUsed , edict_t * pentOther ) ;
void ( * pfnTouch ) ( edict_t * pentTouched , edict_t * pentOther ) ;
void ( * pfnBlocked ) ( edict_t * pentBlocked , edict_t * pentOther ) ;
void ( * pfnKeyValue ) ( edict_t * pentKeyvalue , KeyValueData * pkvd ) ;
void ( * pfnSave ) ( edict_t * pent , SAVERESTOREDATA * pSaveData ) ;
int ( * pfnRestore ) ( edict_t * pent , SAVERESTOREDATA * pSaveData , int globalEntity ) ;
void ( * pfnSetAbsBox ) ( edict_t * pent ) ;
void ( * pfnSaveWriteFields ) ( SAVERESTOREDATA * , const char * , void * , TYPEDESCRIPTION * , int ) ;
void ( * pfnSaveReadFields ) ( SAVERESTOREDATA * , const char * , void * , TYPEDESCRIPTION * , int ) ;
void ( * pfnSaveGlobalState ) ( SAVERESTOREDATA * ) ;
void ( * pfnRestoreGlobalState ) ( SAVERESTOREDATA * ) ;
void ( * pfnResetGlobalState ) ( void ) ;
qboolean ( * pfnClientConnect ) ( edict_t * pEntity , const char * pszName , const char * pszAddress , char szRejectReason [ 128 ] ) ;
2021-01-03 02:28:45 +01:00
2018-04-13 18:23:45 +02:00
void ( * pfnClientDisconnect ) ( edict_t * pEntity ) ;
void ( * pfnClientKill ) ( edict_t * pEntity ) ;
void ( * pfnClientPutInServer ) ( edict_t * pEntity ) ;
void ( * pfnClientCommand ) ( edict_t * pEntity ) ;
void ( * pfnClientUserInfoChanged ) ( edict_t * pEntity , char * infobuffer ) ;
void ( * pfnServerActivate ) ( edict_t * pEdictList , int edictCount , int clientMax ) ;
void ( * pfnServerDeactivate ) ( void ) ;
void ( * pfnPlayerPreThink ) ( edict_t * pEntity ) ;
void ( * pfnPlayerPostThink ) ( edict_t * pEntity ) ;
void ( * pfnStartFrame ) ( void ) ;
void ( * pfnParmsNewLevel ) ( void ) ;
void ( * pfnParmsChangeLevel ) ( void ) ;
// Returns string describing current .dll. E.g., TeamFotrress 2, Half-Life
2019-07-19 19:23:08 +02:00
const char * ( * pfnGetGameDescription ) ( void ) ;
2018-04-13 18:23:45 +02:00
// Notify dll about a player customization.
void ( * pfnPlayerCustomization ) ( edict_t * pEntity , customization_t * pCustom ) ;
// Spectator funcs
void ( * pfnSpectatorConnect ) ( edict_t * pEntity ) ;
void ( * pfnSpectatorDisconnect ) ( edict_t * pEntity ) ;
void ( * pfnSpectatorThink ) ( edict_t * pEntity ) ;
// Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint.
void ( * pfnSys_Error ) ( const char * error_string ) ;
2018-07-12 22:13:30 +02:00
void ( * pfnPM_Move ) ( struct playermove_s * ppmove , qboolean server ) ;
void ( * pfnPM_Init ) ( struct playermove_s * ppmove ) ;
2018-04-13 18:23:45 +02:00
char ( * pfnPM_FindTextureType ) ( char * name ) ;
2018-07-12 22:13:30 +02:00
void ( * pfnSetupVisibility ) ( struct edict_s * pViewEntity , struct edict_s * pClient , unsigned char * * pvs , unsigned char * * pas ) ;
void ( * pfnUpdateClientData ) ( const struct edict_s * ent , int sendweapons , struct clientdata_s * cd ) ;
int ( * pfnAddToFullPack ) ( struct entity_state_s * state , int e , edict_t * ent , edict_t * host , int hostflags , int player , unsigned char * pSet ) ;
void ( * pfnCreateBaseline ) ( int player , int eindex , struct entity_state_s * baseline , struct edict_s * entity , int playermodelindex , vec3_t player_mins , vec3_t player_maxs ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnRegisterEncoders ) ( void ) ;
2018-07-12 22:13:30 +02:00
int ( * pfnGetWeaponData ) ( struct edict_s * player , struct weapon_data_s * info ) ;
2018-04-13 18:23:45 +02:00
2018-07-12 22:13:30 +02:00
void ( * pfnCmdStart ) ( const edict_t * player , const struct usercmd_s * cmd , unsigned int random_seed ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnCmdEnd ) ( const edict_t * player ) ;
// Return 1 if the packet is valid. Set response_buffer_size if you want to send a response packet. Incoming, it holds the max
// size of the response_buffer, so you must zero it out if you choose not to respond.
2018-07-12 22:13:30 +02:00
int ( * pfnConnectionlessPacket ) ( const struct netadr_s * net_from , const char * args , char * response_buffer , int * response_buffer_size ) ;
2018-04-13 18:23:45 +02:00
// Enumerates player hulls. Returns 0 if the hull number doesn't exist, 1 otherwise
int ( * pfnGetHullBounds ) ( int hullnumber , float * mins , float * maxs ) ;
// Create baselines for certain "unplaced" items.
void ( * pfnCreateInstancedBaselines ) ( void ) ;
// One of the pfnForceUnmodified files failed the consistency check for the specified player
// Return 0 to allow the client to continue, 1 to force immediate disconnection ( with an optional disconnect message of up to 256 characters )
2018-07-12 22:13:30 +02:00
int ( * pfnInconsistentFile ) ( const struct edict_s * player , const char * filename , char * disconnect_message ) ;
2018-04-13 18:23:45 +02:00
// The game .dll should return 1 if lag compensation should be allowed ( could also just set
// the sv_unlag cvar.
// Most games right now should return 0, until client-side weapon prediction code is written
// and tested for them.
int ( * pfnAllowLagCompensation ) ( void ) ;
} DLL_FUNCTIONS ;
extern DLL_FUNCTIONS gEntityInterface ;
// Current version.
# define NEW_DLL_FUNCTIONS_VERSION 1
typedef struct
{
2021-01-03 02:28:45 +01:00
// Called right before the object's memory is freed.
2018-04-13 18:23:45 +02:00
// Calls its destructor.
void ( * pfnOnFreeEntPrivateData ) ( edict_t * pEnt ) ;
void ( * pfnGameShutdown ) ( void ) ;
int ( * pfnShouldCollide ) ( edict_t * pentTouched , edict_t * pentOther ) ;
2021-01-03 02:28:45 +01:00
void ( * pfnCvarValue ) ( const edict_t * pEnt , const char * value ) ;
2018-04-13 18:23:45 +02:00
void ( * pfnCvarValue2 ) ( const edict_t * pEnt , int requestID , const char * cvarName , const char * value ) ;
} NEW_DLL_FUNCTIONS ;
typedef int ( * NEW_DLL_FUNCTIONS_FN ) ( NEW_DLL_FUNCTIONS * pFunctionTable , int * interfaceVersion ) ;
// Pointers will be null if the game DLL doesn't support this API.
extern NEW_DLL_FUNCTIONS gNewDLLFunctions ;
typedef int ( * APIFUNCTION ) ( DLL_FUNCTIONS * pFunctionTable , int interfaceVersion ) ;
typedef int ( * APIFUNCTION2 ) ( DLL_FUNCTIONS * pFunctionTable , int * interfaceVersion ) ;
2018-04-14 03:26:12 +02:00
# endif //EIFACE_H