+ else
+ {
+ self.model = forceplayermodels_goodmodel;
+ self.modelindex = forceplayermodels_goodmodelindex;
+ self.skin = self.forceplayermodels_saveskin;
+ }
+
+ // forceplayercolors too
+ if(!teamplay)
+ {
+ if(autocvar_cl_forcemyplayercolors && islocalplayer)
+ self.colormap = 1024 + autocvar_cl_forcemyplayercolors;
+ else if(autocvar_cl_forceplayercolors)
+ self.colormap = player_localnum + 1;
+ }
+}
+
+// FEATURE: fallback frames
+.float csqcmodel_saveframe;
+.float csqcmodel_saveframe2;
+.float csqcmodel_saveframe3;
+.float csqcmodel_saveframe4;
+.float csqcmodel_framecount;
+
+#define IS_DEAD_FRAME(f) ((f) == 0 || (f) == 1)
+void CSQCPlayer_FallbackFrame_PreUpdate(void)
+{
+ self.frame = self.csqcmodel_saveframe;
+ self.frame2 = self.csqcmodel_saveframe2;
+ self.frame3 = self.csqcmodel_saveframe3;
+ self.frame4 = self.csqcmodel_saveframe4;
+}
+void CSQCPlayer_FallbackFrame_PostUpdate(float isnew)
+{
+ self.csqcmodel_saveframe = self.frame;
+ self.csqcmodel_saveframe2 = self.frame2;
+ self.csqcmodel_saveframe3 = self.frame3;
+ self.csqcmodel_saveframe4 = self.frame4;
+
+ // hack for death animations: set their frametime to zero in case a
+ // player "pops in"
+ if(isnew)
+ {
+#define FIX_FRAMETIME(f,ft) \
+ if(IS_DEAD_FRAME(self.f)) \
+ { \
+ self.ft = self.death_time; \
+ }
+ FIX_FRAMETIME(frame, frame1time)
+ FIX_FRAMETIME(frame2, frame2time)
+ FIX_FRAMETIME(frame3, frame3time)
+ FIX_FRAMETIME(frame4, frame4time)
+ }
+ self.csqcmodel_isdead = IS_DEAD_FRAME(self.frame);
+}
+float CSQCPlayer_FallbackFrame(float f)
+{
+ if(frameduration(self.modelindex, f) > 0)
+ return f; // goooooood
+ switch(f)
+ {
+ case 23: return 11; // anim_melee -> anim_shoot
+ case 24: return 4; // anim_duckwalkbackwards -> anim_duckwalk
+ case 25: return 4; // anim_duckwalkstrafeleft -> anim_duckwalk
+ case 26: return 4; // anim_duckwalkstraferight -> anim_duckwalk
+ case 27: return 4; // anim_duckwalkforwardright -> anim_duckwalk
+ case 28: return 4; // anim_duckwalkforwardleft -> anim_duckwalk
+ case 29: return 4; // anim_duckwalkbackright -> anim_duckwalk
+ case 30: return 4; // anim_duckwalkbackleft -> anim_duckwalk
+ }
+ print(sprintf("Frame %d missing in model %s, and we have no fallback - FAIL!\n", f, self.model));
+ return f;
+}
+void CSQCPlayer_FallbackFrame_Apply(void)
+{
+ self.frame = CSQCPlayer_FallbackFrame(self.frame);
+ self.frame2 = CSQCPlayer_FallbackFrame(self.frame2);
+ self.frame3 = CSQCPlayer_FallbackFrame(self.frame3);
+ self.frame4 = CSQCPlayer_FallbackFrame(self.frame4);