]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_cmds.c
added glFlush call when done feeding geometry, to get a very nice speed boost, and...
[xonotic/darkplaces.git] / pr_cmds.c
index 49cc08d2fb54d776b52b059b2882b5b9c808e4da..7b1a17825dccd0327ea8fdcff8645ea446b4735a 100644 (file)
--- a/pr_cmds.c
+++ b/pr_cmds.c
@@ -105,7 +105,7 @@ qboolean checkextension(char *name)
                while (*e && *e != ' ')
                        e++;
                if (e - start == len)
-                       if (!strncasecmp(e, name, len))
+                       if (!strncasecmp(start, name, len))
                                return true;
        }
        return false;
@@ -254,7 +254,7 @@ void SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate)
                angles = e->v.angles;
                
                a = angles[1]/180 * M_PI;
-               
+
                xvector[0] = cos(a);
                xvector[1] = sin(a);
                yvector[0] = -sin(a);
@@ -262,7 +262,7 @@ void SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate)
                
                VectorCopy (min, bounds[0]);
                VectorCopy (max, bounds[1]);
-               
+
                rmin[0] = rmin[1] = rmin[2] = 9999;
                rmax[0] = rmax[1] = rmax[2] = -9999;
                
@@ -350,16 +350,16 @@ void PF_setmodel (void)
        for (i=0, check = sv.model_precache ; *check ; i++, check++)
                if (!strcmp(*check, m))
                        break;
-                       
+
        if (!*check)
                PR_RunError ("no precache: %s\n", m);
-               
+
 
        e->v.model = m - pr_strings;
        e->v.modelindex = i; //SV_ModelIndex (m);
 
        mod = sv.models[ (int)e->v.modelindex];  // Mod_ForName (m, true);
-       
+
        if (mod)
        /*
        { // LordHavoc: corrected model bounding box, but for compatibility that means I have to break it here
@@ -374,7 +374,7 @@ void PF_setmodel (void)
                        SetMinMaxSize (e, mod->mins, mod->maxs, true);
        }
        */
-               SetMinMaxSize (e, mod->mins, mod->maxs, true);
+               SetMinMaxSize (e, mod->normalmins, mod->normalmaxs, true);
        else
                SetMinMaxSize (e, vec3_origin, vec3_origin, true);
 }
@@ -646,7 +646,7 @@ void PF_ambientsound (void)
        for (soundnum=0, check = sv.sound_precache ; *check ; check++, soundnum++)
                if (!strcmp(*check,samp))
                        break;
-                       
+
        if (!*check)
        {
                Con_Printf ("no precache: %s\n", samp);
@@ -665,7 +665,7 @@ void PF_ambientsound (void)
                MSG_WriteByte (&sv.signon, svc_spawnstaticsound);
 
        for (i=0 ; i<3 ; i++)
-               MSG_WriteFloatCoord(&sv.signon, pos[i]);
+               MSG_WriteDPCoord(&sv.signon, pos[i]);
 
        if (large)
                MSG_WriteShort (&sv.signon, soundnum);
@@ -764,11 +764,12 @@ void PF_traceline (void)
        pr_global_struct->trace_inopen = trace.inopen;
        VectorCopy (trace.endpos, pr_global_struct->trace_endpos);
        VectorCopy (trace.plane.normal, pr_global_struct->trace_plane_normal);
-       pr_global_struct->trace_plane_dist =  trace.plane.dist; 
+       pr_global_struct->trace_plane_dist =  trace.plane.dist;
        if (trace.ent)
                pr_global_struct->trace_ent = EDICT_TO_PROG(trace.ent);
        else
                pr_global_struct->trace_ent = EDICT_TO_PROG(sv.edicts);
+       // FIXME: add trace_endcontents
 }
 
 
@@ -857,12 +858,12 @@ void PF_checkpos (void)
 
 //============================================================================
 
-byte   checkpvs[MAX_MAP_LEAFS/8];
+qbyte checkpvs[MAX_MAP_LEAFS/8];
 
 int PF_newcheckclient (int check)
 {
        int             i;
-       byte    *pvs;
+       qbyte   *pvs;
        edict_t *ent;
        mleaf_t *leaf;
        vec3_t  org;
@@ -1005,7 +1006,7 @@ localcmd (string)
 void PF_localcmd (void)
 {
        char    *str;
-       
+
        str = G_STRING(OFS_PARM0);      
        Cbuf_AddText (str);
 }
@@ -1095,22 +1096,36 @@ void PF_dprint (void)
        Con_DPrintf ("%s",PF_VarString(0));
 }
 
