X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=94f3221657b65845509ee1ca74d0de89af1f7374;hp=e5e2d377cf4981f7d9527d1a4ca7f927caf87bec;hb=1b2f61baeeff5a7d004fafd3cfdd8269a0338a1e;hpb=a9f034bd247570b2b06c435599db8e283c1a42de diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index e5e2d377cf..94f3221657 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -226,6 +226,7 @@ void player_setupanimsformodel() self.anim_backright = '21 1 1'; self.anim_backleft = '22 1 1'; self.anim_melee = '23 1 1'; + self.anim_fly = '24 1 1'; animparseerror = FALSE; animfilename = strcat(self.model, ".animinfo"); animfile = fopen(animfilename, FILE_READ); @@ -253,6 +254,7 @@ void player_setupanimsformodel() self.anim_backright = animparseline(animfile); self.anim_backleft = animparseline(animfile); self.anim_melee = animparseline(animfile); + self.anim_fly = animparseline(animfile); fclose(animfile); // derived anims @@ -290,13 +292,39 @@ void player_anim (void) if (!self.animstate_override) { - if (!(self.flags & FL_ONGROUND)) + if (!(self.flags & FL_ONGROUND) || self.BUTTON_JUMP) { if (self.crouch) - setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump); + { + if (self.animstate_startframe != self.anim_duckjump_x) // don't perform another trace if already playing the crouch jump anim + { + traceline(self.origin + '0 0 1' * PL_CROUCH_MIN_z, self.origin + '0 0 1' * (PL_CROUCH_MIN_z - autocvar_sv_player_jumpanim_minfall), TRUE, self); + if(!trace_startsolid && trace_fraction == 1 || !(self.animstate_startframe == self.anim_duckwalk_x || self.animstate_startframe == self.anim_duckidle_x)) // don't get stuck on non-crouch anims + { + setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump); + self.restart_jump = FALSE; + } + } + } else - setanim(self, self.anim_jump, FALSE, TRUE, self.restart_jump); - self.restart_jump = FALSE; + { + // 21/25 is the magic number here for how long the jump animation takes to play once (numframes/framerate) + if((self.animstate_startframe == self.anim_jump_x && time - self.animstate_starttime >= 21/25)) + setanim(self, self.anim_fly, TRUE, FALSE, FALSE); + + if(self.animstate_startframe != self.anim_fly_x) // no tracing if we're in the fly anim + { + if (self.animstate_startframe != self.anim_jump_x) // don't perform another trace if already playing the jump anim + { + traceline(self.origin + '0 0 1' * PL_MIN_z, self.origin + '0 0 1' * (PL_MIN_z - autocvar_sv_player_jumpanim_minfall), TRUE, self); + if(!trace_startsolid && trace_fraction == 1 || self.animstate_startframe == self.anim_idle_x || (self.animstate_startframe == self.anim_melee_x && time - self.animstate_starttime >= 21/20)) // don't get stuck on idle animation in midair, nor melee after it finished + { + setanim(self, self.anim_jump, FALSE, TRUE, self.restart_jump); + self.restart_jump = FALSE; + } + } + } + } } else if (self.crouch) { @@ -519,10 +547,13 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(sv_gentle < 1) { if(self.classname != "body") // pain anim is BORKED on our ZYMs, FIXME remove this once we have good models { - if (random() > 0.5) - setanim(self, self.anim_pain1, FALSE, TRUE, TRUE); - else - setanim(self, self.anim_pain2, FALSE, TRUE, TRUE); + if (!self.animstate_override) + { + if (random() > 0.5) + setanim(self, self.anim_pain1, FALSE, TRUE, TRUE); + else + setanim(self, self.anim_pain2, FALSE, TRUE, TRUE); + } } if(sound_allowed(MSG_BROADCAST, attacker))