From: Rudolf Polzer Date: Sun, 2 Dec 2012 10:51:01 +0000 (+0100) Subject: animdecide: improvements X-Git-Tag: xonotic-v0.7.0~99^2~25^2~3 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=7ea9d4c4970109633bdc8109fa559ad8c2cbe5fa;p=xonotic%2Fxonotic-data.pk3dir.git animdecide: improvements Fix implicit state on cloned players. Fix non-csqcplayers (just because I can, this code will get disabled anyway) --- diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 7caa36c56..e181a29fd 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -589,11 +589,11 @@ void CSQCModel_Hook_PreDraw(float isplayer) { // we know that frame3 and frame4 fields, used by InterpolateAnimation, are left alone - but that is all we know! float doblend = FALSE; - float flg = 0; + float onground = 0; if(self == csqcplayer) { if(self.pmove_flags & PMF_ONGROUND) - flg |= FL_ONGROUND; + onground = 1; self.anim_prev_pmove_flags = self.pmove_flags; if(self.pmove_flags & PMF_DUCKED) animdecide_setstate(self, self.anim_state | ANIMSTATE_DUCK, FALSE); @@ -604,10 +604,11 @@ void CSQCModel_Hook_PreDraw(float isplayer) { traceline(self.origin + '0 0 1' * self.maxs_z, self.origin + '0 0 1' * (self.mins_z - 4), MOVE_NOMONSTERS, self); if(trace_startsolid || trace_fraction < 1) - flg |= FL_ONGROUND; + onground = 1; } animdecide_init(self); // FIXME only do this on model change - animdecide_setframes(self, flg, doblend, anim_frame, anim_frame1time, anim_frame2, anim_frame2time); + animdecide_setimplicitstate(self, onground); + animdecide_setframes(self, doblend, anim_frame, anim_frame1time, anim_frame2, anim_frame2time); float sf = 0; if(self.anim_saveframe != self.anim_frame || self.anim_saveframe1time != self.anim_frame1time) sf |= CSQCMODEL_PROPERTY_FRAME; diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index a7d2b3278..d3990252c 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 @@ -211,7 +201,7 @@ vector animdecide_getloweranim(entity e) // can't get here } -void animdecide_setimplicitstate(entity e, float flg) +void animdecide_setimplicitstate(entity e, float onground) { float s; s = 0; @@ -242,7 +232,7 @@ 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 (ground to air transition) @@ -259,9 +249,8 @@ 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 diff --git a/qcsrc/common/animdecide.qh b/qcsrc/common/animdecide.qh index 071646f96..105dac7c4 100644 --- a/qcsrc/common/animdecide.qh +++ b/qcsrc/common/animdecide.qh @@ -1,9 +1,8 @@ // client side frame inferring void animdecide_init(entity e); -// flags to pass here -float FL_ONGROUND = 512; -void animdecide_setframes(entity e, float flg, float support_blending, .float fld_frame, .float fld_frame1time, .float fld_frame2, .float fld_frame2time); +void animdecide_setimplicitstate(entity e, float onground); +void animdecide_setframes(entity e, float support_blending, .float fld_frame, .float fld_frame1time, .float fld_frame2, .float fld_frame2time); // please network this one .float anim_state; @@ -13,6 +12,14 @@ void animdecide_setframes(entity e, float flg, float support_blending, .float fl .float anim_upper_action; .float anim_upper_time; +// when copying entities, copy these too +.float anim_implicit_state; +.float anim_implicit_time; +.float anim_lower_implicit_action; +.float anim_lower_implicit_time; +.float anim_upper_implicit_action; +.float anim_upper_implicit_time; + // explicit anim states (networked) void animdecide_setstate(entity e, float newstate, float restart); #define ANIMSTATE_DEAD1 1 // base frames: die1 diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 7b08c2c5c..98eecb3c6 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -2473,6 +2473,7 @@ vector vec3(float x, float y, float z) return v; } +#ifndef MENUQC vector animfixfps(entity e, vector a, vector b) { // multi-frame anim: keep as-is @@ -2490,3 +2491,4 @@ vector animfixfps(entity e, vector a, vector b) } return a; } +#endif diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index a5b1d985c..b8c5502a8 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -364,4 +364,6 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t vector vec3(float x, float y, float z); +#ifndef MENUQC vector animfixfps(entity e, vector a, vector b); +#endif diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 9f7e44887..e473b614b 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -167,6 +167,12 @@ void CopyBody(float keepvelocity) self.anim_lower_time = oldself.anim_lower_time; self.anim_upper_action = oldself.anim_upper_action; self.anim_upper_time = oldself.anim_upper_time; + self.anim_implicit_state = oldself.anim_implicit_state; + self.anim_implicit_time = oldself.anim_implicit_time; + self.anim_lower_implicit_action = oldself.anim_lower_implicit_action; + self.anim_lower_implicit_time = oldself.anim_lower_implicit_time; + self.anim_upper_implicit_action = oldself.anim_upper_implicit_action; + self.anim_upper_implicit_time = oldself.anim_upper_implicit_time; self.dphitcontentsmask = oldself.dphitcontentsmask; self.death_time = oldself.death_time; self.pain_finished = oldself.pain_finished; @@ -207,7 +213,7 @@ void CopyBody(float keepvelocity) self.nextthink = time; self.think = CopyBody_Think; // "bake" the current animation frame for clones (they don't get clientside animation) - animdecide_setframes(self, self.flags, FALSE, frame, frame1time, frame2, frame2time); + animdecide_setframes(self, FALSE, frame, frame1time, frame2, frame2time); self = oldself; } @@ -244,6 +250,12 @@ void player_anim (void) if(self.crouch) animbits |= ANIMSTATE_DUCK; animdecide_setstate(self, animbits, FALSE); + animdecide_setimplicitstate(self, (self.flags & FL_ONGROUND)); + +#ifndef NO_LEGACY_NETWORKING + if(!self.iscsqcmodel) + animdecide_setframes(self, FALSE, frame, frame1time, frame2, frame2time); +#endif if (self.weaponentity) {