-char   pr_string_temp[128];
+// LordHavoc: added this to semi-fix the problem of using many ftos calls in a print
+#define STRINGTEMP_BUFFERS 16
+#define STRINGTEMP_LENGTH 128
+static char pr_string_temp[STRINGTEMP_BUFFERS][STRINGTEMP_LENGTH];
+static int pr_string_tempindex = 0;
+
+static char *PR_GetTempString(void)
+{
+       char *s;
+       s = pr_string_temp[pr_string_tempindex];
+       pr_string_tempindex = (pr_string_tempindex + 1) % STRINGTEMP_BUFFERS;
+       return s;
+}
 
 void PF_ftos (void)
 {
-       float   v;
+       float v;
+       char *s;
        v = G_FLOAT(OFS_PARM0);
 
-       // LordHavoc: ftos improvement
-       sprintf (pr_string_temp, "%g", v);
+       s = PR_GetTempString();
        /*
        if (v == (int)v)
-               sprintf (pr_string_temp, "%d",(int)v);
+               sprintf (s, "%d",(int)v);
        else
-               sprintf (pr_string_temp, "%5.1f",v);
+               sprintf (s, "%5.1f",v);
        */
-       G_INT(OFS_RETURN) = pr_string_temp - pr_strings;
+       // LordHavoc: ftos improvement
+       sprintf (s, "%g", v);
+       G_INT(OFS_RETURN) = s - pr_strings;
 }
 
 void PF_fabs (void)
@@ -1122,14 +1137,18 @@ void PF_fabs (void)
 
 void PF_vtos (void)
 {
-       sprintf (pr_string_temp, "'%5.1f %5.1f %5.1f'", G_VECTOR(OFS_PARM0)[0], G_VECTOR(OFS_PARM0)[1], G_VECTOR(OFS_PARM0)[2]);
-       G_INT(OFS_RETURN) = pr_string_temp - pr_strings;
+       char *s;
+       s = PR_GetTempString();
+       sprintf (s, "'%5.1f %5.1f %5.1f'", G_VECTOR(OFS_PARM0)[0], G_VECTOR(OFS_PARM0)[1], G_VECTOR(OFS_PARM0)[2]);
+       G_INT(OFS_RETURN) = s - pr_strings;
 }
 
 void PF_etos (void)
 {
-       sprintf (pr_string_temp, "entity %i", G_EDICTNUM(OFS_PARM0));
-       G_INT(OFS_RETURN) = pr_string_temp - pr_strings;
+       char *s;
+       s = PR_GetTempString();
+       sprintf (s, "entity %i", G_EDICTNUM(OFS_PARM0));
+       G_INT(OFS_RETURN) = s - pr_strings;
 }
 
 void PF_Spawn (void)
@@ -1155,7 +1174,7 @@ void PF_Remove (void)
 // entity (entity start, .string field, string match) find = #5;
 void PF_Find (void)
 {
-       int             e;      
+       int             e;
        int             f;
        char    *s, *t;
        edict_t *ed;
@@ -1168,7 +1187,7 @@ void PF_Find (void)
                RETURN_EDICT(sv.edicts);
                return;
        }
