X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fanimdecide.qc;h=5c2caa6a7f04c7d8c6a3a9b60040b95e035602ee;hb=3a035cb2732af064519135410c5664c2e1b3f501;hp=ecc840f6fbbe41358d381d26a8c12ffaac59de2d;hpb=6dc9591eba337374f2b4348a6a6deaa1cb6887d0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index ecc840f6f..5c2caa6a7 100644 --- a/qcsrc/common/animdecide.qc +++ b/qcsrc/common/animdecide.qc @@ -10,41 +10,52 @@ #include "../server/defs.qh" #endif -// player animation data for this model -// each vector is as follows: -// _x = startframe -// _y = numframes -// _z = framerate -.vector anim_die1; // player dies -.vector anim_die2; // player dies differently -.vector anim_draw; // player pulls out a weapon -.vector anim_duckwalk; // player walking while crouching -.vector anim_duckjump; // player jumping from a crouch -.vector anim_duckidle; // player idling while crouching -.vector anim_idle; // player standing -.vector anim_jump; // player jump -.vector anim_pain1; // player flinches from pain -.vector anim_pain2; // player flinches from pain, differently -.vector anim_shoot; // player shoots -.vector anim_taunt; // player taunts others (FIXME: no code references this) -.vector anim_run; // player running forward -.vector anim_runbackwards; // player running backward -.vector anim_strafeleft; // player shuffling left quickly -.vector anim_straferight; // player shuffling right quickly -.vector anim_forwardright; // player running forward and right -.vector anim_forwardleft; // player running forward and left -.vector anim_backright; // player running backward and right -.vector anim_backleft; // player running back and left -.vector anim_melee; // player doing the melee action -.vector anim_duck; // player doing the melee action -.vector anim_duckwalkbackwards; -.vector anim_duckwalkstrafeleft; -.vector anim_duckwalkstraferight; -.vector anim_duckwalkforwardright; -.vector anim_duckwalkforwardleft; -.vector anim_duckwalkbackright; -.vector anim_duckwalkbackleft; -.float animdecide_modelindex; +bool monsters_animoverride(entity e) +{ + int monster_id = 0; + for(int i = MON_FIRST; i <= MON_LAST; ++i) + { + entity mon = get_monsterinfo(i); + + //if(substring(e.model, 0, strlen(mon.model) - 4) == substring(mon.model, 0, strlen(mon.model) - 4)) + if(e.model == mon.model) + { + monster_id = i; + break; + } + } + + if(!monster_id) { return false; } + + MON_ACTION(monster_id, MR_ANIM); + + vector none = '0 0 0'; + e.anim_duckwalk = e.anim_walk; + e.anim_duckjump = animfixfps(e, '5 1 10', none); + e.anim_duckidle = e.anim_idle; + e.anim_jump = animfixfps(e, '8 1 10', none); + e.anim_taunt = animfixfps(e, '12 1 0.33', none); + e.anim_runbackwards = e.anim_run; + e.anim_strafeleft = e.anim_run; + e.anim_straferight = e.anim_run; + e.anim_forwardright = e.anim_run; + e.anim_forwardleft = e.anim_run; + e.anim_backright = e.anim_run; + e.anim_backleft = e.anim_run; + e.anim_duckwalkbackwards = e.anim_walk; + e.anim_duckwalkstrafeleft = e.anim_walk; + e.anim_duckwalkstraferight = e.anim_walk; + e.anim_duckwalkforwardright = e.anim_walk; + e.anim_duckwalkforwardleft = e.anim_walk; + e.anim_duckwalkbackright = e.anim_walk; + e.anim_duckwalkbackleft = e.anim_walk; + + // these anims ought to stay until stopped explicitly by weaponsystem + e.anim_shoot_z = 0.001; + e.anim_melee_z = 0.001; + + return true; +} void animdecide_load_if_needed(entity e) { @@ -52,6 +63,12 @@ void animdecide_load_if_needed(entity e) return; e.animdecide_modelindex = e.modelindex; + if(substring(e.model, 0, 16) == "models/monsters/") + { + if(monsters_animoverride(e)) + return; + } + 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 @@ -141,6 +158,8 @@ vector animdecide_getupperanim(entity e) vector animdecide_getloweranim(entity e) { // death etc. + if(e.anim_state & ANIMSTATE_FOLLOW) + return vec3(((e.anim_state & ANIMSTATE_DUCK) ? e.anim_duckidle_x : e.anim_idle_x), e.anim_time, ANIMPRIO_DEAD); // dead priority so it's above all if(e.anim_state & ANIMSTATE_FROZEN) return vec3(e.anim_idle.x, e.anim_time, ANIMPRIO_DEAD); if(e.anim_state & ANIMSTATE_DEAD1) @@ -295,10 +314,10 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f upper = lower; if(e.frame1time != upper.y || e.frame2time != lower.y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); - e.fld_frame = upper.x; - e.fld_frame1time = upper.y; - e.fld_frame2 = lower.x; - e.fld_frame2time = lower.y; + e.(fld_frame) = upper.x; + e.(fld_frame1time) = upper.y; + e.(fld_frame2) = lower.x; + e.(fld_frame2time) = lower.y; } else { @@ -308,8 +327,8 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f upper = lower; if(e.frame1time != upper.y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); - e.fld_frame = upper.x; - e.fld_frame1time = upper.y; + e.(fld_frame) = upper.x; + e.(fld_frame1time) = upper.y; } }