]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
forcemodels: also, if client lacks a model file, force model to default player model
authorRudolf Polzer <divverent@alientrap.org>
Fri, 2 Dec 2011 13:41:39 +0000 (14:41 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Fri, 2 Dec 2011 13:41:39 +0000 (14:41 +0100)
qcsrc/client/Main.qc
qcsrc/client/csqcmodel_hooks.qc
qcsrc/server/cl_client.qc

index af7787c0fc67797ea1c0c904976be2c996b5f414..572e5981d56b83edd12a4853dd287673d2502688 100644 (file)
@@ -43,7 +43,6 @@ float __engine_check;
 
 void precache_playermodel(string m)
 {
-       float globhandle, i, n;
        string f;
 
        if(substring(m, -9,5) == "_lod1")
@@ -59,6 +58,7 @@ void precache_playermodel(string m)
                precache_model(f);
 
        /*
+       float globhandle, i, n;
        globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
        if (globhandle < 0)
                return;
index 887be7b62c80be06233b734bea660ce482fed2ea..c3bbc970eb9c3fab9588d95c0fccc985956fe39c 100644 (file)
@@ -18,39 +18,6 @@ void CSQCModel_Hook_PreDraw(float isplayer)
 
                if(self.modelindex && self.model != "null")
                {
-                       // LOD
-                       if(self.lodmodelindex0 != self.modelindex)
-                       {
-                               string modelname = self.model;
-                               string s;
-
-                               // set modelindex
-                               self.lodmodelindex0 = self.modelindex;
-                               self.lodmodelindex1 = self.modelindex;
-                               self.lodmodelindex2 = self.modelindex;
-
-                               // FIXME: this only supports 3-letter extensions
-                               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
-                               if(fexists(s))
-                               {
-                                       precache_model(s);
-                                       setmodel(self, s);
-                                       if(self.modelindex)
-                                               self.lodmodelindex1 = self.modelindex;
-                               }
-
-                               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
-                               if(fexists(s))
-                               {
-                                       precache_model(s);
-                                       setmodel(self, s);
-                                       if(self.modelindex)
-                                               self.lodmodelindex2 = self.modelindex;
-                               }
-
-                               setmodel(self, modelname); // make everything normal again
-                       }
-
                        if(autocvar_cl_playerdetailreduction <= 0)
                        {
                                if(autocvar_cl_playerdetailreduction <= -2)
@@ -168,30 +135,70 @@ void CSQCModel_Hook_PostUpdate(float isplayer, float islocalplayer)
                self.forceplayermodels_savemodelindex = self.modelindex;
                self.forceplayermodels_saveskin = self.skin;
 
-               if(autocvar_cl_forceplayermodels)
+               if(self.modelindex && self.model != "null")
                {
-                       if(self.modelindex && self.model != "null")
+                       if(islocalplayer)
                        {
-                               if(islocalplayer)
-                               {
-                                       // trust server's idea of "own player model"
-                                       forceplayermodels_model = self.model;
-                                       forceplayermodels_modelindex = self.modelindex;
-                                       forceplayermodels_skin = self.skin;
-                               }
-                               if(!forceplayermodels_modelindex)
-                               {
-                                       // only if this failed, find it out on our own
-                                       setmodel(self, autocvar__cl_playermodel); // this is harmless, see below
-                                       forceplayermodels_model = self.model;
-                                       forceplayermodels_modelindex = self.modelindex;
-                                       forceplayermodels_skin = autocvar__cl_playerskin;
-                               }
+                               // trust server's idea of "own player model"
+                               forceplayermodels_model = self.model;
+                               forceplayermodels_modelindex = self.modelindex;
+                               forceplayermodels_skin = self.skin;
+                       }
+                       if(!forceplayermodels_modelindex)
+                       {
+                               // only if this failed, find it out on our own
+                               setmodel(self, autocvar__cl_playermodel); // this is harmless, see below
+                               forceplayermodels_model = self.model;
+                               forceplayermodels_modelindex = self.modelindex;
+                               forceplayermodels_skin = autocvar__cl_playerskin;
                        }
+               }
 
+               if(autocvar_cl_forceplayermodels)
+               {
                        self.model = forceplayermodels_model;
                        self.modelindex = forceplayermodels_modelindex;
                        self.skin = forceplayermodels_skin;
                }
+
+               // LOD model loading
+               if(self.lodmodelindex0 != self.modelindex)
+               {
+                       string modelname = self.model;
+                       string s;
+
+                       if(!fexists(modelname))
+                       {
+                               print(sprintf(_("Trying to use non existing model %s. "), modelname));
+                               modelname = cvar_defstring("_cl_playermodel");
+                               print(sprintf(_("Reverted to %s."), modelname));
+                       }
+
+                       // set modelindex
+                       self.lodmodelindex0 = self.modelindex;
+                       self.lodmodelindex1 = self.modelindex;
+                       self.lodmodelindex2 = self.modelindex;
+
+                       // FIXME: this only supports 3-letter extensions
+                       s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
+                       if(fexists(s))
+                       {
+                               precache_model(s);
+                               setmodel(self, s);
+                               if(self.modelindex)
+                                       self.lodmodelindex1 = self.modelindex;
+                       }
+
+                       s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
+                       if(fexists(s))
+                       {
+                               precache_model(s);
+                               setmodel(self, s);
+                               if(self.modelindex)
+                                       self.lodmodelindex2 = self.modelindex;
+                       }
+
+                       setmodel(self, modelname); // make everything normal again
+               }
        }
 }
index 65b30b1d643da3978e4c261a596481e5f1bee8b4..b551ca392bf8428fbc625d0e4b1e8be7793322c4 100644 (file)
@@ -431,25 +431,26 @@ string CheckPlayerModel(string plyermodel) {
                // to change a cvar default, we'll have a small leak here.
                FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel"));
        }
-       if(strlen(plyermodel) < 4)
-               return FallbackPlayerModel;
+       // only in right path
        if( substring(plyermodel,0,14) != "models/player/")
                return FallbackPlayerModel;
-       else if(autocvar_sv_servermodelsonly)
+       // only good file extensions
+       if(substring(plyermodel,-4,4) != ".zym")
+       if(substring(plyermodel,-4,4) != ".dpm")
+       if(substring(plyermodel,-4,4) != ".iqm")
+       if(substring(plyermodel,-4,4) != ".md3")
+       if(substring(plyermodel,-4,4) != ".psk")
+               return FallbackPlayerModel;
+       // forbid the LOD models
+       if(substring(plyermodel, -9,5) == "_lod1")
+               return FallbackPlayerModel;
+       if(substring(plyermodel, -9,5) == "_lod2")
+               return FallbackPlayerModel;
+       if(plyermodel != strtolower(plyermodel))
+               return FallbackPlayerModel;
+       // also, restrict to server models
+       if(autocvar_sv_servermodelsonly)
        {
-               if(substring(plyermodel,-4,4) != ".zym")
-               if(substring(plyermodel,-4,4) != ".dpm")
-               if(substring(plyermodel,-4,4) != ".iqm")
-               if(substring(plyermodel,-4,4) != ".md3")
-               if(substring(plyermodel,-4,4) != ".psk")
-                       return FallbackPlayerModel;
-               // forbid the LOD models
-               if(substring(plyermodel, -9,5) == "_lod1")
-                       return FallbackPlayerModel;
-               if(substring(plyermodel, -9,5) == "_lod2")
-                       return FallbackPlayerModel;
-               if(plyermodel != strtolower(plyermodel))
-                       return FallbackPlayerModel;
                if(!fexists(plyermodel))
                        return FallbackPlayerModel;
        }