201 lines
6.3 KiB
C
201 lines
6.3 KiB
C
|
|
// 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>" 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); |