X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fcsqcmodel_hooks.qc;h=a3e612062f903abd4de191b5e70d38b612c503e3;hb=51086b4545acc961d03eb8091669d9963fa6bf00;hp=1d0c36ae9c1236302d77cc354511a88deeb3d31b;hpb=48388e38c1377c33f08feed8e76c0a2c9212a20c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 1d0c36ae9..a3e612062 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -69,7 +69,7 @@ void CSQCPlayer_LOD_Apply(void) } } -// FEATURE: forcemodel (MUST be called BEFORE LOD!) +// FEATURE: forcemodel and model color selection (MUST be called BEFORE LOD!) string forceplayermodels_model; float forceplayermodels_modelisgoodmodel; float forceplayermodels_modelindex; @@ -92,14 +92,17 @@ float forceplayermodels_attempted; string forceplayermodels_goodmodel; float forceplayermodels_goodmodelindex; -void CSQCPlayer_ForceModel_PreUpdate(void) +.vector glowmod; +.vector old_glowmod; + +void CSQCPlayer_ModelAppearance_PreUpdate(void) { self.model = self.forceplayermodels_savemodel; self.modelindex = self.forceplayermodels_savemodelindex; self.skin = self.forceplayermodels_saveskin; self.colormap = self.forceplayermodels_savecolormap; } -void CSQCPlayer_ForceModel_PostUpdate(void) +void CSQCPlayer_ModelAppearance_PostUpdate(void) { self.forceplayermodels_savemodel = self.model; self.forceplayermodels_savemodelindex = self.modelindex; @@ -114,7 +117,7 @@ void CSQCPlayer_ForceModel_PostUpdate(void) print(sprintf("Warning: missing model %s has been used\n", self.forceplayermodels_savemodel)); } } -void CSQCPlayer_ForceModel_Apply(float islocalplayer) +void CSQCPlayer_ModelAppearance_Apply(float islocalplayer) { // which one is ALWAYS good? if not(forceplayermodels_goodmodel) @@ -208,6 +211,7 @@ void CSQCPlayer_ForceModel_Apply(float islocalplayer) self.skin = self.forceplayermodels_saveskin; } + //float selected_colormap = cm; // forceplayercolors too if(teamplay) { @@ -218,7 +222,7 @@ void CSQCPlayer_ForceModel_Apply(float islocalplayer) entity tm; for(tm = teams.sort_next; tm; tm = tm.sort_next) - if(tm.team != COLOR_SPECTATOR) + if(tm.team != NUM_SPECTATOR) ++teams_count; if(autocvar_cl_forcemyplayercolors) @@ -265,8 +269,64 @@ void CSQCPlayer_ForceModel_Apply(float islocalplayer) else if(autocvar_cl_forceplayercolors) self.colormap = player_localnum + 1; } + + if(self.colormap > 0) + self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? self.colormap : stof(getplayerkeyvalue(self.colormap - 1, "colors"))) & 0x0F, TRUE) * 2; + else + self.glowmod = '1 1 1'; + + if(autocvar_cl_deathglow > 0) + { + if(self.csqcmodel_isdead) + { + // Fade out to black now... + if(self.old_glowmod == '0 0 0') { self.old_glowmod = self.glowmod; } + self.colormap = 0; + + self.glowmod = self.old_glowmod * bound(0, 1 - (time - self.death_time) / autocvar_cl_deathglow, 1); + self.glowmod_x = max(self.glowmod_x, 0.0001); + self.glowmod_y = max(self.glowmod_y, 0.0001); + self.glowmod_z = max(self.glowmod_z, 0.0001); + } + else if(self.old_glowmod != '0 0 0') { self.old_glowmod = '0 0 0'; } + } + + //print(sprintf("CSQCPlayer_ModelAppearance_Apply(): state = %s, colormap = %f, glowmod = %s\n", (self.csqcmodel_isdead ? "DEAD" : "ALIVE"), self.colormap, vtos(self.glowmod))); } +/*// FEATURE: auto glowmod +.vector glowmod; +void CSQCPlayer_GlowMod_Apply(void) +{ + float cm = self.colormap; + + if(self.csqcmodel_effects & CSQCMODEL_EF_RESPAWNGHOST) + cm = 1024; + + if(self.colormap > 0) + self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? self.colormap : stof(getplayerkeyvalue(self.colormap - 1, "colors"))) & 0x0F, TRUE) * 2; + else + self.glowmod = '1 1 1'; + + if(self.colormod != '0 0 0') { self.colormod = '0 0 0'; } + + if(autocvar_cl_deathglow > 0) + { + if(self.csqcmodel_isdead) + { + self.colormap = 0; + self.glowmod = self.glowmod * bound(0, 1 - (time - self.death_time) / autocvar_cl_deathglow, 1); + // prevent the zero vector + self.glowmod_x = max(self.glowmod_x, 0.0001); + self.glowmod_y = max(self.glowmod_y, 0.0001); + self.glowmod_z = max(self.glowmod_z, 0.0001); + } + + } + + print(sprintf("CSQCPlayer_GlowMod_Apply(): state = %s, colormap = %f, colormod = %s, glowmod = %s\n", (self.csqcmodel_isdead ? "DEAD" : "ALIVE"), cm, vtos(self.colormod), vtos(self.glowmod))); +}*/ + // FEATURE: fallback frames .float csqcmodel_saveframe; .float csqcmodel_saveframe2; @@ -313,6 +373,10 @@ void CSQCPlayer_FallbackFrame_PostUpdate(float isnew) } self.csqcmodel_isdead = IS_DEAD_FRAME(self.frame); } +void CSQCPlayer_AnimDecide_PostUpdate(float isnew) +{ + self.csqcmodel_isdead = !!(self.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2)); +} float CSQCPlayer_FallbackFrame(float f) { if(frameduration(self.modelindex, f) > 0) @@ -398,11 +462,8 @@ void CSQCModel_AutoTagIndex_Apply(void) } else if(self.tag_entity.isplayermodel) { - self.tag_index = gettagindex(self.tag_entity, "weapon"); - if(!self.tag_index) - self.tag_index = gettagindex(self.tag_entity, "tag_weapon"); - if(!self.tag_index) - self.tag_index = gettagindex(self.tag_entity, "bip01 r hand"); + skeleton_loadinfo(self.tag_entity); + self.tag_index = self.tag_entity.bone_weapon; } } @@ -551,31 +612,6 @@ void CSQCPlayer_Precache() precache_sound("misc/jetpack_fly.wav"); } -// FEATURE: auto glowmod -.vector glowmod; -void CSQCPlayer_GlowMod_Apply(void) -{ - float cm = self.colormap; - - if(self.csqcmodel_effects & CSQCMODEL_EF_RESPAWNGHOST) - cm = 1024; - - if(self.colormap > 0) - self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? self.colormap : stof(getplayerkeyvalue(self.colormap - 1, "colors"))) & 0x0F, TRUE) * 2; - else - self.glowmod = '1 1 1'; - - if(autocvar_cl_deathglow > 0) - if(self.csqcmodel_isdead) - { - self.glowmod = self.glowmod * bound(0, 1 - (time - self.death_time) / autocvar_cl_deathglow, 1); - // prevent the zero vector - self.glowmod_x = max(self.glowmod_x, 0.0001); - self.glowmod_y = max(self.glowmod_y, 0.0001); - self.glowmod_z = max(self.glowmod_z, 0.0001); - } -} - // general functions .float csqcmodel_predraw_run; .float anim_frame; @@ -603,15 +639,16 @@ void CSQCModel_Hook_PreDraw(float isplayer) if(self.isplayermodel) // this checks if it's a player MODEL! { - CSQCPlayer_ForceModel_Apply(self.entnum == player_localnum + 1); - CSQCPlayer_GlowMod_Apply(); + float islocalplayer = (self.entnum == player_localnum + 1); + CSQCPlayer_ModelAppearance_Apply(islocalplayer); CSQCPlayer_LOD_Apply(); if(!isplayer) CSQCPlayer_FallbackFrame_Apply(); else { // we know that frame3 and frame4 fields, used by InterpolateAnimation, are left alone - but that is all we know! - float doblend = autocvar__animblend; + skeleton_loadinfo(self); + float doblend = (self.bone_upperbody >= 0); float onground = 0; if(self == csqcplayer) { @@ -625,7 +662,7 @@ void CSQCModel_Hook_PreDraw(float isplayer) } else { - traceline(self.origin + '0 0 1' * self.maxs_z, self.origin + '0 0 1' * (self.mins_z - 4), MOVE_NOMONSTERS, self); + tracebox(self.origin + '0 0 1', self.mins, self.maxs, self.origin - '0 0 4', MOVE_NORMAL, self); if(trace_startsolid || trace_fraction < 1) onground = 1; } @@ -654,7 +691,7 @@ void CSQCModel_Hook_PreDraw(float isplayer) CSQCModel_InterpolateAnimation_2To4_Do(); if(doblend) { - skeleton_from_frames(self); + skeleton_from_frames(self, self.csqcmodel_isdead); } else { @@ -673,13 +710,15 @@ void CSQCModel_Hook_PreDraw(float isplayer) void CSQCModel_Hook_PreUpdate(float isnew, float isplayer, float islocalplayer) { + // interpolate v_angle + self.iflags |= IFLAG_V_ANGLE_X; // revert to values from server CSQCModel_Effects_PreUpdate(); if(self.isplayermodel) { if(!isplayer) CSQCPlayer_FallbackFrame_PreUpdate(); - CSQCPlayer_ForceModel_PreUpdate(); + CSQCPlayer_ModelAppearance_PreUpdate(); } } @@ -691,8 +730,10 @@ void CSQCModel_Hook_PostUpdate(float isnew, float isplayer, float islocalplayer) // save values set by server if(self.isplayermodel) { - CSQCPlayer_ForceModel_PostUpdate(); - if(!isplayer) + CSQCPlayer_ModelAppearance_PostUpdate(); + if(isplayer) + CSQCPlayer_AnimDecide_PostUpdate(isnew); + else CSQCPlayer_FallbackFrame_PostUpdate(isnew); } CSQCModel_Effects_PostUpdate();