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