-               
+
        for (e++ ; e < sv.num_edicts ; e++)
        {
                ed = EDICT_NUM(e);
@@ -1323,9 +1342,9 @@ void PF_precache_model (void)
        
        if (sv.state != ss_loading)
                PR_RunError ("PF_Precache_*: Precache can only be done in spawn functions");
-               
+
        s = G_STRING(OFS_PARM0);
-       if (hlbsp && ((!s) || (!s[0])))
+       if (sv.worldmodel->ishlbsp && ((!s) || (!s[0])))
                return;
        G_INT(OFS_RETURN) = G_INT(OFS_PARM0);
        PR_CheckEmptyString (s);
@@ -1335,7 +1354,7 @@ void PF_precache_model (void)
                if (!sv.model_precache[i])
                {
                        sv.model_precache[i] = s;
-                       sv.models[i] = Mod_ForName (s, true);
+                       sv.models[i] = Mod_ForName (s, true, false, false);
                        return;
                }
                if (!strcmp(sv.model_precache[i], s))
@@ -1570,7 +1589,7 @@ void PF_aim (void)
        VectorMA (start, 2048, dir, end);
        tr = SV_Move (start, vec3_origin, vec3_origin, end, MOVE_NORMAL, ent);
        if (tr.ent && tr.ent->v.takedamage == DAMAGE_AIM
-       && (!teamplay.value || ent->v.team <=0 || ent->v.team != tr.ent->v.team) )
+       && (!teamplay.integer || ent->v.team <=0 || ent->v.team != tr.ent->v.team) )
        {
                VectorCopy (pr_global_struct->v_forward, G_VECTOR(OFS_RETURN));
                return;
@@ -1589,7 +1608,7 @@ void PF_aim (void)
                        continue;
                if (check == ent)
                        continue;
-               if (teamplay.value && ent->v.team > 0 && ent->v.team == check->v.team)
+               if (teamplay.integer && ent->v.team > 0 && ent->v.team == check->v.team)
                        continue;       // don't aim at teammate
                for (j=0 ; j<3 ; j++)
                        end[j] = check->v.origin[j]
@@ -1794,7 +1813,7 @@ void PF_WriteAngle (void)
 
 void PF_WriteCoord (void)
 {
-       MSG_WriteFloatCoord (WriteDest(), G_FLOAT(OFS_PARM1));
+       MSG_WriteDPCoord (WriteDest(), G_FLOAT(OFS_PARM1));
 }
 
 void PF_WriteString (void)
@@ -1840,7 +1859,7 @@ void PF_makestatic (void)
        MSG_WriteByte (&sv.signon, ent->v.skin);
        for (i=0 ; i<3 ; i++)
        {
-               MSG_WriteFloatCoord(&sv.signon, ent->v.origin[i]);
+               MSG_WriteDPCoord(&sv.signon, ent->v.origin[i]);
                MSG_WriteAngle(&sv.signon, ent->v.angles[i]);
        }
 
@@ -2101,20 +2120,20 @@ void PF_setcolor (void)
 {
        client_t        *client;
        int                     entnum, i;
-       
+
        entnum = G_EDICTNUM(OFS_PARM0);
        i = G_FLOAT(OFS_PARM1);
-       
+
        if (entnum < 1 || entnum > svs.maxclients)
        {
                Con_Printf ("tried to setcolor a non-client\n");
                return;
        }
-               
+
        client = &svs.clients[entnum-1];
        client->colors = i;
        client->edict->v.team = (i & 15) + 1;
-               
+
        MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors);
        MSG_WriteByte (&sv.reliable_datagram, entnum - 1);
        MSG_WriteByte (&sv.reliable_datagram, i);
@@ -2144,9 +2163,9 @@ void PF_te_blood (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_BLOOD);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // velocity
        MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[0], 127));
        MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[1], 127));
@@ -2162,15 +2181,15 @@ void PF_te_bloodshower (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_BLOODSHOWER);
        // min
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // max
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // speed
-       MSG_WriteFloatCoord(&sv.datagram, G_FLOAT(OFS_PARM2));
+       MSG_WriteDPCoord(&sv.datagram, G_FLOAT(OFS_PARM2));
        // count
        MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535));
 }
@@ -2180,9 +2199,9 @@ void PF_te_explosionrgb (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_EXPLOSIONRGB);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // color
        MSG_WriteByte(&sv.datagram, bound(0, (int) (G_VECTOR(OFS_PARM1)[0] * 255), 255));
        MSG_WriteByte(&sv.datagram, bound(0, (int) (G_VECTOR(OFS_PARM1)[1] * 255), 255));
@@ -2196,17 +2215,17 @@ void PF_te_particlecube (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_PARTICLECUBE);
        // min
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // max
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // velocity
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
        // count
        MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535));
        // color
@@ -2214,7 +2233,7 @@ void PF_te_particlecube (void)
        // gravity true/false
        MSG_WriteByte(&sv.datagram, ((int) G_FLOAT(OFS_PARM5)) != 0);
        // randomvel
-       MSG_WriteFloatCoord(&sv.datagram, G_FLOAT(OFS_PARM6));
+       MSG_WriteDPCoord(&sv.datagram, G_FLOAT(OFS_PARM6));
 }
 
 void PF_te_particlerain (void)
@@ -2224,17 +2243,17 @@ void PF_te_particlerain (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_PARTICLERAIN);
        // min
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // max
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // velocity
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
        // count
        MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535));
        // color
