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