]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_dodging.qc
- working ramp (needs some more love though)
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_dodging.qc
index d9520c07b731bffbb971973c91d97cc856fdd4c1..4b1660b6707421b0fc708ee75d04ecb95efb45a7 100644 (file)
@@ -16,6 +16,9 @@
 // set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done..
 .float dodging_action;
 
+// the jump part of the dodge cannot be ramped
+.float dodging_single_action;
+
 void dodging_Initialize() {
        self.last_FORWARD_KEY_time = 0;
        self.last_BACKWARD_KEY_time = 0;
@@ -23,33 +26,56 @@ void dodging_Initialize() {
        self.last_LEFT_KEY_time = 0;
        self.last_dodging_time = 0;
        self.dodging_action = 0;
+       self.dodging_single_action = 0;
        self.dodging_direction_x = 0;
        self.dodging_direction_y = 0;
 }
 
 MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
-       makevectors(self.angles);
-       // print("physics hook\n");
+       float common_factor;
+
+       // is dodging enabled at all? if not, do nothing..
        if (g_dodging == 0)
                return 0;
 
+       // make sure v_up, v_right and v_forward are sane
+       makevectors(self.angles);
+
+       // if we have e.g. 0.5 sec ramptime and a frametime of 0.25, then the ramp code 
+       // will be called ramp_time/frametime times = 2 times. so, we need to 
+       // add 0.5 * the total speed each frame until the dodge action is done..
+       common_factor = sys_frametime / cvar("sv_dodging_ramp_time");
+
+       // if ramp time is smaller than frametime we get problems ;D
+       if (common_factor > 1) 
+               common_factor = 1;
+
+
        // ramp up dodging speed by adding some velocity each frame.. TODO: do it! :D
        if (self.dodging_action == 1) {
                self.velocity = 
                          self.velocity 
-                       + ((self.dodging_direction_y * cvar("sv_dodging_horiz_speed")) * v_right) 
-                       + ((self.dodging_direction_x * cvar("sv_dodging_horiz_speed")) * v_forward) 
+                       + (common_factor * (self.dodging_direction_y * cvar("sv_dodging_horiz_speed")) * v_right) 
+                       + (common_factor * (self.dodging_direction_x * cvar("sv_dodging_horiz_speed")) * v_forward);
+       }
+
+       // the up part of the dodge is a single shot action
+       if (self.dodging_single_action == 1) {
+               self.velocity = 
+                         self.velocity 
                        + (cvar("sv_dodging_up_speed") * v_up);
 
-               // reset state so next dodge can be done correctly
-               self.dodging_action = 0;
-               self.dodging_direction_x = 0;
-               self.dodging_direction_y = 0;
+               self.dodging_single_action = 0;
        }
 
        // are we done with the dodging ramp yet?
        if((self.dodging_action == 1) && ((time - self.last_dodging_time) > cvar("sv_dodging_ramp_time")))
+       {
+               // reset state so next dodge can be done correctly
                self.dodging_action = 0;
+               self.dodging_direction_x = 0;
+               self.dodging_direction_y = 0;
+       }
 
        return 0;
 }
@@ -64,10 +90,11 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
 
        dodge_detected = 0;
 
-       // common checks
+       // 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))
                return 0;
 
@@ -77,7 +104,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                if (!(self.pressedkeys & KEY_FORWARD)) {
                        if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { 
                                dodge_detected = 1;
-                               self.dodging_action = 1;
                                self.dodging_direction_x = 1.0;
                                self.last_dodging_time = time;
                        }
@@ -90,7 +116,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                if (!(self.pressedkeys & KEY_BACKWARD)) {
                        if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout)        { 
                                dodge_detected = 1;
-                               self.dodging_action = 1;
                                self.dodging_direction_x = -1.0;
                                self.last_dodging_time = time;
                        }
@@ -103,7 +128,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                if (!(self.pressedkeys & KEY_RIGHT)) {
                        if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout)   { 
                                dodge_detected = 1;
-                               self.dodging_action = 1;
                                self.dodging_direction_y = 1.0;
                                self.last_dodging_time = time;
                        }
@@ -116,7 +140,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                if (!(self.pressedkeys & KEY_LEFT)) {
                        if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout)    { 
                                dodge_detected = 1;
-                               self.dodging_action = 1;
                                self.dodging_direction_y = -1.0;
                                self.last_dodging_time = time;
                        }
@@ -127,7 +150,10 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
 
 
        if (dodge_detected == 1) {
-               // normalize the dodging_direction vector.. 
+               self.dodging_action = 1;
+               self.dodging_single_action = 1;
+
+               // normalize the dodging_direction vector.. (unlike UT99) XD
                length = length + self.dodging_direction_x * self.dodging_direction_x;
                length = length + self.dodging_direction_y * self.dodging_direction_y;
                length = sqrt(length);