123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /*
- Copyright (C) 1997-2001 Id Software, Inc.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- /*
- Copyright (C) 1997-2001 Id Software, Inc.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- // game.h -- game dll information visible to server
- #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
- typedef struct edict_s edict_t;
- typedef struct gclient_s gclient_t;
- #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;
- qboolean 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
- {
- // 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);
- // 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);
- qboolean (*inPVS) (vec3_t p1, vec3_t p2);
- qboolean (*inPHS) (vec3_t p1, vec3_t p2);
- void (*SetAreaPortalState) (int portalnum, qboolean open);
- qboolean (*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
- // network messaging
- void (*multicast) (vec3_t origin, multicast_t to);
- void (*unicast) (edict_t *ent, qboolean reliable);
- void (*WriteChar) (int c);
- void (*WriteByte) (int c);
- void (*WriteShort) (int c);
- void (*WriteLong) (int c);
- void (*WriteFloat) (float f);
- void (*WriteString) (char *s);
- void (*WritePosition) (vec3_t pos); // some fractional bits
- void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse
- void (*WriteAngle) (float f);
- // managed memory allocation
- void *(*TagMalloc) (int size, int tag);
- void (*TagFree) (void *block);
- void (*FreeTags) (int tag);
- // 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
- {
- 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);
- // Read/Write Game is for storing persistant cross level information
- // about the world state and the clients.
- // WriteGame is called every time a level is exited.
- // ReadGame is called on a loadgame.
- void (*WriteGame) (char *filename, qboolean autosave);
- void (*ReadGame) (char *filename);
- // ReadLevel is called after the default map information has been
- // loaded with SpawnEntities
- void (*WriteLevel) (char *filename);
- void (*ReadLevel) (char *filename);
- qboolean (*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
- struct edict_s *edicts;
- int edict_size;
- int num_edicts; // current number, <= max_edicts
- int max_edicts;
- } game_export_t;
- game_export_t *GetGameApi (game_import_t *import);
|