1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 //
23 
24 // g_public.h -- game module information visible to server
25 
26 #define	GAME_API_VERSION	8
27 
28 // entity->svFlags
29 // the server does not know how to interpret most of the values
30 // in entityStates (level eType), so the game must explicitly flag
31 // special server behaviors
32 #define	SVF_NOCLIENT			0x00000001	// don't send entity to clients, even if it has effects
33 
34 // TTimo
35 // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=551
36 #define SVF_CLIENTMASK 0x00000002
37 
38 #define SVF_BOT					0x00000008	// set if the entity is a bot
39 #define	SVF_BROADCAST			0x00000020	// send to all connected clients
40 #define	SVF_PORTAL				0x00000040	// merge a second pvs at origin2 into snapshots
41 #define	SVF_USE_CURRENT_ORIGIN	0x00000080	// entity->r.currentOrigin instead of entity->s.origin
42 											// for link position (missiles and movers)
43 #define SVF_SINGLECLIENT		0x00000100	// only send to a single client (entityShared_t->singleClient)
44 #define SVF_NOSERVERINFO		0x00000200	// don't send CS_SERVERINFO updates to this client
45 											// so that it can be updated for ping tools without
46 											// lagging clients
47 #define SVF_CAPSULE				0x00000400	// use capsule for collision detection instead of bbox
48 #define SVF_NOTSINGLECLIENT		0x00000800	// send entity to everyone but one client
49 											// (entityShared_t->singleClient)
50 
51 
52 
53 //===============================================================
54 
55 
56 typedef struct {
57 	entityState_t	s;				// communicated by server to clients
58 
59 	qboolean	linked;				// qfalse if not in any good cluster
60 	int			linkcount;
61 
62 	int			svFlags;			// SVF_NOCLIENT, SVF_BROADCAST, etc
63 
64 	// only send to this client when SVF_SINGLECLIENT is set
65 	// if SVF_CLIENTMASK is set, use bitmask for clients to send to (maxclients must be <= 32, up to the mod to enforce this)
66 	int			singleClient;
67 
68 	qboolean	bmodel;				// if false, assume an explicit mins / maxs bounding box
69 									// only set by trap_SetBrushModel
70 	vec3_t		mins, maxs;
71 	int			contents;			// CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc
72 									// a non-solid entity should set to 0
73 
74 	vec3_t		absmin, absmax;		// derived from mins/maxs and origin + rotation
75 
76 	// currentOrigin will be used for all collision detection and world linking.
77 	// it will not necessarily be the same as the trajectory evaluation for the current
78 	// time, because each entity must be moved one at a time after time is advanced
79 	// to avoid simultanious collision issues
80 	vec3_t		currentOrigin;
81 	vec3_t		currentAngles;
82 
83 	// when a trace call is made and passEntityNum != ENTITYNUM_NONE,
84 	// an ent will be excluded from testing if:
85 	// ent->s.number == passEntityNum	(don't interact with self)
86 	// ent->s.ownerNum = passEntityNum	(don't interact with your own missiles)
87 	// entity[ent->s.ownerNum].ownerNum = passEntityNum	(don't interact with other missiles from owner)
88 	int			ownerNum;
89 } entityShared_t;
90 
91 
92 
93 // the server looks at a sharedEntity, which is the start of the game's gentity_t structure
94 typedef struct {
95 	entityState_t	s;				// communicated by server to clients
96 	entityShared_t	r;				// shared by both the server system and game
97 } sharedEntity_t;
98 
99 
100 
101 //===============================================================
102 
103 //
104 // system traps provided by the main engine
105 //
106 typedef enum {
107 	//============== general Quake services ==================
108 
109 	G_PRINT,		// ( const char *string );
110 	// print message on the local console
111 
112 	G_ERROR,		// ( const char *string );
113 	// abort the game
114 
115 	G_MILLISECONDS,	// ( void );
116 	// get current time for profiling reasons
117 	// this should NOT be used for any game related tasks,
118 	// because it is not journaled
119 
120 	// console variable interaction
121 	G_CVAR_REGISTER,	// ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags );
122 	G_CVAR_UPDATE,	// ( vmCvar_t *vmCvar );
123 	G_CVAR_SET,		// ( const char *var_name, const char *value );
124 	G_CVAR_VARIABLE_INTEGER_VALUE,	// ( const char *var_name );
125 
126 	G_CVAR_VARIABLE_STRING_BUFFER,	// ( const char *var_name, char *buffer, int bufsize );
127 
128 	G_ARGC,			// ( void );
129 	// ClientCommand and ServerCommand parameter access
130 
131 	G_ARGV,			// ( int n, char *buffer, int bufferLength );
132 
133 	G_FS_FOPEN_FILE,	// ( const char *qpath, fileHandle_t *file, fsMode_t mode );
134 	G_FS_READ,		// ( void *buffer, int len, fileHandle_t f );
135 	G_FS_WRITE,		// ( const void *buffer, int len, fileHandle_t f );
136 	G_FS_FCLOSE_FILE,		// ( fileHandle_t f );
137 
138 	G_SEND_CONSOLE_COMMAND,	// ( const char *text );
139 	// add commands to the console as if they were typed in
140 	// for map changing, etc
141 
142 
143 	//=========== server specific functionality =============
144 
145 	G_LOCATE_GAME_DATA,		// ( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t,
146 	//							playerState_t *clients, int sizeofGameClient );
147 	// the game needs to let the server system know where and how big the gentities
148 	// are, so it can look at them directly without going through an interface
149 
150 	G_DROP_CLIENT,		// ( int clientNum, const char *reason );
151 	// kick a client off the server with a message
152 
153 	G_SEND_SERVER_COMMAND,	// ( int clientNum, const char *fmt, ... );
154 	// reliably sends a command string to be interpreted by the given
155 	// client.  If clientNum is -1, it will be sent to all clients
156 
157 	G_SET_CONFIGSTRING,	// ( int num, const char *string );
158 	// config strings hold all the index strings, and various other information
159 	// that is reliably communicated to all clients
160 	// All of the current configstrings are sent to clients when
161 	// they connect, and changes are sent to all connected clients.
162 	// All confgstrings are cleared at each level start.
163 
164 	G_GET_CONFIGSTRING,	// ( int num, char *buffer, int bufferSize );
165 
166 	G_GET_USERINFO,		// ( int num, char *buffer, int bufferSize );
167 	// userinfo strings are maintained by the server system, so they
168 	// are persistant across level loads, while all other game visible
169 	// data is completely reset
170 
171 	G_SET_USERINFO,		// ( int num, const char *buffer );
172 
173 	G_GET_SERVERINFO,	// ( char *buffer, int bufferSize );
174 	// the serverinfo info string has all the cvars visible to server browsers
175 
176 	G_SET_BRUSH_MODEL,	// ( gentity_t *ent, const char *name );
177 	// sets mins and maxs based on the brushmodel name
178 
179 	G_TRACE,	// ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
180 	// collision detection against all linked entities
181 
182 	G_POINT_CONTENTS,	// ( const vec3_t point, int passEntityNum );
183 	// point contents against all linked entities
184 
185 	G_IN_PVS,			// ( const vec3_t p1, const vec3_t p2 );
186 
187 	G_IN_PVS_IGNORE_PORTALS,	// ( const vec3_t p1, const vec3_t p2 );
188 
189 	G_ADJUST_AREA_PORTAL_STATE,	// ( gentity_t *ent, qboolean open );
190 
191 	G_AREAS_CONNECTED,	// ( int area1, int area2 );
192 
193 	G_LINKENTITY,		// ( gentity_t *ent );
194 	// an entity will never be sent to a client or used for collision
195 	// if it is not passed to linkentity.  If the size, position, or
196 	// solidity changes, it must be relinked.
197 
198 	G_UNLINKENTITY,		// ( gentity_t *ent );
199 	// call before removing an interactive entity
200 
201 	G_ENTITIES_IN_BOX,	// ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount );
202 	// EntitiesInBox will return brush models based on their bounding box,
203 	// so exact determination must still be done with EntityContact
204 
205 	G_ENTITY_CONTACT,	// ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
206 	// perform an exact check against inline brush models of non-square shape
207 
208 	// access for bots to get and free a server client (FIXME?)
209 	G_BOT_ALLOCATE_CLIENT,	// ( void );
210 
211 	G_BOT_FREE_CLIENT,	// ( int clientNum );
212 
213 	G_GET_USERCMD,	// ( int clientNum, usercmd_t *cmd )
214 
215 	G_GET_ENTITY_TOKEN,	// qboolean ( char *buffer, int bufferSize )
216 	// Retrieves the next string token from the entity spawn text, returning
217 	// false when all tokens have been parsed.
218 	// This should only be done at GAME_INIT time.
219 
220 	G_FS_GETFILELIST,
221 	G_DEBUG_POLYGON_CREATE,
222 	G_DEBUG_POLYGON_DELETE,
223 	G_REAL_TIME,
224 	G_SNAPVECTOR,
225 
226 	G_TRACECAPSULE,	// ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
227 	G_ENTITY_CONTACTCAPSULE,	// ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
228 
229 	// 1.32
230 	G_FS_SEEK,
231 
232 	BOTLIB_SETUP = 200,				// ( void );
233 	BOTLIB_SHUTDOWN,				// ( void );
234 	BOTLIB_LIBVAR_SET,
235 	BOTLIB_LIBVAR_GET,
236 	BOTLIB_PC_ADD_GLOBAL_DEFINE,
237 	BOTLIB_START_FRAME,
238 	BOTLIB_LOAD_MAP,
239 	BOTLIB_UPDATENTITY,
240 	BOTLIB_TEST,
241 
242 	BOTLIB_GET_SNAPSHOT_ENTITY,		// ( int client, int ent );
243 	BOTLIB_GET_CONSOLE_MESSAGE,		// ( int client, char *message, int size );
244 	BOTLIB_USER_COMMAND,			// ( int client, usercmd_t *ucmd );
245 
246 	BOTLIB_AAS_ENABLE_ROUTING_AREA = 300,
247 	BOTLIB_AAS_BBOX_AREAS,
248 	BOTLIB_AAS_AREA_INFO,
249 	BOTLIB_AAS_ENTITY_INFO,
250 
251 	BOTLIB_AAS_INITIALIZED,
252 	BOTLIB_AAS_PRESENCE_TYPE_BOUNDING_BOX,
253 	BOTLIB_AAS_TIME,
254 
255 	BOTLIB_AAS_POINT_AREA_NUM,
256 	BOTLIB_AAS_TRACE_AREAS,
257 
258 	BOTLIB_AAS_POINT_CONTENTS,
259 	BOTLIB_AAS_NEXT_BSP_ENTITY,
260 	BOTLIB_AAS_VALUE_FOR_BSP_EPAIR_KEY,
261 	BOTLIB_AAS_VECTOR_FOR_BSP_EPAIR_KEY,
262 	BOTLIB_AAS_FLOAT_FOR_BSP_EPAIR_KEY,
263 	BOTLIB_AAS_INT_FOR_BSP_EPAIR_KEY,
264 
265 	BOTLIB_AAS_AREA_REACHABILITY,
266 
267 	BOTLIB_AAS_AREA_TRAVEL_TIME_TO_GOAL_AREA,
268 
269 	BOTLIB_AAS_SWIMMING,
270 	BOTLIB_AAS_PREDICT_CLIENT_MOVEMENT,
271 
272 	BOTLIB_EA_SAY = 400,
273 	BOTLIB_EA_SAY_TEAM,
274 	BOTLIB_EA_COMMAND,
275 
276 	BOTLIB_EA_ACTION,
277 	BOTLIB_EA_GESTURE,
278 	BOTLIB_EA_TALK,
279 	BOTLIB_EA_ATTACK,
280 	BOTLIB_EA_USE,
281 	BOTLIB_EA_RESPAWN,
282 	BOTLIB_EA_CROUCH,
283 	BOTLIB_EA_MOVE_UP,
284 	BOTLIB_EA_MOVE_DOWN,
285 	BOTLIB_EA_MOVE_FORWARD,
286 	BOTLIB_EA_MOVE_BACK,
287 	BOTLIB_EA_MOVE_LEFT,
288 	BOTLIB_EA_MOVE_RIGHT,
289 
290 	BOTLIB_EA_SELECT_WEAPON,
291 	BOTLIB_EA_JUMP,
292 	BOTLIB_EA_DELAYED_JUMP,
293 	BOTLIB_EA_MOVE,
294 	BOTLIB_EA_VIEW,
295 
296 	BOTLIB_EA_END_REGULAR,
297 	BOTLIB_EA_GET_INPUT,
298 	BOTLIB_EA_RESET_INPUT,
299 
300 
301 	BOTLIB_AI_LOAD_CHARACTER = 500,
302 	BOTLIB_AI_FREE_CHARACTER,
303 	BOTLIB_AI_CHARACTERISTIC_FLOAT,
304 	BOTLIB_AI_CHARACTERISTIC_BFLOAT,
305 	BOTLIB_AI_CHARACTERISTIC_INTEGER,
306 	BOTLIB_AI_CHARACTERISTIC_BINTEGER,
307 	BOTLIB_AI_CHARACTERISTIC_STRING,
308 
309 	BOTLIB_AI_ALLOC_CHAT_STATE,
310 	BOTLIB_AI_FREE_CHAT_STATE,
311 	BOTLIB_AI_QUEUE_CONSOLE_MESSAGE,
312 	BOTLIB_AI_REMOVE_CONSOLE_MESSAGE,
313 	BOTLIB_AI_NEXT_CONSOLE_MESSAGE,
314 	BOTLIB_AI_NUM_CONSOLE_MESSAGE,
315 	BOTLIB_AI_INITIAL_CHAT,
316 	BOTLIB_AI_REPLY_CHAT,
317 	BOTLIB_AI_CHAT_LENGTH,
318 	BOTLIB_AI_ENTER_CHAT,
319 	BOTLIB_AI_STRING_CONTAINS,
320 	BOTLIB_AI_FIND_MATCH,
321 	BOTLIB_AI_MATCH_VARIABLE,
322 	BOTLIB_AI_UNIFY_WHITE_SPACES,
323 	BOTLIB_AI_REPLACE_SYNONYMS,
324 	BOTLIB_AI_LOAD_CHAT_FILE,
325 	BOTLIB_AI_SET_CHAT_GENDER,
326 	BOTLIB_AI_SET_CHAT_NAME,
327 
328 	BOTLIB_AI_RESET_GOAL_STATE,
329 	BOTLIB_AI_RESET_AVOID_GOALS,
330 	BOTLIB_AI_PUSH_GOAL,
331 	BOTLIB_AI_POP_GOAL,
332 	BOTLIB_AI_EMPTY_GOAL_STACK,
333 	BOTLIB_AI_DUMP_AVOID_GOALS,
334 	BOTLIB_AI_DUMP_GOAL_STACK,
335 	BOTLIB_AI_GOAL_NAME,
336 	BOTLIB_AI_GET_TOP_GOAL,
337 	BOTLIB_AI_GET_SECOND_GOAL,
338 	BOTLIB_AI_CHOOSE_LTG_ITEM,
339 	BOTLIB_AI_CHOOSE_NBG_ITEM,
340 	BOTLIB_AI_TOUCHING_GOAL,
341 	BOTLIB_AI_ITEM_GOAL_IN_VIS_BUT_NOT_VISIBLE,
342 	BOTLIB_AI_GET_LEVEL_ITEM_GOAL,
343 	BOTLIB_AI_AVOID_GOAL_TIME,
344 	BOTLIB_AI_INIT_LEVEL_ITEMS,
345 	BOTLIB_AI_UPDATE_ENTITY_ITEMS,
346 	BOTLIB_AI_LOAD_ITEM_WEIGHTS,
347 	BOTLIB_AI_FREE_ITEM_WEIGHTS,
348 	BOTLIB_AI_SAVE_GOAL_FUZZY_LOGIC,
349 	BOTLIB_AI_ALLOC_GOAL_STATE,
350 	BOTLIB_AI_FREE_GOAL_STATE,
351 
352 	BOTLIB_AI_RESET_MOVE_STATE,
353 	BOTLIB_AI_MOVE_TO_GOAL,
354 	BOTLIB_AI_MOVE_IN_DIRECTION,
355 	BOTLIB_AI_RESET_AVOID_REACH,
356 	BOTLIB_AI_RESET_LAST_AVOID_REACH,
357 	BOTLIB_AI_REACHABILITY_AREA,
358 	BOTLIB_AI_MOVEMENT_VIEW_TARGET,
359 	BOTLIB_AI_ALLOC_MOVE_STATE,
360 	BOTLIB_AI_FREE_MOVE_STATE,
361 	BOTLIB_AI_INIT_MOVE_STATE,
362 
363 	BOTLIB_AI_CHOOSE_BEST_FIGHT_WEAPON,
364 	BOTLIB_AI_GET_WEAPON_INFO,
365 	BOTLIB_AI_LOAD_WEAPON_WEIGHTS,
366 	BOTLIB_AI_ALLOC_WEAPON_STATE,
367 	BOTLIB_AI_FREE_WEAPON_STATE,
368 	BOTLIB_AI_RESET_WEAPON_STATE,
369 
370 	BOTLIB_AI_GENETIC_PARENTS_AND_CHILD_SELECTION,
371 	BOTLIB_AI_INTERBREED_GOAL_FUZZY_LOGIC,
372 	BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC,
373 	BOTLIB_AI_GET_NEXT_CAMP_SPOT_GOAL,
374 	BOTLIB_AI_GET_MAP_LOCATION_GOAL,
375 	BOTLIB_AI_NUM_INITIAL_CHATS,
376 	BOTLIB_AI_GET_CHAT_MESSAGE,
377 	BOTLIB_AI_REMOVE_FROM_AVOID_GOALS,
378 	BOTLIB_AI_PREDICT_VISIBLE_POSITION,
379 
380 	BOTLIB_AI_SET_AVOID_GOAL_TIME,
381 	BOTLIB_AI_ADD_AVOID_SPOT,
382 	BOTLIB_AAS_ALTERNATIVE_ROUTE_GOAL,
383 	BOTLIB_AAS_PREDICT_ROUTE,
384 	BOTLIB_AAS_POINT_REACHABILITY_AREA_INDEX,
385 
386 	BOTLIB_PC_LOAD_SOURCE,
387 	BOTLIB_PC_FREE_SOURCE,
388 	BOTLIB_PC_READ_TOKEN,
389 	BOTLIB_PC_SOURCE_FILE_AND_LINE
390 
391 } gameImport_t;
392 
393 
394 //
395 // functions exported by the game subsystem
396 //
397 typedef enum {
398 	GAME_INIT,	// ( int levelTime, int randomSeed, int restart );
399 	// init and shutdown will be called every single level
400 	// The game should call G_GET_ENTITY_TOKEN to parse through all the
401 	// entity configuration text and spawn gentities.
402 
403 	GAME_SHUTDOWN,	// (void);
404 
405 	GAME_CLIENT_CONNECT,	// ( int clientNum, qboolean firstTime, qboolean isBot );
406 	// return NULL if the client is allowed to connect, otherwise return
407 	// a text string with the reason for denial
408 
409 	GAME_CLIENT_BEGIN,				// ( int clientNum );
410 
411 	GAME_CLIENT_USERINFO_CHANGED,	// ( int clientNum );
412 
413 	GAME_CLIENT_DISCONNECT,			// ( int clientNum );
414 
415 	GAME_CLIENT_COMMAND,			// ( int clientNum );
416 
417 	GAME_CLIENT_THINK,				// ( int clientNum );
418 
419 	GAME_RUN_FRAME,					// ( int levelTime );
420 
421 	GAME_CONSOLE_COMMAND,			// ( void );
422 	// ConsoleCommand will be called when a command has been issued
423 	// that is not recognized as a builtin function.
424 	// The game can issue trap_argc() / trap_argv() commands to get the command
425 	// and parameters.  Return qfalse if the game doesn't recognize it as a command.
426 
427 	BOTAI_START_FRAME				// ( int time );
428 } gameExport_t;
429 
430