1 // protos for ALL external functions in cube...
2
3 #ifndef STANDALONE
4
5 extern bool hasTE, hasMT, hasMDA, hasDRE, hasstencil, hasST2, hasSTW, hasSTS, hasAF;
6
7 // GL_ARB_multitexture
8 extern PFNGLACTIVETEXTUREARBPROC glActiveTexture_;
9 extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTexture_;
10 extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2f_;
11 extern PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3f_;
12
13 // GL_EXT_multi_draw_arrays
14 extern PFNGLMULTIDRAWARRAYSEXTPROC glMultiDrawArrays_;
15 extern PFNGLMULTIDRAWELEMENTSEXTPROC glMultiDrawElements_;
16
17 // GL_EXT_draw_range_elements
18 extern PFNGLDRAWRANGEELEMENTSEXTPROC glDrawRangeElements_;
19
20 // GL_EXT_stencil_two_side
21 extern PFNGLACTIVESTENCILFACEEXTPROC glActiveStencilFace_;
22
23 // GL_ATI_separate_stencil
24 extern PFNGLSTENCILOPSEPARATEATIPROC glStencilOpSeparate_;
25 extern PFNGLSTENCILFUNCSEPARATEATIPROC glStencilFuncSeparate_;
26
27 struct color
28 {
29 float r, g, b, alpha;
colorcolor30 color(){}
colorcolor31 color(float r, float g, float b) : r(r), g(g), b(b), alpha(1.0f) {}
colorcolor32 color(float r, float g, float b, float a) : r(r), g(g), b(b), alpha(a) {}
33 };
34
35 struct authkey // for AUTH
36 {
37 char *name, *key, *desc;
38 int lastauth;
39
authkeyauthkey40 authkey(const char *name, const char *key, const char *desc)
41 : name(newstring(name)), key(newstring(key)), desc(newstring(desc)),
42 lastauth(0)
43 {
44 }
45
~authkeyauthkey46 ~authkey()
47 {
48 DELETEA(name);
49 DELETEA(key);
50 DELETEA(desc);
51 }
52 };
53
54 // console
55 extern void keypress(int code, bool isdown, int cooked, SDLMod mod = KMOD_NONE);
56 extern int rendercommand(int x, int y, int w);
57 extern void renderconsole();
58 extern char *getcurcommand();
59 extern char *addreleaseaction(const char *s);
60 extern void writebinds(stream *f);
61 extern void pasteconsole(char *dst);
62 extern void clientlogf(const char *s, ...);
63
64 struct keym
65 {
66 int code;
67
68 enum
69 {
70 ACTION_DEFAULT = 0,
71 ACTION_SPECTATOR,
72 ACTION_EDITING,
73 NUMACTIONS
74 };
75
76 char *name, *actions[NUMACTIONS];
77 bool pressed;
78
keymkeym79 keym() : code(-1), name(NULL), pressed(false) { loopi(NUMACTIONS) actions[i] = newstring(""); }
~keymkeym80 ~keym() { DELETEA(name); loopi(NUMACTIONS) DELETEA(actions[i]); }
81 };
82
83 extern keym *keypressed;
84
85 extern bool bindkey(keym *km, const char *action, int state = keym::ACTION_DEFAULT);
86 extern keym *findbinda(const char *action, int type = keym::ACTION_DEFAULT);
87 extern bool bindc(int code, const char *action, int type = keym::ACTION_DEFAULT);
88
89 // menus
90 extern void rendermenu();
91 extern bool menuvisible();
92 extern void menureset(void *menu);
93 extern void menumanual(void *menu, char *text, char *action = NULL, color *bgcolor = NULL, const char *desc = NULL);
94 extern void menuimagemanual(void *menu, const char *filename1, const char *filename2, char *text, char *action = NULL, color *bgcolor = NULL, const char *desc = NULL);
95 extern void menutitle(void *menu, const char *title = NULL);
96 extern bool needscoresreorder;
97 extern void menuheader(void *menu, char *header = NULL, char *footer = NULL);
98 extern bool menukey(int code, bool isdown, int unicode, SDLMod mod = KMOD_NONE);
99 extern void *addmenu(const char *name, const char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(void *, bool) = NULL, bool (__cdecl *keyfunc)(void *, int, bool, int) = NULL, bool hotkeys = false, bool forwardkeys = false);
100 extern void rendermenumdl();
101 extern void menuset(void *m, bool save = true);
102 extern void menuselect(void *menu, int sel);
103 extern void showmenu(const char *name, bool top = true);
104 extern void closemenu(const char *name);
105 extern void addchange(const char *desc, int type);
106 extern void clearchanges(int type);
107 extern void refreshapplymenu(void *menu, bool init);
108
109 struct mitem
110 {
111 struct gmenu *parent;
112 color *bgcolor;
113
mitemmitem114 mitem(gmenu *parent, color *bgcolor, int type) : parent(parent), bgcolor(bgcolor), type(type) {}
~mitemmitem115 virtual ~mitem() {}
116
117 virtual void render(int x, int y, int w);
118 virtual int width() = 0;
selectmitem119 virtual void select() {}
focusmitem120 virtual void focus(bool on) { }
keymitem121 virtual void key(int code, bool isdown, int unicode) { }
initmitem122 virtual void init() {}
getdescmitem123 virtual const char *getdesc() { return NULL; }
gettextmitem124 virtual const char *gettext() { return NULL; }
getactionmitem125 virtual const char *getaction() { return NULL; }
126 bool isselection();
127 void renderbg(int x, int y, int w, color *c);
128 static color gray, white, whitepulse;
129 int type;
130
131 enum { TYPE_TEXTINPUT, TYPE_KEYINPUT, TYPE_CHECKBOX, TYPE_MANUAL, TYPE_SLIDER };
132 };
133
134 struct mdirlist
135 {
136 char *dir, *ext, *action;
137 bool image;
~mdirlistmdirlist138 ~mdirlist()
139 {
140 DELETEA(dir);
141 DELETEA(ext);
142 DELETEA(action);
143 }
144 };
145
146 struct gmenu
147 {
148 const char *name, *title, *header, *footer;
149 vector<mitem *> items;
150 int mwidth;
151 int menusel;
152 bool allowinput, inited, hotkeys, forwardkeys;
153 void (__cdecl *refreshfunc)(void *, bool);
154 bool (__cdecl *keyfunc)(void *, int, bool, int);
155 char *initaction;
156 char *usefont;
157 bool allowblink;
158 const char *mdl;
159 int anim, rotspeed, scale;
160 int footlen;
161 mdirlist *dirlist;
162
gmenugmenu163 gmenu() : name(0), title(0), header(0), footer(0), initaction(0), usefont(0), allowblink(0), mdl(0), footlen(0), dirlist(0) {}
~gmenugmenu164 virtual ~gmenu()
165 {
166 DELETEA(name);
167 DELETEA(mdl);
168 DELETEP(dirlist);
169 DELETEA(initaction);
170 DELETEA(usefont);
171 items.deletecontents();
172 }
173
174 void render();
175 void renderbg(int x1, int y1, int x2, int y2, bool border);
176 void conprintmenu();
177 void refresh();
178 void open();
179 void close();
180 void init();
181 };
182
183 // serverbrowser
184 extern void addserver(const char *servername, int serverport, int weight);
185 extern char *getservername(int n);
186 extern bool resolverwait(const char *name, ENetAddress *address);
187 extern int connectwithtimeout(ENetSocket sock, const char *hostname, ENetAddress &remoteaddress);
188 extern void writeservercfg();
189 extern void refreshservers(void *menu, bool init);
190 extern bool serverskey(void *menu, int code, bool isdown, int unicode);
191 extern bool serverinfokey(void *menu, int code, bool isdown, int unicode);
192
193 struct serverinfo
194 {
195 enum { UNRESOLVED = 0, RESOLVING, RESOLVED };
196
197 string name;
198 string full;
199 string map;
200 string sdesc;
201 string description;
202 string cmd;
203 int mode, numplayers, maxclients, ping, protocol, minremain, resolved, port, lastpingmillis, pongflags, getinfo, menuline_from, menuline_to;
204 ENetAddress address;
205 vector<const char *> playernames;
206 uchar namedata[MAXTRANS];
207 vector<char *> infotexts;
208 uchar textdata[MAXTRANS];
209 char lang[3];
210 color *bgcolor;
211 int favcat, msweight, weight;
212
213 int uplinkqual, uplinkqual_age;
214 unsigned char uplinkstats[MAXCLIENTS + 1];
215
serverinfoserverinfo216 serverinfo()
217 : mode(0), numplayers(0), maxclients(0), ping(9999), protocol(0), minremain(0),
218 resolved(UNRESOLVED), port(-1), lastpingmillis(0), pongflags(0), getinfo(EXTPING_NOP),
219 bgcolor(NULL), favcat(-1), msweight(0), weight(0), uplinkqual(0), uplinkqual_age(0)
220 {
221 name[0] = full[0] = map[0] = sdesc[0] = description[0] = '\0';
222 loopi(3) lang[i] = '\0';
223 loopi(MAXCLIENTS + 1) uplinkstats[i] = 0;
224 }
225 };
226
227 extern serverinfo *getconnectedserverinfo();
228 extern void pingservers();
229 extern void updatefrommaster(int force);
230
231 struct packetqueue
232 {
233 ringbuf<ENetPacket *, 8> packets;
234
235 packetqueue();
236 ~packetqueue();
237 void queue(ENetPacket *p);
238 bool flushtolog(const char *logfile);
239 void clear();
240 };
241
242 // rendergl
243 extern glmatrixf mvmatrix, projmatrix, clipmatrix, mvpmatrix, invmvmatrix, invmvpmatrix;
244 extern void resetcamera();
245
246 extern void gl_checkextensions();
247 extern void gl_init(int w, int h, int bpp, int depth, int fsaa);
248 extern void cleangl();
249 extern void enablepolygonoffset(GLenum type);
250 extern void disablepolygonoffset(GLenum type, bool restore = true);
251 extern void line(int x1, int y1, float z1, int x2, int y2, float z2);
252 extern void line(int x1, int y1, int x2, int y2, color *c = NULL);
253 extern void box(block &b, float z1, float z2, float z3, float z4);
254 extern void dot(int x, int y, float z);
255 extern void linestyle(float width, int r, int g, int b);
256 extern void blendbox(int x1, int y1, int x2, int y2, bool border, int tex = -1, color *c = NULL);
257 extern void quad(GLuint tex, float x, float y, float s, float tx, float ty, float tsx, float tsy = 0);
258 extern void quad(GLuint tex, vec &c1, vec &c2, float tx, float ty, float tsx, float tsy);
259 extern void circle(GLuint tex, float x, float y, float r, float tx, float ty, float tr, int subdiv = 32);
260 extern void setperspective(float fovy, float aspect, float nearplane, float farplane);
261 extern void sethudgunperspective(bool on);
262 extern void gl_drawframe(int w, int h, float changelod, float curfps);
263 extern void clearminimap();
264 extern void resetzones();
265 extern void rendercursor(int x, int y, int w);
266 extern void renderaboveheadicon(playerent *p);
267 extern void drawscope(bool preload = false);
268 extern float dynfov();
269 extern void damageblend(int n);
270
271 enum
272 {
273 CROSSHAIR_DEFAULT = 0,
274 CROSSHAIR_TEAMMATE,
275 CROSSHAIR_SCOPE,
276 CROSSHAIR_KNIFE,
277 CROSSHAIR_PISTOL,
278 CROSSHAIR_CARBINE,
279 CROSSHAIR_SHOTGUN,
280 CROSSHAIR_SMG,
281 CROSSHAIR_SNIPER,
282 CROSSHAIR_AR,
283 CROSSHAIR_CPISTOL,
284 CROSSHAIR_GRENADES,
285 CROSSHAIR_AKIMBO,
286 CROSSHAIR_NUM,
287 };
288
289 extern void drawcrosshair(playerent *p, int n, struct color *c = NULL, float size = -1.0f);
290
291 // shadow
292 extern bool addshadowbox(const vec &bbmin, const vec &bbmax, const vec &extrude, const glmatrixf &mat);
293 extern void drawstencilshadows();
294
295 // texture
296 struct Texture
297 {
298 char *name;
299 int xs, ys, bpp, clamp;
300 float scale;
301 bool mipmap, canreduce;
302 GLuint id;
303 };
304 extern Texture *notexture, *noworldtexture;
305 extern bool silent_texture_load;
306 extern bool uniformtexres;
307
308 extern void scaletexture(uchar *src, uint sw, uint sh, uint bpp, uchar *dst, uint dw, uint dh);
309 extern void createtexture(int tnum, int w, int h, void *pixels, int clamp, bool mipmap, bool canreduce, GLenum format);
310 extern SDL_Surface *wrapsurface(void *data, int width, int height, int bpp);
311 extern SDL_Surface *creatergbsurface(int width, int height);
312 extern SDL_Surface *creatergbasurface(int width, int height);
313 extern SDL_Surface *forcergbsurface(SDL_Surface *os);
314 extern SDL_Surface *forcergbasurface(SDL_Surface *os);
315 extern Texture *textureload(const char *name, int clamp = 0, bool mipmap = true, bool canreduce = false, float scale = 1.0f, bool trydl = false);
316 extern Texture *lookuptexture(int tex, Texture *failtex = notexture, bool trydl = false);
317 extern bool reloadtexture(Texture &t);
318 extern bool reloadtexture(const char *name);
319 extern void reloadtextures();
320 Texture *createtexturefromsurface(const char *name, SDL_Surface *s);
321 extern void blitsurface(SDL_Surface *dst, SDL_Surface *src, int x, int y);
322 void loadsky(char *basename, bool reload);
323
324 static inline Texture *lookupworldtexture(int tex, bool trydl = true)
325 { return lookuptexture(tex, noworldtexture, trydl); }
326
327 extern float skyfloor;
328 extern void draw_envbox(int fogdist);
329
330 extern int autodownload;
331 extern void setupcurl();
332 extern bool requirepackage(int type, const char *path);
333 extern int downloadpackages();
334 extern void sortpckservers();
335 extern void writepcksourcecfg();
336
337 extern int maxtmus;
338 extern void inittmus();
339 extern void resettmu(int n);
340 extern void scaletmu(int n, int rgbscale, int alphascale = 0);
341 extern void colortmu(int n, float r = 0, float g = 0, float b = 0, float a = 0);
342 extern void setuptmu(int n, const char *rgbfunc = NULL, const char *alphafunc = NULL);
343
344 struct zone { int x1, x2, y1, y2, color; }; // zones (drawn on the minimap)
345
346 // rendercubes
347 extern void mipstats(int a, int b, int c);
348 extern void render_flat(int tex, int x, int y, int size, int h, sqr *l1, sqr *l2, sqr *l3, sqr *l4, bool isceil);
349 extern void render_flatdelta(int wtex, int x, int y, int size, float h1, float h2, float h3, float h4, sqr *l1, sqr *l2, sqr *l3, sqr *l4, bool isceil);
350 extern void render_square(int wtex, float floor1, float floor2, float ceil1, float ceil2, int x1, int y1, int x2, int y2, int size, sqr *l1, sqr *l2, bool topleft, int dir);
351 extern void render_tris(int x, int y, int size, bool topleft, sqr *h1, sqr *h2, sqr *s, sqr *t, sqr *u, sqr *v);
352 extern void resetcubes();
353 extern void setupstrips();
354 extern void renderstripssky();
355 extern void renderstrips();
356 extern void rendershadow(int x, int y, int xs, int ys, const vec &texgenS, const vec &texgenT);
357
358 // water
359 extern void setwatercolor(const char *r = "", const char *g = "", const char *b = "", const char *a = "");
360 extern void calcwaterscissor();
361 extern void addwaterquad(int x, int y, int size);
362 extern int renderwater(float hf, GLuint reflecttex, GLuint refracttex);
363 extern void resetwater();
364
365 // client
366 extern void abortconnect();
367 extern void disconnect(int onlyclean = 0, int async = 0);
368 extern void cleanupclient();
369 extern void toserver(char *text);
370 extern void addmsg(int type, const char *fmt = NULL, ...);
371 extern bool multiplayer(bool msg = true);
372 extern bool allowedittoggle();
373 extern void sendpackettoserv(int chan, ENetPacket *packet);
374 extern void gets2c();
375 extern void c2sinfo(playerent *d);
376 extern void c2skeepalive();
377 extern void neterr(const char *s);
378 extern int getclientnum();
379 extern void changeteam(int team, bool respawn = true); // deprecated?
380 extern void getmap(char *name = NULL, char *callback = NULL);
381 extern void newteam(char *name);
382 extern bool securemapcheck(const char *map, bool msg = true);
383 extern int getbuildtype();
384 extern void sendintro();
385 extern void getdemo(int *idx, char *dsp);
386 extern void listdemos();
387 extern bool tryauth(const char *desc);
388 extern authkey *findauthkey(const char *desc);
389
390 // serverms
391 bool requestmasterf(const char *fmt, ...); // for AUTH et al
392 //moving to server.cpp seems a bad idea.
393 // :for AUTH
394
395 // clientgame
396 extern flaginfo flaginfos[2];
397 extern int sessionid;
398 extern int gametimecurrent;
399 extern int gametimemaximum;
400 extern int lastgametimeupdate;
resetserverstate401 struct serverstate { int autoteam; int mastermode; int matchteamsize; void reset() { autoteam = mastermode = matchteamsize = 0; }};
402 extern struct serverstate servstate;
403 extern void updateworld(int curtime, int lastmillis);
404 extern void resetmap(bool mrproper = true);
405 extern void startmap(const char *name, bool reset = true);
406 extern void changemap(const char *name);
407 extern void initclient();
408 extern void deathstate(playerent *pl);
409 extern void spawnplayer(playerent *d);
410 extern void dodamage(int damage, playerent *pl, playerent *actor, int gun = -1, bool gib = false, bool local = true);
411 extern void dokill(playerent *pl, playerent *act, bool gib = false, int gun = 0);
412 extern playerent *newplayerent();
413 extern botent *newbotent();
414 extern void freebotent(botent *d);
415 extern char *getclientmap();
416 extern int getclientmode();
417 extern void zapplayer(playerent *&d);
418 extern playerent *getclient(int cn);
419 extern playerent *newclient(int cn);
420 extern void timeupdate(int milliscur, int millismax); // was (int timeremain);
421 extern void respawnself();
422 extern void setskin(playerent *pl, int skin, int team = -1);
423 extern void callvote(int type, const char *arg1 = NULL, const char *arg2 = NULL, const char *arg3 = NULL);
424 extern void addsleep(int msec, const char *cmd, bool persist = false);
425 extern void resetsleep(bool force = false);
426 //game mode extras
427 extern void flagpickup(int fln);
428 extern void tryflagdrop(bool manual = false);
429 extern void flagreturn(int fln);
430 extern void flagscore(int fln);
431 extern void flagstolen(int flag, int act);
432 extern void flagdropped(int flag, float x, float y, float z);
433 extern void flaginbase(int flag);
434 extern void flagidle(int flag);
435 extern void flagmsg(int flag, int message, int actor, int flagtime);
436 extern void arenarespawn();
437 extern bool tryrespawn();
438 extern void findplayerstart(playerent *d, bool mapcenter = false, int arenaspawn = -1);
439 extern void serveropcommand(int cmd, int arg1);
440 extern void refreshsopmenu(void *menu, bool init);
441 extern char *colorname(playerent *d, char *name = NULL, const char *prefix = "");
442 extern char *colorping(int ping);
443 extern char *colorpj(int pj);
444 extern const char *highlight(const char *text);
445 extern void togglespect();
446 extern playerent *updatefollowplayer(int shiftdirection = 0);
447 extern void spectatemode(int mode);
448
449 struct votedisplayinfo
450 {
451 playerent *owner;
452 int type, stats[VOTE_NUM], result, millis;
453 string desc;
454 bool localplayervoted;
votedisplayinfovotedisplayinfo455 votedisplayinfo() : owner(NULL), result(VOTE_NEUTRAL), millis(0), localplayervoted(false) { loopi(VOTE_NUM) stats[i] = VOTE_NEUTRAL; }
456 };
457
458 extern votedisplayinfo *newvotedisplayinfo(playerent *owner, int type, const char *arg1, const char *arg2, const char *arg3 = "");
459 extern void callvotesuc();
460 extern void callvoteerr(int e);
461 extern void displayvote(votedisplayinfo *v);
462 extern void voteresult(int v);
463 extern void votecount(int v);
464 extern void clearvote();
465
466 // scoreboard
467 struct discscore { int team, flags, frags, deaths, points; char name[MAXNAMELEN + 1]; };
468 extern vector<discscore> discscores;
469 extern void showscores(bool on);
470 extern void renderscores(void *menu, bool init);
471 extern const char *asciiscores(bool destjpg = false);
472 extern void consolescores();
473 extern void teamflagscores(int &team1, int &team2);
474
475 // world
476 extern void setupworld(int factor);
477 extern bool worldbordercheck(int x1, int x2, int y1, int y2, int z1, int z2);
478 extern bool empty_world(int factor, bool force);
479 extern void remip(const block &b, int level = 0);
480 extern void remipmore(const block &b, int level = 0);
481 extern int closestent();
482 extern int findtype(char *what);
483 extern int findentity(int type, int index = 0);
484 extern int findentity(int type, int index, uchar attr2);
485 extern entity *newentity(int index, int x, int y, int z, char *what, int v1, int v2, int v3, int v4);
486
487 // worldlight
488 extern int lastcalclight;
489
490 extern void fullbrightlight(int level = -1);
491 extern void calclight();
492 extern void adddynlight(physent *owner, const vec &o, int reach, int expire, int fade, uchar r, uchar g = 0, uchar b = 0);
493 extern void dodynlights();
494 extern void undodynlights();
495 extern void cleardynlights();
496 extern void removedynlights(physent *owner);
497 extern block *blockcopy(const block &b);
498 extern void blockpaste(const block &b, int bx, int by, bool light);
499 extern void blockpaste(const block &b);
500 extern void freeblock(block *&b);
501
502 // worldrender
503 extern void render_world(float vx, float vy, float vh, float changelod, int yaw, int pitch, float fov, float fovy, int w, int h);
504 extern int lod_factor();
505
506 // worldocull
507 extern void disableraytable();
508 extern void computeraytable(float vx, float vy, float fov);
509 extern int isoccluded(float vx, float vy, float cx, float cy, float csize);
510
511 // main
512 extern SDL_Surface *screen;
513 extern int colorbits, depthbits, stencilbits;
514
515 extern void keyrepeat(bool on);
516 extern bool interceptkey(int sym);
517 extern bool firstrun, inmainloop;
518
519 enum
520 {
521 NOT_INITING = 0,
522 INIT_LOAD,
523 INIT_RESET
524 };
525 enum
526 {
527 CHANGE_GFX = 1<<0,
528 CHANGE_SOUND = 1<<1
529 };
530 extern bool initwarning(const char *desc, int level = INIT_RESET, int type = CHANGE_GFX);
531
532 // rendertext
533 struct font
534 {
535 struct charinfo
536 {
537 short x, y, w, h;
538 };
539
540 struct utf8charinfo : charinfo
541 {
542 int code;
543 };
544
545 char *name;
546 Texture *tex;
547 vector<charinfo> chars;
548 int defaultw, defaulth;
549 int offsetx, offsety, offsetw, offseth;
550 int skip;
551 };
552
553 #define VIRTH 1800
554 #define FONTH (curfont->defaulth)
555 #define PIXELTAB (10*curfont->defaultw)
556
557 extern int VIRTW; // virtual screen size for text & HUD
558 extern bool ignoreblinkingbit;
559 extern font *curfont;
560
561 extern void initfont();
562 extern bool setfont(const char *name);
563 extern font *getfont(const char *name);
564 extern void pushfont(const char *name);
565 extern void popfont();
566 extern void draw_text(const char *str, int left, int top, int r = 255, int g = 255, int b = 255, int a = 255, int cursor = -1, int maxwidth = -1);
567 extern void draw_textf(const char *fstr, int left, int top, ...);
568 extern int text_width(const char *str);
569 extern int text_visible(const char *str, int max);
570 extern void text_bounds(const char *str, int &width, int &height, int maxwidth = -1);
571 extern int text_visible(const char *str, int hitx, int hity, int maxwidth);
572 extern void text_pos(const char *str, int cursor, int &cx, int &cy, int maxwidth);
573 extern void text_startcolumns();
574 extern void text_endcolumns();
575
576 // editing
577 extern void cursorupdate();
578 extern void toggleedit(bool force = false);
579 extern char *editinfo();
580 extern void editdrag(bool isdown);
581 extern void checkselections();
582 extern void setvdeltaxy(int delta, block &sel);
583 extern void editequalisexy(bool isfloor, block &sel);
584 extern void edittypexy(int type, block &sel);
585 extern void edittexxy(int type, int t, block &sel);
586 extern void editheightxy(bool isfloor, int amount, block &sel);
587 //extern bool noteditmode();
588 extern bool noteditmode(const char* func = NULL);
589 extern void pruneundos(int maxremain = 0);
590
591 // renderhud
592 enum
593 {
594 HUDMSG_INFO = 0,
595 HUDMSG_TIMER,
596
597 HUDMSG_TYPE = 0xFF,
598 HUDMSG_OVERWRITE = 1<<8
599 };
600 extern void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwater);
601 extern void loadingscreen(const char *fmt = NULL, ...);
602 extern void hudoutf(const char *s, ...);
603 extern void hudonlyf(const char *s, ...);
604 extern void hudeditf(int type, const char *s, ...);
605 extern void show_out_of_renderloop_progress(float bar1, const char *text1, float bar2 = 0, const char *text2 = NULL);
606 extern void updatedmgindicator(vec &attack);
607 extern vec getradarpos();
608
609 // renderparticles
610 enum
611 {
612 PT_PART = 0,
613 PT_FIREBALL,
614 PT_SHOTLINE,
615 PT_DECAL,
616 PT_BULLETHOLE,
617 PT_BLOOD,
618 PT_STAIN,
619 PT_FLASH,
620 PT_HUDFLASH
621 };
622
623 #define PT_DECAL_MASK ((1<<PT_DECAL)|(1<<PT_BULLETHOLE)|(1<<PT_STAIN))
624
625 enum
626 {
627 PART_SPARK = 0,
628 PART_SMOKE,
629 PART_ECLOSEST,
630 PART_BLOOD,
631 PART_DEMOTRACK,
632 PART_FIREBALL,
633 PART_SHOTLINE,
634 PART_BULLETHOLE,
635 PART_BLOODSTAIN,
636 PART_SCORCH,
637 PART_HUDMUZZLEFLASH,
638 PART_MUZZLEFLASH,
639 PART_ELIGHT,
640 PART_ESPAWN,
641 PART_EAMMO,
642 PART_EPICKUP,
643 PART_EMODEL,
644 PART_ECARROT,
645 PART_ELADDER,
646 PART_EFLAG
647 };
648
649 extern void particleinit();
650 extern void particlereset();
651 extern void particle_flash(int type, float scale, float angle, const vec &p);
652 extern void particle_splash(int type, int num, int fade, const vec &p);
653 extern void particle_trail(int type, int fade, const vec &from, const vec &to);
654 extern void particle_emit(int type, int *args, int basetime, int seed, const vec &p);
655 extern void particle_fireball(int type, const vec &o);
656 extern void addshotline(dynent *d, const vec &from, const vec &to);
657 extern bool addbullethole(dynent *d, const vec &from, const vec &to, float radius = 1, bool noisy = true, int type = 0); // shotty
658 extern bool addscorchmark(vec &o, float radius = 7);
659
660 extern void render_particles(int time, int typemask = ~0);
661
662 // worldio
663 extern int mapdims[8];
664 extern const char *setnames(const char *name);
665 extern void save_world(char *fname);
666 extern bool load_world(char *mname);
667 extern void writemap(char *name, int size, uchar *data);
668 extern void writecfggz(char *name, int size, int sizegz, uchar *data);
669 extern uchar *readmap(char *name, int *size, int *revision);
670 extern uchar *readmcfggz(char *name, int *size, int *sizegz);
671
672 // physics
673 extern float raycube(const vec &o, const vec &ray, vec &surface);
674 extern bool raycubelos(const vec &from, const vec &to, float margin = 0);
675 extern void moveplayer(physent *pl, int moveres, bool local);
676 extern void moveplayer(physent *pl, int moveres, bool local, int curtime);
677 extern void movebounceent(bounceent *p, int moveres, bool local);
678 extern void entinmap(physent *d);
679 extern void physicsframe();
680 extern void mousemove(int dx, int dy);
681 extern void fixcamerarange(physent *cam = camera1);
682 extern void updatecrouch(playerent *p, bool on);
683 extern bool objcollide(physent *d, const vec &objpos, float objrad, float objheight);
684 extern bool collide(physent *d, bool spawn = false, float drop = 0, float rise = 0, int level = 7);
685 extern void attack(bool on);
686 extern void vecfromyawpitch(float yaw, float pitch, int move, int strafe, vec &m);
687 extern void vectoyawpitch(const vec &v, float &yaw, float &pitch);
688
689 // sound
690 /*
691 extern void audiomgr.playsound(int n, int priority = SP_NORMAL);
692 extern void audiomgr.playsound(int n, physent *p, int priority = SP_NORMAL);
693 extern void audiomgr.playsound(int n, entity *e, int priority = SP_NORMAL);
694 extern void audiomgr.playsound(int n, const vec *v, int priority = SP_NORMAL);
695 extern void audiomgr.playsoundc(int n, physent *p = NULL, int priority = SP_NORMAL);
696 extern void initsound();
697 extern void soundcleanup();
698 extern void musicsuggest(int id, int millis = 0, bool rndofs = false);
699 extern void musicfadeout(int id);
700 extern void clearworldsounds(bool fullclean = true);
701 extern void detachsounds(playerent *owner);
702 extern void updateaudio();
703 extern void preloadmapsound(entity &e);
704 extern void preloadmapsounds();
705 extern void writesoundconfig(stream *f);
706 */
707
708 // rendermodel
709 extern void rendermodel(const char *mdl, int anim, int tex, float rad, const vec &o, float yaw, float pitch, float speed = 0, int basetime = 0, playerent *d = NULL, modelattach *a = NULL, float scale = 1.0f);
710 extern void startmodelbatches();
711 extern void endmodelbatches(bool flush = true);
712 extern void clearmodelbatches();
713 extern mapmodelinfo &getmminfo(int i);
714 extern int findanim(const char *name);
715 extern void loadskin(const char *dir, const char *altdir, Texture *&skin);
716 extern model *nomodel;
717 extern model *loadmodel(const char *name, int i = -1, bool trydl = false);
718 extern void preload_playermodels();
719 extern void preload_entmodels();
720 extern void preload_hudguns();
721 extern void preload_mapmodels(bool trydl = false);
722 extern void renderclients();
723 extern void renderclient(playerent *d);
724 extern void renderclient(playerent *d, const char *mdlname, const char *vwepname, int tex = 0);
725 extern void updateclientname(playerent *d);
726
727 // weapon
728 extern void shoot(playerent *d, vec &to);
729 extern void createrays(vec &from, vec &to);
730 extern void removebounceents(playerent *owner);
731 extern void movebounceents();
732 extern void clearbounceents();
733 extern void renderbounceents();
734 extern void addgib(playerent *d);
735 extern playerent *playerincrosshair();
736 extern int magsize(int gun);
737 extern void setscope(bool activate);
738 extern void setburst(bool activate);
739 extern int intersect(playerent *d, const vec &from, const vec &to, vec *end = NULL);
740 extern bool intersect(entity *e, const vec &from, const vec &to, vec *end = NULL);
741 // Structure for storing traceresults
742 struct traceresult_s
743 {
744 vec end;
745 bool collided;
746 };
747 void TraceLine(vec from, vec to, dynent *pTracer, bool CheckPlayers, traceresult_s *tr, bool SkipTags=false);
748 extern void damageeffect(int damage, playerent *d);
749 extern void tryreload(playerent *p);
750 extern void checkweaponstate();
751 extern struct projectile *newprojectile(vec &from, vec &to, float speed, bool local, playerent *owner, int gun, int id = lastmillis);
752 extern int burstshotssettings[NUMGUNS];
753
754 // entities
755 extern void spawnallitems();
756 extern void pickupeffects(int n, playerent *d);
757 extern void renderentities();
758 extern void rendermapmodels();
759 extern void resetspawns(int type = -1);
760 extern void setspawn(int i, bool on);
761 extern void checkitems(playerent *d);
762 extern vector<int> changedents;
763 extern void syncentchanges(bool force = false);
764
765 // rndmap
766 extern void perlinarea(block &b, int scale, int seed, int psize);
767
768 // doc
769 extern void renderdoc(int x, int y, int doch);
770 extern void renderdocmenu(void *menu, bool init);
771 extern void toggledoc();
772 extern void scrolldoc(int i);
773 extern int stringsort(const char **a, const char **b);
774 #endif
775
776 // protocol [client and server]
777 extern const char *acronymmodestr(int n);
778 extern const char *fullmodestr(int n);
779 extern int defaultgamelimit(int gamemode);
780
781 // crypto // for AUTH
782 extern void genprivkey(const char *seed, vector<char> &privstr, vector<char> &pubstr);
783 extern bool hashstring(const char *str, char *result, int maxlen);
784 const char *genpwdhash(const char *name, const char *pwd, int salt);
785 extern void answerchallenge(const char *privstr, const char *challenge, vector<char> &answerstr);
786 extern void *parsepubkey(const char *pubstr);
787 extern void freepubkey(void *pubkey);
788 extern void *genchallenge(void *pubkey, const void *seed, int seedlen, vector<char> &challengestr);
789 extern void freechallenge(void *answer);
790 extern bool checkchallenge(const char *answerstr, void *correct);
791
792 // console
793 extern void conoutf(const char *s, ...);
794
795 // command
796 extern bool per_idents, neverpersist;
797 extern int variable(const char *name, int min, int cur, int max, int *storage, void (*fun)(), bool persist);
798 extern float fvariable(const char *name, float min, float cur, float max, float *storage, void (*fun)(), bool persist);
799 extern char *svariable(const char *name, const char *cur, char **storage, void (*fun)(), bool persist);
800 extern void setvar(const char *name, int i, bool dofunc = false);
801 extern void setfvar(const char *name, float f, bool dofunc = false);
802 extern void setsvar(const char *name, const char *str, bool dofunc = false);
803 extern int getvar(const char *name);
804 extern bool identexists(const char *name);
805 extern bool addcommand(const char *name, void (*fun)(), const char *sig);
806 extern int execute(const char *p);
807 extern char *executeret(const char *p);
808 extern char *conc(char **w, int n, bool space);
809 extern void intret(int v);
810 extern const char *floatstr(float v);
811 extern void floatret(float v);
812 extern void result(const char *s);
813 extern void exec(const char *cfgfile);
814 extern bool execfile(const char *cfgfile);
815 extern void resetcomplete();
816 extern void complete(char *s);
817 extern void push(const char *name, const char *action);
818 extern void pop(const char *name);
819 extern void alias(const char *name, const char *action, bool constant = false);
820 extern const char *getalias(const char *name);
821 extern void writecfg();
822 extern void deletecfg();
823 extern void identnames(vector<const char *> &names, bool builtinonly);
824 extern void changescriptcontext(int newcontext);
825 extern void explodelist(const char *s, vector<char *> &elems);
826 extern char *indexlist(const char *s, int pos);
827 extern char *parseword(const char *&p);
828 extern char *strreplace(char *dest, const char *source, const char *search, const char *replace);
829 extern void pushscontext(int newcontext);
830 extern int popscontext();
831 extern int curscontext();
832 extern int execcontext;
833 extern const char *currentserver(int i);
834 extern void setcontext(const char *context, const char *info);
835 extern void resetcontext();
836 extern int millis_();
837 extern int screenshottype;
838
839 // server
840 extern int modeacronyms;
841 extern void servertoclient(int chan, uchar *buf, int len, bool demo = false);
842 extern void localservertoclient(int chan, uchar *buf, int len, bool demo = false);
843 extern const char *modestr(int n, bool acronyms = false);
844 extern const char *voteerrorstr(int n);
845 extern const char *mmfullname(int n);
846 extern void fatal(const char *s, ...);
847 extern void initserver(bool dedicated, int argc = 0, char **argv = NULL);
848 extern void cleanupserver();
849 extern void localconnect();
850 extern void localdisconnect();
851 extern void localclienttoserver(int chan, ENetPacket *);
852 extern void serverslice(uint timeout);
853 extern void putint(ucharbuf &p, int n);
854 extern void putint(packetbuf &p, int n);
855 extern void putint(vector<uchar> &p, int n);
856 extern int getint(ucharbuf &p);
857 extern void putuint(ucharbuf &p, int n);
858 extern void putuint(packetbuf &p, int n);
859 extern void putuint(vector<uchar> &p, int n);
860 extern int getuint(ucharbuf &p);
861 extern void putfloat(ucharbuf &p, float f);
862 extern void putfloat(packetbuf &p, float f);
863 extern void putfloat(vector<uchar> &p, float f);
864 extern float getfloat(ucharbuf &p);
865 extern void sendstring(const char *t, ucharbuf &p);
866 extern void sendstring(const char *t, packetbuf &p);
867 extern void sendstring(const char *t, vector<uchar> &p);
868 extern void getstring(char *t, ucharbuf &p, int len = MAXTRANS);
869 extern void filtertext(char *dst, const char *src, int whitespace = 1, int len = sizeof(string)-1);
870 extern void filterrichtext(char *dst, const char *src, int len = sizeof(string)-1);
871 extern void filterservdesc(char *dst, const char *src, int len = sizeof(string)-1);
872 extern void filterlang(char *d, const char *s);
873 extern void trimtrailingwhitespace(char *s);
874 extern void cutcolorstring(char *text, int len);
875 extern void startintermission();
876 extern void restoreserverstate(vector<entity> &ents);
877 extern string mastername;
878 extern int masterport, mastertype;
879 extern ENetSocket connectmaster();
880 extern uchar *retrieveservers(uchar *buf, int buflen);
881 extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version);
882 extern int msgsizelookup(int msg);
883 extern const char *genpwdhash(const char *name, const char *pwd, int salt);
884 extern void servermsinit(const char *master, const char *ip, int serverport, bool listen);
885 extern bool serverpickup(int i, int sender);
886 extern bool valid_client(int cn);
887 extern void extinfo_cnbuf(ucharbuf &p, int cn);
888 extern void extinfo_statsbuf(ucharbuf &p, int pid, int bpos, ENetSocket &pongsock, ENetAddress &addr, ENetBuffer &buf, int len, int *csend);
889 extern void extinfo_teamscorebuf(ucharbuf &p);
890 extern char *votestring(int type, char *arg1, char *arg2, char *arg3);
891 extern int wizardmain(int argc, char **argv);
892
893 // demo
894 #define DHDR_DESCCHARS 80
895 #define DHDR_PLISTCHARS 322
896 struct demoheader
897 {
898 char magic[16];
899 int version, protocol;
900 char desc[DHDR_DESCCHARS];
901 char plist[DHDR_PLISTCHARS];
902 };
903 #define DEFDEMOFILEFMT "%w_%h_%n_%Mmin_%G"
904 #define DEFDEMOTIMEFMT "%Y%m%d_%H%M"
905
906 extern bool watchingdemo;
907 extern int demoprotocol;
908 extern void enddemoplayback();
909
910 // logging
911
912 enum { ACLOG_DEBUG = 0, ACLOG_VERBOSE, ACLOG_INFO, ACLOG_WARNING, ACLOG_ERROR, ACLOG_NUM };
913
914 extern bool initlogging(const char *identity, int facility_, int consolethres, int filethres, int syslogthres, bool logtimestamp);
915 extern void exitlogging();
916 extern bool logline(int level, const char *msg, ...);
917
918 // server config
919
920 struct serverconfigfile
921 {
922 string filename;
923 int filelen;
924 char *buf;
serverconfigfileserverconfigfile925 serverconfigfile() : filelen(0), buf(NULL) { filename[0] = '\0'; }
~serverconfigfileserverconfigfile926 virtual ~serverconfigfile() { DELETEA(buf); }
927
readserverconfigfile928 virtual void read() {}
929 void init(const char *name);
930 bool load();
931 };
932
933 // server commandline parsing
934 struct servercommandline
935 {
936 int uprate, serverport, syslogfacility, filethres, syslogthres, maxdemos, maxclients, kickthreshold, banthreshold, verbose, incoming_limit, afk_limit, ban_time, demotimelocal;
937 const char *ip, *master, *logident, *serverpassword, *adminpasswd, *demopath, *maprot, *pwdfile, *blfile, *nbfile, *infopath, *motdpath, *forbidden, *killmessages, *demofilenameformat, *demotimestampformat;
938 bool logtimestamp, demo_interm, loggamestatus;
939 string motd, servdesc_full, servdesc_pre, servdesc_suf, voteperm, mapperm;
940 int clfilenesting;
941 vector<const char *> adminonlymaps;
942
servercommandlineservercommandline943 servercommandline() : uprate(0), serverport(CUBE_DEFAULT_SERVER_PORT), syslogfacility(6), filethres(-1), syslogthres(-1), maxdemos(5),
944 maxclients(DEFAULTCLIENTS), kickthreshold(-5), banthreshold(-6), verbose(0), incoming_limit(10), afk_limit(45000), ban_time(20*60*1000), demotimelocal(0),
945 ip(""), master(NULL), logident(""), serverpassword(""), adminpasswd(""), demopath(""),
946 maprot("config/maprot.cfg"), pwdfile("config/serverpwd.cfg"), blfile("config/serverblacklist.cfg"), nbfile("config/nicknameblacklist.cfg"),
947 infopath("config/serverinfo"), motdpath("config/motd"), forbidden("config/forbidden.cfg"), killmessages("config/serverkillmessages.cfg"),
948 logtimestamp(false), demo_interm(false), loggamestatus(true),
949 clfilenesting(0)
950 {
951 motd[0] = servdesc_full[0] = servdesc_pre[0] = servdesc_suf[0] = voteperm[0] = mapperm[0] = '\0';
952 demofilenameformat = DEFDEMOFILEFMT;
953 demotimestampformat = DEFDEMOTIMEFMT;
954 }
955
checkargservercommandline956 bool checkarg(const char *arg)
957 {
958 if(!strncmp(arg, "assaultcube://", 13)) return false;
959 else if(arg[0] != '-' || arg[1] == '\0') return false;
960 const char *a = arg + 2 + strspn(arg + 2, " ");
961 int ai = atoi(a);
962 // client: dtwhzbsave
963 switch(arg[1])
964 { // todo: gjlqGHJQUYZ
965 case '-':
966 if(!strncmp(arg, "--demofilenameformat=", 21))
967 {
968 demofilenameformat = arg+21;
969 }
970 else if(!strncmp(arg, "--demotimestampformat=", 22))
971 {
972 demotimestampformat = arg+22;
973 }
974 else if(!strncmp(arg, "--demotimelocal=", 16))
975 {
976 int ai = atoi(arg+16);
977 demotimelocal = ai == 0 ? 0 : 1;
978 }
979 else if(!strncmp(arg, "--masterport=", 13))
980 {
981 int ai = atoi(arg+13);
982 masterport = ai == 0 ? AC_MASTER_PORT : ai;
983 }
984 else if(!strncmp(arg, "--mastertype=", 13))
985 {
986 int ai = atoi(arg+13);
987 mastertype = ai > 0 ? 1 : 0;
988 }
989 else return false;
990 break;
991 case 'u': uprate = ai; break;
992 case 'f': if(ai > 0 && ai < 65536) serverport = ai; break;
993 case 'i': ip = a; break;
994 case 'm': master = a; break;
995 case 'N': logident = a; break;
996 case 'l': loggamestatus = ai != 0; break;
997 case 'F': if(isdigit(*a) && ai >= 0 && ai <= 7) syslogfacility = ai; break;
998 case 'T': logtimestamp = true; break;
999 case 'L':
1000 switch(*a)
1001 {
1002 case 'F': filethres = atoi(a + 1); break;
1003 case 'S': syslogthres = atoi(a + 1); break;
1004 }
1005 break;
1006 case 'A': if(*a) adminonlymaps.add(a); break;
1007 case 'c': if(ai > 0) maxclients = min(ai, MAXCLIENTS); break;
1008 case 'k':
1009 {
1010 if(arg[2]=='A' && arg[3]!='\0')
1011 {
1012 if ((ai = atoi(&arg[3])) >= 30) afk_limit = ai * 1000;
1013 else afk_limit = 0;
1014 }
1015 else if(arg[2]=='B' && arg[3]!='\0')
1016 {
1017 if ((ai = atoi(&arg[3])) >= 0) ban_time = ai * 60 * 1000;
1018 else ban_time = 0;
1019 }
1020 else if(ai < 0) kickthreshold = ai;
1021 break;
1022 }
1023 case 'y': if(ai < 0) banthreshold = ai; break;
1024 case 'x': adminpasswd = a; break;
1025 case 'p': serverpassword = a; break;
1026 case 'D':
1027 {
1028 if(arg[2]=='I')
1029 {
1030 demo_interm = true;
1031 }
1032 else if(ai > 0) maxdemos = ai; break;
1033 }
1034 case 'W': demopath = a; break;
1035 case 'r': maprot = a; break;
1036 case 'X': pwdfile = a; break;
1037 case 'B': blfile = a; break;
1038 case 'K': nbfile = a; break;
1039 case 'E': killmessages = a; break;
1040 case 'I': infopath = a; break;
1041 case 'o': filterrichtext(motd, a); break;
1042 case 'O': motdpath = a; break;
1043 case 'g': forbidden = a; break;
1044 case 'n':
1045 {
1046 char *t = servdesc_full;
1047 switch(*a)
1048 {
1049 case '1': t = servdesc_pre; a += 1 + strspn(a + 1, " "); break;
1050 case '2': t = servdesc_suf; a += 1 + strspn(a + 1, " "); break;
1051 }
1052 filterrichtext(t, a);
1053 filterservdesc(t, t);
1054 break;
1055 }
1056 case 'P': concatstring(voteperm, a); break;
1057 case 'M': concatstring(mapperm, a); break;
1058 case 'Z': if(ai >= 0) incoming_limit = ai; break;
1059 case 'V': verbose++; break;
1060 case 'C': if(*a && clfilenesting < 3)
1061 {
1062 serverconfigfile cfg;
1063 cfg.init(a);
1064 cfg.load();
1065 int line = 1;
1066 clfilenesting++;
1067 if(cfg.buf)
1068 {
1069 printf("reading commandline parameters from file '%s'\n", a);
1070 for(char *p = cfg.buf, *l; p < cfg.buf + cfg.filelen; line++)
1071 {
1072 l = p; p += strlen(p) + 1;
1073 for(char *c = p - 2; c > l; c--) { if(*c == ' ') *c = '\0'; else break; }
1074 l += strspn(l, " \t");
1075 if(*l && !this->checkarg(newstring(l)))
1076 printf("unknown parameter in file '%s', line %d: '%s'\n", cfg.filename, line, l);
1077 }
1078 }
1079 else printf("failed to read file '%s'\n", a);
1080 clfilenesting--;
1081 break;
1082 }
1083 default: return false;
1084 }
1085 return true;
1086 }
1087 };
1088
1089 // shotty: shotgun rays def
1090 struct sgray {
1091 int ds; // damage flag: outer, medium, center: SGSEGDMG_*
1092 vec rv; // ray vector
1093 };
1094