Fixed grenades disappearing when speed exceeds 2000 fixed units ignoring sv_maxvelocity (#888)

* Fixed grenades disappearing when speed exceeds 2000 fixed units ignoring sv_maxvelocity
* Clamp nades velocity to sv_maxvelocity value when reached
* Make IsInWorld behave like SV_CheckVelocity: less/greater without equal
* Enclose IsInWorld changes with FIXES macro
This commit is contained in:
Francisco Muñoz 2023-11-26 01:24:48 -03:00 committed by GitHub
parent b10489f2e0
commit 193c1ed52a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 4 deletions

View File

@ -870,6 +870,17 @@ BOOL CBaseEntity::IsInWorld()
} }
// speed // speed
#ifdef REGAMEDLL_FIXES
float maxvel = g_psv_maxvelocity->value;
if (pev->velocity.x > maxvel || pev->velocity.y > maxvel || pev->velocity.z > maxvel)
{
return FALSE;
}
if (pev->velocity.x < -maxvel || pev->velocity.y < -maxvel || pev->velocity.z < -maxvel)
{
return FALSE;
}
#else
if (pev->velocity.x >= 2000.0 || pev->velocity.y >= 2000.0 || pev->velocity.z >= 2000.0) if (pev->velocity.x >= 2000.0 || pev->velocity.y >= 2000.0 || pev->velocity.z >= 2000.0)
{ {
return FALSE; return FALSE;
@ -878,6 +889,7 @@ BOOL CBaseEntity::IsInWorld()
{ {
return FALSE; return FALSE;
} }
#endif
return TRUE; return TRUE;
} }

View File

@ -9,6 +9,7 @@ cvar_t *g_psv_friction = nullptr;
cvar_t *g_psv_stopspeed = nullptr; cvar_t *g_psv_stopspeed = nullptr;
cvar_t *g_psv_stepsize = nullptr; cvar_t *g_psv_stepsize = nullptr;
cvar_t *g_psv_clienttrace = nullptr; cvar_t *g_psv_clienttrace = nullptr;
cvar_t *g_psv_maxvelocity = nullptr;
cvar_t displaysoundlist = { "displaysoundlist", "0", 0, 0.0f, nullptr }; cvar_t displaysoundlist = { "displaysoundlist", "0", 0, 0.0f, nullptr };
cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER, 0.0f, nullptr }; cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER, 0.0f, nullptr };
@ -238,6 +239,7 @@ void EXT_FUNC GameDLLInit()
g_psv_stopspeed = CVAR_GET_POINTER("sv_stopspeed"); g_psv_stopspeed = CVAR_GET_POINTER("sv_stopspeed");
g_psv_stepsize = CVAR_GET_POINTER("sv_stepsize"); g_psv_stepsize = CVAR_GET_POINTER("sv_stepsize");
g_psv_clienttrace = CVAR_GET_POINTER("sv_clienttrace"); g_psv_clienttrace = CVAR_GET_POINTER("sv_clienttrace");
g_psv_maxvelocity = CVAR_GET_POINTER("sv_maxvelocity");
CVAR_REGISTER(&displaysoundlist); CVAR_REGISTER(&displaysoundlist);
CVAR_REGISTER(&timelimit); CVAR_REGISTER(&timelimit);

View File

@ -43,12 +43,13 @@
extern cvar_t *g_pskill; extern cvar_t *g_pskill;
extern cvar_t *g_psv_gravity; extern cvar_t *g_psv_gravity;
extern cvar_t *g_psv_aim; extern cvar_t *g_psv_aim;
extern cvar_t *g_footsteps;
extern cvar_t *g_psv_accelerate; extern cvar_t *g_psv_accelerate;
extern cvar_t *g_psv_friction; extern cvar_t *g_psv_friction;
extern cvar_t *g_psv_stopspeed; extern cvar_t *g_psv_stopspeed;
extern cvar_t *g_psv_stepsize; extern cvar_t *g_psv_stepsize;
extern cvar_t *g_psv_clienttrace; extern cvar_t *g_psv_clienttrace;
extern cvar_t *g_footsteps; extern cvar_t *g_psv_maxvelocity;
extern cvar_t displaysoundlist; extern cvar_t displaysoundlist;
extern cvar_t timelimit; extern cvar_t timelimit;

View File

@ -772,6 +772,13 @@ void CGrenade::BounceSound()
void CGrenade::TumbleThink() void CGrenade::TumbleThink()
{ {
#ifdef REGAMEDLL_FIXES
if (pev->velocity.IsLengthGreaterThan(g_psv_maxvelocity->value))
{
pev->velocity = pev->velocity.Normalize() * g_psv_maxvelocity->value;
}
#endif
if (!IsInWorld()) if (!IsInWorld())
{ {
UTIL_Remove(this); UTIL_Remove(this);
@ -809,6 +816,13 @@ void CGrenade::TumbleThink()
void CGrenade::SG_TumbleThink() void CGrenade::SG_TumbleThink()
{ {
#ifdef REGAMEDLL_FIXES
if (pev->velocity.IsLengthGreaterThan(g_psv_maxvelocity->value))
{
pev->velocity = pev->velocity.Normalize() * g_psv_maxvelocity->value;
}
#endif
if (!IsInWorld()) if (!IsInWorld())
{ {
UTIL_Remove(this); UTIL_Remove(this);
@ -1322,6 +1336,13 @@ void AnnounceFlashInterval(float interval, float offset)
void CGrenade::C4Think() void CGrenade::C4Think()
{ {
#ifdef REGAMEDLL_FIXES
if (pev->velocity.IsLengthGreaterThan(g_psv_maxvelocity->value))
{
pev->velocity = pev->velocity.Normalize() * g_psv_maxvelocity->value;
}
#endif
if (!IsInWorld()) if (!IsInWorld())
{ {
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES

View File

@ -4,12 +4,11 @@ LINK_ENTITY_TO_CLASS(gib, CGib, CCSGib)
void CGib::LimitVelocity() void CGib::LimitVelocity()
{ {
float length = pev->velocity.Length(); float topspeed = g_psv_maxvelocity->value * 0.75f;
float topspeed = CVAR_GET_FLOAT("sv_maxvelocity") * 0.75f;
// ceiling at topspeed. The gib velocity equation is not bounded properly. Rather than tune it // ceiling at topspeed. The gib velocity equation is not bounded properly. Rather than tune it
// in 3 separate places again, I'll just limit it here. // in 3 separate places again, I'll just limit it here.
if (length > topspeed) if (pev->velocity.IsLengthGreaterThan(topspeed))
{ {
// DONE: This should really be sv_maxvelocity * 0.75 or something // DONE: This should really be sv_maxvelocity * 0.75 or something
pev->velocity = pev->velocity.Normalize() * topspeed; pev->velocity = pev->velocity.Normalize() * topspeed;