From f98880536b885ff5e31321bedf58be3c9014c3b7 Mon Sep 17 00:00:00 2001 From: Florian Paul Schmidt Date: Sat, 20 Mar 2010 04:05:33 +0100 Subject: [PATCH] - working ramp (needs some more love though) --- defaultXonotic.cfg | 11 ++--- qcsrc/server/mutators/mutator_dodging.qc | 54 ++++++++++++++++++------ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 236dc0dc1..ef7f5eb28 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -514,11 +514,12 @@ set g_grappling_hook 0 "let players spawn with the grappling hook which allows t set g_dodging 0 "set to 1 to enable dodging in games" -seta cl_dodging_timeout 0 -set sv_dodging_delay 0.5 -set sv_dodging_up_speed 200 -set sv_dodging_horiz_speed 500 -set sv_dodging_ramp_time 0.2 +seta cl_dodging_timeout 0 "determines how long apart (in seconds) two taps on the same direction key are considered a dodge. use 0 to disable" + +set sv_dodging_delay 0.5 "determines how long a player has to wait to be able to dodge again after dodging" +set sv_dodging_up_speed 200 "the jump velocity of the dodge" +set sv_dodging_horiz_speed 500 "the horizontal velocity of the dodge" +set sv_dodging_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)" set leadlimit 0 diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc index d9520c07b..4b1660b67 100644 --- a/qcsrc/server/mutators/mutator_dodging.qc +++ b/qcsrc/server/mutators/mutator_dodging.qc @@ -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); -- 2.39.2