X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fanimdecide.qc;h=23f43b9e94a74535614eb5919480d1a2db41236c;hp=0cba5d7f38b4d49b54f5d779e087571fe1bb7399;hb=c51698509e174e343dff48128a1dcfff1527c535;hpb=c6d440124df99b8b1f48fe7666332273535eb413 diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index 0cba5d7f3..23f43b9e9 100644 --- a/qcsrc/common/animdecide.qc +++ b/qcsrc/common/animdecide.qc @@ -1,50 +1,58 @@ -#if defined(CSQC) - #include "../dpdefs/csprogsdefs.qh" - #include "animdecide.qh" -#elif defined(MENUQC) -#elif defined(SVQC) - #include "../dpdefs/progsdefs.qh" - #include "../dpdefs/dpextensions.qh" +#include "animdecide.qh" + +#include "monsters/all.qh" + +#if defined(SVQC) #include "util.qh" - #include "animdecide.qh" #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) +{ + Monster monster_id = NULL; + 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 = mon; + break; + } + } + + if(!monster_id) { return false; } + + monster_id.mr_anim(monster_id); + + 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 +60,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 +155,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)