X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fanimdecide.qc;h=32ffef248d540ce8b5f9c85101ec8e5ceef0b37b;hb=dd26dcda7539f07aae99ec9f6a7c407c7ce43ea6;hp=bb2429bb38e6bfd2e6cdf177723d08c3ff76653f;hpb=1b219f106c4eb8be2b42e3d2f443762e4d5d6263;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index bb2429bb3..32ffef248 100644 --- a/qcsrc/common/animdecide.qc +++ b/qcsrc/common/animdecide.qc @@ -32,9 +32,14 @@ .vector anim_duckwalkforwardleft; .vector anim_duckwalkbackright; .vector anim_duckwalkbackleft; +.float animdecide_modelindex; void animdecide_init(entity e) { + if(e.modelindex == e.animdecide_modelindex) + return; + e.animdecide_modelindex = e.modelindex; + vector none = '0 0 0'; e.anim_die1 = animfixfps(e, '0 1 0.5', none); // 2 seconds e.anim_die2 = animfixfps(e, '1 1 0.5', none); // 2 seconds @@ -66,16 +71,25 @@ void animdecide_init(entity e) e.anim_duckwalkbackleft = animfixfps(e, '30 1 1', '4 1 1'); // these anims ought to stay until stopped explicitly by weaponsystem - e.aim_shoot_z = 0.001; - e.aim_melee_z = 0.001; + e.anim_shoot_z = 0.001; + e.anim_melee_z = 0.001; } #define ANIMPRIO_IDLE 0 -#define ANIMPRIO_ACTIVE 2 +#define ANIMPRIO_ACTIVE 1 +#define ANIMPRIO_CROUCH 2 #define ANIMPRIO_DEAD 3 vector animdecide_getupperanim(entity e) { + // death etc. + if(e.anim_state & ANIMSTATE_FROZEN) + return vec3(e.anim_idle_x, e.anim_time, ANIMPRIO_DEAD); + if(e.anim_state & ANIMSTATE_DEAD1) + return vec3(e.anim_die1_x, e.anim_time, ANIMPRIO_DEAD); + if(e.anim_state & ANIMSTATE_DEAD2) + return vec3(e.anim_die2_x, e.anim_time, ANIMPRIO_DEAD); + // is there an action? vector outframe = '-1 0 0'; float t, a; @@ -152,27 +166,27 @@ vector animdecide_getloweranim(entity e) if(e.anim_state & ANIMSTATE_DUCK) { if(e.anim_implicit_state & ANIMIMPLICITSTATE_INAIR) - return vec3(e.anim_duckjump_x, 0, ANIMPRIO_ACTIVE); // play the END of the jump anim + return vec3(e.anim_duckjump_x, 0, ANIMPRIO_CROUCH); // play the END of the jump anim else switch(e.anim_implicit_state & (ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_LEFT | ANIMIMPLICITSTATE_RIGHT)) { case ANIMIMPLICITSTATE_FORWARD: - return vec3(e.anim_duckwalk_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalk_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS: - return vec3(e.anim_duckwalkbackwards_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackwards_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkstraferight_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkstraferight_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkstrafeleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkstrafeleft_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkforwardright_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkforwardright_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkforwardleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkforwardleft_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkbackright_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackright_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkbackleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackleft_x, t, ANIMPRIO_CROUCH); default: - return vec3(e.anim_duckidle_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckidle_x, t, ANIMPRIO_CROUCH); } } else @@ -202,6 +216,9 @@ vector animdecide_getloweranim(entity e) } } // can't get here +#ifdef GMQCC + return vec3(e.anim_idle_x, t, ANIMPRIO_IDLE); +#endif } void animdecide_setimplicitstate(entity e, float onground) @@ -213,6 +230,7 @@ void animdecide_setimplicitstate(entity e, float onground) vector v; v_x = e.velocity * v_forward; v_y = e.velocity * v_right; + v_z = 0; // we want to match like this: // the 8 directions shall be "evenly spaced" @@ -260,12 +278,12 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f vector upper = animdecide_getupperanim(e); vector lower = animdecide_getloweranim(e); //print("UPPER: ", vtos(upper), ", LOWER: ", vtos(lower), "\n"); - if(upper_z > lower_z) - lower = upper; - else if(lower_z > upper_z) - upper = lower; if(support_blending) { + if(upper_z && !lower_z) + lower = upper; + else if(lower_z && !upper_z) + upper = lower; if(e.frame1time != upper_y || e.frame2time != lower_y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); e.fld_frame = upper_x; @@ -275,6 +293,10 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f } else { + if(upper_z > lower_z) + lower = upper; + else if(lower_z > upper_z) + upper = lower; if(e.frame1time != upper_y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); e.fld_frame = upper_x;