1 #include "quakedef.h"
2
3 #include "prvm_cmds.h"
4 #include "clvm_cmds.h"
5 #include "menu.h"
6 #include "csprogs.h"
7
8 // TODO check which strings really should be engine strings
9
10 //============================================================================
11 // Menu
12
13 const char *vm_m_extensions =
14 "BX_WAL_SUPPORT "
15 "DP_CINEMATIC_DPV "
16 "DP_COVERAGE "
17 "DP_CRYPTO "
18 "DP_CSQC_BINDMAPS "
19 "DP_GFX_FONTS "
20 "DP_GFX_FONTS_FREETYPE "
21 "DP_UTF8 "
22 "DP_FONT_VARIABLEWIDTH "
23 "DP_MENU_EXTRESPONSEPACKET "
24 "DP_QC_ASINACOSATANATAN2TAN "
25 "DP_QC_AUTOCVARS "
26 "DP_QC_CMD "
27 "DP_QC_CRC16 "
28 "DP_QC_CVAR_TYPE "
29 "DP_QC_CVAR_DESCRIPTION "
30 "DP_QC_DIGEST "
31 "DP_QC_DIGEST_SHA256 "
32 "DP_QC_FINDCHAIN_TOFIELD "
33 "DP_QC_I18N "
34 "DP_QC_LOG "
35 "DP_QC_RENDER_SCENE "
36 "DP_QC_SPRINTF "
37 "DP_QC_STRFTIME "
38 "DP_QC_STRINGBUFFERS "
39 "DP_QC_STRINGBUFFERS_CVARLIST "
40 "DP_QC_STRINGBUFFERS_EXT_WIP "
41 "DP_QC_STRINGCOLORFUNCTIONS "
42 "DP_QC_STRING_CASE_FUNCTIONS "
43 "DP_QC_STRREPLACE "
44 "DP_QC_TOKENIZEBYSEPARATOR "
45 "DP_QC_TOKENIZE_CONSOLE "
46 "DP_QC_UNLIMITEDTEMPSTRINGS "
47 "DP_QC_URI_ESCAPE "
48 "DP_QC_URI_GET "
49 "DP_QC_URI_POST "
50 "DP_QC_WHICHPACK "
51 "FTE_STRINGS "
52 ;
53
54 /*
55 =========
56 VM_M_setmousetarget
57
58 setmousetarget(float target)
59 =========
60 */
VM_M_setmousetarget(prvm_prog_t * prog)61 static void VM_M_setmousetarget(prvm_prog_t *prog)
62 {
63 VM_SAFEPARMCOUNT(1, VM_M_setmousetarget);
64
65 switch((int)PRVM_G_FLOAT(OFS_PARM0))
66 {
67 case 1:
68 in_client_mouse = false;
69 break;
70 case 2:
71 in_client_mouse = true;
72 break;
73 default:
74 prog->error_cmd("VM_M_setmousetarget: wrong destination %f !",PRVM_G_FLOAT(OFS_PARM0));
75 }
76 }
77
78 /*
79 =========
80 VM_M_getmousetarget
81
82 float getmousetarget
83 =========
84 */
VM_M_getmousetarget(prvm_prog_t * prog)85 static void VM_M_getmousetarget(prvm_prog_t *prog)
86 {
87 VM_SAFEPARMCOUNT(0,VM_M_getmousetarget);
88
89 if(in_client_mouse)
90 PRVM_G_FLOAT(OFS_RETURN) = 2;
91 else
92 PRVM_G_FLOAT(OFS_RETURN) = 1;
93 }
94
95
96
97 /*
98 =========
99 VM_M_setkeydest
100
101 setkeydest(float dest)
102 =========
103 */
VM_M_setkeydest(prvm_prog_t * prog)104 static void VM_M_setkeydest(prvm_prog_t *prog)
105 {
106 VM_SAFEPARMCOUNT(1,VM_M_setkeydest);
107
108 switch((int)PRVM_G_FLOAT(OFS_PARM0))
109 {
110 case 0:
111 // key_game
112 key_dest = key_game;
113 break;
114 case 2:
115 // key_menu
116 key_dest = key_menu;
117 break;
118 case 3:
119 // key_menu_grabbed
120 key_dest = key_menu_grabbed;
121 break;
122 case 1:
123 // key_message
124 // key_dest = key_message
125 // break;
126 default:
127 prog->error_cmd("VM_M_setkeydest: wrong destination %f !", PRVM_G_FLOAT(OFS_PARM0));
128 }
129 }
130
131 /*
132 =========
133 VM_M_getkeydest
134
135 float getkeydest
136 =========
137 */
VM_M_getkeydest(prvm_prog_t * prog)138 static void VM_M_getkeydest(prvm_prog_t *prog)
139 {
140 VM_SAFEPARMCOUNT(0,VM_M_getkeydest);
141
142 // key_game = 0, key_message = 1, key_menu = 2, key_menu_grabbed = 3, unknown = -1
143 switch(key_dest)
144 {
145 case key_game:
146 PRVM_G_FLOAT(OFS_RETURN) = 0;
147 break;
148 case key_menu:
149 PRVM_G_FLOAT(OFS_RETURN) = 2;
150 break;
151 case key_menu_grabbed:
152 PRVM_G_FLOAT(OFS_RETURN) = 3;
153 break;
154 case key_message:
155 // not supported
156 // PRVM_G_FLOAT(OFS_RETURN) = 1;
157 // break;
158 default:
159 PRVM_G_FLOAT(OFS_RETURN) = -1;
160 }
161 }
162
163
164 /*
165 =========
166 VM_M_getresolution
167
168 vector getresolution(float number)
169 =========
170 */
VM_M_getresolution(prvm_prog_t * prog)171 static void VM_M_getresolution(prvm_prog_t *prog)
172 {
173 int nr, fs;
174 VM_SAFEPARMCOUNTRANGE(1, 2, VM_getresolution);
175
176 nr = (int)PRVM_G_FLOAT(OFS_PARM0);
177
178 fs = ((prog->argc <= 1) || ((int)PRVM_G_FLOAT(OFS_PARM1)));
179
180 if(nr < -1 || nr >= (fs ? video_resolutions_count : video_resolutions_hardcoded_count))
181 {
182 PRVM_G_VECTOR(OFS_RETURN)[0] = 0;
183 PRVM_G_VECTOR(OFS_RETURN)[1] = 0;
184 PRVM_G_VECTOR(OFS_RETURN)[2] = 0;
185 }
186 else if(nr == -1)
187 {
188 vid_mode_t *m = VID_GetDesktopMode();
189 if (m)
190 {
191 PRVM_G_VECTOR(OFS_RETURN)[0] = m->width;
192 PRVM_G_VECTOR(OFS_RETURN)[1] = m->height;
193 PRVM_G_VECTOR(OFS_RETURN)[2] = m->pixelheight_num / (prvm_vec_t) m->pixelheight_denom;
194 }
195 else
196 {
197 PRVM_G_VECTOR(OFS_RETURN)[0] = 0;
198 PRVM_G_VECTOR(OFS_RETURN)[1] = 0;
199 PRVM_G_VECTOR(OFS_RETURN)[2] = 0;
200 }
201 }
202 else
203 {
204 video_resolution_t *r = &((fs ? video_resolutions : video_resolutions_hardcoded)[nr]);
205 PRVM_G_VECTOR(OFS_RETURN)[0] = r->width;
206 PRVM_G_VECTOR(OFS_RETURN)[1] = r->height;
207 PRVM_G_VECTOR(OFS_RETURN)[2] = r->pixelheight;
208 }
209 }
210
VM_M_getgamedirinfo(prvm_prog_t * prog)211 static void VM_M_getgamedirinfo(prvm_prog_t *prog)
212 {
213 int nr, item;
214 VM_SAFEPARMCOUNT(2, VM_getgamedirinfo);
215
216 nr = (int)PRVM_G_FLOAT(OFS_PARM0);
217 item = (int)PRVM_G_FLOAT(OFS_PARM1);
218
219 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
220
221 if(nr >= 0 && nr < fs_all_gamedirs_count)
222 {
223 if(item == 0)
224 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, fs_all_gamedirs[nr].name );
225 else if(item == 1)
226 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, fs_all_gamedirs[nr].description );
227 }
228 }
229
230 /*
231 =========
232 VM_M_getserverliststat
233
234 float getserverliststat(float type)
235 =========
236 */
237 /*
238 type:
239 0 serverlist_viewcount
240 1 serverlist_totalcount
241 2 masterquerycount
242 3 masterreplycount
243 4 serverquerycount
244 5 serverreplycount
245 6 sortfield
246 7 sortflags
247 */
VM_M_getserverliststat(prvm_prog_t * prog)248 static void VM_M_getserverliststat(prvm_prog_t *prog)
249 {
250 int type;
251 VM_SAFEPARMCOUNT ( 1, VM_M_getserverliststat );
252
253 PRVM_G_FLOAT( OFS_RETURN ) = 0;
254
255 type = (int)PRVM_G_FLOAT( OFS_PARM0 );
256 switch(type)
257 {
258 case 0:
259 PRVM_G_FLOAT ( OFS_RETURN ) = serverlist_viewcount;
260 return;
261 case 1:
262 PRVM_G_FLOAT ( OFS_RETURN ) = serverlist_cachecount;
263 return;
264 case 2:
265 PRVM_G_FLOAT ( OFS_RETURN ) = masterquerycount;
266 return;
267 case 3:
268 PRVM_G_FLOAT ( OFS_RETURN ) = masterreplycount;
269 return;
270 case 4:
271 PRVM_G_FLOAT ( OFS_RETURN ) = serverquerycount;
272 return;
273 case 5:
274 PRVM_G_FLOAT ( OFS_RETURN ) = serverreplycount;
275 return;
276 case 6:
277 PRVM_G_FLOAT ( OFS_RETURN ) = serverlist_sortbyfield;
278 return;
279 case 7:
280 PRVM_G_FLOAT ( OFS_RETURN ) = serverlist_sortflags;
281 return;
282 default:
283 VM_Warning(prog, "VM_M_getserverliststat: bad type %i!\n", type );
284 }
285 }
286
287 /*
288 ========================
289 VM_M_resetserverlistmasks
290
291 resetserverlistmasks()
292 ========================
293 */
VM_M_resetserverlistmasks(prvm_prog_t * prog)294 static void VM_M_resetserverlistmasks(prvm_prog_t *prog)
295 {
296 VM_SAFEPARMCOUNT(0, VM_M_resetserverlistmasks);
297 ServerList_ResetMasks();
298 }
299
300
301 /*
302 ========================
303 VM_M_setserverlistmaskstring
304
305 setserverlistmaskstring(float mask, float fld, string str, float op)
306 0-511 and
307 512 - 1024 or
308 ========================
309 */
VM_M_setserverlistmaskstring(prvm_prog_t * prog)310 static void VM_M_setserverlistmaskstring(prvm_prog_t *prog)
311 {
312 const char *str;
313 int masknr;
314 serverlist_mask_t *mask;
315 int field;
316
317 VM_SAFEPARMCOUNT( 4, VM_M_setserverlistmaskstring );
318 str = PRVM_G_STRING( OFS_PARM2 );
319
320 masknr = (int)PRVM_G_FLOAT( OFS_PARM0 );
321 if( masknr >= 0 && masknr < SERVERLIST_ANDMASKCOUNT )
322 mask = &serverlist_andmasks[masknr];
323 else if( masknr >= 512 && masknr - 512 < SERVERLIST_ORMASKCOUNT )
324 mask = &serverlist_ormasks[masknr - 512 ];
325 else
326 {
327 VM_Warning(prog, "VM_M_setserverlistmaskstring: invalid mask number %i\n", masknr );
328 return;
329 }
330
331 field = (int) PRVM_G_FLOAT( OFS_PARM1 );
332
333 switch( field ) {
334 case SLIF_CNAME:
335 strlcpy( mask->info.cname, str, sizeof(mask->info.cname) );
336 break;
337 case SLIF_NAME:
338 strlcpy( mask->info.name, str, sizeof(mask->info.name) );
339 break;
340 case SLIF_QCSTATUS:
341 strlcpy( mask->info.qcstatus, str, sizeof(mask->info.qcstatus) );
342 break;
343 case SLIF_PLAYERS:
344 strlcpy( mask->info.players, str, sizeof(mask->info.players) );
345 break;
346 case SLIF_MAP:
347 strlcpy( mask->info.map, str, sizeof(mask->info.map) );
348 break;
349 case SLIF_MOD:
350 strlcpy( mask->info.mod, str, sizeof(mask->info.mod) );
351 break;
352 case SLIF_GAME:
353 strlcpy( mask->info.game, str, sizeof(mask->info.game) );
354 break;
355 default:
356 VM_Warning(prog, "VM_M_setserverlistmaskstring: Bad field number %i passed!\n", field );
357 return;
358 }
359
360 mask->active = true;
361 mask->tests[field] = (serverlist_maskop_t)((int)PRVM_G_FLOAT( OFS_PARM3 ));
362 }
363
364 /*
365 ========================
366 VM_M_setserverlistmasknumber
367
368 setserverlistmasknumber(float mask, float fld, float num, float op)
369
370 0-511 and
371 512 - 1024 or
372 ========================
373 */
VM_M_setserverlistmasknumber(prvm_prog_t * prog)374 static void VM_M_setserverlistmasknumber(prvm_prog_t *prog)
375 {
376 int number;
377 serverlist_mask_t *mask;
378 int masknr;
379 int field;
380 VM_SAFEPARMCOUNT( 4, VM_M_setserverlistmasknumber );
381
382 masknr = (int)PRVM_G_FLOAT( OFS_PARM0 );
383 if( masknr >= 0 && masknr < SERVERLIST_ANDMASKCOUNT )
384 mask = &serverlist_andmasks[masknr];
385 else if( masknr >= 512 && masknr - 512 < SERVERLIST_ORMASKCOUNT )
386 mask = &serverlist_ormasks[masknr - 512 ];
387 else
388 {
389 VM_Warning(prog, "VM_M_setserverlistmasknumber: invalid mask number %i\n", masknr );
390 return;
391 }
392
393 number = (int)PRVM_G_FLOAT( OFS_PARM2 );
394 field = (int) PRVM_G_FLOAT( OFS_PARM1 );
395
396 switch( field ) {
397 case SLIF_MAXPLAYERS:
398 mask->info.maxplayers = number;
399 break;
400 case SLIF_NUMPLAYERS:
401 mask->info.numplayers = number;
402 break;
403 case SLIF_NUMBOTS:
404 mask->info.numbots = number;
405 break;
406 case SLIF_NUMHUMANS:
407 mask->info.numhumans = number;
408 break;
409 case SLIF_PING:
410 mask->info.ping = number;
411 break;
412 case SLIF_PROTOCOL:
413 mask->info.protocol = number;
414 break;
415 case SLIF_FREESLOTS:
416 mask->info.freeslots = number;
417 break;
418 case SLIF_CATEGORY:
419 mask->info.category = number;
420 break;
421 case SLIF_ISFAVORITE:
422 mask->info.isfavorite = number != 0;
423 break;
424 default:
425 VM_Warning(prog, "VM_M_setserverlistmasknumber: Bad field number %i passed!\n", field );
426 return;
427 }
428
429 mask->active = true;
430 mask->tests[field] = (serverlist_maskop_t)((int)PRVM_G_FLOAT( OFS_PARM3 ));
431 }
432
433
434 /*
435 ========================
436 VM_M_resortserverlist
437
438 resortserverlist
439 ========================
440 */
VM_M_resortserverlist(prvm_prog_t * prog)441 static void VM_M_resortserverlist(prvm_prog_t *prog)
442 {
443 VM_SAFEPARMCOUNT(0, VM_M_resortserverlist);
444 ServerList_RebuildViewList();
445 }
446
447 /*
448 =========
449 VM_M_getserverliststring
450
451 string getserverliststring(float field, float hostnr)
452 =========
453 */
VM_M_getserverliststring(prvm_prog_t * prog)454 static void VM_M_getserverliststring(prvm_prog_t *prog)
455 {
456 const serverlist_entry_t *cache;
457 int hostnr;
458
459 VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
460
461 PRVM_G_INT(OFS_RETURN) = OFS_NULL;
462
463 hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
464
465 if(hostnr == -1 && serverlist_callbackentry)
466 {
467 cache = serverlist_callbackentry;
468 }
469 else
470 {
471 if(hostnr < 0 || hostnr >= serverlist_viewcount)
472 {
473 Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
474 return;
475 }
476 cache = ServerList_GetViewEntry(hostnr);
477 }
478 switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
479 case SLIF_CNAME:
480 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.cname );
481 break;
482 case SLIF_NAME:
483 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.name );
484 break;
485 case SLIF_QCSTATUS:
486 PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.qcstatus );
487 break;
488 case SLIF_PLAYERS:
489 PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.players );
490 break;
491 case SLIF_GAME:
492 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.game );
493 break;
494 case SLIF_MOD:
495 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.mod );
496 break;
497 case SLIF_MAP:
498 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.map );
499 break;
500 // TODO remove this again
501 case 1024:
502 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->line1 );
503 break;
504 case 1025:
505 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->line2 );
506 break;
507 default:
508 Con_Print("VM_M_getserverliststring: bad field number passed!\n");
509 }
510 }
511
512 /*
513 =========
514 VM_M_getserverlistnumber
515
516 float getserverlistnumber(float field, float hostnr)
517 =========
518 */
VM_M_getserverlistnumber(prvm_prog_t * prog)519 static void VM_M_getserverlistnumber(prvm_prog_t *prog)
520 {
521 const serverlist_entry_t *cache;
522 int hostnr;
523
524 VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
525
526 PRVM_G_INT(OFS_RETURN) = OFS_NULL;
527
528 hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
529
530 if(hostnr == -1 && serverlist_callbackentry)
531 {
532 cache = serverlist_callbackentry;
533 }
534 else
535 {
536 if(hostnr < 0 || hostnr >= serverlist_viewcount)
537 {
538 Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
539 return;
540 }
541 cache = ServerList_GetViewEntry(hostnr);
542 }
543 switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
544 case SLIF_MAXPLAYERS:
545 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers;
546 break;
547 case SLIF_NUMPLAYERS:
548 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.numplayers;
549 break;
550 case SLIF_NUMBOTS:
551 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.numbots;
552 break;
553 case SLIF_NUMHUMANS:
554 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.numhumans;
555 break;
556 case SLIF_FREESLOTS:
557 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.freeslots;
558 break;
559 case SLIF_PING:
560 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.ping;
561 break;
562 case SLIF_PROTOCOL:
563 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.protocol;
564 break;
565 case SLIF_CATEGORY:
566 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.category;
567 break;
568 case SLIF_ISFAVORITE:
569 PRVM_G_FLOAT( OFS_RETURN ) = cache->info.isfavorite;
570 break;
571 default:
572 Con_Print("VM_M_getserverlistnumber: bad field number passed!\n");
573 }
574 }
575
576 /*
577 ========================
578 VM_M_setserverlistsort
579
580 setserverlistsort(float field, float flags)
581 ========================
582 */
VM_M_setserverlistsort(prvm_prog_t * prog)583 static void VM_M_setserverlistsort(prvm_prog_t *prog)
584 {
585 VM_SAFEPARMCOUNT( 2, VM_M_setserverlistsort );
586
587 serverlist_sortbyfield = (serverlist_infofield_t)((int)PRVM_G_FLOAT( OFS_PARM0 ));
588 serverlist_sortflags = (int) PRVM_G_FLOAT( OFS_PARM1 );
589 }
590
591 /*
592 ========================
593 VM_M_refreshserverlist
594
595 refreshserverlist()
596 ========================
597 */
VM_M_refreshserverlist(prvm_prog_t * prog)598 static void VM_M_refreshserverlist(prvm_prog_t *prog)
599 {
600 qboolean do_reset = false;
601 VM_SAFEPARMCOUNTRANGE( 0, 1, VM_M_refreshserverlist );
602 if (prog->argc >= 1 && PRVM_G_FLOAT(OFS_PARM0))
603 do_reset = true;
604 ServerList_QueryList(do_reset, true, false, false);
605 }
606
607 /*
608 ========================
609 VM_M_getserverlistindexforkey
610
611 float getserverlistindexforkey(string key)
612 ========================
613 */
VM_M_getserverlistindexforkey(prvm_prog_t * prog)614 static void VM_M_getserverlistindexforkey(prvm_prog_t *prog)
615 {
616 const char *key;
617 VM_SAFEPARMCOUNT( 1, VM_M_getserverlistindexforkey );
618
619 key = PRVM_G_STRING( OFS_PARM0 );
620 VM_CheckEmptyString( prog, key );
621
622 if( !strcmp( key, "cname" ) )
623 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_CNAME;
624 else if( !strcmp( key, "ping" ) )
625 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PING;
626 else if( !strcmp( key, "game" ) )
627 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_GAME;
628 else if( !strcmp( key, "mod" ) )
629 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_MOD;
630 else if( !strcmp( key, "map" ) )
631 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_MAP;
632 else if( !strcmp( key, "name" ) )
633 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_NAME;
634 else if( !strcmp( key, "qcstatus" ) )
635 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_QCSTATUS;
636 else if( !strcmp( key, "players" ) )
637 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PLAYERS;
638 else if( !strcmp( key, "maxplayers" ) )
639 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_MAXPLAYERS;
640 else if( !strcmp( key, "numplayers" ) )
641 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_NUMPLAYERS;
642 else if( !strcmp( key, "numbots" ) )
643 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_NUMBOTS;
644 else if( !strcmp( key, "numhumans" ) )
645 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_NUMHUMANS;
646 else if( !strcmp( key, "freeslots" ) )
647 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_FREESLOTS;
648 else if( !strcmp( key, "protocol" ) )
649 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PROTOCOL;
650 else if( !strcmp( key, "category" ) )
651 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_CATEGORY;
652 else if( !strcmp( key, "isfavorite" ) )
653 PRVM_G_FLOAT( OFS_RETURN ) = SLIF_ISFAVORITE;
654 else
655 PRVM_G_FLOAT( OFS_RETURN ) = -1;
656 }
657
658 /*
659 ========================
660 VM_M_addwantedserverlistkey
661
662 addwantedserverlistkey(string key)
663 ========================
664 */
VM_M_addwantedserverlistkey(prvm_prog_t * prog)665 static void VM_M_addwantedserverlistkey(prvm_prog_t *prog)
666 {
667 VM_SAFEPARMCOUNT( 1, VM_M_addwantedserverlistkey );
668 }
669
670 /*
671 ===============================================================================
672 MESSAGE WRITING
673
674 used only for client and menu
675 server uses VM_SV_...
676
677 Write*(* data, float type, float to)
678
679 ===============================================================================
680 */
681
682 #define MSG_BROADCAST 0 // unreliable to all
683 #define MSG_ONE 1 // reliable to one (msg_entity)
684 #define MSG_ALL 2 // reliable to all
685 #define MSG_INIT 3 // write to the init string
686
VM_M_WriteDest(prvm_prog_t * prog)687 static sizebuf_t *VM_M_WriteDest (prvm_prog_t *prog)
688 {
689 int dest;
690 int destclient;
691
692 if(!sv.active)
693 prog->error_cmd("VM_M_WriteDest: game is not server (%s)", prog->name);
694
695 dest = (int)PRVM_G_FLOAT(OFS_PARM1);
696 switch (dest)
697 {
698 case MSG_BROADCAST:
699 return &sv.datagram;
700
701 case MSG_ONE:
702 destclient = (int) PRVM_G_FLOAT(OFS_PARM2);
703 if (destclient < 0 || destclient >= svs.maxclients || !svs.clients[destclient].active || !svs.clients[destclient].netconnection)
704 prog->error_cmd("VM_clientcommand: %s: invalid client !", prog->name);
705
706 return &svs.clients[destclient].netconnection->message;
707
708 case MSG_ALL:
709 return &sv.reliable_datagram;
710
711 case MSG_INIT:
712 return &sv.signon;
713
714 default:
715 prog->error_cmd("WriteDest: bad destination");
716 break;
717 }
718
719 return NULL;
720 }
721
VM_M_WriteByte(prvm_prog_t * prog)722 static void VM_M_WriteByte (prvm_prog_t *prog)
723 {
724 VM_SAFEPARMCOUNT(1, VM_M_WriteByte);
725 MSG_WriteByte (VM_M_WriteDest(prog), (int)PRVM_G_FLOAT(OFS_PARM0));
726 }
727
VM_M_WriteChar(prvm_prog_t * prog)728 static void VM_M_WriteChar (prvm_prog_t *prog)
729 {
730 VM_SAFEPARMCOUNT(1, VM_M_WriteChar);
731 MSG_WriteChar (VM_M_WriteDest(prog), (int)PRVM_G_FLOAT(OFS_PARM0));
732 }
733
VM_M_WriteShort(prvm_prog_t * prog)734 static void VM_M_WriteShort (prvm_prog_t *prog)
735 {
736 VM_SAFEPARMCOUNT(1, VM_M_WriteShort);
737 MSG_WriteShort (VM_M_WriteDest(prog), (int)PRVM_G_FLOAT(OFS_PARM0));
738 }
739
VM_M_WriteLong(prvm_prog_t * prog)740 static void VM_M_WriteLong (prvm_prog_t *prog)
741 {
742 VM_SAFEPARMCOUNT(1, VM_M_WriteLong);
743 MSG_WriteLong (VM_M_WriteDest(prog), (int)PRVM_G_FLOAT(OFS_PARM0));
744 }
745
VM_M_WriteAngle(prvm_prog_t * prog)746 static void VM_M_WriteAngle (prvm_prog_t *prog)
747 {
748 VM_SAFEPARMCOUNT(1, VM_M_WriteAngle);
749 MSG_WriteAngle (VM_M_WriteDest(prog), PRVM_G_FLOAT(OFS_PARM0), sv.protocol);
750 }
751
VM_M_WriteCoord(prvm_prog_t * prog)752 static void VM_M_WriteCoord (prvm_prog_t *prog)
753 {
754 VM_SAFEPARMCOUNT(1, VM_M_WriteCoord);
755 MSG_WriteCoord (VM_M_WriteDest(prog), PRVM_G_FLOAT(OFS_PARM0), sv.protocol);
756 }
757
VM_M_WriteString(prvm_prog_t * prog)758 static void VM_M_WriteString (prvm_prog_t *prog)
759 {
760 VM_SAFEPARMCOUNT(1, VM_M_WriteString);
761 MSG_WriteString (VM_M_WriteDest(prog), PRVM_G_STRING(OFS_PARM0));
762 }
763
VM_M_WriteEntity(prvm_prog_t * prog)764 static void VM_M_WriteEntity (prvm_prog_t *prog)
765 {
766 VM_SAFEPARMCOUNT(1, VM_M_WriteEntity);
767 MSG_WriteShort (VM_M_WriteDest(prog), PRVM_G_EDICTNUM(OFS_PARM0));
768 }
769
770 /*
771 =================
772 VM_M_copyentity
773
774 copies data from one entity to another
775
776 copyentity(entity src, entity dst)
777 =================
778 */
VM_M_copyentity(prvm_prog_t * prog)779 static void VM_M_copyentity (prvm_prog_t *prog)
780 {
781 prvm_edict_t *in, *out;
782 VM_SAFEPARMCOUNT(2,VM_M_copyentity);
783 in = PRVM_G_EDICT(OFS_PARM0);
784 out = PRVM_G_EDICT(OFS_PARM1);
785 memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t));
786 }
787
788 //#66 vector() getmousepos (EXT_CSQC)
VM_M_getmousepos(prvm_prog_t * prog)789 static void VM_M_getmousepos(prvm_prog_t *prog)
790 {
791 VM_SAFEPARMCOUNT(0,VM_M_getmousepos);
792
793 if (key_consoleactive || (key_dest != key_menu && key_dest != key_menu_grabbed))
794 VectorSet(PRVM_G_VECTOR(OFS_RETURN), 0, 0, 0);
795 else if (in_client_mouse)
796 VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_windowmouse_x * vid_conwidth.integer / vid.width, in_windowmouse_y * vid_conheight.integer / vid.height, 0);
797 else
798 VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_mouse_x * vid_conwidth.integer / vid.width, in_mouse_y * vid_conheight.integer / vid.height, 0);
799 }
800
VM_M_crypto_getkeyfp(prvm_prog_t * prog)801 static void VM_M_crypto_getkeyfp(prvm_prog_t *prog)
802 {
803 lhnetaddress_t addr;
804 const char *s;
805 char keyfp[FP64_SIZE + 1];
806
807 VM_SAFEPARMCOUNT(1,VM_M_crypto_getkeyfp);
808
809 s = PRVM_G_STRING( OFS_PARM0 );
810 VM_CheckEmptyString( prog, s );
811
812 if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL, NULL))
813 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, keyfp );
814 else
815 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
816 }
VM_M_crypto_getidfp(prvm_prog_t * prog)817 static void VM_M_crypto_getidfp(prvm_prog_t *prog)
818 {
819 lhnetaddress_t addr;
820 const char *s;
821 char idfp[FP64_SIZE + 1];
822
823 VM_SAFEPARMCOUNT(1,VM_M_crypto_getidfp);
824
825 s = PRVM_G_STRING( OFS_PARM0 );
826 VM_CheckEmptyString( prog, s );
827
828 if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL, NULL))
829 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, idfp );
830 else
831 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
832 }
VM_M_crypto_getidstatus(prvm_prog_t * prog)833 static void VM_M_crypto_getidstatus(prvm_prog_t *prog)
834 {
835 lhnetaddress_t addr;
836 const char *s;
837 qboolean issigned;
838
839 VM_SAFEPARMCOUNT(1,VM_M_crypto_getidstatus);
840
841 s = PRVM_G_STRING( OFS_PARM0 );
842 VM_CheckEmptyString( prog, s );
843
844 if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, NULL, &issigned))
845 PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
846 else
847 PRVM_G_FLOAT( OFS_RETURN ) = 0;
848 }
VM_M_crypto_getencryptlevel(prvm_prog_t * prog)849 static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog)
850 {
851 lhnetaddress_t addr;
852 const char *s;
853 int aeslevel;
854 char vabuf[1024];
855
856 VM_SAFEPARMCOUNT(1,VM_M_crypto_getencryptlevel);
857
858 s = PRVM_G_STRING( OFS_PARM0 );
859 VM_CheckEmptyString( prog, s );
860
861 if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel, NULL))
862 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, aeslevel ? va(vabuf, sizeof(vabuf), "%d AES128", aeslevel) : "0");
863 else
864 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
865 }
VM_M_crypto_getmykeyfp(prvm_prog_t * prog)866 static void VM_M_crypto_getmykeyfp(prvm_prog_t *prog)
867 {
868 int i;
869 char keyfp[FP64_SIZE + 1];
870
871 VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
872
873 i = PRVM_G_FLOAT( OFS_PARM0 );
874 switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0, NULL))
875 {
876 case -1:
877 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
878 break;
879 case 0:
880 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
881 break;
882 default:
883 case 1:
884 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, keyfp);
885 break;
886 }
887 }
VM_M_crypto_getmyidfp(prvm_prog_t * prog)888 static void VM_M_crypto_getmyidfp(prvm_prog_t *prog)
889 {
890 int i;
891 char idfp[FP64_SIZE + 1];
892
893 VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
894
895 i = PRVM_G_FLOAT( OFS_PARM0 );
896 switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp), NULL))
897 {
898 case -1:
899 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
900 break;
901 case 0:
902 PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
903 break;
904 default:
905 case 1:
906 PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, idfp);
907 break;
908 }
909 }
VM_M_crypto_getmyidstatus(prvm_prog_t * prog)910 static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog)
911 {
912 int i;
913 qboolean issigned;
914
915 VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
916
917 i = PRVM_G_FLOAT( OFS_PARM0 );
918 switch(Crypto_RetrieveLocalKey(i, NULL, 0, NULL, 0, &issigned))
919 {
920 case -1:
921 PRVM_G_FLOAT( OFS_RETURN ) = 0; // have no ID there
922 break;
923 case 0:
924 PRVM_G_FLOAT( OFS_RETURN ) = -1; // out of range
925 break;
926 default:
927 case 1:
928 PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
929 break;
930 }
931 }
932
933 prvm_builtin_t vm_m_builtins[] = {
934 NULL, // #0 NULL function (not callable)
935 VM_checkextension, // #1
936 VM_error, // #2
937 VM_objerror, // #3
938 VM_print, // #4
939 VM_bprint, // #5
940 VM_sprint, // #6
941 VM_centerprint, // #7
942 VM_normalize, // #8
943 VM_vlen, // #9
944 VM_vectoyaw, // #10
945 VM_vectoangles, // #11
946 VM_random, // #12
947 VM_localcmd, // #13
948 VM_cvar, // #14
949 VM_cvar_set, // #15
950 VM_dprint, // #16
951 VM_ftos, // #17
952 VM_fabs, // #18
953 VM_vtos, // #19
954 VM_etos, // #20
955 VM_stof, // #21
956 VM_spawn, // #22
957 VM_remove, // #23
958 VM_find, // #24
959 VM_findfloat, // #25
960 VM_findchain, // #26
961 VM_findchainfloat, // #27
962 VM_precache_file, // #28
963 VM_precache_sound, // #29
964 VM_coredump, // #30
965 VM_traceon, // #31
966 VM_traceoff, // #32
967 VM_eprint, // #33
968 VM_rint, // #34
969 VM_floor, // #35
970 VM_ceil, // #36
971 VM_nextent, // #37
972 VM_sin, // #38
973 VM_cos, // #39
974 VM_sqrt, // #40
975 VM_randomvec, // #41
976 VM_registercvar, // #42
977 VM_min, // #43
978 VM_max, // #44
979 VM_bound, // #45
980 VM_pow, // #46
981 VM_M_copyentity, // #47
982 VM_fopen, // #48
983 VM_fclose, // #49
984 VM_fgets, // #50
985 VM_fputs, // #51
986 VM_strlen, // #52
987 VM_strcat, // #53
988 VM_substring, // #54
989 VM_stov, // #55
990 VM_strzone, // #56
991 VM_strunzone, // #57
992 VM_tokenize, // #58
993 VM_argv, // #59
994 VM_isserver, // #60
995 VM_clientcount, // #61
996 VM_clientstate, // #62
997 VM_clcommand, // #63
998 VM_changelevel, // #64
999 VM_localsound, // #65
1000 VM_M_getmousepos, // #66
1001 VM_gettime, // #67
1002 VM_loadfromdata, // #68
1003 VM_loadfromfile, // #69
1004 VM_modulo, // #70
1005 VM_cvar_string, // #71
1006 VM_crash, // #72
1007 VM_stackdump, // #73
1008 VM_search_begin, // #74
1009 VM_search_end, // #75
1010 VM_search_getsize, // #76
1011 VM_search_getfilename, // #77
1012 VM_chr, // #78
1013 VM_itof, // #79
1014 VM_ftoe, // #80
1015 VM_itof, // #81 isString
1016 VM_altstr_count, // #82
1017 VM_altstr_prepare, // #83
1018 VM_altstr_get, // #84
1019 VM_altstr_set, // #85
1020 VM_altstr_ins, // #86
1021 VM_findflags, // #87
1022 VM_findchainflags, // #88
1023 VM_cvar_defstring, // #89
1024 // deactivate support for model rendering in the menu until someone has time to do it right [3/2/2008 Andreas]
1025 #if 0
1026 VM_CL_setmodel, // #90 void(entity e, string m) setmodel (QUAKE)
1027 VM_CL_precache_model, // #91 void(string s) precache_model (QUAKE)
1028 VM_CL_setorigin, // #92 void(entity e, vector o) setorigin (QUAKE)
1029 #else
1030 NULL,
1031 NULL,
1032 NULL,
1033 #endif
1034 NULL, // #93
1035 NULL, // #94
1036 NULL, // #95
1037 NULL, // #96
1038 NULL, // #97
1039 NULL, // #98
1040 NULL, // #99
1041 NULL, // #100
1042 NULL, // #101
1043 NULL, // #102
1044 NULL, // #103
1045 NULL, // #104
1046 NULL, // #105
1047 NULL, // #106
1048 NULL, // #107
1049 NULL, // #108
1050 NULL, // #109
1051 NULL, // #110
1052 NULL, // #111
1053 NULL, // #112
1054 NULL, // #113
1055 NULL, // #114
1056 NULL, // #115
1057 NULL, // #116
1058 NULL, // #117
1059 NULL, // #118
1060 NULL, // #119
1061 NULL, // #120
1062 NULL, // #121
1063 NULL, // #122
1064 NULL, // #123
1065 NULL, // #124
1066 NULL, // #125
1067 NULL, // #126
1068 NULL, // #127
1069 NULL, // #128
1070 NULL, // #129
1071 NULL, // #130
1072 NULL, // #131
1073 NULL, // #132
1074 NULL, // #133
1075 NULL, // #134
1076 NULL, // #135
1077 NULL, // #136
1078 NULL, // #137
1079 NULL, // #138
1080 NULL, // #139
1081 NULL, // #140
1082 NULL, // #141
1083 NULL, // #142
1084 NULL, // #143
1085 NULL, // #144
1086 NULL, // #145
1087 NULL, // #146
1088 NULL, // #147
1089 NULL, // #148
1090 NULL, // #149
1091 NULL, // #150
1092 NULL, // #151
1093 NULL, // #152
1094 NULL, // #153
1095 NULL, // #154
1096 NULL, // #155
1097 NULL, // #156
1098 NULL, // #157
1099 NULL, // #158
1100 NULL, // #159
1101 NULL, // #160
1102 NULL, // #161
1103 NULL, // #162
1104 NULL, // #163
1105 NULL, // #164
1106 NULL, // #165
1107 NULL, // #166
1108 NULL, // #167
1109 NULL, // #168
1110 NULL, // #169
1111 NULL, // #170
1112 NULL, // #171
1113 NULL, // #172
1114 NULL, // #173
1115 NULL, // #174
1116 NULL, // #175
1117 NULL, // #176
1118 NULL, // #177
1119 NULL, // #178
1120 NULL, // #179
1121 NULL, // #180
1122 NULL, // #181
1123 NULL, // #182
1124 NULL, // #183
1125 NULL, // #184
1126 NULL, // #185
1127 NULL, // #186
1128 NULL, // #187
1129 NULL, // #188
1130 NULL, // #189
1131 NULL, // #190
1132 NULL, // #191
1133 NULL, // #192
1134 NULL, // #193
1135 NULL, // #194
1136 NULL, // #195
1137 NULL, // #196
1138 NULL, // #197
1139 NULL, // #198
1140 NULL, // #199
1141 NULL, // #200
1142 NULL, // #201
1143 NULL, // #202
1144 NULL, // #203
1145 NULL, // #204
1146 NULL, // #205
1147 NULL, // #206
1148 NULL, // #207
1149 NULL, // #208
1150 NULL, // #209
1151 NULL, // #210
1152 NULL, // #211
1153 NULL, // #212
1154 NULL, // #213
1155 NULL, // #214
1156 NULL, // #215
1157 NULL, // #216
1158 NULL, // #217
1159 NULL, // #218
1160 NULL, // #219
1161 NULL, // #220
1162 VM_strstrofs, // #221 float(string str, string sub[, float startpos]) strstrofs (FTE_STRINGS)
1163 VM_str2chr, // #222 float(string str, float ofs) str2chr (FTE_STRINGS)
1164 VM_chr2str, // #223 string(float c, ...) chr2str (FTE_STRINGS)
1165 VM_strconv, // #224 string(float ccase, float calpha, float cnum, string s, ...) strconv (FTE_STRINGS)
1166 VM_strpad, // #225 string(float chars, string s, ...) strpad (FTE_STRINGS)
1167 VM_infoadd, // #226 string(string info, string key, string value, ...) infoadd (FTE_STRINGS)
1168 VM_infoget, // #227 string(string info, string key) infoget (FTE_STRINGS)
1169 VM_strncmp, // #228 float(string s1, string s2, float len) strncmp (FTE_STRINGS)
1170 VM_strncasecmp, // #229 float(string s1, string s2) strcasecmp (FTE_STRINGS)
1171 VM_strncasecmp, // #230 float(string s1, string s2, float len) strncasecmp (FTE_STRINGS)
1172 NULL, // #231
1173 NULL, // #232
1174 NULL, // #233
1175 NULL, // #234
1176 NULL, // #235
1177 NULL, // #236
1178 NULL, // #237
1179 NULL, // #238
1180 NULL, // #239
1181 NULL, // #240
1182 NULL, // #241
1183 NULL, // #242
1184 NULL, // #243
1185 NULL, // #244
1186 NULL, // #245
1187 NULL, // #246
1188 NULL, // #247
1189 NULL, // #248
1190 NULL, // #249
1191 NULL, // #250
1192 NULL, // #251
1193 NULL, // #252
1194 NULL, // #253
1195 NULL, // #254
1196 NULL, // #255
1197 NULL, // #256
1198 NULL, // #257
1199 NULL, // #258
1200 NULL, // #259
1201 NULL, // #260
1202 NULL, // #261
1203 NULL, // #262
1204 NULL, // #263
1205 NULL, // #264
1206 NULL, // #265
1207 NULL, // #266
1208 NULL, // #267
1209 NULL, // #268
1210 NULL, // #269
1211 NULL, // #270
1212 NULL, // #271
1213 NULL, // #272
1214 NULL, // #273
1215 NULL, // #274
1216 NULL, // #275
1217 NULL, // #276
1218 NULL, // #277
1219 NULL, // #278
1220 NULL, // #279
1221 NULL, // #280
1222 NULL, // #281
1223 NULL, // #282
1224 NULL, // #283
1225 NULL, // #284
1226 NULL, // #285
1227 NULL, // #286
1228 NULL, // #287
1229 NULL, // #288
1230 NULL, // #289
1231 NULL, // #290
1232 NULL, // #291
1233 NULL, // #292
1234 NULL, // #293
1235 NULL, // #294
1236 NULL, // #295
1237 NULL, // #296
1238 NULL, // #297
1239 NULL, // #298
1240 NULL, // #299
1241 // deactivate support for model rendering in the menu until someone has time to do it right [3/2/2008 Andreas]
1242 #if 0
1243 // CSQC range #300-#399
1244 VM_CL_R_ClearScene, // #300 void() clearscene (DP_QC_RENDER_SCENE)
1245 VM_CL_R_AddEntities, // #301 void(float mask) addentities (DP_QC_RENDER_SCENE)
1246 VM_CL_R_AddEntity, // #302 void(entity ent) addentity (DP_QC_RENDER_SCENE)
1247 VM_CL_R_SetView, // #303 float(float property, ...) setproperty (DP_QC_RENDER_SCENE)
1248 VM_CL_R_RenderScene, // #304 void() renderscene (DP_QC_RENDER_SCENE)
1249 VM_CL_R_AddDynamicLight, // #305 void(vector org, float radius, vector lightcolours) adddynamiclight (DP_QC_RENDER_SCENE)
1250 VM_CL_R_PolygonBegin, // #306 void(string texturename, float flag[, float is2d, float lines]) R_BeginPolygon (DP_QC_RENDER_SCENE)
1251 VM_CL_R_PolygonVertex, // #307 void(vector org, vector texcoords, vector rgb, float alpha) R_PolygonVertex (DP_QC_RENDER_SCENE)
1252 VM_CL_R_PolygonEnd, // #308 void() R_EndPolygon
1253 NULL/*VM_CL_R_LoadWorldModel*/, // #309 void(string modelname) R_LoadWorldModel
1254 // TODO: rearrange and merge all builtin lists and share as many extensions as possible between all VM instances [1/27/2008 Andreas]
1255 VM_CL_setattachment, // #310 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS) (DP_QC_RENDER_SCENE)
1256 VM_CL_gettagindex, // #311 float(entity ent, string tagname) gettagindex (DP_QC_GETTAGINFO) (DP_QC_RENDER_SCENE)
1257 VM_CL_gettaginfo, // #312 vector(entity ent, float tagindex) gettaginfo (DP_QC_GETTAGINFO) (DP_QC_RENDER_SCENE)
1258 #else
1259 // CSQC range #300-#399
1260 NULL,
1261 NULL,
1262 NULL,
1263 NULL,
1264 NULL,
1265 NULL,
1266 NULL,
1267 NULL,
1268 NULL,
1269 NULL,
1270 NULL,
1271 NULL,
1272 NULL,
1273 #endif
1274 NULL, // #313
1275 NULL, // #314
1276 NULL, // #315
1277 NULL, // #316
1278 NULL, // #317
1279 NULL, // #318
1280 NULL, // #319
1281 NULL, // #320
1282 NULL, // #321
1283 NULL, // #322
1284 NULL, // #323
1285 NULL, // #324
1286 NULL, // #325
1287 NULL, // #326
1288 NULL, // #327
1289 NULL, // #328
1290 NULL, // #329
1291 NULL, // #330
1292 NULL, // #331
1293 NULL, // #332
1294 NULL, // #333
1295 NULL, // #334
1296 NULL, // #335
1297 NULL, // #336
1298 NULL, // #337
1299 NULL, // #338
1300 NULL, // #339
1301 VM_keynumtostring, // #340 string keynumtostring(float keynum)
1302 VM_stringtokeynum, // #341 float stringtokeynum(string key)
1303 VM_getkeybind, // #342 string(float keynum[, float bindmap]) getkeybind (EXT_CSQC)
1304 NULL, // #343
1305 NULL, // #344
1306 NULL, // #345
1307 NULL, // #346
1308 NULL, // #347
1309 NULL, // #348
1310 VM_CL_isdemo, // #349
1311 NULL, // #350
1312 NULL, // #351
1313 NULL, // #352
1314 VM_wasfreed, // #353 float(entity ent) wasfreed
1315 NULL, // #354
1316 VM_CL_videoplaying, // #355
1317 VM_findfont, // #356 float(string fontname) loadfont (DP_GFX_FONTS)
1318 VM_loadfont, // #357 float(string fontname, string fontmaps, string sizes, float slot) loadfont (DP_GFX_FONTS)
1319 NULL, // #358
1320 NULL, // #359
1321 NULL, // #360
1322 NULL, // #361
1323 NULL, // #362
1324 NULL, // #363
1325 NULL, // #364
1326 NULL, // #365
1327 NULL, // #366
1328 NULL, // #367
1329 NULL, // #368
1330 NULL, // #369
1331 NULL, // #370
1332 NULL, // #371
1333 NULL, // #372
1334 NULL, // #373
1335 NULL, // #374
1336 NULL, // #375
1337 NULL, // #376
1338 NULL, // #377
1339 NULL, // #378
1340 NULL, // #379
1341 NULL, // #380
1342 NULL, // #381
1343 NULL, // #382
1344 NULL, // #383
1345 NULL, // #384
1346 NULL, // #385
1347 NULL, // #386
1348 NULL, // #387
1349 NULL, // #388
1350 NULL, // #389
1351 NULL, // #390
1352 NULL, // #391
1353 NULL, // #392
1354 NULL, // #393
1355 NULL, // #394
1356 NULL, // #395
1357 NULL, // #396
1358 NULL, // #397
1359 NULL, // #398
1360 NULL, // #399
1361 NULL, // #400
1362 VM_M_WriteByte, // #401
1363 VM_M_WriteChar, // #402
1364 VM_M_WriteShort, // #403
1365 VM_M_WriteLong, // #404
1366 VM_M_WriteAngle, // #405
1367 VM_M_WriteCoord, // #406
1368 VM_M_WriteString, // #407
1369 VM_M_WriteEntity, // #408
1370 NULL, // #409
1371 NULL, // #410
1372 NULL, // #411
1373 NULL, // #412
1374 NULL, // #413
1375 NULL, // #414
1376 NULL, // #415
1377 NULL, // #416
1378 NULL, // #417
1379 NULL, // #418
1380 NULL, // #419
1381 NULL, // #420
1382 NULL, // #421
1383 NULL, // #422
1384 NULL, // #423
1385 NULL, // #424
1386 NULL, // #425
1387 NULL, // #426
1388 NULL, // #427
1389 NULL, // #428
1390 NULL, // #429
1391 NULL, // #430
1392 NULL, // #431
1393 NULL, // #432
1394 NULL, // #433
1395 NULL, // #434
1396 NULL, // #435
1397 NULL, // #436
1398 NULL, // #437
1399 NULL, // #438
1400 NULL, // #439
1401 VM_buf_create, // #440 float() buf_create (DP_QC_STRINGBUFFERS)
1402 VM_buf_del, // #441 void(float bufhandle) buf_del (DP_QC_STRINGBUFFERS)
1403 VM_buf_getsize, // #442 float(float bufhandle) buf_getsize (DP_QC_STRINGBUFFERS)
1404 VM_buf_copy, // #443 void(float bufhandle_from, float bufhandle_to) buf_copy (DP_QC_STRINGBUFFERS)
1405 VM_buf_sort, // #444 void(float bufhandle, float sortpower, float backward) buf_sort (DP_QC_STRINGBUFFERS)
1406 VM_buf_implode, // #445 string(float bufhandle, string glue) buf_implode (DP_QC_STRINGBUFFERS)
1407 VM_bufstr_get, // #446 string(float bufhandle, float string_index) bufstr_get (DP_QC_STRINGBUFFERS)
1408 VM_bufstr_set, // #447 void(float bufhandle, float string_index, string str) bufstr_set (DP_QC_STRINGBUFFERS)
1409 VM_bufstr_add, // #448 float(float bufhandle, string str, float order) bufstr_add (DP_QC_STRINGBUFFERS)
1410 VM_bufstr_free, // #449 void(float bufhandle, float string_index) bufstr_free (DP_QC_STRINGBUFFERS)
1411 NULL, // #450
1412 VM_iscachedpic, // #451 draw functions...
1413 VM_precache_pic, // #452
1414 VM_freepic, // #453
1415 VM_drawcharacter, // #454
1416 VM_drawstring, // #455
1417 VM_drawpic, // #456
1418 VM_drawfill, // #457
1419 VM_drawsetcliparea, // #458
1420 VM_drawresetcliparea, // #459
1421 VM_getimagesize, // #460
1422 VM_cin_open, // #461
1423 VM_cin_close, // #462
1424 VM_cin_setstate, // #463
1425 VM_cin_getstate, // #464
1426 VM_cin_restart, // #465
1427 VM_drawline, // #466
1428 VM_drawcolorcodedstring, // #467
1429 VM_stringwidth, // #468
1430 VM_drawsubpic, // #469
1431 VM_drawrotpic, // #470
1432 VM_asin, // #471 float(float s) VM_asin (DP_QC_ASINACOSATANATAN2TAN)
1433 VM_acos, // #472 float(float c) VM_acos (DP_QC_ASINACOSATANATAN2TAN)
1434 VM_atan, // #473 float(float t) VM_atan (DP_QC_ASINACOSATANATAN2TAN)
1435 VM_atan2, // #474 float(float c, float s) VM_atan2 (DP_QC_ASINACOSATANATAN2TAN)
1436 VM_tan, // #475 float(float a) VM_tan (DP_QC_ASINACOSATANATAN2TAN)
1437 VM_strlennocol, // #476 float(string s) : DRESK - String Length (not counting color codes) (DP_QC_STRINGCOLORFUNCTIONS)
1438 VM_strdecolorize, // #477 string(string s) : DRESK - Decolorized String (DP_QC_STRINGCOLORFUNCTIONS)
1439 VM_strftime, // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
1440 VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
1441 VM_strtolower, // #480 string(string s) VM_strtolower : DRESK - Return string as lowercase
1442 VM_strtoupper, // #481 string(string s) VM_strtoupper : DRESK - Return string as uppercase
1443 NULL, // #482
1444 NULL, // #483
1445 VM_strreplace, // #484 string(string search, string replace, string subject) strreplace (DP_QC_STRREPLACE)
1446 VM_strireplace, // #485 string(string search, string replace, string subject) strireplace (DP_QC_STRREPLACE)
1447 NULL, // #486
1448 VM_gecko_create, // #487 float gecko_create( string name )
1449 VM_gecko_destroy, // #488 void gecko_destroy( string name )
1450 VM_gecko_navigate, // #489 void gecko_navigate( string name, string URI )
1451 VM_gecko_keyevent, // #490 float gecko_keyevent( string name, float key, float eventtype )
1452 VM_gecko_movemouse, // #491 void gecko_mousemove( string name, float x, float y )
1453 VM_gecko_resize, // #492 void gecko_resize( string name, float w, float h )
1454 VM_gecko_get_texture_extent, // #493 vector gecko_get_texture_extent( string name )
1455 VM_crc16, // #494 float(float caseinsensitive, string s, ...) crc16 = #494 (DP_QC_CRC16)
1456 VM_cvar_type, // #495 float(string name) cvar_type = #495; (DP_QC_CVAR_TYPE)
1457 VM_numentityfields, // #496 float() numentityfields = #496; (QP_QC_ENTITYDATA)
1458 VM_entityfieldname, // #497 string(float fieldnum) entityfieldname = #497; (DP_QC_ENTITYDATA)
1459 VM_entityfieldtype, // #498 float(float fieldnum) entityfieldtype = #498; (DP_QC_ENTITYDATA)
1460 VM_getentityfieldstring, // #499 string(float fieldnum, entity ent) getentityfieldstring = #499; (DP_QC_ENTITYDATA)
1461 VM_putentityfieldstring, // #500 float(float fieldnum, entity ent, string s) putentityfieldstring = #500; (DP_QC_ENTITYDATA)
1462 NULL, // #501
1463 NULL, // #502
1464 VM_whichpack, // #503 string(string) whichpack = #503;
1465 NULL, // #504
1466 NULL, // #505
1467 NULL, // #506
1468 NULL, // #507
1469 NULL, // #508
1470 NULL, // #509
1471 VM_uri_escape, // #510 string(string in) uri_escape = #510;
1472 VM_uri_unescape, // #511 string(string in) uri_unescape = #511;
1473 VM_etof, // #512 float(entity ent) num_for_edict = #512 (DP_QC_NUM_FOR_EDICT)
1474 VM_uri_get, // #513 float(string uri, float id, [string post_contenttype, string post_delim, [float buf]]) uri_get = #513; (DP_QC_URI_GET, DP_QC_URI_POST)
1475 VM_tokenize_console, // #514 float(string str) tokenize_console = #514; (DP_QC_TOKENIZE_CONSOLE)
1476 VM_argv_start_index, // #515 float(float idx) argv_start_index = #515; (DP_QC_TOKENIZE_CONSOLE)
1477 VM_argv_end_index, // #516 float(float idx) argv_end_index = #516; (DP_QC_TOKENIZE_CONSOLE)
1478 VM_buf_cvarlist, // #517 void(float buf, string prefix, string antiprefix) buf_cvarlist = #517; (DP_QC_STRINGBUFFERS_CVARLIST)
1479 VM_cvar_description, // #518 float(string name) cvar_description = #518; (DP_QC_CVAR_DESCRIPTION)
1480 NULL, // #519
1481 NULL, // #520
1482 NULL, // #521
1483 NULL, // #522
1484 NULL, // #523
1485 NULL, // #524
1486 NULL, // #525
1487 NULL, // #526
1488 NULL, // #527
1489 NULL, // #528
1490 NULL, // #529
1491 NULL, // #530
1492 NULL, // #531
1493 VM_log, // #532
1494 VM_getsoundtime, // #533 float(entity e, float channel) getsoundtime = #533; (DP_SND_GETSOUNDTIME)
1495 VM_soundlength, // #534 float(string sample) soundlength = #534; (DP_SND_GETSOUNDTIME)
1496 VM_buf_loadfile, // #535 float(string filename, float bufhandle) buf_loadfile (DP_QC_STRINGBUFFERS_EXT_WIP)
1497 VM_buf_writefile, // #536 float(float filehandle, float bufhandle, float startpos, float numstrings) buf_writefile (DP_QC_STRINGBUFFERS_EXT_WIP)
1498 VM_bufstr_find, // #537 float(float bufhandle, string match, float matchrule, float startpos) bufstr_find (DP_QC_STRINGBUFFERS_EXT_WIP)
1499 VM_matchpattern, // #538 float(string s, string pattern, float matchrule) matchpattern (DP_QC_STRINGBUFFERS_EXT_WIP)
1500 NULL, // #539
1501 NULL, // #540
1502 NULL, // #541
1503 NULL, // #542
1504 NULL, // #543
1505 NULL, // #544
1506 NULL, // #545
1507 NULL, // #546
1508 NULL, // #547
1509 NULL, // #548
1510 NULL, // #549
1511 NULL, // #550
1512 NULL, // #551
1513 NULL, // #552
1514 NULL, // #553
1515 NULL, // #554
1516 NULL, // #555
1517 NULL, // #556
1518 NULL, // #557
1519 NULL, // #558
1520 NULL, // #559
1521 NULL, // #560
1522 NULL, // #561
1523 NULL, // #562
1524 NULL, // #563
1525 NULL, // #564
1526 NULL, // #565
1527 NULL, // #566
1528 NULL, // #567
1529 NULL, // #568
1530 NULL, // #569
1531 NULL, // #570
1532 NULL, // #571
1533 NULL, // #572
1534 NULL, // #573
1535 NULL, // #574
1536 NULL, // #575
1537 NULL, // #576
1538 NULL, // #577
1539 NULL, // #578
1540 NULL, // #579
1541 NULL, // #580
1542 NULL, // #581
1543 NULL, // #582
1544 NULL, // #583
1545 NULL, // #584
1546 NULL, // #585
1547 NULL, // #586
1548 NULL, // #587
1549 NULL, // #588
1550 NULL, // #589
1551 NULL, // #590
1552 NULL, // #591
1553 NULL, // #592
1554 NULL, // #593
1555 NULL, // #594
1556 NULL, // #595
1557 NULL, // #596
1558 NULL, // #597
1559 NULL, // #598
1560 NULL, // #599
1561 NULL, // #600
1562 VM_M_setkeydest, // #601 void setkeydest(float dest)
1563 VM_M_getkeydest, // #602 float getkeydest(void)
1564 VM_M_setmousetarget, // #603 void setmousetarget(float trg)
1565 VM_M_getmousetarget, // #604 float getmousetarget(void)
1566 VM_callfunction, // #605 void callfunction(...)
1567 VM_writetofile, // #606 void writetofile(float fhandle, entity ent)
1568 VM_isfunction, // #607 float isfunction(string function_name)
1569 VM_M_getresolution, // #608 vector getresolution(float number, [float forfullscreen])
1570 VM_keynumtostring, // #609 string keynumtostring(float keynum)
1571 VM_findkeysforcommand, // #610 string findkeysforcommand(string command[, float bindmap])
1572 VM_M_getserverliststat, // #611 float gethostcachevalue(float type)
1573 VM_M_getserverliststring, // #612 string gethostcachestring(float type, float hostnr)
1574 VM_parseentitydata, // #613 void parseentitydata(entity ent, string data)
1575 VM_stringtokeynum, // #614 float stringtokeynum(string key)
1576 VM_M_resetserverlistmasks, // #615 void resethostcachemasks(void)
1577 VM_M_setserverlistmaskstring, // #616 void sethostcachemaskstring(float mask, float fld, string str, float op)
1578 VM_M_setserverlistmasknumber, // #617 void sethostcachemasknumber(float mask, float fld, float num, float op)
1579 VM_M_resortserverlist, // #618 void resorthostcache(void)
1580 VM_M_setserverlistsort, // #619 void sethostcachesort(float fld, float descending)
1581 VM_M_refreshserverlist, // #620 void refreshhostcache(void)
1582 VM_M_getserverlistnumber, // #621 float gethostcachenumber(float fld, float hostnr)
1583 VM_M_getserverlistindexforkey,// #622 float gethostcacheindexforkey(string key)
1584 VM_M_addwantedserverlistkey, // #623 void addwantedhostcachekey(string key)
1585 VM_CL_getextresponse, // #624 string getextresponse(void)
1586 VM_netaddress_resolve, // #625 string netaddress_resolve(string, float)
1587 VM_M_getgamedirinfo, // #626 string getgamedirinfo(float n, float prop)
1588 VM_sprintf, // #627 string sprintf(string format, ...)
1589 NULL, // #628
1590 NULL, // #629
1591 VM_setkeybind, // #630 float(float key, string bind[, float bindmap]) setkeybind
1592 VM_getbindmaps, // #631 vector(void) getbindmap
1593 VM_setbindmaps, // #632 float(vector bm) setbindmap
1594 VM_M_crypto_getkeyfp, // #633 string(string addr) crypto_getkeyfp
1595 VM_M_crypto_getidfp, // #634 string(string addr) crypto_getidfp
1596 VM_M_crypto_getencryptlevel, // #635 string(string addr) crypto_getencryptlevel
1597 VM_M_crypto_getmykeyfp, // #636 string(float addr) crypto_getmykeyfp
1598 VM_M_crypto_getmyidfp, // #637 string(float addr) crypto_getmyidfp
1599 NULL, // #638
1600 VM_digest_hex, // #639
1601 NULL, // #640
1602 VM_M_crypto_getmyidstatus, // #641 float(float i) crypto_getmyidstatus
1603 VM_coverage, // #642
1604 VM_M_crypto_getidstatus, // #643 float(string addr) crypto_getidstatus
1605 NULL
1606 };
1607
1608 const int vm_m_numbuiltins = sizeof(vm_m_builtins) / sizeof(prvm_builtin_t);
1609
MVM_init_cmd(prvm_prog_t * prog)1610 void MVM_init_cmd(prvm_prog_t *prog)
1611 {
1612 r_refdef_scene_t *scene;
1613
1614 VM_Cmd_Init(prog);
1615 VM_Polygons_Reset(prog);
1616
1617 scene = R_GetScenePointer( RST_MENU );
1618
1619 memset (scene, 0, sizeof (*scene));
1620
1621 scene->maxtempentities = 128;
1622 scene->tempentities = (entity_render_t*) Mem_Alloc(prog->progs_mempool, sizeof(entity_render_t) * scene->maxtempentities);
1623
1624 scene->maxentities = MAX_EDICTS + 256 + 512;
1625 scene->entities = (entity_render_t **)Mem_Alloc(prog->progs_mempool, sizeof(entity_render_t *) * scene->maxentities);
1626
1627 scene->ambient = 32.0f;
1628 }
1629
MVM_reset_cmd(prvm_prog_t * prog)1630 void MVM_reset_cmd(prvm_prog_t *prog)
1631 {
1632 // note: the menu's render entities are automatically freed when the prog's pool is freed
1633
1634 //VM_Cmd_Init();
1635 VM_Cmd_Reset(prog);
1636 VM_Polygons_Reset(prog);
1637 }
1638