]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
make player_localnum and player_localentnum conform to FTEQW
[xonotic/darkplaces.git] / csprogs.c
index 79af0570f09565a1f0f247f9d648e60766db6a2a..a99c469b1e84829e98e60da23d73337f6f5cdf60 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -249,6 +249,8 @@ static void CSQC_SetGlobals (void)
                VectorCopy(cl.punchvector, PRVM_clientglobalvector(view_punchvector));
                PRVM_clientglobalfloat(maxclients) = cl.maxclients;
 
+               PRVM_clientglobalfloat(player_localentnum) = cl.viewentity;
+
                CSQC_R_RecalcView();
        CSQC_END
 }
@@ -304,6 +306,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum)
                entrender->entitynumber = edictnum + MAX_EDICTS;
                //entrender->shadertime = 0; // shadertime was set by spawn()
                entrender->flags = 0;
+               entrender->effects = 0;
                entrender->alpha = 1;
                entrender->scale = 1;
                VectorSet(entrender->colormod, 1, 1, 1);
@@ -372,6 +375,28 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum)
                if(renderflags & RF_ADDITIVE) entrender->flags |= RENDER_ADDITIVE;
        }
 
+       // walk attachments to find RENDER_EXTERIORMODEL status
+       {
+               prvm_edict_t *ent = ed;
+               int vn = CL_VM_GetViewEntity();
+               int attachloop = 0;
+               for(;;)
+               {
+                       if(attachloop >= 256)
+                               break;
+                       if(MAX_EDICTS + PRVM_NUM_FOR_EDICT(ent) == vn)
+                       {
+                               entrender->flags |= RENDER_EXTERIORMODEL;
+                               break;
+                       }
+                       if (PRVM_clientedictedict(ent, tag_entity))
+                               ent = PRVM_EDICT_NUM(PRVM_clientedictedict(ent, tag_entity));
+                       else
+                               break;
+                       attachloop++;
+               }
+       }
+
        c = (int)PRVM_clientedictfloat(ed, colormap);
        if (c <= 0)
                CL_SetEntityColormapColors(entrender, -1);
@@ -450,6 +475,7 @@ qboolean CL_VM_InputEvent (int eventtype, int x, int y)
 }
 
 extern r_refdef_view_t csqc_original_r_refdef_view;
+extern r_refdef_view_t csqc_main_r_refdef_view;
 qboolean CL_VM_UpdateView (void)
 {
        prvm_prog_t *prog = CLVM_prog;
@@ -462,7 +488,9 @@ qboolean CL_VM_UpdateView (void)
                return false;
        R_TimeReport("pre-UpdateView");
        CSQC_BEGIN
+               r_refdef.view.ismain = true;
                csqc_original_r_refdef_view = r_refdef.view;
+               csqc_main_r_refdef_view = r_refdef.view;
                //VectorCopy(cl.viewangles, oldangles);
                PRVM_clientglobalfloat(time) = cl.time;
                PRVM_clientglobaledict(self) = cl.csqc_server2csqcentitynumber[cl.playerentity];
@@ -478,8 +506,10 @@ qboolean CL_VM_UpdateView (void)
                //VectorCopy(oldangles, cl.viewangles);
                // Dresk : Reset Dmg Globals Here
                CL_VM_UpdateDmgGlobals(0, 0, emptyvector);
-               r_refdef.view = csqc_original_r_refdef_view;
+               r_refdef.view = csqc_main_r_refdef_view;
+               R_RenderView_UpdateViewVectors(); // we have to do this, as we undid the scene render doing this for us
        CSQC_END
+
        R_TimeReport("UpdateView");
        return true;
 }
@@ -967,9 +997,9 @@ extern cvar_t csqc_usedemoprogs;
 void CL_VM_Init (void)
 {
        prvm_prog_t *prog = CLVM_prog;
-       const char* csprogsfn;
+       const char* csprogsfn = NULL;
        unsigned char *csprogsdata = NULL;
-       fs_offset_t csprogsdatasize;
+       fs_offset_t csprogsdatasize = 0;
        int csprogsdatacrc, requiredcrc;
        int requiredsize;
        char vabuf[1024];
@@ -1106,7 +1136,8 @@ void CL_VM_Init (void)
        PRVM_clientglobaledict(self) = 0;
 
        PRVM_clientglobalstring(mapname) = PRVM_SetEngineString(prog, cl.worldname);
-       PRVM_clientglobalfloat(player_localentnum) = cl.playerentity;
+       PRVM_clientglobalfloat(player_localnum) = cl.realplayerentity - 1;
+       PRVM_clientglobalfloat(player_localentnum) = cl.viewentity;
 
        // set map description (use world entity 0)
        PRVM_clientedictstring(prog->edicts, message) = PRVM_SetEngineString(prog, cl.worldmessage);
@@ -1217,3 +1248,10 @@ qboolean CL_VM_TransformView(int entnum, matrix4x4_t *viewmatrix, mplane_t *clip
 
        return ret;
 }
+
+int CL_VM_GetViewEntity(void)
+{
+       if(cl.csqc_server2csqcentitynumber[cl.viewentity])
+               return cl.csqc_server2csqcentitynumber[cl.viewentity] + MAX_EDICTS;
+       return cl.viewentity;
+}