]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_cmds.c
changed GL_MATRIX_MODE check to GL_PROJECTION, and removed GL_MATRIX_MODE define...
[xonotic/darkplaces.git] / pr_cmds.c
index 08a1368efcc24e45b7bad39162740e9f93375f61..fc67d6c303dda197ef7ed2f9ac065d0d9df88dc9 100644 (file)
--- a/pr_cmds.c
+++ b/pr_cmds.c
@@ -37,13 +37,11 @@ cvar_t      sv_aim = {CVAR_SAVE, "sv_aim", "2"}; //"0.93"}; // LordHavoc: disabled au
 char *PF_VarString (int        first)
 {
        int             i;
-       static char out[256];
+       static char out[4096]; // FIXME: buffer overflow potential
 
        out[0] = 0;
-       for (i=first ; i<pr_argc ; i++)
-       {
+       for (i = first;i < pr_argc;i++)
                strcat (out, G_STRING((OFS_PARM0+i*3)));
-       }
        return out;
 }
 
@@ -59,14 +57,27 @@ DP_HALFLIFE_MAP \
 DP_INPUTBUTTONS \
 DP_MONSTERWALK \
 DP_MOVETYPEFOLLOW \
-DP_SOLIDCORPSE \
+DP_QC_CHANGEPITCH \
+DP_QC_COPYENTITY \
+DP_QC_ETOS \
+DP_QC_FINDCHAIN \
+DP_QC_FINDCHAINFLOAT \
+DP_QC_FINDFLOAT \
+DP_QC_GETLIGHT \
+DP_QC_MINMAXBOUND \
+DP_QC_RANDOMVEC \
+DP_QC_SINCOSSQRTPOW \
+DP_QC_TRACEBOX \
+DP_QC_TRACETOSS \
+DP_QUAKE2_MODEL \
 DP_REGISTERCVAR \
+DP_SOLIDCORPSE \
 DP_SPRITE32 \
 DP_SV_DRAWONLYTOCLIENT \
-DP_SV_NODRAWTOCLIENT \
+DP_SV_EFFECT \
 DP_SV_EXTERIORMODELTOCLIENT \
+DP_SV_NODRAWTOCLIENT \
 DP_SV_SETCOLOR \
-DP_SV_EFFECT \
 DP_TE_BLOOD \
 DP_TE_BLOODSHOWER \
 DP_TE_EXPLOSIONRGB \
@@ -74,20 +85,8 @@ DP_TE_PARTICLECUBE \
 DP_TE_PARTICLERAIN \
 DP_TE_PARTICLESNOW \
 DP_TE_SPARK \
-DP_QC_CHANGEPITCH \
-DP_QC_COPYENTITY \
-DP_QC_ETOS \
-DP_QC_FINDFLOAT \
-DP_QC_FINDCHAIN \
-DP_QC_FINDCHAINFLOAT \
-DP_QC_GETLIGHT \
-DP_QC_SINCOSSQRTPOW \
-DP_QC_MINMAXBOUND \
-DP_QC_RANDOMVEC \
-DP_QC_TRACEBOX \
-DP_QC_TRACETOSS \
-DP_QUAKE2_MODEL \
 NEH_CMD_PLAY2 \
+TW_SV_STEPCONTROL \
 ";
 
 qboolean checkextension(char *name)
@@ -105,7 +104,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;
@@ -168,13 +167,9 @@ void PF_objerror (void)
        ed = PROG_TO_EDICT(pr_global_struct->self);
        ED_Print (ed);
        ED_Free (ed);
-
-// LordHavoc: bug fix - no longer kills server
-//     Host_Error ("Program error");
 }
 
 
-
 /*
 ==============
 PF_makevectors
@@ -225,80 +220,12 @@ void PF_setorigin (void)
 
 void SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate)
 {
-       /*
-       float   *angles;
-       vec3_t  rmin, rmax;
-       float   bounds[2][3];
-       float   xvector[2], yvector[2];
-       float   a;
-       vec3_t  base, transformed;
-       int             i, j, k, l;
-       */
        int             i;
        
        for (i=0 ; i<3 ; i++)
                if (min[i] > max[i])
                        PR_RunError ("backwards mins/maxs");
 
