Skip to content

Commit 333afcc

Browse files
dystopmVaqtincha
andauthored
Refactor Shield hit handling to remove redundancy and fix related bugs (#999)
* fix #927 (#985) * Shield hit punchangle change logic grouped * Add comments for clarity --------- Co-authored-by: Vaqtincha <51029683+Vaqtincha@users.noreply.github.com>
1 parent ff079db commit 333afcc

3 files changed

Lines changed: 50 additions & 42 deletions

File tree

regamedll/dlls/cbase.cpp

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,30 +1443,8 @@ VectorRef CBaseEntity::__API_HOOK(FireBullets3)(VectorRef vecSrc, VectorRef vecD
14431443

14441444
if (tr.iHitgroup == HITGROUP_SHIELD)
14451445
{
1446-
EMIT_SOUND(pEntity->edict(), CHAN_VOICE, (RANDOM_LONG(0, 1) == 1) ? "weapons/ric_metal-1.wav" : "weapons/ric_metal-2.wav", VOL_NORM, ATTN_NORM);
1447-
UTIL_Sparks(tr.vecEndPos);
1448-
1449-
pEntity->pev->punchangle.x = iCurrentDamage * RANDOM_FLOAT(-0.15, 0.15);
1450-
pEntity->pev->punchangle.z = iCurrentDamage * RANDOM_FLOAT(-0.15, 0.15);
1451-
1452-
#ifndef REGAMEDLL_FIXES
1453-
if (pEntity->pev->punchangle.x < 4)
1454-
#else
1455-
if (pEntity->pev->punchangle.x < -4)
1456-
#endif
1457-
{
1458-
pEntity->pev->punchangle.x = -4;
1459-
}
1460-
1461-
if (pEntity->pev->punchangle.z < -5)
1462-
{
1463-
pEntity->pev->punchangle.z = -5;
1464-
}
1465-
else if (pEntity->pev->punchangle.z > 5)
1466-
{
1467-
pEntity->pev->punchangle.z = 5;
1468-
}
1469-
1446+
// stop on shield hit
1447+
pEntity->HitShield(iCurrentDamage, &tr);
14701448
break;
14711449
}
14721450

@@ -1503,6 +1481,43 @@ VectorRef CBaseEntity::__API_HOOK(FireBullets3)(VectorRef vecSrc, VectorRef vecD
15031481
return vecRet;
15041482
}
15051483

1484+
void CBaseEntity::HitShield(float flDamage, TraceResult *ptr)
1485+
{
1486+
if (RANDOM_LONG(0, 1))
1487+
EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/ric_metal-1.wav", VOL_NORM, ATTN_NORM);
1488+
else
1489+
EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/ric_metal-2.wav", VOL_NORM, ATTN_NORM);
1490+
1491+
UTIL_Sparks(ptr->vecEndPos);
1492+
1493+
#ifdef REGAMEDLL_FIXES
1494+
// dont modify punchangle if it is already above this threshold
1495+
if (Q_fabs(pev->punchangle.x) < 4.0)
1496+
{
1497+
pev->punchangle.x = clamp(flDamage * RANDOM_FLOAT(-0.15, 0.15), -4.0f, 4.0f);
1498+
}
1499+
#else
1500+
pev->punchangle.x = flDamage * RANDOM_FLOAT(-0.15, 0.15);
1501+
1502+
if (pev->punchangle.x < 4) // BUGBUG: https://github.com/rehlds/ReGameDLL_CS/pull/919
1503+
pev->punchangle.x = -4;
1504+
#endif
1505+
1506+
#ifdef REGAMEDLL_FIXES
1507+
// dont modify punchangle if it is already above this threshold
1508+
if (Q_fabs(pev->punchangle.z) < 5.0)
1509+
#endif
1510+
{
1511+
pev->punchangle.z = clamp(flDamage * RANDOM_FLOAT(-0.15, 0.15), -5.0f, 5.0f);
1512+
// the code above is replicated as:
1513+
// if (pev->punchangle.z < -5)
1514+
// pev->punchangle.z = -5;
1515+
// else if (pev->punchangle.z > 5)
1516+
// pev->punchangle.z = 5;
1517+
// which is the original logic
1518+
}
1519+
}
1520+
15061521
void CBaseEntity::TraceBleed(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
15071522
{
15081523
if (BloodColor() == DONT_BLEED)

regamedll/dlls/cbase.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class CBaseEntity {
162162
bool Intersects(const Vector &mins, const Vector &maxs);
163163
bool CanTakeHealth(float flHealth = 0.0f) const;
164164
void MakeDormant();
165+
void HitShield(float flDamage, TraceResult* ptr);
165166

166167
// This entity's classname.
167168
const char *GetClassname() const { return pev->classname.str(); }

regamedll/dlls/player.cpp

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -698,27 +698,19 @@ void EXT_FUNC CBasePlayer::__API_HOOK(TraceAttack)(entvars_t *pevAttacker, float
698698

699699
if (bHitShield)
700700
{
701+
#ifndef REGAMEDLL_FIXES
702+
// BUGBUG: zeroing out damage BEFORE altering victim's punchangle
703+
// will simply nullify any previous punchangles
701704
flDamage = 0;
702-
bShouldBleed = false;
703-
704-
if (RANDOM_LONG(0, 1))
705-
EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/ric_metal-1.wav", VOL_NORM, ATTN_NORM);
706-
else
707-
EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/ric_metal-2.wav", VOL_NORM, ATTN_NORM);
708-
709-
UTIL_Sparks(ptr->vecEndPos);
710-
711-
pev->punchangle.x = flDamage * RANDOM_FLOAT(-0.15, 0.15);
712-
pev->punchangle.z = flDamage * RANDOM_FLOAT(-0.15, 0.15);
713-
714-
if (pev->punchangle.x < 4)
715-
pev->punchangle.x = -4;
705+
#endif
716706

717-
if (pev->punchangle.z < -5)
718-
pev->punchangle.z = -5;
707+
bShouldBleed = false;
708+
HitShield(flDamage, ptr);
719709

720-
else if (pev->punchangle.z > 5)
721-
pev->punchangle.z = 5;
710+
#ifdef REGAMEDLL_FIXES
711+
// reset damage after messing with victim's punchangle
712+
flDamage = 0;
713+
#endif
722714
}
723715
else
724716
{

0 commit comments

Comments
 (0)