File: game\game.h

    1 /*
    2 Copyright (C) 1997-2001 Id Software, Inc.
    3 
    4 This program is free software; you can redistribute it and/or
    5 modify it under the terms of the GNU General Public License
    6 as published by the Free Software Foundation; either version 2
    7 of the License, or (at your option) any later version.
    8 
    9 This program is distributed in the hope that it will be useful,
   10 but WITHOUT ANY WARRANTY; without even the implied warranty of
   11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
   12 
   13 See the GNU General Public License for more details.
   14 
   15 You should have received a copy of the GNU General Public License
   16 along with this program; if not, write to the Free Software
   17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   18 
   19 */
   20 
   21 // game.h -- game dll information visible to server
   22 
   23 #define GAME_API_VERSION        3
   24 
   25 // edict->svflags
   26 
   27 #define SVF_NOCLIENT                    0x00000001      // don't send entity to clients, even if it has effects
   28 #define SVF_DEADMONSTER                 0x00000002      // treat as CONTENTS_DEADMONSTER for collision
   29 #define SVF_MONSTER                             0x00000004      // treat as CONTENTS_MONSTER for collision
   30 
   31 // edict->solid values
   32 
   33 typedef enum
   34 {
   35 SOLID_NOT,                      // no interaction with other objects
   36 SOLID_TRIGGER,          // only touch when inside, after moving
   37 SOLID_BBOX,                     // touch on edge
   38 SOLID_BSP                       // bsp clip, touch on edge
   39 } solid_t;
   40 
   41 //===============================================================
   42 
   43 // link_t is only used for entity area links now
   44 typedef struct link_s
   45 {
   46         struct link_s   *prev, *next;
   47 } link_t;
   48 
   49 #define MAX_ENT_CLUSTERS        16
   50 
   51 
   52 typedef struct edict_s edict_t;
   53 typedef struct gclient_s gclient_t;
   54 
   55 
   56 #ifndef GAME_INCLUDE