-       /*
-       rotate = false;         // FIXME: implement rotation properly again
-
-       if (!rotate)
-       {
-               VectorCopy (min, rmin);
-               VectorCopy (max, rmax);
-       }
-       else
-       {
-       // find min / max for rotations
-               angles = e->v.angles;
-               
-               a = angles[1]/180 * M_PI;
-               
-               xvector[0] = cos(a);
-               xvector[1] = sin(a);
-               yvector[0] = -sin(a);
-               yvector[1] = cos(a);
-               
-               VectorCopy (min, bounds[0]);
-               VectorCopy (max, bounds[1]);
-
-               rmin[0] = rmin[1] = rmin[2] = 9999;
-               rmax[0] = rmax[1] = rmax[2] = -9999;
-               
-               for (i=0 ; i<= 1 ; i++)
-               {
-                       base[0] = bounds[i][0];
-                       for (j=0 ; j<= 1 ; j++)
-                       {
-                               base[1] = bounds[j][1];
-                               for (k=0 ; k<= 1 ; k++)
-                               {
-                                       base[2] = bounds[k][2];
-                                       
-                               // transform the point
-                                       transformed[0] = xvector[0]*base[0] + yvector[0]*base[1];
-                                       transformed[1] = xvector[1]*base[0] + yvector[1]*base[1];
-                                       transformed[2] = base[2];
-                                       
-                                       for (l=0 ; l<3 ; l++)
-                                       {
-                                               if (transformed[l] < rmin[l])
-                                                       rmin[l] = transformed[l];
-                                               if (transformed[l] > rmax[l])
-                                                       rmax[l] = transformed[l];
-                                       }
-                               }
-                       }
-               }
-       }
-       
-// set derived values
-       VectorCopy (rmin, e->v.mins);
-       VectorCopy (rmax, e->v.maxs);
-       VectorSubtract (max, min, e->v.size);
-       */
-       
 // set derived values
        VectorCopy (min, e->v.mins);
        VectorCopy (max, e->v.maxs);
@@ -356,24 +283,11 @@ void PF_setmodel (void)
 
 
        e->v.model = m - pr_strings;
-       e->v.modelindex = i; //SV_ModelIndex (m);
+       e->v.modelindex = i;
 
-       mod = sv.models[ (int)e->v.modelindex];  // Mod_ForName (m, true);
+       mod = sv.models[ (int)e->v.modelindex];
 
        if (mod)
-       /*
-       { // LordHavoc: corrected model bounding box, but for compatibility that means I have to break it here
-               vec3_t min, max;
-               if (mod->type == ALIASTYPE_MDL)
-               {
-                       min[0] = min[1] = min[2] = -16;
-                       max[0] = max[1] = max[2] = 16;
-                       SetMinMaxSize (e, min, max, true);
-               }
-               else
-                       SetMinMaxSize (e, mod->mins, mod->maxs, true);
-       }
-       */
                SetMinMaxSize (e, mod->normalmins, mod->normalmaxs, true);
        else
                SetMinMaxSize (e, vec3_origin, vec3_origin, true);
@@ -665,7 +579,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);
@@ -727,8 +641,6 @@ break()
 */
 void PF_break (void)
 {
-//     Con_Printf ("break statement\n");
-//     *(int *)-4 = 0; // dump to debugger
        PR_RunError ("break statement");
 }
 
@@ -858,12 +770,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;
@@ -1055,16 +967,18 @@ findradius (origin, radius)
 */
 void PF_findradius (void)
 {
-       edict_t *ent, *chain;
-       float   rad;
-       float   *org;
-       vec3_t  eorg;
-       int             i, j;
+       edict_t *ent, *chain;
+       float radius;
+       float radius2;
+       float *org;
+       float eorg[3];
+       int i;
 
        chain = (edict_t *)sv.edicts;
        
        org = G_VECTOR(OFS_PARM0);
-       rad = G_FLOAT(OFS_PARM1);
+       radius = G_FLOAT(OFS_PARM1);
+       radius2 = radius * radius;
 
        ent = NEXT_EDICT(sv.edicts);
        for (i=1 ; i<sv.num_edicts ; i++, ent = NEXT_EDICT(ent))
@@ -1073,9 +987,13 @@ void PF_findradius (void)
                        continue;
                if (ent->v.solid == SOLID_NOT)
                        continue;
-               for (j=0 ; j<3 ; j++)
-                       eorg[j] = org[j] - (ent->v.origin[j] + (ent->v.mins[j] + ent->v.maxs[j])*0.5);                  
-               if (Length(eorg) > rad)
+
+               // LordHavoc: compare against bounding box rather than center,
+               // and use DotProduct instead of Length, major speedup
+               eorg[0] = (org[0] - ent->v.origin[0]) - bound(ent->v.mins[0], (org[0] - ent->v.origin[0]), ent->v.maxs[0]);
+               eorg[1] = (org[1] - ent->v.origin[1]) - bound(ent->v.mins[1], (org[1] - ent->v.origin[1]), ent->v.maxs[1]);
+               eorg[2] = (org[2] - ent->v.origin[2]) - bound(ent->v.mins[2], (org[2] - ent->v.origin[2]), ent->v.maxs[2]);
+               if (DotProduct(eorg, eorg) > radius2)
                        continue;
                        
                ent->v.chain = EDICT_TO_PROG(chain);
@@ -1096,22 +1014,30 @@ 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);
 
