DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
csprogs.c
Go to the documentation of this file.
1/*
2Copyright (C) 2006-2021 DarkPlaces contributors
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19*/
20
21#include "quakedef.h"
22#include "progsvm.h"
23#include "clprogdefs.h"
24#include "csprogs.h"
25#include "cl_collision.h"
26#include "snd_main.h"
27#include "clvm_cmds.h"
28#include "prvm_cmds.h"
29
30//============================================================================
31// Client prog handling
32//[515]: omg !!! optimize it ! a lot of hacks here and there also :P
33
34#define CSQC_RETURNVAL prog->globals.fp[OFS_RETURN]
35
37{
38 prvm_prog_t *prog = CLVM_prog;
39
40 if(!prog->loaded)
41 return;
42
45}
46
47
54static void CL_CheckRequiredFuncs(prvm_prog_t *prog, const char *filename)
55{
56 if (PRVM_ED_FindFunction(prog, "CSQC_UpdateView"))
57 return;
58 else if (PRVM_ED_FindFunction(prog, "CSQC_DrawHud"))
59 prog->flag |= PRVM_CSQC_SIMPLE;
60 else
61 prog->error_cmd("%s: no CSQC_UpdateView (EXT_CSQC) or CSQC_DrawHud (CSQC_SIMPLE) function found in %s", prog->name, filename);
62}
63
64#define CL_REQFIELDS (sizeof(cl_reqfields) / sizeof(prvm_required_field_t))
65
67{
68#define PRVM_DECLARE_serverglobalfloat(x)
69#define PRVM_DECLARE_serverglobalvector(x)
70#define PRVM_DECLARE_serverglobalstring(x)
71#define PRVM_DECLARE_serverglobaledict(x)
72#define PRVM_DECLARE_serverglobalfunction(x)
73#define PRVM_DECLARE_clientglobalfloat(x)
74#define PRVM_DECLARE_clientglobalvector(x)
75#define PRVM_DECLARE_clientglobalstring(x)
76#define PRVM_DECLARE_clientglobaledict(x)
77#define PRVM_DECLARE_clientglobalfunction(x)
78#define PRVM_DECLARE_menuglobalfloat(x)
79#define PRVM_DECLARE_menuglobalvector(x)
80#define PRVM_DECLARE_menuglobalstring(x)
81#define PRVM_DECLARE_menuglobaledict(x)
82#define PRVM_DECLARE_menuglobalfunction(x)
83#define PRVM_DECLARE_serverfieldfloat(x)
84#define PRVM_DECLARE_serverfieldvector(x)
85#define PRVM_DECLARE_serverfieldstring(x)
86#define PRVM_DECLARE_serverfieldedict(x)
87#define PRVM_DECLARE_serverfieldfunction(x)
88#define PRVM_DECLARE_clientfieldfloat(x) {ev_float, #x },
89#define PRVM_DECLARE_clientfieldvector(x) {ev_vector, #x },
90#define PRVM_DECLARE_clientfieldstring(x) {ev_string, #x },
91#define PRVM_DECLARE_clientfieldedict(x) {ev_entity, #x },
92#define PRVM_DECLARE_clientfieldfunction(x) {ev_function, #x },
93#define PRVM_DECLARE_menufieldfloat(x)
94#define PRVM_DECLARE_menufieldvector(x)
95#define PRVM_DECLARE_menufieldstring(x)
96#define PRVM_DECLARE_menufieldedict(x)
97#define PRVM_DECLARE_menufieldfunction(x)
98#define PRVM_DECLARE_serverfunction(x)
99#define PRVM_DECLARE_clientfunction(x)
100#define PRVM_DECLARE_menufunction(x)
101#define PRVM_DECLARE_field(x)
102#define PRVM_DECLARE_global(x)
103#define PRVM_DECLARE_function(x)
104#include "prvm_offsets.h"
105#undef PRVM_DECLARE_serverglobalfloat
106#undef PRVM_DECLARE_serverglobalvector
107#undef PRVM_DECLARE_serverglobalstring
108#undef PRVM_DECLARE_serverglobaledict
109#undef PRVM_DECLARE_serverglobalfunction
110#undef PRVM_DECLARE_clientglobalfloat
111#undef PRVM_DECLARE_clientglobalvector
112#undef PRVM_DECLARE_clientglobalstring
113#undef PRVM_DECLARE_clientglobaledict
114#undef PRVM_DECLARE_clientglobalfunction
115#undef PRVM_DECLARE_menuglobalfloat
116#undef PRVM_DECLARE_menuglobalvector
117#undef PRVM_DECLARE_menuglobalstring
118#undef PRVM_DECLARE_menuglobaledict
119#undef PRVM_DECLARE_menuglobalfunction
120#undef PRVM_DECLARE_serverfieldfloat
121#undef PRVM_DECLARE_serverfieldvector
122#undef PRVM_DECLARE_serverfieldstring
123#undef PRVM_DECLARE_serverfieldedict
124#undef PRVM_DECLARE_serverfieldfunction
125#undef PRVM_DECLARE_clientfieldfloat
126#undef PRVM_DECLARE_clientfieldvector
127#undef PRVM_DECLARE_clientfieldstring
128#undef PRVM_DECLARE_clientfieldedict
129#undef PRVM_DECLARE_clientfieldfunction
130#undef PRVM_DECLARE_menufieldfloat
131#undef PRVM_DECLARE_menufieldvector
132#undef PRVM_DECLARE_menufieldstring
133#undef PRVM_DECLARE_menufieldedict
134#undef PRVM_DECLARE_menufieldfunction
135#undef PRVM_DECLARE_serverfunction
136#undef PRVM_DECLARE_clientfunction
137#undef PRVM_DECLARE_menufunction
138#undef PRVM_DECLARE_field
139#undef PRVM_DECLARE_global
140#undef PRVM_DECLARE_function
141};
142
143#define CL_REQGLOBALS (sizeof(cl_reqglobals) / sizeof(prvm_required_field_t))
144
146{
147#define PRVM_DECLARE_serverglobalfloat(x)
148#define PRVM_DECLARE_serverglobalvector(x)
149#define PRVM_DECLARE_serverglobalstring(x)
150#define PRVM_DECLARE_serverglobaledict(x)
151#define PRVM_DECLARE_serverglobalfunction(x)
152#define PRVM_DECLARE_clientglobalfloat(x) {ev_float, #x},
153#define PRVM_DECLARE_clientglobalvector(x) {ev_vector, #x},
154#define PRVM_DECLARE_clientglobalstring(x) {ev_string, #x},
155#define PRVM_DECLARE_clientglobaledict(x) {ev_entity, #x},
156#define PRVM_DECLARE_clientglobalfunction(x) {ev_function, #x},
157#define PRVM_DECLARE_menuglobalfloat(x)
158#define PRVM_DECLARE_menuglobalvector(x)
159#define PRVM_DECLARE_menuglobalstring(x)
160#define PRVM_DECLARE_menuglobaledict(x)
161#define PRVM_DECLARE_menuglobalfunction(x)
162#define PRVM_DECLARE_serverfieldfloat(x)
163#define PRVM_DECLARE_serverfieldvector(x)
164#define PRVM_DECLARE_serverfieldstring(x)
165#define PRVM_DECLARE_serverfieldedict(x)
166#define PRVM_DECLARE_serverfieldfunction(x)
167#define PRVM_DECLARE_clientfieldfloat(x)
168#define PRVM_DECLARE_clientfieldvector(x)
169#define PRVM_DECLARE_clientfieldstring(x)
170#define PRVM_DECLARE_clientfieldedict(x)
171#define PRVM_DECLARE_clientfieldfunction(x)
172#define PRVM_DECLARE_menufieldfloat(x)
173#define PRVM_DECLARE_menufieldvector(x)
174#define PRVM_DECLARE_menufieldstring(x)
175#define PRVM_DECLARE_menufieldedict(x)
176#define PRVM_DECLARE_menufieldfunction(x)
177#define PRVM_DECLARE_serverfunction(x)
178#define PRVM_DECLARE_clientfunction(x)
179#define PRVM_DECLARE_menufunction(x)
180#define PRVM_DECLARE_field(x)
181#define PRVM_DECLARE_global(x)
182#define PRVM_DECLARE_function(x)
183#include "prvm_offsets.h"
184#undef PRVM_DECLARE_serverglobalfloat
185#undef PRVM_DECLARE_serverglobalvector
186#undef PRVM_DECLARE_serverglobalstring
187#undef PRVM_DECLARE_serverglobaledict
188#undef PRVM_DECLARE_serverglobalfunction
189#undef PRVM_DECLARE_clientglobalfloat
190#undef PRVM_DECLARE_clientglobalvector
191#undef PRVM_DECLARE_clientglobalstring
192#undef PRVM_DECLARE_clientglobaledict
193#undef PRVM_DECLARE_clientglobalfunction
194#undef PRVM_DECLARE_menuglobalfloat
195#undef PRVM_DECLARE_menuglobalvector
196#undef PRVM_DECLARE_menuglobalstring
197#undef PRVM_DECLARE_menuglobaledict
198#undef PRVM_DECLARE_menuglobalfunction
199#undef PRVM_DECLARE_serverfieldfloat
200#undef PRVM_DECLARE_serverfieldvector
201#undef PRVM_DECLARE_serverfieldstring
202#undef PRVM_DECLARE_serverfieldedict
203#undef PRVM_DECLARE_serverfieldfunction
204#undef PRVM_DECLARE_clientfieldfloat
205#undef PRVM_DECLARE_clientfieldvector
206#undef PRVM_DECLARE_clientfieldstring
207#undef PRVM_DECLARE_clientfieldedict
208#undef PRVM_DECLARE_clientfieldfunction
209#undef PRVM_DECLARE_menufieldfloat
210#undef PRVM_DECLARE_menufieldvector
211#undef PRVM_DECLARE_menufieldstring
212#undef PRVM_DECLARE_menufieldedict
213#undef PRVM_DECLARE_menufieldfunction
214#undef PRVM_DECLARE_serverfunction
215#undef PRVM_DECLARE_clientfunction
216#undef PRVM_DECLARE_menufunction
217#undef PRVM_DECLARE_field
218#undef PRVM_DECLARE_global
219#undef PRVM_DECLARE_function
220};
221
223{
224 prvm_prog_t *prog = CLVM_prog;
225
226 if(prog->loaded)
227 {
230 VectorCopy(dmg_origin, PRVM_clientglobalvector(dmg_origin));
231 }
232}
233
234void CSQC_UpdateNetworkTimes(double newtime, double oldtime)
235{
236 prvm_prog_t *prog = CLVM_prog;
237
238 if(!prog->loaded)
239 return;
240
241 PRVM_clientglobalfloat(servertime) = newtime;
242 PRVM_clientglobalfloat(serverprevtime) = oldtime;
243 PRVM_clientglobalfloat(serverdeltatime) = newtime - oldtime;
244}
245
246//[515]: set globals before calling R_UpdateView, WEIRD CRAP
247static void CSQC_SetGlobals (double frametime)
248{
250 prvm_prog_t *prog = CLVM_prog;
251
253 PRVM_clientglobalfloat(cltime) = host.realtime; // Spike named it that way.
258 // // FIXME: this actually belongs into getinputstate().. [12/17/2007 Black]
263
264 // LadyHavoc: Spike says not to do this, but without pmove_org the
265 // CSQC is useless as it can't alter the view origin without
266 // completely replacing it
270 PRVM_clientglobalfloat(pmove_onground) = cl.onground;
271 PRVM_clientglobalfloat(pmove_inwater) = cl.inwater;
272
277
279
281}
282
284{
285 prvm_prog_t *prog = CLVM_prog;
286 int b;
287 if(!PRVM_clientedictfunction(ed, predraw))
288 return;
291 prog->ExecuteProgram(prog, PRVM_clientedictfunction(ed, predraw), "CSQC_Predraw: NULL function\n");
293}
294
296{
297 prvm_prog_t *prog = CLVM_prog;
298 int b;
299 if(PRVM_clientedictfunction(ed, think))
301 {
305 prog->ExecuteProgram(prog, PRVM_clientedictfunction(ed, think), "CSQC_Think: NULL function\n");
307 }
308}
309
312{
313 prvm_prog_t *prog = CLVM_prog;
314 int renderflags;
315 int c;
316 float scale;
317 entity_render_t *entrender;
318 model_t *model;
319 prvm_vec3_t modellight_origin;
320
322 if (!model)
323 return false;
324
325 if (edictnum)
326 {
328 return false;
329 entrender = cl.csqcrenderentities + edictnum;
331 entrender->entitynumber = edictnum + MAX_EDICTS;
332 //entrender->shadertime = 0; // shadertime was set by spawn()
333 entrender->flags = 0;
334 entrender->effects = 0;
335 entrender->alpha = 1;
336 entrender->scale = 1;
337 VectorSet(entrender->colormod, 1, 1, 1);
338 VectorSet(entrender->glowmod, 1, 1, 1);
339 entrender->allowdecals = true;
340 }
341 else
342 {
343 entrender = CL_NewTempEntity(0);
344 if (!entrender)
345 return false;
346 }
347
348 entrender->userwavefunc_param[0] = PRVM_clientedictfloat(ed, userwavefunc_param0);
349 entrender->userwavefunc_param[1] = PRVM_clientedictfloat(ed, userwavefunc_param1);
350 entrender->userwavefunc_param[2] = PRVM_clientedictfloat(ed, userwavefunc_param2);
351 entrender->userwavefunc_param[3] = PRVM_clientedictfloat(ed, userwavefunc_param3);
352
353 entrender->model = model;
354 entrender->skinnum = (int)PRVM_clientedictfloat(ed, skin);
355 entrender->effects |= entrender->model->effects;
356 renderflags = (int)PRVM_clientedictfloat(ed, renderflags);
357 entrender->alpha = PRVM_clientedictfloat(ed, alpha);
358 entrender->scale = scale = PRVM_clientedictfloat(ed, scale);
362 if (!entrender->alpha)
363 entrender->alpha = 1.0f;
364 if (!entrender->scale)
365 entrender->scale = scale = 1.0f;
366 if (!VectorLength2(entrender->colormod))
367 VectorSet(entrender->colormod, 1, 1, 1);
368 if (!VectorLength2(entrender->glowmod))
369 VectorSet(entrender->glowmod, 1, 1, 1);
370
371 // LadyHavoc: use the CL_GetTagMatrix function on self to ensure consistent behavior (duplicate code would be bad)
372 // this also sets the custommodellight_origin for us
373 CL_GetTagMatrix(prog, &entrender->matrix, ed, 0, modellight_origin);
374 VectorCopy(modellight_origin, entrender->custommodellight_origin);
375
376 // set up the animation data
377 VM_GenerateFrameGroupBlend(prog, ed->priv.server->framegroupblend, ed);
378 VM_FrameBlendFromFrameGroupBlend(ed->priv.server->frameblend, ed->priv.server->framegroupblend, model, cl.time);
379 VM_UpdateEdictSkeleton(prog, ed, model, ed->priv.server->frameblend);
380 if (PRVM_clientedictfloat(ed, shadertime)) // hack for csprogs.dat files that do not set shadertime, leaves the value at entity spawn time
381 entrender->shadertime = PRVM_clientedictfloat(ed, shadertime);
382
383 // transparent offset
384 if (renderflags & RF_USETRANSPARENTOFFSET)
386
387 // model light
388 if (renderflags & RF_MODELLIGHT)
389 {
394 }
395
396 if(renderflags)
397 {
398 if(renderflags & RF_VIEWMODEL) entrender->flags |= RENDER_VIEWMODEL | RENDER_NODEPTHTEST;
399 if(renderflags & RF_EXTERNALMODEL) entrender->flags |= RENDER_EXTERIORMODEL;
400 if(renderflags & RF_WORLDOBJECT) entrender->flags |= RENDER_WORLDOBJECT;
401 if(renderflags & RF_DEPTHHACK) entrender->flags |= RENDER_NODEPTHTEST;
402 if(renderflags & RF_ADDITIVE) entrender->flags |= RENDER_ADDITIVE;
403 if(renderflags & RF_DYNAMICMODELLIGHT) entrender->flags |= RENDER_DYNAMICMODELLIGHT;
404 }
405
407 if (c <= 0)
408 CL_SetEntityColormapColors(entrender, -1);
409 else if (c <= cl.maxclients && cl.scores != NULL)
411 else
412 CL_SetEntityColormapColors(entrender, c);
413
415 // either fullbright or lit
417 {
418 if (!(entrender->effects & EF_FULLBRIGHT) && !(renderflags & RF_FULLBRIGHT))
419 entrender->flags |= RENDER_LIGHT;
420 }
421 // hide player shadow during intermission or nehahra movie
422 if (!(entrender->effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST))
423 && (entrender->alpha >= 1)
424 && !(renderflags & RF_NOSHADOW)
425 && !(entrender->flags & RENDER_VIEWMODEL)
427 entrender->flags |= RENDER_SHADOW;
428 if (entrender->flags & RENDER_VIEWMODEL)
429 entrender->flags |= RENDER_NOSELFSHADOW;
430 if (entrender->effects & EF_NOSELFSHADOW)
431 entrender->flags |= RENDER_NOSELFSHADOW;
432 if (entrender->effects & EF_NODEPTHTEST)
433 entrender->flags |= RENDER_NODEPTHTEST;
434 if (entrender->effects & EF_ADDITIVE)
435 entrender->flags |= RENDER_ADDITIVE;
436 if (entrender->effects & EF_DOUBLESIDED)
437 entrender->flags |= RENDER_DOUBLESIDED;
438 if (entrender->effects & EF_DYNAMICMODELLIGHT)
439 entrender->flags |= RENDER_DYNAMICMODELLIGHT;
440
441 // make the other useful stuff
442 memcpy(entrender->framegroupblend, ed->priv.server->framegroupblend, sizeof(ed->priv.server->framegroupblend));
443 CL_UpdateRenderEntity(entrender);
444
445 // override animation data with full control
446 memcpy(entrender->frameblend, ed->priv.server->frameblend, sizeof(ed->priv.server->frameblend));
447 if (ed->priv.server->skeleton.relativetransforms)
448 entrender->skeleton = &ed->priv.server->skeleton;
449 else
450 entrender->skeleton = NULL;
451
452 return true;
453}
454
455// 0 = keydown, key, character (EXT_CSQC)
456// 1 = keyup, key, character (EXT_CSQC)
457// 2 = mousemove relative, x, y (EXT_CSQC)
458// 3 = mousemove absolute, x, y (DP_CSQC)
459qbool CL_VM_InputEvent (int eventtype, float x, float y)
460{
461 prvm_prog_t *prog = CLVM_prog;
462 qbool r;
463
464 if(!prog->loaded)
465 return false;
466
468 r = false;
469 else
470 {
473 PRVM_G_FLOAT(OFS_PARM0) = eventtype;
474 PRVM_G_FLOAT(OFS_PARM1) = x; // key or x
475 PRVM_G_FLOAT(OFS_PARM2) = y; // ascii or y
476 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_InputEvent), "QC function CSQC_InputEvent is missing");
477 r = CSQC_RETURNVAL != 0;
478 }
479 return r;
480}
481
485{
486 prvm_prog_t *prog = CLVM_prog;
487 vec3_t emptyvector;
488 emptyvector[0] = 0;
489 emptyvector[1] = 0;
490 emptyvector[2] = 0;
491// vec3_t oldangles;
492
493 if(!prog->loaded)
494 return false;
495
496 R_TimeReport("pre-UpdateView");
497
500 //VectorCopy(cl.viewangles, oldangles);
504 // clear renderable entity and light lists to prevent crashes if the
505 // CSQC_UpdateView function does not call R_ClearScene as it should
508 // polygonbegin without draw2d arg has to guess
509 prog->polygonbegin_guess2d = false;
510 // free memory for resources that are no longer referenced
512 // pass in width and height and menu/focus state as parameters (EXT_CSQC_1)
514 {
517 }
518 else
519 {
522 }
523 /*
524 * This should be fine for now but FTEQW uses flags for keydest
525 * and checks that an array called "eyeoffset" is 0
526 *
527 * Just a note in case there's compatibility problems later
528 */
530 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_UpdateView), "QC function CSQC_UpdateView is missing");
531 //VectorCopy(oldangles, cl.viewangles);
532 // Dresk : Reset Dmg Globals Here
533 CL_VM_UpdateDmgGlobals(0, 0, emptyvector);
535 R_RenderView_UpdateViewVectors(); // we have to do this, as we undid the scene render doing this for us
536
537 R_TimeReport("UpdateView");
538 return true;
539}
540
542{
543 prvm_prog_t *prog = CLVM_prog;
544
545 R_TimeReport("pre-DrawHud");
546
550
552
553 // width and height parameters are virtual in CSQC_SIMPLE engines
556 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_DrawHud), "QC function CSQC_DrawHud is missing");
557
558 if (PRVM_clientfunction(CSQC_DrawScores))
559 {
562 if (key_dest != key_menu)
563 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_DrawScores), "QC function CSQC_DrawScores is missing");
564 }
566 if (!cl.islocalgame) // LadyHavoc: changed to draw the deathmatch overlays in any multiplayer mode
568
569 R_TimeReport("DrawHud");
570}
571
572
573qbool CL_VM_ConsoleCommand(const char *text, size_t textlen)
574{
575 prvm_prog_t *prog = CLVM_prog;
576 return PRVM_ConsoleCommand(prog, text, textlen, &prog->funcoffsets.CSQC_ConsoleCommand, false, cl.csqc_server2csqcentitynumber[cl.playerentity], cl.time, "QC function CSQC_ConsoleCommand is missing");
577}
578
580{
581 prvm_prog_t *prog = CLVM_prog;
582 int t;
583 qbool r = false;
584
585 if(!prog->loaded)
586 return false;
587
588 if(PRVM_clientfunction(CSQC_Parse_TempEntity))
589 {
593 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Parse_TempEntity), "QC function CSQC_Parse_TempEntity is missing");
594 r = CSQC_RETURNVAL != 0;
595 if(!r)
596 {
598 cl_message.badread = false;
599 }
600 }
601 return r;
602}
603
604void CL_VM_Parse_StuffCmd(const char *msg, size_t msg_len)
605{
606 prvm_prog_t *prog = CLVM_prog;
607 int restorevm_tempstringsbuf_cursize;
608
609 if(msg[0] == 'c')
610 if(msg[1] == 's')
611 if(msg[2] == 'q')
612 if(msg[3] == 'c')
613 {
614 // if this is setting a csqc variable, deprotect csqc_progcrc
615 // temporarily so that it can be set by the cvar command,
616 // and then reprotect it afterwards
617 int crcflags = csqc_progcrc.flags;
618 csqc_progcrc.flags &= ~CF_READONLY;
619 csqc_progsize.flags &= ~CF_READONLY;
620 Cmd_ExecuteString(cmd_local, msg, msg_len, src_local, true);
622 return;
623 }
624
625 if(!prog->loaded)
626 {
628 return;
629 }
630
631 if(PRVM_clientfunction(CSQC_Parse_StuffCmd))
632 {
635 restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize;
636 PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, msg, msg_len);
637 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Parse_StuffCmd), "QC function CSQC_Parse_StuffCmd is missing");
638 prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
639 }
640 else
642}
643
644static void CL_VM_Parse_Print(const char *msg, size_t msg_len)
645{
646 prvm_prog_t *prog = CLVM_prog;
647 int restorevm_tempstringsbuf_cursize;
650 restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize;
651 PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, msg, msg_len);
652 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Parse_Print), "QC function CSQC_Parse_Print is missing");
653 prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
654}
655
656void CSQC_AddPrintText(const char *msg, size_t msg_len)
657{
658 prvm_prog_t *prog = CLVM_prog;
660 size_t writebytes = min(msg_len + 1, MAX_INPUTLINE - cl.csqc_printtextbuf_len);
661
662 if(prog->loaded && PRVM_clientfunction(CSQC_Parse_Print))
663 {
664 if(msg[msg_len - 1] != '\n' && msg[msg_len - 1] != '\r')
665 {
666 if(cl.csqc_printtextbuf_len + msg_len + 1 >= MAX_INPUTLINE)
667 {
669 cl.csqc_printtextbuf[0] = '\0';
671 }
672 else
673 {
674 memcpy(start, msg, writebytes);
675 cl.csqc_printtextbuf_len += msg_len;
676 }
677 return;
678 }
679 memcpy(start, msg, writebytes);
680 cl.csqc_printtextbuf_len += msg_len;
682 cl.csqc_printtextbuf[0] = '\0';
684 }
685 else
686 Con_Print(msg);
687}
688
689void CL_VM_Parse_CenterPrint(const char *msg, size_t msg_len)
690{
691 prvm_prog_t *prog = CLVM_prog;
692 int restorevm_tempstringsbuf_cursize;
693
694 if(prog->loaded && PRVM_clientfunction(CSQC_Parse_CenterPrint))
695 {
698 restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize;
699 PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, msg, msg_len);
700 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Parse_CenterPrint), "QC function CSQC_Parse_CenterPrint is missing");
701 prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
702 }
703 else
704 SCR_CenterPrint(msg);
705}
706
714void CL_VM_UpdateShowingScoresState (int showingscores)
715{
716 prvm_prog_t *prog = CLVM_prog;
717
718 if(prog->loaded)
719 PRVM_clientglobalfloat(sb_showscores) = showingscores;
720}
721qbool CL_VM_Event_Sound(int sound_num, float fvolume, int channel, float attenuation, int ent, vec3_t pos, int flags, float speed)
722{
723 prvm_prog_t *prog = CLVM_prog;
724 qbool r = false;
725
726 if(prog->loaded)
727 {
728 if(PRVM_clientfunction(CSQC_Event_Sound))
729 {
732 PRVM_G_FLOAT(OFS_PARM0) = ent;
734 PRVM_G_INT(OFS_PARM2) = PRVM_SetTempString(prog, cl.sound_name[sound_num], strlen(cl.sound_name[sound_num]));
735 PRVM_G_FLOAT(OFS_PARM3) = fvolume;
736 PRVM_G_FLOAT(OFS_PARM4) = attenuation;
738 PRVM_G_FLOAT(OFS_PARM6) = speed * 100.0f;
739 PRVM_G_FLOAT(OFS_PARM7) = flags; // flags
740 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Event_Sound), "QC function CSQC_Event_Sound is missing");
741 r = CSQC_RETURNVAL != 0;
742 }
743 }
744
745 return r;
746}
747static void CL_VM_UpdateCoopDeathmatchGlobals (int gametype)
748{
749 prvm_prog_t *prog = CLVM_prog;
750 // Avoid global names for clean(er) coding
751 int localcoop;
752 int localdeathmatch;
753
754 if(prog->loaded)
755 {
756 if(gametype == GAME_COOP)
757 {
758 localcoop = 1;
759 localdeathmatch = 0;
760 }
761 else if(gametype == GAME_DEATHMATCH)
762 {
763 localcoop = 0;
764 localdeathmatch = 1;
765 }
766 else
767 {
768 // How did the ServerInfo send an unknown gametype?
769 // Better just assign the globals as 0...
770 localcoop = 0;
771 localdeathmatch = 0;
772 }
773 PRVM_clientglobalfloat(coop) = localcoop;
774 PRVM_clientglobalfloat(deathmatch) = localdeathmatch;
775 }
776}
777#if 0
778static float CL_VM_Event (float event) //[515]: needed ? I'd say "YES", but don't know for what :D
779{
780 prvm_prog_t *prog = CLVM_prog;
781 float r = 0;
782
783 if(!prog->loaded)
784 return 0;
785
786 if(PRVM_clientfunction(CSQC_Event))
787 {
790 PRVM_G_FLOAT(OFS_PARM0) = event;
791 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Event), "QC function CSQC_Event is missing");
793 }
794 return r;
795}
796#endif
797
799{
800 prvm_prog_t *prog = CLVM_prog;
801 unsigned short entnum, oldself, realentnum;
802
803 if(!prog->loaded)
804 {
805 Host_Error ("CSQC_ReadEntities: CSQC is not loaded");
806 return;
807 }
808
810 oldself = PRVM_clientglobaledict(self);
811 while(1)
812 {
815 break;
816 realentnum = entnum & 0x7FFF;
818 if(entnum & 0x8000)
819 {
821 {
822 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Ent_Remove), "QC function CSQC_Ent_Remove is missing");
823 cl.csqc_server2csqcentitynumber[realentnum] = 0;
824 }
825 else
826 {
827 // LadyHavoc: removing an entity that is already gone on
828 // the csqc side is possible for legitimate reasons (such
829 // as a repeat of the remove message), so no warning is
830 // needed
831 //Con_Printf("Bad csqc_server2csqcentitynumber map\n"); //[515]: never happens ?
832 }
833 }
834 else
835 {
837 {
838 if(!PRVM_clientfunction(CSQC_Ent_Spawn))
839 {
840 prvm_edict_t *ed;
841 ed = PRVM_ED_Alloc(prog);
842 PRVM_clientedictfloat(ed, entnum) = realentnum;
844 }
845 else
846 {
847 // entity( float entnum ) CSQC_Ent_Spawn;
848 // the qc function should set entnum, too (this way it also can return world [2/1/2008 Andreas]
849 PRVM_G_FLOAT(OFS_PARM0) = (float) realentnum;
850 // make sure no one gets wrong ideas
852 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Ent_Spawn), "QC function CSQC_Ent_Spawn is missing");
854 }
856 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Ent_Update), "QC function CSQC_Ent_Update is missing");
857 }
858 else {
860 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Ent_Update), "QC function CSQC_Ent_Update is missing");
861 }
862 }
863 }
864 PRVM_clientglobaledict(self) = oldself;
865}
866
868{
869 // links don't survive the transition, so unlink everything
871}
872
874{
875 int i;
876 prvm_edict_t *ent;
877
878 // link every entity except world
879 for (i = 1, ent = prog->edicts;i < prog->num_edicts;i++, ent++)
880 if (!ent->free)
881 CL_LinkEdict(ent);
882}
883
885{
886 int edictnum = PRVM_NUM_FOR_EDICT(e);
887 entity_render_t *entrender;
889 entrender = cl.csqcrenderentities + edictnum;
890 e->priv.server->move = false; // don't move on first frame
891 memset(entrender, 0, sizeof(*entrender));
892 entrender->shadertime = cl.time;
893}
894
896{
898 R_DecalSystem_Reset(&entrender->decalsystem);
899 memset(entrender, 0, sizeof(*entrender));
901 memset(ed->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
902 VM_RemoveEdictSkeleton(prog, ed);
903#ifdef USEODE
906#endif
907}
908
910{
911 int i;
912 prvm_edict_t *ent;
913 int active = 0, models = 0, solid = 0;
914
915 for (i=0 ; i<prog->num_edicts ; i++)
916 {
917 ent = PRVM_EDICT_NUM(i);
918 if (ent->free)
919 continue;
920 active++;
922 solid++;
924 models++;
925 }
926
927 Con_Printf("num_edicts:%3i\n", prog->num_edicts);
928 Con_Printf("active :%3i\n", active);
929 Con_Printf("view :%3i\n", models);
930 Con_Printf("touch :%3i\n", solid);
931}
932
934{
935 return true;
936}
937
938// returns true if the packet is valid, false if end of file is reached
939// used for dumping the CSQC download into demo files
940qbool MakeDownloadPacket(const char *filename, unsigned char *data, size_t len, int crc, int cnt, sizebuf_t *buf, int protocol)
941{
942 int packetsize = buf->maxsize - 7; // byte short long
943 int npackets = ((int)len + packetsize - 1) / (packetsize);
944 char vabuf[1024];
945
946 if(protocol == PROTOCOL_QUAKEWORLD)
947 return false; // CSQC can't run in QW anyway
948
949 SZ_Clear(buf);
950 if(cnt == 0)
951 {
953 MSG_WriteString(buf, va(vabuf, sizeof(vabuf), "\ncl_downloadbegin %lu %s\n", (unsigned long)len, filename));
954 return true;
955 }
956 else if(cnt >= 1 && cnt <= npackets)
957 {
958 unsigned long thispacketoffset = (cnt - 1) * packetsize;
959 int thispacketsize = (int)len - thispacketoffset;
960 if(thispacketsize > packetsize)
961 thispacketsize = packetsize;
962
964 MSG_WriteLong(buf, thispacketoffset);
965 MSG_WriteShort(buf, thispacketsize);
966 SZ_Write(buf, data + thispacketoffset, thispacketsize);
967
968 return true;
969 }
970 else if(cnt == npackets + 1)
971 {
973 MSG_WriteString(buf, va(vabuf, sizeof(vabuf), "\ncl_downloadfinished %lu %d\n", (unsigned long)len, crc));
974 return true;
975 }
976 return false;
977}
978
980void CL_VM_Init (void)
981{
982 prvm_prog_t *prog = CLVM_prog;
983 const char* csprogsfn = NULL;
984 unsigned char *csprogsdata = NULL;
985 fs_offset_t csprogsdatasize = 0;
986 int csprogsdatacrc, requiredcrc;
987 int requiredsize;
988 char vabuf[1024];
989
990 // reset csqc_progcrc after reading it, so that changing servers doesn't
991 // expect csqc on the next server
992 requiredcrc = csqc_progcrc.integer;
993 requiredsize = csqc_progsize.integer;
996
997 // if the server is not requesting a csprogs, then we're done here
998 if (requiredcrc < 0)
999 return;
1000
1001 // see if the requested csprogs.dat file matches the requested crc
1003 {
1004 csprogsfn = va(vabuf, sizeof(vabuf), "dlcache/%s.%i.%i", csqc_progname.string, requiredsize, requiredcrc);
1005 if(cls.caughtcsprogsdata && cls.caughtcsprogsdatasize == requiredsize && CRC_Block(cls.caughtcsprogsdata, (size_t)cls.caughtcsprogsdatasize) == requiredcrc)
1006 {
1007 Con_DPrintf("Using buffered \"%s\"\n", csprogsfn);
1008 csprogsdata = cls.caughtcsprogsdata;
1009 csprogsdatasize = cls.caughtcsprogsdatasize;
1012 }
1013 else
1014 {
1015 Con_DPrintf("Not using buffered \"%s\" (buffered: %p, %d)\n", csprogsfn, (void *)cls.caughtcsprogsdata, (int) cls.caughtcsprogsdatasize);
1016 csprogsdata = FS_LoadFile(csprogsfn, tempmempool, true, &csprogsdatasize);
1017 }
1018 }
1019 if (!csprogsdata)
1020 {
1021 csprogsfn = csqc_progname.string;
1022 csprogsdata = FS_LoadFile(csprogsfn, tempmempool, true, &csprogsdatasize);
1023 }
1024 if (csprogsdata)
1025 {
1026 csprogsdatacrc = CRC_Block(csprogsdata, (size_t)csprogsdatasize);
1027 if (csprogsdatacrc != requiredcrc || csprogsdatasize != requiredsize)
1028 {
1029 if (cls.demoplayback)
1030 {
1031 Con_Printf(CON_WARN "Warning: Your %s is not the same version as the demo was recorded with (CRC/size are %i/%i but should be %i/%i)\n", csqc_progname.string, csprogsdatacrc, (int)csprogsdatasize, requiredcrc, requiredsize);
1032 // Mem_Free(csprogsdata);
1033 // return;
1034 // We WANT to continue here, and play the demo with different csprogs!
1035 // After all, this is just a warning. Sure things may go wrong from here.
1036 }
1037 else
1038 {
1039 Mem_Free(csprogsdata);
1040 CL_DisconnectEx(false, "Your %s is not the same version as the server (CRC is %i/%i but should be %i/%i)\n", csqc_progname.string, csprogsdatacrc, (int)csprogsdatasize, requiredcrc, requiredsize);
1041 return;
1042 }
1043 }
1044 }
1045 else
1046 {
1047 if (requiredcrc >= 0)
1048 CL_DisconnectEx(false, CON_ERROR "CL_VM_Init: %s requires CSQC, but \"%s\" wasn't found\n", cls.demoplayback ? "demo" : "server", csqc_progname.string);
1049 return;
1050 }
1051
1053
1054 // allocate the mempools
1056 prog->edictprivate_size = 0; // no private struct used
1057 prog->name = "client";
1058 prog->num_edicts = 1;
1059 prog->max_edicts = 512;
1061 prog->reserved_edicts = 0;
1063 // TODO: add a shared extension string #define and add real support for csqc extension strings [12/5/2007 Black]
1065 prog->builtins = vm_cl_builtins;
1067
1068 // all callbacks must be defined (pointers are not checked before calling)
1075 prog->init_cmd = CLVM_init_cmd;
1076 prog->reset_cmd = CLVM_reset_cmd;
1077 prog->error_cmd = Host_Error;
1079
1080 PRVM_Prog_Load(prog, csprogsfn, csprogsdata, csprogsdatasize, CL_CheckRequiredFuncs, CL_REQFIELDS, cl_reqfields, CL_REQGLOBALS, cl_reqglobals);
1081
1082 if (!prog->loaded)
1083 {
1084 Mem_Free(csprogsdata);
1085 Host_Error("CSQC %s failed to load\n", csprogsfn);
1086 }
1087
1088 if(cls.demorecording)
1089 {
1090 if(cls.demo_lastcsprogssize != csprogsdatasize || cls.demo_lastcsprogscrc != csprogsdatacrc)
1091 {
1092 int i;
1093 static char buf[NET_MAXMESSAGE];
1094 sizebuf_t sb;
1095 unsigned char *demobuf; fs_offset_t demofilesize;
1096
1097 sb.data = (unsigned char *) buf;
1098 sb.maxsize = sizeof(buf);
1099 i = 0;
1100
1101 CL_CutDemo(&demobuf, &demofilesize);
1102 while(MakeDownloadPacket(csqc_progname.string, csprogsdata, (size_t)csprogsdatasize, csprogsdatacrc, i++, &sb, cls.protocol))
1104 CL_PasteDemo(&demobuf, &demofilesize);
1105
1106 cls.demo_lastcsprogssize = csprogsdatasize;
1107 cls.demo_lastcsprogscrc = csprogsdatacrc;
1108 }
1109 }
1110 Mem_Free(csprogsdata);
1111
1112 // check if OP_STATE animation is possible in this dat file
1113 if (prog->fieldoffsets.nextthink >= 0 && prog->fieldoffsets.frame >= 0 && prog->fieldoffsets.think >= 0 && prog->globaloffsets.self >= 0)
1114 prog->flag |= PRVM_OP_STATE;
1115
1116 // set time
1119
1123
1124 // set map description (use world entity 0)
1133
1134 // call the prog init if it exists
1136 {
1137 PRVM_G_FLOAT(OFS_PARM0) = 1.0f; // CSQC_SIMPLE engines always pass 0, FTE always passes 1
1138 // always include "DarkPlaces" so it can be recognised when gamename doesn't include it
1139 PRVM_G_INT(OFS_PARM1) = PRVM_SetEngineString(prog, va(vabuf, sizeof(vabuf), "DarkPlaces %s", gamename));
1140 PRVM_G_FLOAT(OFS_PARM2) = 1.0f; // TODO DP versions...
1141 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Init), "QC function CSQC_Init is missing");
1142 }
1143
1144 // Once CSQC_Init was called, we consider csqc code fully initialized.
1145 prog->inittime = host.realtime;
1146
1149
1150 // Update Coop and Deathmatch Globals (at this point the client knows them from ServerInfo)
1152}
1153
1155{
1156 prvm_prog_t *prog = CLVM_prog;
1158
1159 //Cvar_SetValueQuick(&csqc_progcrc, -1);
1160 //Cvar_SetValueQuick(&csqc_progsize, -1);
1161 if (prog->loaded)
1162 {
1166 prog->ExecuteProgram(prog, PRVM_clientfunction(CSQC_Shutdown), "QC function CSQC_Shutdown is missing");
1167 }
1168 PRVM_Prog_Reset(prog);
1169 Con_DPrint("CSQC ^1unloaded\n");
1170}
1171
1173{
1174 prvm_prog_t *prog = CLVM_prog;
1175 prvm_edict_t *ed;
1176 model_t *mod;
1177 matrix4x4_t matrix;
1178 qbool r = 0;
1179
1181
1182 if(!ed->free)
1183 {
1186 if(CL_GetTagMatrix(prog, &matrix, ed, 0, NULL) == 0)
1187 Matrix4x4_OriginFromMatrix(&matrix, out);
1188 if (mod && mod->soundfromcenter)
1189 VectorMAMAM(1.0f, out, 0.5f, mod->normalmins, 0.5f, mod->normalmaxs, out);
1190 r = 1;
1191 }
1192
1193 return r;
1194}
1195
1196qbool CL_VM_TransformView(int entnum, matrix4x4_t *viewmatrix, mplane_t *clipplane, vec3_t visorigin)
1197{
1198 prvm_prog_t *prog = CLVM_prog;
1199 qbool ret = false;
1200 prvm_edict_t *ed;
1201 vec3_t forward, left, up, origin, ang;
1202 matrix4x4_t mat, matq;
1203
1204 ed = PRVM_EDICT_NUM(entnum);
1205 // camera:
1206 // camera_transform
1207 if(PRVM_clientedictfunction(ed, camera_transform))
1208 {
1209 ret = true;
1210 if(viewmatrix && clipplane && visorigin)
1211 {
1212 Matrix4x4_ToVectors(viewmatrix, forward, left, up, origin);
1213 AnglesFromVectors(ang, forward, up, false);
1222 prog->ExecuteProgram(prog, PRVM_clientedictfunction(ed, camera_transform), "QC function e.camera_transform is missing");
1228 Matrix4x4_Invert_Full(&mat, viewmatrix);
1229 Matrix4x4_FromVectors(viewmatrix, forward, left, up, origin);
1230 Matrix4x4_Concat(&matq, viewmatrix, &mat);
1231 Matrix4x4_TransformPositivePlane(&matq, clipplane->normal[0], clipplane->normal[1], clipplane->normal[2], clipplane->dist, clipplane->normal_and_dist);
1232 }
1233 }
1234
1235 return ret;
1236}
1237
model_t * CL_GetModelFromEdict(prvm_edict_t *ed)
void CL_LinkEdict(prvm_edict_t *ent)
void CL_PasteDemo(unsigned char **buf, fs_offset_t *filesize)
Definition cl_demo.c:160
void CL_CutDemo(unsigned char **buf, fs_offset_t *filesize)
Definition cl_demo.c:137
void CL_WriteDemoMessage(sizebuf_t *message)
Definition cl_demo.c:110
void CL_DisconnectEx(qbool kicked, const char *fmt,...)
Definition cl_main.c:370
cvar_t csqc_progcrc
Definition cl_main.c:36
void CL_UpdateRenderEntity(entity_render_t *ent)
Definition cl_main.c:702
entity_render_t * CL_NewTempEntity(double shadertime)
Definition cl_main.c:794
void CL_ExpandCSQCRenderEntities(int num)
Definition cl_main.c:325
cvar_t csqc_progsize
Definition cl_main.c:37
client_state_t cl
Definition cl_main.c:117
cvar_t csqc_progname
Definition cl_main.c:35
client_static_t cls
Definition cl_main.c:116
cvar_t csqc_lowres
Definition cl_main.c:40
void CL_SetEntityColormapColors(entity_render_t *ent, int colormap)
Definition cl_main.c:1061
void SCR_CenterPrint(const char *str)
Definition cl_screen.c:144
cvar_t vid_conheight
Definition cl_screen.c:57
cvar_t vid_conwidth
Definition cl_screen.c:56
qbool sb_showscores
Definition sbar.c:56
void CLVM_init_cmd(prvm_prog_t *prog)
Definition clvm_cmds.c:5656
prvm_builtin_t vm_cl_builtins[]
Definition clvm_cmds.c:5003
int CL_GetTagMatrix(prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int tagindex, prvm_vec_t *returnshadingorigin)
Definition clvm_cmds.c:3286
void CLVM_reset_cmd(prvm_prog_t *prog)
Definition clvm_cmds.c:5663
void CSQC_R_RecalcView(void)
Definition clvm_cmds.c:756
const int vm_cl_numbuiltins
Definition clvm_cmds.c:5654
void Cbuf_AddText(cmd_state_t *cmd, const char *text)
Definition cmd.c:264
void Cmd_ClearCSQCCommands(cmd_state_t *cmd)
Definition cmd.c:1981
void Cmd_ExecuteString(cmd_state_t *cmd, const char *text, size_t textlen, cmd_source_t src, qbool lockmutex)
Parses a single line of text into arguments and tries to execute it.
Definition cmd.c:2068
cmd_state_t * cmd_local
command interpreter for local commands injected by SVQC, CSQC, MQC, server or client engine code uses...
Definition cmd.c:25
@ src_local
from the command buffer
Definition cmd.h:75
unsigned short CRC_Block(const unsigned char *data, size_t size)
Definition com_crc16.c:75
const char * gamename
Definition com_game.c:27
void MSG_WriteShort(sizebuf_t *sb, int c)
Definition com_msg.c:138
void MSG_WriteString(sizebuf_t *sb, const char *s)
Definition com_msg.c:173
void MSG_WriteLong(sizebuf_t *sb, int c)
Definition com_msg.c:147
void MSG_WriteByte(sizebuf_t *sb, int c)
Definition com_msg.c:130
void SZ_Clear(sizebuf_t *buf)
Definition common.c:44
char * va(char *buf, size_t buflen, const char *format,...)
Definition common.c:972
void SZ_Write(sizebuf_t *buf, const unsigned char *data, int length)
Definition common.c:72
#define MSG_ReadShort
Definition common.h:191
@ PROTOCOL_NEHAHRAMOVIE
Nehahra movie protocol, a big nasty hack dating back to early days of the Quake Standards Group (but ...
Definition common.h:143
@ PROTOCOL_QUAKEWORLD
quakeworld protocol
Definition common.h:145
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
void Con_DPrint(const char *msg)
A Con_Print that only shows up if the "developer" cvar is set.
Definition console.c:1531
#define CON_WARN
Definition console.h:101
#define CON_ERROR
Definition console.h:102
int CL_VM_GetViewEntity(void)
Definition csprogs.c:1238
cvar_t cl_noplayershadow
Definition cl_main.c:85
void CL_VM_PreventInformationLeaks(void)
Definition csprogs.c:36
prvm_required_field_t cl_reqglobals[]
Definition csprogs.c:145
qbool MakeDownloadPacket(const char *filename, unsigned char *data, size_t len, int crc, int cnt, sizebuf_t *buf, int protocol)
Definition csprogs.c:940
cvar_t csqc_usedemoprogs
Definition cl_main.c:38
static qbool CLVM_load_edict(prvm_prog_t *prog, prvm_edict_t *ent)
Definition csprogs.c:933
qbool CL_VM_ConsoleCommand(const char *text, size_t textlen)
Definition csprogs.c:573
void CSQC_AddPrintText(const char *msg, size_t msg_len)
Definition csprogs.c:656
void CSQC_UpdateNetworkTimes(double newtime, double oldtime)
Definition csprogs.c:234
static void CLVM_init_edict(prvm_prog_t *prog, prvm_edict_t *e)
Definition csprogs.c:884
static void CL_VM_UpdateCoopDeathmatchGlobals(int gametype)
Definition csprogs.c:747
static void CL_VM_Parse_Print(const char *msg, size_t msg_len)
Definition csprogs.c:644
void CL_VM_Parse_StuffCmd(const char *msg, size_t msg_len)
Definition csprogs.c:604
static void CLVM_begin_increase_edicts(prvm_prog_t *prog)
Definition csprogs.c:867
static void CL_CheckRequiredFuncs(prvm_prog_t *prog, const char *filename)
Previous DP versions declined to load csprogs if it lacked any of: CSQC_Init, CSQC_InputEvent,...
Definition csprogs.c:54
void CL_VM_UpdateShowingScoresState(int showingscores)
Definition csprogs.c:714
void CL_VM_UpdateIntermissionState(int intermission)
Definition csprogs.c:707
static void CLVM_end_increase_edicts(prvm_prog_t *prog)
Definition csprogs.c:873
static void CLVM_free_edict(prvm_prog_t *prog, prvm_edict_t *ed)
Definition csprogs.c:895
void CL_VM_Init(void)
Definition csprogs.c:980
#define CSQC_RETURNVAL
Definition csprogs.c:34
r_refdef_view_t csqc_main_r_refdef_view
Definition clvm_cmds.c:26
static void CLVM_count_edicts(prvm_prog_t *prog)
Definition csprogs.c:909
qbool CL_VM_Event_Sound(int sound_num, float fvolume, int channel, float attenuation, int ent, vec3_t pos, int flags, float speed)
Definition csprogs.c:721
qbool CL_VM_InputEvent(int eventtype, float x, float y)
Definition csprogs.c:459
void CL_VM_DrawHud(double frametime)
Definition csprogs.c:541
void CSQC_Think(prvm_edict_t *ed)
Definition csprogs.c:295
r_refdef_view_t csqc_original_r_refdef_view
Definition clvm_cmds.c:25
void CSQC_ReadEntities(void)
Definition csprogs.c:798
void CL_VM_ShutDown(void)
Definition csprogs.c:1154
qbool CL_VM_Parse_TempEntity(void)
Definition csprogs.c:579
qbool CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum)
Definition csprogs.c:311
qbool CL_VM_GetEntitySoundOrigin(int entnum, vec3_t out)
Definition csprogs.c:1172
qbool CL_VM_TransformView(int entnum, matrix4x4_t *viewmatrix, mplane_t *clipplane, vec3_t visorigin)
Definition csprogs.c:1196
qbool CL_VM_UpdateView(double frametime)
Definition csprogs.c:484
void CL_VM_Parse_CenterPrint(const char *msg, size_t msg_len)
Definition csprogs.c:689
static void CSQC_SetGlobals(double frametime)
Definition csprogs.c:247
void CL_VM_UpdateDmgGlobals(int dmg_take, int dmg_save, vec3_t dmg_origin)
Definition csprogs.c:222
void CSQC_Predraw(prvm_edict_t *ed)
Definition csprogs.c:283
#define CL_REQGLOBALS
Definition csprogs.c:143
prvm_required_field_t cl_reqfields[]
Definition csprogs.c:66
#define CL_REQFIELDS
Definition csprogs.c:64
#define RF_FULLBRIGHT
Definition csprogs.h:93
#define RF_WORLDOBJECT
Definition csprogs.h:89
#define RF_DEPTHHACK
Definition csprogs.h:83
#define RF_USETRANSPARENTOFFSET
Definition csprogs.h:88
#define RF_DYNAMICMODELLIGHT
Definition csprogs.h:91
#define RF_VIEWMODEL
Definition csprogs.h:81
#define CL_MAX_EDICTS
Definition csprogs.h:25
#define RF_NOSHADOW
Definition csprogs.h:94
#define RF_ADDITIVE
Definition csprogs.h:84
#define RF_EXTERNALMODEL
Definition csprogs.h:82
#define RF_MODELLIGHT
Definition csprogs.h:90
vector v_up
float clientcommandframe
float flags
float maxclients
vector pmove_vel
vector input_angles
float modelindex
void CSQC_UpdateView(float vid_width, float vid_height, float notmenu)
entity self
float frametime
vector view_punchangle
string mapname
float player_localnum
vector pmove_org
float mod(float dividend, float divisor)
vector modellight_dir
vector mins
float transparent_offset
float CSQC_InputEvent(float evtype, float scanx, float chary)
vector view_angles
float effects
vector modellight_ambient
vector modellight_diffuse
float skin
float time
vector v_right
vector input_movevalues
float trace_networkentity
vector trace_endpos
vector maxs
float input_buttons
float nextthink
float colormap
float player_localentnum
float intermission
vector absmax
vector v_forward
void CSQC_Init(float apilevel, string enginename, float engineversion)
float entnum
vector origin
string model
float servercommandframe
float solid
vector absmin
void CSQC_Shutdown()
vector view_punchvector
void Cvar_SetValueQuick(cvar_t *var, float value)
Definition cvar.c:473
float scale
vector glowmod
float alpha
vector colormod
unsigned char * FS_LoadFile(const char *path, mempool_t *pool, qbool quiet, fs_offset_t *filesizepointer)
Definition fs.c:3540
static int(ZEXPORT *qz_inflate)(z_stream *strm
int64_t fs_offset_t
Definition fs.h:37
void R_RenderView_UpdateViewVectors(void)
Definition gl_rmain.c:4512
void R_DecalSystem_Reset(decalsystem_t *decalsystem)
Definition gl_rmain.c:9134
cvar_t r_fullbright
Definition gl_rmain.c:112
r_refdef_t r_refdef
Definition gl_rmain.c:57
GLint GLenum GLint GLint y
Definition glquake.h:651
GLint GLenum GLint x
Definition glquake.h:651
GLsizeiptr const GLvoid * data
Definition glquake.h:639
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glquake.h:657
host_static_t host
Definition host.c:41
void Host_Error(const char *error,...)
Definition host.c:85
keydest_t key_dest
Definition keys.c:37
@ key_menu
Definition keys.h:372
@ key_game
Definition keys.h:372
void AnglesFromVectors(vec3_t angles, const vec3_t forward, const vec3_t up, qbool flippitch)
LadyHavoc: calculates pitch/yaw/roll angles from forward and up vectors.
Definition mathlib.c:650
#define min(A, B)
Definition mathlib.h:37
#define VectorClear(a)
Definition mathlib.h:97
#define VectorMAMAM(scale1, b1, scale2, b2, scale3, b3, out)
Definition mathlib.h:117
#define VectorLength2(a)
Definition mathlib.h:110
#define VectorSet(vec, x, y, z)
Definition mathlib.h:96
#define VectorCopy(in, out)
Definition mathlib.h:101
#define VectorScale(in, scale, out)
Definition mathlib.h:111
void Matrix4x4_Concat(matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
Definition matrixlib.c:83
void Matrix4x4_TransformPositivePlane(const matrix4x4_t *in, float x, float y, float z, float d, float *o)
Definition matrixlib.c:1699
int Matrix4x4_Invert_Full(matrix4x4_t *out, const matrix4x4_t *in1)
Definition matrixlib.c:145
void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
Definition matrixlib.c:970
void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
Definition matrixlib.c:939
void Matrix4x4_OriginFromMatrix(const matrix4x4_t *in, float *out)
Definition matrixlib.c:1792
float strlen(string s)
static memexpandablearray_t models
sizebuf_t cl_message
Definition netconn.c:71
#define OFS_PARM4
Definition pr_comp.h:38
#define OFS_PARM2
Definition pr_comp.h:36
#define OFS_PARM3
Definition pr_comp.h:37
#define OFS_RETURN
Definition pr_comp.h:33
#define OFS_PARM5
Definition pr_comp.h:39
#define OFS_PARM6
Definition pr_comp.h:40
#define OFS_PARM0
Definition pr_comp.h:34
#define OFS_PARM1
Definition pr_comp.h:35
#define OFS_PARM7
Definition pr_comp.h:41
float deathmatch
Definition progsdefs.qc:29
float dmg_take
Definition progsdefs.qc:198
float coop
Definition progsdefs.qc:30
float dmg_save
Definition progsdefs.qc:199
string message
Definition progsdefs.qc:205
#define PRVM_clientfunction(funcname)
Definition progsvm.h:194
#define CLVM_prog
Definition progsvm.h:767
#define PRVM_OP_STATE
Definition progsvm.h:238
int PRVM_SetTempString(prvm_prog_t *prog, const char *s, size_t slen)
Takes an strlen (not a buffer size).
#define PRVM_clientglobaledict(fieldname)
Definition progsvm.h:192
void PRVM_Prog_Load(prvm_prog_t *prog, const char *filename, unsigned char *data, fs_offset_t size, void CheckRequiredFuncs(prvm_prog_t *prog, const char *filename), int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, prvm_required_field_t *required_global)
void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const struct model_s *edmodel, const struct frameblend_s *frameblend)
#define PRVM_EDICT_TO_PROG(e)
Definition progsvm.h:875
void PRVM_Prog_Init(prvm_prog_t *prog, struct cmd_state_s *cmd)
Initializing a vm: Call InitProg with the num Set up the fields marked with [INIT] in the prog struct...
mfunction_t * PRVM_ED_FindFunction(prvm_prog_t *prog, const char *name)
Definition prvm_edict.c:425
int PRVM_SetEngineString(prvm_prog_t *prog, const char *s)
const char * vm_sv_extensions[]
client also uses this
Definition svvm_cmds.c:11
#define PRVM_EDICT_NUM(n)
Definition progsvm.h:867
#define PRVM_clientedictstring(ed, fieldname)
Definition progsvm.h:186
void PRVM_Prog_Reset(prvm_prog_t *prog)
void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, struct framegroupblend_s *framegroupblend, const prvm_edict_t *ed)
#define PRVM_clientglobalfloat(fieldname)
Definition progsvm.h:189
#define PRVM_NUM_FOR_EDICT(e)
Definition progsvm.h:870
#define PRVM_clientedictfunction(ed, fieldname)
Definition progsvm.h:188
void PRVM_GarbageCollection(prvm_prog_t *prog)
#define PRVM_CSQC_SIMPLE
Definition progsvm.h:239
void VM_RemoveEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed)
Definition prvm_cmds.c:261
#define PRVM_clientedictvector(ed, fieldname)
Definition progsvm.h:185
#define PRVM_EDICT(n)
Definition progsvm.h:866
void CLVM_ExecuteProgram(prvm_prog_t *prog, func_t fnum, const char *errormessage)
Definition prvm_exec.c:1086
#define PRVM_clientglobalvector(fieldname)
Definition progsvm.h:190
#define PRVM_clientedictfloat(ed, fieldname)
Definition progsvm.h:184
void VM_FrameBlendFromFrameGroupBlend(struct frameblend_s *frameblend, const struct framegroupblend_s *framegroupblend, const struct model_s *model, double curtime)
#define PRVM_clientglobalstring(fieldname)
Definition progsvm.h:191
#define PRVM_G_FLOAT(o)
Definition progsvm.h:882
#define PRVM_G_VECTOR(o)
Definition progsvm.h:886
prvm_edict_t * PRVM_ED_Alloc(prvm_prog_t *prog)
Definition prvm_edict.c:269
#define PRVM_G_INT(o)
Definition progsvm.h:883
#define GAME_COOP
Definition protocol.h:203
#define RENDER_EXTERIORMODEL
Definition protocol.h:359
#define EF_FULLBRIGHT
Definition protocol.h:77
#define EF_NOSHADOW
Definition protocol.h:80
#define EF_NODEPTHTEST
Definition protocol.h:81
#define GAME_DEATHMATCH
Definition protocol.h:204
#define EF_ADDITIVE
Definition protocol.h:73
#define svc_downloaddata
Definition protocol.h:269
#define EF_DYNAMICMODELLIGHT
Definition protocol.h:85
#define svc_stufftext
Definition protocol.h:223
#define RENDER_SHADOW
Definition protocol.h:365
#define RENDER_VIEWMODEL
Definition protocol.h:358
#define EF_NOSELFSHADOW
Definition protocol.h:84
#define RENDER_DYNAMICMODELLIGHT
Definition protocol.h:373
#define EF_DOUBLESIDED
Definition protocol.h:83
#define RENDER_WORLDOBJECT
Definition protocol.h:362
#define RENDER_DOUBLESIDED
Definition protocol.h:371
#define RENDER_ADDITIVE
Definition protocol.h:370
#define RENDER_NOSELFSHADOW
Definition protocol.h:367
#define RENDER_LIGHT
Definition protocol.h:366
#define RENDER_CUSTOMIZEDMODELLIGHT
Definition protocol.h:372
#define RENDER_NODEPTHTEST
Definition protocol.h:369
void VM_ClearTraceGlobals(prvm_prog_t *prog)
Definition prvm_cmds.c:5245
qbool PRVM_ConsoleCommand(prvm_prog_t *prog, const char *text, size_t textlen, int *func, qbool preserve_self, int curself, double ptime, const char *error_message)
Definition prvm_cmds.c:68
int i
#define MAX_INPUTLINE
maximum size of console commandline, QuakeC strings, and many other text processing buffers
Definition qdefs.h:94
#define MAX_EDICTS
max number of objects in game world at once (32768 protocol limit)
Definition qdefs.h:105
#define NET_MAXMESSAGE
max reliable packet size (sent as multiple fragments of MAX_PACKETFRAGMENT)
Definition qdefs.h:103
#define STAT_HEALTH
Definition qstats.h:8
#define NULL
Definition qtypes.h:12
vec_t vec3_t[3]
Definition qtypes.h:71
prvm_vec_t prvm_vec3_t[3]
Definition qtypes.h:63
bool qbool
Definition qtypes.h:9
float prvm_vec_t
Definition qtypes.h:55
void R_TimeReport(const char *desc)
Definition r_stats.c:193
cvar_t cl_deathscoreboard
Definition sbar.c:110
void Sbar_DeathmatchOverlay(void)
Definition sbar.c:1866
#define SOLID_BSP
bsp clip, touch on edge, block
Definition server.h:336
dp_FragColor r
return ret
precision highp float
Definition shader_glsl.h:53
dp_FragColor b
#define CHAN_ENGINE2USER(c)
Definition sound.h:91
vec3_t csqc_viewanglesfromengine
Definition client.h:1114
char sound_name[MAX_SOUNDS][MAX_QPATH]
Definition client.h:893
int realplayerentity
Definition client.h:905
vec3_t movement_velocity
Definition client.h:810
unsigned short csqc_server2csqcentitynumber[MAX_EDICTS]
Definition client.h:1110
qbool onground
Definition client.h:843
size_t csqc_printtextbuf_len
strlen
Definition client.h:1119
scoreboard_t * scores
Definition client.h:945
vec3_t csqc_vieworiginfromengine
Definition client.h:1113
vec3_t viewangles
Definition client.h:786
char worldbasename[MAX_QPATH]
Definition client.h:898
entity_t * entities
Definition client.h:991
struct model_s * worldmodel
Definition client.h:934
int intermission
Definition client.h:856
world_t world
Definition client.h:1122
int islocalgame
Definition client.h:746
double time
Definition client.h:868
qbool inwater
Definition client.h:844
vec3_t punchvector
Definition client.h:790
vec3_t punchangle
Definition client.h:788
usercmd_t movecmd[CL_MAX_USERCMDS]
Definition client.h:754
entity_render_t * csqcrenderentities
Definition client.h:992
vec3_t csqc_viewangles
Definition client.h:1112
char worldmessage[MAX_QPATH]
Definition client.h:896
int playerentity
Definition client.h:910
int stats[MAX_CL_STATS]
Definition client.h:758
csqc_vidvars_t csqc_vidvars
Definition client.h:834
char csqc_printtextbuf[MAX_INPUTLINE]
Definition client.h:1118
vec3_t csqc_vieworigin
Definition client.h:1111
unsigned char * caughtcsprogsdata
Definition client.h:688
unsigned int servermovesequence
Definition client.h:637
qbool demoplayback
Definition client.h:587
int demo_lastcsprogscrc
Definition client.h:586
fs_offset_t demo_lastcsprogssize
Definition client.h:585
qbool demorecording
Definition client.h:584
fs_offset_t caughtcsprogsdatasize
Definition client.h:689
protocolversion_t protocol
Definition client.h:617
qbool drawenginesbar
Definition client.h:707
qbool drawcrosshair
Definition client.h:708
Definition cvar.h:66
float value
Definition cvar.h:74
unsigned flags
Definition cvar.h:67
int integer
Definition cvar.h:73
const char * string
Definition cvar.h:71
frameblend_t frameblend[MAX_FRAMEBLENDS]
Definition client.h:373
vec3_t custommodellight_lightdir
Definition client.h:404
vec_t userwavefunc_param[Q3WAVEFUNC_USER_COUNT]
Definition client.h:445
float custommodellight_origin[3]
Definition client.h:406
matrix4x4_t matrix
Definition client.h:332
float colormod[3]
Definition client.h:359
model_t * model
Definition client.h:343
vec3_t custommodellight_diffuse
Definition client.h:403
decalsystem_t decalsystem
Definition client.h:438
float transparent_offset
Definition client.h:340
framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS]
Definition client.h:363
vec3_t custommodellight_ambient
Definition client.h:402
double shadertime
Definition client.h:366
float glowmod[3]
Definition client.h:360
skeleton_t * skeleton
Definition client.h:375
entity_render_t render
Definition client.h:477
double realtime
the accumulated mainloop time since application started (with filtering), without any slowmo or clamp...
Definition host.h:46
unsigned effects
vec3_t normal
Definition model_brush.h:59
vec_t dist
Definition model_brush.h:60
vec4_t normal_and_dist
Definition model_brush.h:62
prvm_vec_t * fp
Definition progsvm.h:102
union prvm_edict_t::@30 fields
qbool free
true if this edict is unused
Definition progsvm.h:93
union prvm_edict_t::@29 priv
struct edict_engineprivate_s * server
FIXME: this server pointer really means world, not server (it is used by both server qc and client qc...
Definition progsvm.h:106
void(* reset_cmd)(struct prvm_prog_s *prog)
[INIT] used by PRVM_ResetProg
Definition progsvm.h:745
int numbuiltins
Definition progsvm.h:605
int entityfields
number of vec_t fields in progs (some variables are 3)
Definition progsvm.h:548
prvm_builtin_t * builtins
Definition progsvm.h:604
qbool loaded
used to indicate whether a prog is loaded
Definition progsvm.h:710
prvm_prog_funcoffsets_t funcoffsets
Definition progsvm.h:693
int edictprivate_size
size of the engine private struct
Definition progsvm.h:689
const char * name
name of the prog, e.g. "Server", "Client" or "Menu" (used for text output)
Definition progsvm.h:700
void(* begin_increase_edicts)(struct prvm_prog_s *prog)
[INIT] used by PRVM_MEM_Increase_Edicts
Definition progsvm.h:734
void(* free_edict)(struct prvm_prog_s *prog, prvm_edict_t *ed)
[INIT] used by PRVM_ED_Free
Definition progsvm.h:738
void(* error_cmd)(const char *format,...) DP_FUNC_PRINTF(1) DP_FUNC_NORETURN
[INIT]
Definition progsvm.h:747
int num_edicts
copies of some vars that were former read from sv
Definition progsvm.h:671
prvm_prog_fieldoffsets_t fieldoffsets
Definition progsvm.h:691
void(* count_edicts)(struct prvm_prog_s *prog)
[INIT] used by PRVM_ED_Count_f
Definition progsvm.h:740
double inittime
system time when QC initialization code finished (any entity created before is not a leak)
Definition progsvm.h:539
int limit_edicts
used instead of the constant MAX_EDICTS
Definition progsvm.h:675
prvm_prog_globaloffsets_t globaloffsets
Definition progsvm.h:692
unsigned flag
flag - used to store general flags like PRVM_GE_SELF, etc.
Definition progsvm.h:703
prvm_edict_t * edicts
Definition progsvm.h:680
void(* init_edict)(struct prvm_prog_s *prog, prvm_edict_t *edict)
[INIT] used by PRVM_ED_ClearEdict
Definition progsvm.h:737
mempool_t * progs_mempool
all memory allocations related to this vm_prog (code, edicts, strings)
Definition progsvm.h:602
qbool polygonbegin_guess2d
indicates if polygonbegin should be interpreted as 2d (clearscene sets this to false,...
Definition progsvm.h:661
int max_edicts
number of edicts for which space has been (should be) allocated
Definition progsvm.h:673
void(* ExecuteProgram)(struct prvm_prog_s *prog, func_t fnum, const char *errormessage)
pointer to one of the *VM_ExecuteProgram functions
Definition progsvm.h:749
qbool(* load_edict)(struct prvm_prog_s *prog, prvm_edict_t *ent)
[INIT] used by PRVM_ED_LoadFromFile
Definition progsvm.h:742
sizebuf_t tempstringsbuf
buffer for storing all tempstrings created during one invocation of ExecuteProgram
Definition progsvm.h:644
void(* init_cmd)(struct prvm_prog_s *prog)
[INIT] used by PRVM_InitProg
Definition progsvm.h:744
const char ** extensionstring
Definition progsvm.h:705
void(* end_increase_edicts)(struct prvm_prog_s *prog)
[INIT]
Definition progsvm.h:735
int reserved_edicts
number of reserved edicts (allocated from 1)
Definition progsvm.h:678
entity_render_t ** entities
renderable entities (excluding world)
Definition render.h:361
r_refdef_view_t view
Definition render.h:406
r_refdef_scene_t scene
Definition render.h:418
unsigned char * data
Definition common.h:52
int cursize
Definition common.h:54
qbool badread
Definition common.h:56
int readcount
Definition common.h:55
int maxsize
Definition common.h:53
float forwardmove
Definition protocol.h:380
int buttons
Definition protocol.h:395
float upmove
Definition protocol.h:382
unsigned int sequence
Definition protocol.h:397
float sidemove
Definition protocol.h:381
int width
Definition vid.h:60
int height
Definition vid.h:61
viddef_mode_t mode
currently active video mode
Definition vid.h:73
vec3_t maxs
Definition world.h:72
vec3_t mins
Definition world.h:71
static vec3_t forward
Definition sv_user.c:305
static vec3_t up
Definition sv_user.c:305
viddef_t vid
global video state
Definition vid_shared.c:64
void World_UnlinkAll(world_t *world)
unlinks all entities (used before reallocation of edicts)
Definition world.c:159
void World_UnlinkEdict(prvm_edict_t *ent)
Definition world.c:178
void World_Physics_RemoveJointFromEntity(world_t *world, struct prvm_edict_s *ed)
void World_Physics_RemoveFromEntity(world_t *world, struct prvm_edict_s *ed)
mempool_t * tempmempool
Definition zone.c:794
#define Mem_Free(mem)
Definition zone.h:96
#define Mem_AllocPool(name, flags, parent)
Definition zone.h:104