]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
animdecide: improvements
authorRudolf Polzer <divverent@xonotic.org>
Sun, 2 Dec 2012 10:51:01 +0000 (11:51 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Sun, 2 Dec 2012 10:51:01 +0000 (11:51 +0100)
Fix implicit state on cloned players.
Fix non-csqcplayers (just because I can, this code will get disabled anyway)

qcsrc/client/csqcmodel_hooks.qc
qcsrc/common/animdecide.qc
qcsrc/common/animdecide.qh
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/server/cl_player.qc

index 7caa36c560faa95578ea78da2a6f475dc78e1129..e181a29fd9a2330682cec8cddbbea8ad74d524a1 100644 (file)
@@ -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;
index a7d2b3278340de60e8eb1ad82baf6633c8339eb7..d3990252c17c2b61ba5aaec46afb88519a94c410 100644 (file)
@@ -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
index 071646f96bd6a11de6ea6a2e91ff301b7cbc135f..105dac7c47f2460a8710a54c87032a5b469eb1dd 100644 (file)
@@ -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
index 7b08c2c5cf6eaf14fc7c02d10d8d655672e4d786..98eecb3c61cdb6af600f2ec9999098a15f6be999 100644 (file)
@@ -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
index a5b1d985c41e139e48ddb43ad43f5a90f05b292a..b8c5502a846e6466af246144b42a04a475103c34 100644 (file)
@@ -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
index 9f7e44887e8f1a6af50a26b7b0cf115374643eca..e473b614b3abbc64d7a75bc4a7e56910521a018c 100644 (file)
@@ -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)
        {