+       s = PR_GetTempString();
        // LordHavoc: ftos improvement
-       sprintf (pr_string_temp, "%g", v);
-       /*
-       if (v == (int)v)
-               sprintf (pr_string_temp, "%d",(int)v);
-       else
-               sprintf (pr_string_temp, "%5.1f",v);
-       */
-       G_INT(OFS_RETURN) = pr_string_temp - pr_strings;
+       sprintf (s, "%g", v);
+       G_INT(OFS_RETURN) = s - pr_strings;
 }
 
 void PF_fabs (void)
@@ -1123,14 +1049,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)
@@ -1156,7 +1086,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;
@@ -1169,7 +1099,7 @@ void PF_Find (void)
                RETURN_EDICT(sv.edicts);
                return;
        }
-               
+
        for (e++ ; e < sv.num_edicts ; e++)
        {
                ed = EDICT_NUM(e);
@@ -1296,7 +1226,7 @@ void PF_precache_sound (void)
 {
        char    *s;
        int             i;
-       
+
        if (sv.state != ss_loading)
                PR_RunError ("PF_Precache_*: Precache can only be done in spawn functions");
 
@@ -1324,7 +1254,7 @@ 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 (sv.worldmodel->ishlbsp && ((!s) || (!s[0])))
                return;
@@ -1336,7 +1266,7 @@ void PF_precache_model (void)
                if (!sv.model_precache[i])
                {
                        sv.model_precache[i] = s;
-                       sv.models[i] = Mod_ForName (s, true, true, false);
+                       sv.models[i] = Mod_ForName (s, true, false, false);
                        return;
                }
                if (!strcmp(sv.model_precache[i], s))
@@ -1421,12 +1351,12 @@ void PF_droptofloor (void)
        edict_t         *ent;
        vec3_t          end;
        trace_t         trace;
-       
+
        ent = PROG_TO_EDICT(pr_global_struct->self);
 
        VectorCopy (ent->v.origin, end);
        end[2] -= 256;
-       
+
        trace = SV_Move (ent->v.origin, ent->v.mins, ent->v.maxs, end, MOVE_NORMAL, ent);
 
        if (trace.fraction == 1 || trace.allsolid)
@@ -1438,6 +1368,8 @@ void PF_droptofloor (void)
                ent->v.flags = (int)ent->v.flags | FL_ONGROUND;
                ent->v.groundentity = EDICT_TO_PROG(trace.ent);
                G_FLOAT(OFS_RETURN) = 1;
+               // if support is destroyed, keep suspended (gross hack for floating items in various maps)
+               ent->suspendedinairflag = true;
        }
 }
 
@@ -1454,17 +1386,17 @@ void PF_lightstyle (void)
        char    *val;
        client_t        *client;
        int                     j;
-       
+
        style = G_FLOAT(OFS_PARM0);
        val = G_STRING(OFS_PARM1);
 
 // change the string in sv
        sv.lightstyles[style] = val;
-       
+
 // send message to all clients on this server
        if (sv.state != ss_active)
                return;
