diff --git a/regamedll/dlls/cdll_dll.h b/regamedll/dlls/cdll_dll.h index 92aee04c..ae228c95 100644 --- a/regamedll/dlls/cdll_dll.h +++ b/regamedll/dlls/cdll_dll.h @@ -69,6 +69,7 @@ const int DEFAULT_FOV = 90; // the default field of view #define PLAYER_FREEZE_TIME_OVER BIT(1) #define PLAYER_IN_BOMB_ZONE BIT(2) #define PLAYER_HOLDING_SHIELD BIT(3) +#define PLAYER_PREVENT_DUCK BIT(4) #define MENU_KEY_1 BIT(0) #define MENU_KEY_2 BIT(1) diff --git a/regamedll/pm_shared/pm_shared.cpp b/regamedll/pm_shared/pm_shared.cpp index f2c1594c..6dd8d2e1 100644 --- a/regamedll/pm_shared/pm_shared.cpp +++ b/regamedll/pm_shared/pm_shared.cpp @@ -1851,8 +1851,6 @@ void PM_UnDuck() void PM_Duck() { - float_precision duckFraction; - int buttonsChanged = (pmove->oldbuttons ^ pmove->cmd.buttons); // These buttons have changed this frame int nButtonPressed = buttonsChanged & pmove->cmd.buttons; // The changed ones still down are "pressed" @@ -1868,6 +1866,20 @@ void PM_Duck() pmove->oldbuttons &= ~IN_DUCK; } +#ifdef REGAMEDLL_FIXES + // Prevent ducking if the iuser3 variable is contain PLAYER_PREVENT_DUCK + if ((pmove->iuser3 & PLAYER_PREVENT_DUCK) == PLAYER_PREVENT_DUCK) + { + // Try to unduck + if (pmove->flags & FL_DUCKING) + { + PM_UnDuck(); + } + + return; + } +#endif + if (pmove->dead || !(pmove->cmd.buttons & IN_DUCK) && !pmove->bInDuck && !(pmove->flags & FL_DUCKING)) { return; @@ -1883,11 +1895,9 @@ void PM_Duck() { // Use 1 second so super long jump will work pmove->flDuckTime = 1000; - pmove->bInDuck = true; + pmove->bInDuck = TRUE; } - float_precision time = Q_max(0.0, (1.0 - pmove->flDuckTime / 1000.0)); - if (pmove->bInDuck) { // Finish ducking immediately if duck time is over or not on ground @@ -1918,13 +1928,20 @@ void PM_Duck() } else { + float_precision duckFraction = PM_VEC_VIEW; + float_precision time = (1.0 - pmove->flDuckTime / 1000.0); + + // Calc parametric time + if (time >= 0.0) { + duckFraction = PM_SplineFraction(time, (1.0 / TIME_TO_DUCK)); + } + #ifdef REGAMEDLL_FIXES - float fMore = (pmove->_player_mins[1] - pmove->_player_mins[0]); + float fMore = (pmove->_player_mins[1][2] - pmove->_player_mins[0][2]); #else float fMore = (PM_VEC_DUCK_HULL_MIN - PM_VEC_HULL_MIN); #endif - // Calc parametric time - duckFraction = PM_SplineFraction(time, (1.0 / TIME_TO_DUCK)); + pmove->view_ofs[2] = ((PM_VEC_DUCK_VIEW - fMore) * duckFraction) + (PM_VEC_VIEW * (1 - duckFraction)); } }