X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Fdodging%2Fsv_dodging.qc;h=3651e9aa07286d42db46bc13b430cb869f74cf83;hb=caa42d15f2b2cd3ed4bc177a9aa70903e67d5142;hp=59b932f418d3c31e3b3239c43f9a845fc75380bd;hpb=f03ef02a03bebb3df2a88f1a9ea1b989a2023a5c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/dodging/sv_dodging.qc b/qcsrc/common/mutators/mutator/dodging/sv_dodging.qc index 59b932f41..3651e9aa0 100644 --- a/qcsrc/common/mutators/mutator/dodging/sv_dodging.qc +++ b/qcsrc/common/mutators/mutator/dodging/sv_dodging.qc @@ -18,6 +18,7 @@ #define PHYS_DODGING_AIR autocvar_sv_dodging_air_dodging #define PHYS_DODGING_MAXSPEED autocvar_sv_dodging_maxspeed #define PHYS_DODGING_AIR_MAXSPEED autocvar_sv_dodging_air_maxspeed +#define PHYS_DODGING_CLIENTSELECT autocvar_sv_dodging_clientselect // we ran out of stats slots! TODO: re-enable this when prediction is available for dodging #if 0 @@ -37,16 +38,24 @@ #define PHYS_DODGING_AIR STAT(DODGING_AIR, this) #define PHYS_DODGING_MAXSPEED STAT(DODGING_MAXSPEED, this) #define PHYS_DODGING_AIR_MAXSPEED STAT(DODGING_AIR_MAXSPEED, this) +#define PHYS_DODGING_CLIENTSELECT STAT(DODGING_CLIENTSELECT, this) #endif #ifdef CSQC + float cvar_cl_dodging_timeout; + bool cvar_cl_dodging; + bool autocvar_cl_dodging; #define PHYS_DODGING_FRAMETIME (1 / (frametime <= 0 ? 60 : frametime)) #define PHYS_DODGING_TIMEOUT(s) STAT(DODGING_TIMEOUT) #define PHYS_DODGING_PRESSED_KEYS(s) (s).pressedkeys + #define PHYS_DODGING_ENABLED(s) autocvar_cl_dodging #elif defined(SVQC) + .float cvar_cl_dodging_timeout; + .bool cvar_cl_dodging; #define PHYS_DODGING_FRAMETIME sys_frametime #define PHYS_DODGING_TIMEOUT(s) CS(s).cvar_cl_dodging_timeout #define PHYS_DODGING_PRESSED_KEYS(s) CS(s).pressedkeys + #define PHYS_DODGING_ENABLED(s) CS(s).cvar_cl_dodging #endif #ifdef SVQC @@ -56,8 +65,6 @@ bool autocvar_sv_dodging_sound; #include #include -.float cvar_cl_dodging_timeout; - REGISTER_MUTATOR(dodging, cvar("g_dodging")) { // this just turns on the cvar. @@ -113,20 +120,20 @@ REGISTER_MUTATOR(dodging, true); return true; // returns true if the player is close to a wall -bool is_close_to_wall(entity this, float threshold) +bool is_close_to_wall(entity this, float threshold, vector forward, vector right) { - X(v_right); - X(-v_right); - X(v_forward); - X(-v_forward); + X(right); + X(-right); + X(forward); + X(-forward); return false; } -bool is_close_to_ground(entity this, float threshold) +bool is_close_to_ground(entity this, float threshold, vector up) { if (IS_ONGROUND(this)) return true; - X(-v_up); // necessary for dodging down a slope using doubletap (using `+dodge` works anyway) + X(-up); // necessary for dodging down a slope using doubletap (using `+dodge` works anyway) return false; } @@ -156,10 +163,8 @@ bool PM_dodging_checkpressedkeys(entity this) if (mymovement_##COND) { \ /* is this a state change? */ \ if(!(PHYS_DODGING_PRESSED_KEYS(this) & KEY_##BTN) || frozen_no_doubletap) { \ - /*LOG_INFOF("state change %f\n", time);*/ \ tap_direction_##RESULT; \ if ((time - this.last_##BTN##_KEY_time) < PHYS_DODGING_TIMEOUT(this) || frozen_no_doubletap) { \ - /*LOG_INFOF("dodge repress %f (%s)\n", time - this.last_##BTN##_KEY_time, this.netname);*/ \ dodge_detected = true; \ } else if(PHYS_INPUT_BUTTON_DODGE(this)) { \ dodge_detected = true; \ @@ -174,7 +179,6 @@ bool PM_dodging_checkpressedkeys(entity this) #undef X if (!dodge_detected) return false; - //LOG_INFOF("dodge keys detected %f, speed %f\n", time, vlen(this.velocity)); // this check has to be after checking keys: // the first key press of the double tap is allowed to be before dodging delay, @@ -183,14 +187,14 @@ bool PM_dodging_checkpressedkeys(entity this) if ((time - this.last_dodging_time) < PHYS_DODGING_DELAY) return false; - makevectors(this.angles); + vector forward, right, up; + MAKE_VECTORS(this.angles, forward, right, up); - bool can_dodge = (is_close_to_ground(this, PHYS_DODGING_HEIGHT_THRESHOLD) && (PHYS_DODGING_MAXSPEED == 0 || vdist(this.velocity, <, PHYS_DODGING_MAXSPEED))); - bool can_wall_dodge = (PHYS_DODGING_WALL && is_close_to_wall(this, PHYS_DODGING_DISTANCE_THRESHOLD)); + bool can_dodge = (is_close_to_ground(this, PHYS_DODGING_HEIGHT_THRESHOLD, up) && (PHYS_DODGING_MAXSPEED == 0 || vdist(this.velocity, <, PHYS_DODGING_MAXSPEED))); + bool can_wall_dodge = (PHYS_DODGING_WALL && is_close_to_wall(this, PHYS_DODGING_DISTANCE_THRESHOLD, forward, right)); bool can_air_dodge = (PHYS_DODGING_AIR && (PHYS_DODGING_AIR_MAXSPEED == 0 || vdist(this.velocity, <, PHYS_DODGING_AIR_MAXSPEED))); if (!can_dodge && !can_wall_dodge && !can_air_dodge) return false; - //LOG_INFOF("dodge delay %f (%s)\n", time - this.last_dodging_time, this.netname); // TODO lowest i got with double press: 0.63 this.last_dodging_time = time; this.dodging_action = 1; @@ -217,7 +221,7 @@ void PM_dodging(entity this) if (!this.dodging_action) return; // when swimming or dead, no dodging allowed.. - if (this.waterlevel >= WATERLEVEL_SWIMMING || IS_DEAD(this)) + if (this.waterlevel >= WATERLEVEL_SWIMMING || IS_DEAD(this) || (PHYS_DODGING_CLIENTSELECT && !PHYS_DODGING_ENABLED(this))) { this.dodging_action = 0; this.dodging_direction.x = 0; @@ -225,11 +229,11 @@ void PM_dodging(entity this) return; } - // make sure v_up, v_right and v_forward are sane + vector forward, right, up; if(PHYS_DODGING_AIR) - makevectors(this.v_angle); + MAKE_VECTORS(this.v_angle, forward, right, up); else - makevectors(this.angles); + MAKE_VECTORS(this.angles, forward, right, up); // fraction of the force to apply each frame // if we have e.g. 0.5 sec ramptime and a frametime of 0.25, then the ramp code @@ -241,16 +245,15 @@ void PM_dodging(entity this) float velocity_increase = min(common_factor * this.dodging_force_total, this.dodging_force_remaining); this.dodging_force_remaining -= velocity_increase; - //LOG_INFOF("time %f velocity_increase: %f\n", time, velocity_increase); - this.velocity += this.dodging_direction.x * velocity_increase * v_forward - + this.dodging_direction.y * velocity_increase * v_right; + this.velocity += this.dodging_direction.x * velocity_increase * forward + + this.dodging_direction.y * velocity_increase * right; // the up part of the dodge is a single shot action if (this.dodging_single_action == 1) { UNSET_ONGROUND(this); - this.velocity += PHYS_DODGING_UP_SPEED * v_up; + this.velocity += PHYS_DODGING_UP_SPEED * up; #ifdef SVQC if (autocvar_sv_dodging_sound) @@ -293,7 +296,6 @@ void PM_dodging_GetPressedKeys(entity this) MUTATOR_HOOKFUNCTION(dodging, PlayerPhysics) { entity player = M_ARGV(0, entity); - //LOG_INFOF("player %s, physics %f\n", player.netname, time); #ifdef CSQC PM_dodging_GetPressedKeys(player); @@ -304,11 +306,11 @@ MUTATOR_HOOKFUNCTION(dodging, PlayerPhysics) #ifdef SVQC REPLICATE(cvar_cl_dodging_timeout, float, "cl_dodging_timeout"); +REPLICATE(cvar_cl_dodging, bool, "cl_dodging"); MUTATOR_HOOKFUNCTION(dodging, GetPressedKeys) { entity player = M_ARGV(0, entity); - //LOG_INFOF("player %s, keys %f\n", player.netname, time); PM_dodging_checkpressedkeys(player); }