-       
+
        for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
                if (client->active || client->spawned)
                {
@@ -1510,7 +1442,7 @@ PF_pointcontents
 */
 void PF_pointcontents (void)
 {
-       G_FLOAT(OFS_RETURN) = SV_PointContents (G_VECTOR(OFS_PARM0));
+       G_FLOAT(OFS_RETURN) = Mod_PointInLeaf(G_VECTOR(OFS_PARM0), sv.worldmodel)->contents;
 }
 
 /*
@@ -1524,7 +1456,7 @@ void PF_nextent (void)
 {
        int             i;
        edict_t *ent;
-       
+
        i = G_EDICTNUM(OFS_PARM0);
        while (1)
        {
@@ -1559,7 +1491,7 @@ void PF_aim (void)
        trace_t tr;
        float   dist, bestdist;
        float   speed;
-       
+
        ent = G_EDICT(OFS_PARM0);
        speed = G_FLOAT(OFS_PARM1);
 
@@ -1570,8 +1502,8 @@ void PF_aim (void)
        VectorCopy (pr_global_struct->v_forward, dir);
        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.integer || ent->v.team <=0 || ent->v.team != tr.ent->v.team) )
+       if (tr.ent && ((edict_t *)tr.ent)->v.takedamage == DAMAGE_AIM
+       && (!teamplay.integer || ent->v.team <=0 || ent->v.team != ((edict_t *)tr.ent)->v.team) )
        {
                VectorCopy (pr_global_struct->v_forward, G_VECTOR(OFS_RETURN));
                return;
@@ -1582,7 +1514,7 @@ void PF_aim (void)
        VectorCopy (dir, bestdir);
        bestdist = sv_aim.value;
        bestent = NULL;
-       
+
        check = NEXT_EDICT(sv.edicts);
        for (i=1 ; i<sv.num_edicts ; i++, check = NEXT_EDICT(check) )
        {
@@ -1607,7 +1539,7 @@ void PF_aim (void)
                        bestent = check;
                }
        }
-       
+
        if (bestent)
        {
                VectorSubtract (bestent->v.origin, ent->v.origin, dir);
@@ -1615,7 +1547,7 @@ void PF_aim (void)
                VectorScale (pr_global_struct->v_forward, dist, end);
                end[2] = dir[2];
                VectorNormalize (end);
-               VectorCopy (end, G_VECTOR(OFS_RETURN)); 
+               VectorCopy (end, G_VECTOR(OFS_RETURN));
        }
        else
        {
@@ -1634,12 +1566,12 @@ void PF_changeyaw (void)
 {
        edict_t         *ent;
        float           ideal, current, move, speed;
-       
+
        ent = PROG_TO_EDICT(pr_global_struct->self);
        current = ANGLEMOD(ent->v.angles[1]);
        ideal = ent->v.ideal_yaw;
        speed = ent->v.yaw_speed;
-       
+
        if (current == ideal)
                return;
        move = ideal - current;
@@ -1663,7 +1595,7 @@ void PF_changeyaw (void)
                if (move < -speed)
                        move = -speed;
        }
-       
+
        ent->v.angles[1] = ANGLEMOD (current + move);
 }
 
@@ -1677,7 +1609,7 @@ void PF_changepitch (void)
        edict_t         *ent;
        float           ideal, current, move, speed;
        eval_t          *val;
-       
+
        ent = G_EDICT(OFS_PARM0);
        current = ANGLEMOD( ent->v.angles[0] );
        if ((val = GETEDICTFIELDVALUE(ent, eval_idealpitch)))
@@ -1694,7 +1626,7 @@ void PF_changepitch (void)
                PR_RunError ("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch");
                return;
        }
-       
+
        if (current == ideal)
                return;
        move = ideal - current;
@@ -1718,7 +1650,7 @@ void PF_changepitch (void)
                if (move < -speed)
                        move = -speed;
        }
-       
+
        ent->v.angles[0] = ANGLEMOD (current + move);
 }
 
@@ -1746,17 +1678,17 @@ sizebuf_t *WriteDest (void)
        {
        case MSG_BROADCAST:
                return &sv.datagram;
-       
+
        case MSG_ONE:
                ent = PROG_TO_EDICT(pr_global_struct->msg_entity);
                entnum = NUM_FOR_EDICT(ent);
                if (entnum < 1 || entnum > svs.maxclients)
                        PR_RunError ("WriteDest: not a client");
                return &svs.clients[entnum-1].message;
-               
+
        case MSG_ALL:
                return &sv.reliable_datagram;
-       
+
        case MSG_INIT:
                return &sv.signon;
 
@@ -1764,7 +1696,7 @@ sizebuf_t *WriteDest (void)
                PR_RunError ("WriteDest: bad destination");
                break;
        }
-       
+
        return NULL;
 }
 
@@ -1795,7 +1727,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)
@@ -1817,7 +1749,7 @@ void PF_makestatic (void)
 {
        edict_t *ent;
        int             i, large;
-       
+
        ent = G_EDICT(OFS_PARM0);
 
        large = false;
@@ -1841,7 +1773,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]);
        }
 
@@ -1887,7 +1819,7 @@ void PF_changelevel (void)
        if (svs.changelevel_issued)
                return;
        svs.changelevel_issued = true;
-       
+
        s = G_STRING(OFS_PARM0);
        Cbuf_AddText (va("changelevel %s\n",s));
 }
@@ -1926,7 +1858,7 @@ void PF_randomvec (void)
                temp[2] = (rand()&32767) * (2.0 / 32767.0) - 1.0;
        }
        while (DotProduct(temp, temp) >= 1);
-       VectorCopy (temp, G_VECTOR(OFS_RETURN));        
+       VectorCopy (temp, G_VECTOR(OFS_RETURN));
 }
 
 void SV_LightPoint (vec3_t color, vec3_t p);
@@ -1948,7 +1880,7 @@ void PF_GetLight (void)
        vec_t*          p;
        p = G_VECTOR(OFS_PARM0);
        SV_LightPoint (color, p);
-       VectorCopy (color, G_VECTOR(OFS_RETURN));       
+       VectorCopy (color, G_VECTOR(OFS_RETURN));
 }
 
 #define MAX_QC_CVARS 128
@@ -1957,15 +1889,15 @@ int currentqc_cvar;
 
 void PF_registercvar (void)
 {
-       char    *name, *value;
-       cvar_t  *variable;
-       name = G_STRING(OFS_PARM1);
-       value = G_STRING(OFS_PARM2);
+       char *name, *value;
+       cvar_t *variable;
+       name = G_STRING(OFS_PARM0);
+       value = G_STRING(OFS_PARM1);
        G_FLOAT(OFS_RETURN) = 0;
 // first check to see if it has already been defined
        if (Cvar_FindVar (name))
                return;
-       
+
 // check for overlap with a command
        if (Cmd_Exists (name))
        {
@@ -1978,15 +1910,13 @@ void PF_registercvar (void)
 
 // copy the name and value
        variable = &qc_cvar[currentqc_cvar++];
-       variable->name = Z_Malloc (strlen(name)+1);     
+       variable->name = Z_Malloc (strlen(name)+1);
        strcpy (variable->name, name);
-       variable->string = Z_Malloc (strlen(value)+1);  
+       variable->string = Z_Malloc (strlen(value)+1);
        strcpy (variable->string, value);
        variable->value = atof (value);
-       
-// link the variable in
-       variable->next = cvar_vars;
-       cvar_vars = variable;
+
+       Cvar_RegisterVariable(variable);
        G_FLOAT(OFS_RETURN) = 1; // success
 }
 
@@ -2102,20 +2032,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);
@@ -2145,9 +2075,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));
@@ -2163,15 +2093,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));
 }
@@ -2181,9 +2111,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));
@@ -2197,17 +2127,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
@@ -2215,7 +2145,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)
@@ -2225,17 +2155,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
@@ -2249,17 +2179,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
@@ -2273,9 +2203,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));
@@ -2289,9 +2219,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)
@@ -2299,9 +2229,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)
@@ -2309,9 +2239,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)
@@ -2319,9 +2249,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)
@@ -2329,9 +2259,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)
@@ -2341,9 +2271,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
@@ -2359,9 +2289,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)
@@ -2369,9 +2299,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)
@@ -2379,9 +2309,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)
@@ -2389,9 +2319,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)
@@ -2399,9 +2329,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)
@@ -2409,9 +2339,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)
@@ -2419,9 +2349,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)
@@ -2429,9 +2359,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)
@@ -2439,9 +2369,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)
@@ -2449,9 +2379,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));
 }
@@ -2463,13 +2393,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)
@@ -2479,13 +2409,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)
@@ -2495,13 +2425,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)
@@ -2511,13 +2441,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)
@@ -2618,7 +2557,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
@@ -2677,7 +2616,9 @@ 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;
 int pr_numbuiltins = sizeof(pr_builtin)/sizeof(pr_builtin[0]);
+