57 58 struct gclient_s 59 { 60 player_state_t ps; // communicated by server to clients 61 int ping; 62 // the game dll can add anything it wants after 63 // this point in the structure 64 }; 65 66 67 struct edict_s 68 { 69 entity_state_t s; 70 struct gclient_s *client; 71 qboolean inuse; 72 int linkcount; 73 74 // FIXME: move these fields to a server private sv_entity_t 75 link_t area; // linked to a division node or leaf 76 77 int num_clusters; // if -1, use headnode instead 78 int clusternums[MAX_ENT_CLUSTERS]; 79 int headnode; // unused if num_clusters != -1 80 int areanum, areanum2; 81 82 //================================ 83 84 int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc 85 vec3_t mins, maxs; 86 vec3_t absmin, absmax, size; 87 solid_t solid; 88 int clipmask; 89 edict_t *owner; 90 91 // the game dll can add anything it wants after 92 // this point in the structure 93 }; 94
95 #endif // GAME_INCLUDE 96 97 //=============================================================== 98 99 // 100 // functions provided by the main engine 101 // 102 typedef struct 103 { 104 // special messages 105 void (*bprintf) (int printlevel, char *fmt, ...); 106 void (*dprintf) (char *fmt, ...); 107 void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...); 108 void (*centerprintf) (edict_t *ent, char *fmt, ...); 109 void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs); 110 void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs); 111 112 // config strings hold all the index strings, the lightstyles, 113 // and misc data like the sky definition and cdtrack. 114 // All of the current configstrings are sent to clients when 115 // they connect, and changes are sent to all connected clients. 116 void (*configstring) (int num, char *string); 117 118 void (*error) (char *fmt, ...); 119 120 // the *index functions create configstrings and some internal server state 121 int (*modelindex) (char *name); 122 int (*soundindex) (char *name); 123 int (*imageindex) (char *name); 124 125 void (*setmodel) (edict_t *ent, char *name); 126 127 // collision detection 128 trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask); 129 int (*pointcontents) (vec3_t point); 130 qboolean (*inPVS) (vec3_t p1, vec3_t p2); 131 qboolean (*inPHS) (vec3_t p1, vec3_t p2); 132 void (*SetAreaPortalState) (int portalnum, qboolean open); 133 qboolean (*AreasConnected) (int area1, int area2); 134 135 // an entity will never be sent to a client or used for collision 136 // if it is not passed to linkentity. If the size, position, or 137 // solidity changes, it must be relinked. 138 void (*linkentity) (edict_t *ent); 139 void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict 140 int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype); 141 void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction 142 143 // network messaging 144 void (*multicast) (vec3_t origin, multicast_t to); 145 void (*unicast) (edict_t *ent, qboolean reliable); 146 void (*WriteChar) (int c); 147 void (*WriteByte) (int c); 148 void (*WriteShort) (int c); 149 void (*WriteLong) (int c); 150 void (*WriteFloat) (float f); 151 void (*WriteString) (char *s); 152 void (*WritePosition) (vec3_t pos); // some fractional bits 153 void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse 154 void (*WriteAngle) (float f); 155 156 // managed memory allocation 157 void *(*TagMalloc) (int size, int tag); 158 void (*TagFree) (void *block); 159 void (*FreeTags) (int tag); 160 161 // console variable interaction 162 cvar_t *(*cvar) (char *var_name, char *value, int flags); 163 cvar_t *(*cvar_set) (char *var_name, char *value); 164 cvar_t *(*cvar_forceset) (char *var_name, char *value); 165 166 // ClientCommand and ServerCommand parameter access 167 int (*argc) (void); 168 char *(*argv) (int n); 169 char *(*args) (void); // concatenation of all argv >= 1 170 171 // add commands to the server console as if they were typed in 172 // for map changing, etc 173 void (*AddCommandString) (char *text); 174 175 void (*DebugGraph) (float value, int color); 176 } game_import_t; 177 178 // 179 // functions exported by the game subsystem 180 // 181 typedef struct 182 { 183 int apiversion; 184 185 // the init function will only be called when a game starts, 186 // not each time a level is loaded. Persistant data for clients 187 // and the server can be allocated in init 188 void (*Init) (void); 189 void (*Shutdown) (void); 190 191 // each new level entered will cause a call to SpawnEntities 192 void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint); 193 194 // Read/Write Game is for storing persistant cross level information 195 // about the world state and the clients. 196 // WriteGame is called every time a level is exited. 197 // ReadGame is called on a loadgame. 198 void (*WriteGame) (char *filename, qboolean autosave); 199 void (*ReadGame) (char *filename); 200 201 // ReadLevel is called after the default map information has been 202 // loaded with SpawnEntities 203 void (*WriteLevel) (char *filename); 204 void (*ReadLevel) (char *filename); 205 206 qboolean (*ClientConnect) (edict_t *ent, char *userinfo); 207 void (*ClientBegin) (edict_t *ent); 208 void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo); 209 void (*ClientDisconnect) (edict_t *ent); 210 void (*ClientCommand) (edict_t *ent); 211 void (*ClientThink) (edict_t *ent, usercmd_t *cmd); 212 213 void (*RunFrame) (void); 214 215 // ServerCommand will be called when an "sv <command>" command is issued on the 216 // server console. 217 // The game can issue gi.argc() / gi.argv() commands to get the rest 218 // of the parameters 219 void (*ServerCommand) (void); 220 221 // 222 // global variables shared between game and server 223 // 224 225 // The edict array is allocated in the game dll so it 226 // can vary in size from one game to another. 227 // 228 // The size will be fixed when ge->Init() is called 229 struct edict_s *edicts; 230 int edict_size; 231 int num_edicts; // current number, <= max_edicts 232 int max_edicts; 233 } game_export_t; 234 235 game_export_t *GetGameApi (game_import_t *import); 236