@@ -2248,17 +2267,17 @@ void PF_te_particlesnow (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_PARTICLESNOW);
        // min
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // max
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // velocity
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
        // count
        MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535));
        // color
@@ -2272,9 +2291,9 @@ void PF_te_spark (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SPARK);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // velocity
        MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[0], 127));
        MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[1], 127));
@@ -2288,9 +2307,9 @@ void PF_te_gunshotquad (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_GUNSHOTQUAD);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_spikequad (void)
@@ -2298,9 +2317,9 @@ void PF_te_spikequad (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SPIKEQUAD);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_superspikequad (void)
@@ -2308,9 +2327,9 @@ void PF_te_superspikequad (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SUPERSPIKEQUAD);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_explosionquad (void)
@@ -2318,9 +2337,9 @@ void PF_te_explosionquad (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_EXPLOSIONQUAD);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_smallflash (void)
@@ -2328,9 +2347,9 @@ void PF_te_smallflash (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SMALLFLASH);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_customflash (void)
@@ -2340,9 +2359,9 @@ void PF_te_customflash (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_CUSTOMFLASH);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // radius
        MSG_WriteByte(&sv.datagram, bound(0, G_FLOAT(OFS_PARM1) / 8 - 1, 255));
        // lifetime
@@ -2358,9 +2377,9 @@ void PF_te_gunshot (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_GUNSHOT);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_spike (void)
@@ -2368,9 +2387,9 @@ void PF_te_spike (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SPIKE);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_superspike (void)
@@ -2378,9 +2397,9 @@ void PF_te_superspike (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_SUPERSPIKE);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_explosion (void)
@@ -2388,9 +2407,9 @@ void PF_te_explosion (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_EXPLOSION);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_tarexplosion (void)
@@ -2398,9 +2417,9 @@ void PF_te_tarexplosion (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_TAREXPLOSION);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_wizspike (void)
@@ -2408,9 +2427,9 @@ void PF_te_wizspike (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_WIZSPIKE);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_knightspike (void)
@@ -2418,9 +2437,9 @@ void PF_te_knightspike (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_KNIGHTSPIKE);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_lavasplash (void)
@@ -2428,9 +2447,9 @@ void PF_te_lavasplash (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_LAVASPLASH);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_teleport (void)
@@ -2438,9 +2457,9 @@ void PF_te_teleport (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_TELEPORT);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_te_explosion2 (void)
@@ -2448,9 +2467,9 @@ void PF_te_explosion2 (void)
        MSG_WriteByte(&sv.datagram, svc_temp_entity);
        MSG_WriteByte(&sv.datagram, TE_EXPLOSION2);
        // origin
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
        // color
        MSG_WriteByte(&sv.datagram, G_FLOAT(OFS_PARM1));
 }
@@ -2462,13 +2481,13 @@ void PF_te_lightning1 (void)
        // owner entity
        MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0));
        // start
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // end
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
 }
 
 void PF_te_lightning2 (void)
@@ -2478,13 +2497,13 @@ void PF_te_lightning2 (void)
        // owner entity
        MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0));
        // start
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // end
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
 }
 
 void PF_te_lightning3 (void)
@@ -2494,13 +2513,13 @@ void PF_te_lightning3 (void)
        // owner entity
        MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0));
        // start
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // end
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
 }
 
 void PF_te_beam (void)
@@ -2510,13 +2529,22 @@ void PF_te_beam (void)
        // owner entity
        MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0));
        // start
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]);
        // end
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
-       MSG_WriteFloatCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]);
+}
+
+void PF_te_plasmaburn (void)
+{
+       MSG_WriteByte(&sv.datagram, svc_temp_entity);
+       MSG_WriteByte(&sv.datagram, TE_PLASMABURN);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]);
+       MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]);
 }
 
 void PF_Fixme (void)
@@ -2617,7 +2645,7 @@ PF_precache_file,
 PF_setspawnparms,
 
 PF_Fixme,                              // #79 LordHavoc: dunno who owns 79-89, so these are just padding
-PF_Fixme,                              // #80 
+PF_Fixme,                              // #80
 PF_Fixme,                              // #81
 PF_Fixme,                              // #82
 PF_Fixme,                              // #83
@@ -2676,6 +2704,7 @@ PF_te_lightning2,         // #429
 PF_te_lightning3,              // #430
 PF_te_beam,                            // #431
 PF_vectorvectors,              // #432
+PF_te_plasmaburn,              // #433
 };
 
 builtin_t *pr_builtins = pr_builtin;