]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
allow multiplayer savegames
[xonotic/darkplaces.git] / csprogs.c
index f2f2b6b3ba2c974ff6524a21a6a0d70702a82237..26aa822add799951628e00d3dcc2f53017eaa2e6 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -20,7 +20,6 @@ static char *cl_required_func[] =
        "CSQC_InputEvent",
        "CSQC_UpdateView",
        "CSQC_ConsoleCommand",
-       "CSQC_Shutdown"
 };
 
 static int cl_numrequiredfunc = sizeof(cl_required_func) / sizeof(char*);
@@ -49,6 +48,7 @@ void CL_VM_Error (const char *format, ...)    //[515]: hope it will be never execut
 //[515]: set globals before calling R_UpdateView, WEIRD CRAP
 static void CSQC_SetGlobals (void)
 {
+       prvm_eval_t *val;
        CSQC_BEGIN
                prog->globals.client->time = cl.time;
                prog->globals.client->frametime = max(0, cl.time - cl.oldtime);
@@ -60,10 +60,9 @@ static void CSQC_SetGlobals (void)
                VectorSet(prog->globals.client->input_movevalues, cl.movecmd[0].forwardmove, cl.movecmd[0].sidemove, cl.movecmd[0].upmove);
                //VectorCopy(cl.movement_origin, cl.csqc_origin);
                Matrix4x4_OriginFromMatrix(&cl.entities[cl.viewentity].render.matrix, cl.csqc_origin);
-               VectorCopy(cl.csqc_origin, prog->globals.client->pmove_org);
+               if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.view_angles)))
+                       VectorCopy(cl.viewangles, val->vector);
                prog->globals.client->maxclients = cl.maxclients;
-               //VectorCopy(cl.movement_velocity, prog->globals.client->pmove_vel);
-               VectorCopy(cl.velocity, prog->globals.client->pmove_vel);
        CSQC_END
 }
 
@@ -112,7 +111,6 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
 
        e->render.model = model;
        e->render.colormap = (int)ed->fields.client->colormap;
-       e->render.frame = (int)ed->fields.client->frame;
        e->render.skinnum = (int)ed->fields.client->skin;
        e->render.effects |= e->render.model->effects;
        scale = 1;
@@ -159,8 +157,8 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        // self.frame1time is the animation base time for the interpolation target
        // self.frame2 is the interpolation start (previous frame)
        // self.frame2time is the animation base time for the interpolation start
-       e->render.frame1 = e->render.frame = ed->fields.client->frame;
-       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2))) e->render.frame = val->_float;
+       e->render.frame1 = e->render.frame2 = ed->fields.client->frame;
+       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2))) e->render.frame2 = val->_float;
        if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame1time))) e->render.frame2time = val->_float;
        if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2time))) e->render.frame1time = val->_float;
        if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac))) e->render.framelerp = val->_float;
@@ -178,6 +176,28 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
                if(renderflags & RF_ADDITIVE)           e->render.effects |= EF_ADDITIVE;
        }
 
+       if ((e->render.colormap > 0 && e->render.colormap <= cl.maxclients) || e->render.colormap >= 1024)
+       {
+               int cb;
+               unsigned char *cbcolor;
+               int palcol;
+               if (e->render.colormap >= 1024)
+                       palcol = (unsigned char)(e->render.colormap-1024);
+               else
+                       palcol = cl.scores[e->render.colormap-1].colors;
+
+               cb = (palcol & 0xF) << 4;cb += (cb >= 128 && cb < 224) ? 4 : 12;
+               cbcolor = (unsigned char *) (&palette_complete[cb]);
+               e->render.colormap_pantscolor[0] = cbcolor[0] * (1.0f / 255.0f);
+               e->render.colormap_pantscolor[1] = cbcolor[1] * (1.0f / 255.0f);
+               e->render.colormap_pantscolor[2] = cbcolor[2] * (1.0f / 255.0f);
+               cb = (palcol & 0xF0);cb += (cb >= 128 && cb < 224) ? 4 : 12;
+               cbcolor = (unsigned char *) (&palette_complete[cb]);
+               e->render.colormap_shirtcolor[0] = cbcolor[0] * (1.0f / 255.0f);
+               e->render.colormap_shirtcolor[1] = cbcolor[1] * (1.0f / 255.0f);
+               e->render.colormap_shirtcolor[2] = cbcolor[2] * (1.0f / 255.0f);
+       }
+
        // either fullbright or lit
        if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
                e->render.flags |= RENDER_LIGHT;
@@ -199,11 +219,16 @@ qboolean CL_VM_InputEvent (qboolean pressed, int key)
        if(!cl.csqc_loaded)
                return false;
        CSQC_BEGIN
-               prog->globals.client->time = cl.time;
-               PRVM_G_FLOAT(OFS_PARM0) = pressed;
-               PRVM_G_FLOAT(OFS_PARM1) = key;
-               PRVM_ExecuteProgram(prog->funcoffsets.CSQC_InputEvent, "QC function CSQC_InputEvent is missing");
-               r = CSQC_RETURNVAL;
+               if (!prog->funcoffsets.CSQC_InputEvent)
+                       r = false;
+               else
+               {
+                       prog->globals.client->time = cl.time;
+                       PRVM_G_FLOAT(OFS_PARM0) = pressed;
+                       PRVM_G_FLOAT(OFS_PARM1) = key;
+                       PRVM_ExecuteProgram(prog->funcoffsets.CSQC_InputEvent, "QC function CSQC_InputEvent is missing");
+                       r = CSQC_RETURNVAL;
+               }
        CSQC_END
        return r;
 }
@@ -231,16 +256,19 @@ extern sizebuf_t vm_tempstringsbuf;
 qboolean CL_VM_ConsoleCommand (const char *cmd)
 {
        int restorevm_tempstringsbuf_cursize;
-       qboolean r;
+       qboolean r = false;
        if(!cl.csqc_loaded)
                return false;
        CSQC_BEGIN
+       if (prog->funcoffsets.CSQC_ConsoleCommand)
+       {
                prog->globals.client->time = cl.time;
                restorevm_tempstringsbuf_cursize = vm_tempstringsbuf.cursize;
                PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(cmd);
                PRVM_ExecuteProgram(prog->funcoffsets.CSQC_ConsoleCommand, "QC function CSQC_ConsoleCommand is missing");
                vm_tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
                r = CSQC_RETURNVAL;
+       }
        CSQC_END
        return r;
 }
@@ -392,6 +420,12 @@ float CL_VM_Event (float event)            //[515]: needed ? I'd say "YES", but don't know
 void CSQC_ReadEntities (void)
 {
        unsigned short entnum, oldself, realentnum;
+       if(!cl.csqc_loaded)
+       {
+               Host_Error ("CSQC_ReadEntities: CSQC is not loaded");
+               return;
+       }
+
        CSQC_BEGIN
                prog->globals.client->time = cl.time;
                oldself = prog->globals.client->self;
@@ -621,7 +655,8 @@ void CL_VM_ShutDown (void)
                return;
        CSQC_BEGIN
                prog->globals.client->time = cl.time;
-               PRVM_ExecuteProgram(prog->funcoffsets.CSQC_Shutdown, "QC function CSQC_Shutdown is missing");
+               if (prog->funcoffsets.CSQC_Shutdown)
+                       PRVM_ExecuteProgram(prog->funcoffsets.CSQC_Shutdown, "QC function CSQC_Shutdown is missing");
                PRVM_ResetProg();
        CSQC_END
        Con_Print("CSQC ^1unloaded\n");