]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_dodging.qc
DODGING: comment updated to reflect what the code does
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_dodging.qc
index 4b1660b6707421b0fc708ee75d04ecb95efb45a7..12bb7e600fc9bcf611f7a0d342ad5481aed3b29f 100644 (file)
@@ -1,4 +1,7 @@
 
+.float cvar_cl_dodging_timeout;
+
+
 // these are used to store the last key press time for each of the keys..
 .float last_FORWARD_KEY_time;
 .float last_BACKWARD_KEY_time;
@@ -20,6 +23,8 @@
 .float dodging_single_action;
 
 void dodging_Initialize() {
+       // print("dodging_Initialize\n");
+
        self.last_FORWARD_KEY_time = 0;
        self.last_BACKWARD_KEY_time = 0;
        self.last_RIGHT_KEY_time = 0;
@@ -31,7 +36,14 @@ void dodging_Initialize() {
        self.dodging_direction_y = 0;
 }
 
+MUTATOR_HOOKFUNCTION(dodging_GetCvars) {
+       GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout");
+       return 0;
+}
+
 MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
+       // print("dodging_PlayerPhysics\n");
+
        float common_factor;
 
        // is dodging enabled at all? if not, do nothing..
@@ -53,6 +65,9 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
 
        // ramp up dodging speed by adding some velocity each frame.. TODO: do it! :D
        if (self.dodging_action == 1) {
+               //disable jump key during dodge accel phase
+               if (self.movement_z > 0) self.movement_z = 0;
+
                self.velocity = 
                          self.velocity 
                        + (common_factor * (self.dodging_direction_y * cvar("sv_dodging_horiz_speed")) * v_right) 
@@ -65,6 +80,11 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
                          self.velocity 
                        + (cvar("sv_dodging_up_speed") * v_up);
 
+               if (cvar("sv_dodging_sound") == 1)
+                       PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+
+               setanim(self, self.anim_jump, TRUE, FALSE, TRUE);
+
                self.dodging_single_action = 0;
        }
 
@@ -80,24 +100,79 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        return 0;
 }
 
+
+// returns 1 if the player is close to a wall
+float check_close_to_wall(float threshold) {
+       if (cvar("sv_dodging_wall_dodging") == 0)
+               return 0;
+
+       vector trace_start;
+       vector trace_end;
+
+       trace_start = self.origin;
+
+       trace_end = self.origin + (1000*v_right);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin - (1000*v_right);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin + (1000*v_forward);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin - (1000*v_forward);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       return 0;
+}
+
 MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
+       // print("dodging_PlayerPhysics\n");
+
        float length;
        float dodge_detected;
-       //print("dodging_hook\n");
+       vector trace_start;
+       vector trace_end;
+       float height_above_ground;
 
        if (g_dodging == 0)
                return 0;
 
        dodge_detected = 0;
 
+       // no dodging and jumping at the same time..
+       if (self.BUTTON_JUMP)
+               return 0;
+
        // first check if the last dodge is far enough back in time so we can dodge again
        if ((time - self.last_dodging_time) < cvar("sv_dodging_delay"))
                return 0;
 
-       // check if our feet are on the ground :D
-       if (!(self.lastflags & FL_ONGROUND))
+       // determine height above ground is below a threshold
+       trace_start = self.origin;
+       trace_end = self.origin - (1000*v_up);
+
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+
+       // check if the trace hit anything at all
+       if (trace_fraction > 1)
                return 0;
 
+       height_above_ground = self.origin_z - trace_endpos_z;
+
+       // check if our feet are on the ground or at least close or we are
+       // near a wall,,,
+       if ((height_above_ground > (fabs(PL_MIN_z) + cvar("sv_dodging_height_threshold")))
+               && (check_close_to_wall(cvar("sv_dodging_wall_distance_threshold")) != 1))
+               return 0;
 
        if (self.movement_x > 0) {
                // is this a state change?
@@ -105,7 +180,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                        if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { 
                                dodge_detected = 1;
                                self.dodging_direction_x = 1.0;
-                               self.last_dodging_time = time;
                        }
                        self.last_FORWARD_KEY_time = time;
                }
@@ -117,7 +191,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                        if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout)        { 
                                dodge_detected = 1;
                                self.dodging_direction_x = -1.0;
-                               self.last_dodging_time = time;
                        }
                        self.last_BACKWARD_KEY_time = time;
                }
@@ -129,7 +202,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                        if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout)   { 
                                dodge_detected = 1;
                                self.dodging_direction_y = 1.0;
-                               self.last_dodging_time = time;
                        }
                        self.last_RIGHT_KEY_time = time;
                }
@@ -141,7 +213,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                        if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout)    { 
                                dodge_detected = 1;
                                self.dodging_direction_y = -1.0;
-                               self.last_dodging_time = time;
                        }
                        self.last_LEFT_KEY_time = time;
                }
@@ -150,6 +221,11 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
 
 
        if (dodge_detected == 1) {
+               if (self.movement_z > 0)
+                       self.movement_z = 0;
+
+               self.last_dodging_time = time;
+
                self.dodging_action = 1;
                self.dodging_single_action = 1;
 
@@ -174,6 +250,9 @@ MUTATOR_DEFINITION(dodging)
        // in the physics hook we actually implement the dodge..
        MUTATOR_HOOK(PlayerPhysics, dodging_PlayerPhysics, CBC_ORDER_ANY);
 
+       // get timeout information from the client, so the client can configure it..
+       MUTATOR_HOOK(GetCvars, dodging_GetCvars, CBC_ORDER_ANY);
+
        // this just turns on the cvar.
        MUTATOR_ONADD
        {
@@ -188,4 +267,4 @@ MUTATOR_DEFINITION(dodging)
        }
 
        return 0;
-}
\ No newline at end of file
+}