X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fanimdecide.qc;h=32ffef248d540ce8b5f9c85101ec8e5ceef0b37b;hb=9ce97892a5726d5549764cc112397ea0a27dda81;hp=9a76f5ffc96410a8525506c42c622a080bfdcdcb;hpb=3602610d138a5e0aa5847c2f05c0f5caaac9133e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index 9a76f5ffc..32ffef248 100644 --- a/qcsrc/common/animdecide.qc +++ b/qcsrc/common/animdecide.qc @@ -1,13 +1,3 @@ -// implicit anim state -.float anim_implicit_state; -.float anim_implicit_time; - -// actions -.float anim_lower_implicit_action; -.float anim_lower_implicit_time; -.float anim_upper_implicit_action; -.float anim_upper_implicit_time; - // player animation data for this model // each vector is as follows: // _x = startframe @@ -42,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 @@ -74,15 +69,27 @@ void animdecide_init(entity e) e.anim_duckwalkforwardleft = animfixfps(e, '28 1 1', '4 1 1'); e.anim_duckwalkbackright = animfixfps(e, '29 1 1', '4 1 1'); e.anim_duckwalkbackleft = animfixfps(e, '30 1 1', '4 1 1'); + + // these anims ought to stay until stopped explicitly by weaponsystem + e.anim_shoot_z = 0.001; + e.anim_melee_z = 0.001; } #define ANIMPRIO_IDLE 0 -#define ANIMPRIO_STATIC 1 -#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; @@ -151,7 +158,7 @@ vector animdecide_getloweranim(entity e) if(time <= t + outframe_y / outframe_z) { // animation is running! - return vec3(outframe_x, e.anim_lower_time, ANIMPRIO_ACTIVE); + return vec3(outframe_x, t, ANIMPRIO_ACTIVE); } } // or, decide the anim by state @@ -159,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_STATIC); + return vec3(e.anim_duckidle_x, t, ANIMPRIO_CROUCH); } } else @@ -209,9 +216,12 @@ 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 flg) +void animdecide_setimplicitstate(entity e, float onground) { float s; s = 0; @@ -220,6 +230,7 @@ void animdecide_setimplicitstate(entity e, float flg) 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" @@ -242,23 +253,15 @@ void animdecide_setimplicitstate(entity e, float flg) if(v_y < -fabs(v_x) * 0.5) s |= ANIMIMPLICITSTATE_LEFT; } - if(!(flg & FL_ONGROUND)) + if(!onground) s |= ANIMIMPLICITSTATE_INAIR; - // detect some kinds of otherwise misdetected jumps + // detect some kinds of otherwise misdetected jumps (ground to air transition) + // NOTE: currently, in CSQC this is the only jump detection, as the explicit jump action is never called! if(!(e.anim_implicit_state & ANIMIMPLICITSTATE_INAIR) && (s & ANIMIMPLICITSTATE_INAIR)) { - // ground to air transition - do we want to reset jump anim? - if(e.anim_lower_action != ANIMACTION_JUMP || time > e.anim_lower_time + 0.2) - if(e.anim_lower_implicit_action != ANIMACTION_JUMP || time > e.anim_lower_implicit_time + 0.2) - { - traceline(e.origin + '0 0 1' * e.maxs_z, e.origin + '0 0 1' * (e.mins_z - autocvar_sv_player_jumpanim_minfall), MOVE_NOMONSTERS, e); - if(!trace_startsolid && trace_fraction == 1) - { - e.anim_lower_implicit_action = ANIMACTION_JUMP; - e.anim_lower_implicit_time = time; - } - } + e.anim_lower_implicit_action = ANIMACTION_JUMP; + e.anim_lower_implicit_time = time; } if(s != e.anim_implicit_state) @@ -267,21 +270,20 @@ void animdecide_setimplicitstate(entity e, float flg) e.anim_implicit_time = time; } } -void animdecide_setframes(entity e, float flg, float support_blending, .float fld_frame, .float fld_frame1time, .float fld_frame2, .float fld_frame2time) +void animdecide_setframes(entity e, float support_blending, .float fld_frame, .float fld_frame1time, .float fld_frame2, .float fld_frame2time) { - animdecide_setimplicitstate(e, flg); // _x: frame // _y: start time // _z: priority 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; @@ -291,6 +293,10 @@ void animdecide_setframes(entity e, float flg, float support_blending, .float fl } 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;