]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
fix interpretation of text brightness/contrast cvars when a color multiplier is set
[xonotic/darkplaces.git] / csprogs.c
index 4b421f3c17e6b3f4732ab3800e9a815a8e84e033..2bf194178b004845dfa98f8a192d5ca041344deb 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -44,7 +44,7 @@ void CL_VM_Error (const char *format, ...)    //[515]: hope it will be never execut
        Cvar_SetValueQuick(&csqc_progsize, -1);
 
 //     Host_AbortCurrentFrame();       //[515]: hmmm... if server says it needs csqc then client MUST disconnect
-       Host_Error(va("CL_VM_Error: %s", errorstring));
+       Host_Error("CL_VM_Error: %s", errorstring);
 }
 void CL_VM_UpdateDmgGlobals (int dmg_take, int dmg_save, vec3_t dmg_origin)
 {
@@ -212,6 +212,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        else
                CL_SetEntityColormapColors(entrender, c);
 
+       entrender->flags &= ~(RENDER_SHADOW | RENDER_LIGHT | RENDER_NOSELFSHADOW);
        // either fullbright or lit
        if (!(entrender->effects & EF_FULLBRIGHT) && !r_fullbright.integer)
                entrender->flags |= RENDER_LIGHT;
@@ -223,6 +224,8 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
                entrender->flags |= RENDER_SHADOW;
        if (entrender->flags & RENDER_VIEWMODEL)
                entrender->flags |= RENDER_NOSELFSHADOW;
+       if (entrender->effects & EF_NOSELFSHADOW)
+               entrender->flags |= RENDER_NOSELFSHADOW;
 
        // make the other useful stuff
        CL_UpdateRenderEntity(entrender);
@@ -272,6 +275,9 @@ qboolean CL_VM_UpdateView (void)
                // CSQC_UpdateView function does not call R_ClearScene as it should
                r_refdef.scene.numentities = 0;
                r_refdef.scene.numlights = 0;
+               // pass in width and height as parameters (EXT_CSQC_1)
+               PRVM_G_FLOAT(OFS_PARM0) = vid.width;
+               PRVM_G_FLOAT(OFS_PARM1) = vid.height;
                PRVM_ExecuteProgram(prog->funcoffsets.CSQC_UpdateView, "QC function CSQC_UpdateView is missing");
                //VectorCopy(oldangles, cl.viewangles);
                // Dresk : Reset Dmg Globals Here
@@ -346,6 +352,46 @@ void CL_VM_Parse_StuffCmd (const char *msg)
                csqc_progsize.flags = sizeflags;
                return;
        }
+
+       if(cls.demoplayback)
+       if(!strncmp(msg, "curl --clear_autodownload\ncurl --pak --forthismap --as ", 55))
+       {
+               // special handling for map download commands
+               // run these commands IMMEDIATELY, instead of waiting for a client frame
+               // that way, there is no black screen when playing back demos
+               // I know this is a really ugly hack, but I can't think of any better way
+               // FIXME find the actual CAUSE of this, and make demo playback WAIT
+               // until all maps are loaded, then remove this hack
+
+               char buf[MAX_INPUTLINE];
+               const char *p, *q;
+               size_t l;
+
+               p = msg;
+
+               for(;;)
+               {
+                       q = strchr(p, '\n');
+                       if(q)
+                               l = q - p;
+                       else
+                               l = strlen(p);
+                       if(l > sizeof(buf) - 1)
+                               l = sizeof(buf) - 1;
+                       strlcpy(buf, p, l + 1); // strlcpy needs a + 1 as it includes the newline!
+
+                       Cmd_ExecuteString(buf, src_command);
+
+                       p += l;
+                       if(*p == '\n')
+                               ++p; // skip the newline and continue
+                       else
+                               break; // end of string or overflow
+               }
+               Cmd_ExecuteString("curl --clear_autodownload", src_command); // don't inhibit CSQC loading
+               return;
+       }
+
        if(!cl.csqc_loaded)
        {
                Cbuf_AddText(msg);
@@ -666,7 +712,7 @@ void Cmd_ClearCsqcFuncs (void);
 
 // returns true if the packet is valid, false if end of file is reached
 // used for dumping the CSQC download into demo files
-qboolean MakeDownloadPacket(const char *filename, void *data, unsigned long len, int crc, int cnt, sizebuf_t *buf, int protocol)
+qboolean MakeDownloadPacket(const char *filename, unsigned char *data, unsigned long len, int crc, int cnt, sizebuf_t *buf, int protocol)
 {
        int packetsize = buf->maxsize - 7; // byte short long
        int npackets = (len + packetsize - 1) / (packetsize);
@@ -691,7 +737,7 @@ qboolean MakeDownloadPacket(const char *filename, void *data, unsigned long len,
                MSG_WriteByte(buf, svc_downloaddata);
                MSG_WriteLong(buf, thispacketoffset);
                MSG_WriteShort(buf, thispacketsize);
-               SZ_Write(buf, (char*)data + thispacketoffset, thispacketsize);
+               SZ_Write(buf, data + thispacketoffset, thispacketsize);
 
                return true;
        }
@@ -810,19 +856,25 @@ void CL_VM_Init (void)
 
        if(cls.demorecording)
        {
-               int i;
-               char buf[NET_MAXMESSAGE];
-               sizebuf_t sb;
-               void *demobuf; fs_offset_t demofilesize;
-
-               sb.data = (void *) buf;
-               sb.maxsize = sizeof(buf);
-               i = 0;
-
-               CL_CutDemo(&demobuf, &demofilesize);
-               while(MakeDownloadPacket(csprogsfn, csprogsdata, csprogsdatasize, csprogsdatacrc, i++, &sb, cls.protocol))
-                       CL_WriteDemoMessage(&sb);
-               CL_PasteDemo(&demobuf, &demofilesize);
+               if(cls.demo_lastcsprogssize != csprogsdatasize || cls.demo_lastcsprogscrc != csprogsdatacrc)
+               {
+                       int i;
+                       char buf[NET_MAXMESSAGE];
+                       sizebuf_t sb;
+                       unsigned char *demobuf; fs_offset_t demofilesize;
+
+                       sb.data = (void *) buf;
+                       sb.maxsize = sizeof(buf);
+                       i = 0;
+
+                       CL_CutDemo(&demobuf, &demofilesize);
+                       while(MakeDownloadPacket(csqc_progname.string, csprogsdata, csprogsdatasize, csprogsdatacrc, i++, &sb, cls.protocol))
+                               CL_WriteDemoMessage(&sb);
+                       CL_PasteDemo(&demobuf, &demofilesize);
+
+                       cls.demo_lastcsprogssize = csprogsdatasize;
+                       cls.demo_lastcsprogscrc = csprogsdatacrc;
+               }
        }
        Mem_Free(csprogsdata);