// game.h -- game dll information visible to server #include "savefile.h" #define GAME_API_VERSION 3 // edict->svflags #define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects #define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision #define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision // edict->solid values typedef enum { SOLID_NOT, // no interaction with other objects SOLID_TRIGGER, // only touch when inside, after moving SOLID_BBOX, // touch on edge SOLID_BSP // bsp clip, touch on edge } solid_t; //=============================================================== // link_t is only used for entity area links now typedef struct link_s { struct link_s *prev, *next; } link_t; #define MAX_ENT_CLUSTERS 16 #ifndef GAME_INCLUDE struct gclient_s { player_state_t ps; // communicated by server to clients int ping; // the game dll can add anything it wants after // this point in the structure }; struct edict_s { entity_state_t s; struct gclient_s *client; bool inuse; int linkcount; // FIXME: move these fields to a server private sv_entity_t link_t area; // linked to a division node or leaf int num_clusters; // if -1, use headnode instead int clusternums[MAX_ENT_CLUSTERS]; int headnode; // unused if num_clusters != -1 int areanum, areanum2; //================================ int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc vec3_t mins, maxs; vec3_t absmin, absmax, size; solid_t solid; int clipmask; edict_t *owner; // the game dll can add anything it wants after // this point in the structure }; #endif // GAME_INCLUDE //=============================================================== // // functions provided by the main engine // typedef struct game_import_s { //shared xash systems filesystem_api_t Fs; vfilesystem_api_t VFs; memsystem_api_t Mem; scriptsystem_api_t Script; // basic script-machine compilers_api_t Compile; // compilers callback infostring_api_t Info; message_write_t Msg; // network messaging // special messages void (*bprintf) (int printlevel, char *fmt, ...); void (*dprintf) (char *fmt, ...); void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...); void (*centerprintf) (edict_t *ent, char *fmt, ...); void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs); void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs); // get game info gameinfo_t (*GameInfo)( void ); // config strings hold all the index strings, the lightstyles, // and misc data like the sky definition and cdtrack. // All of the current configstrings are sent to clients when // they connect, and changes are sent to all connected clients. void (*configstring) (int num, char *string); void (*error) (char *fmt, ...); // the *index functions create configstrings and some internal server state int (*modelindex) (char *name); int (*soundindex) (char *name); int (*imageindex) (char *name); void (*setmodel) (edict_t *ent, char *name); // collision detection trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask); int (*pointcontents) (vec3_t point); bool (*inPVS) (vec3_t p1, vec3_t p2); bool (*inPHS) (vec3_t p1, vec3_t p2); void (*SetAreaPortalState) (int portalnum, bool open); bool (*AreasConnected) (int area1, int area2); // an entity will never be sent to a client or used for collision // if it is not passed to linkentity. If the size, position, or // solidity changes, it must be relinked. void (*linkentity) (edict_t *ent); void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype); void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction // common studio utils byte *(*getmodelhdr) (edict_t *ent);//returned a pointer on a studiohdr_t for current entity // console variable interaction cvar_t *(*cvar) (char *var_name, char *value, int flags); cvar_t *(*cvar_set) (char *var_name, char *value); cvar_t *(*cvar_forceset) (char *var_name, char *value); // ClientCommand and ServerCommand parameter access int (*argc) (void); char *(*argv) (int n); char *(*args) (void); // concatenation of all argv >= 1 // add commands to the server console as if they were typed in // for map changing, etc void (*AddCommandString) (char *text); void (*DebugGraph) (float value, int color); } game_import_t; // // functions exported by the game subsystem // typedef struct game_export_s { int apiversion; // the init function will only be called when a game starts, // not each time a level is loaded. Persistant data for clients // and the server can be allocated in init void (*Init) (void); void (*Shutdown) (void); // each new level entered will cause a call to SpawnEntities void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint); void (*WriteLump) (dsavehdr_t *hdr, file_t *f, int lumpnum, bool autosave); void (*ReadLump) (byte *base, lump_t *l, int lumpnum); bool (*ClientConnect) (edict_t *ent, char *userinfo); void (*ClientBegin) (edict_t *ent); void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo); void (*ClientDisconnect) (edict_t *ent); void (*ClientCommand) (edict_t *ent); void (*ClientThink) (edict_t *ent, usercmd_t *cmd); void (*RunFrame) (void); // ServerCommand will be called when an "sv " command is issued on the // server console. // The game can issue gi.argc() / gi.argv() commands to get the rest // of the parameters void (*ServerCommand) (void); // // global variables shared between game and server // // The edict array is allocated in the game dll so it // can vary in size from one game to another. // // The size will be fixed when ge->Init() is called edict_t *edicts; int edict_size; int num_edicts; // current number, <= max_edicts int max_edicts; } game_export_t; //dll handle typedef game_export_t (*server_api_t)(game_import_t);