Skip to content

Commit

Permalink
Back to using MSG_ALL for the DeathMsg event in favor of backward com…
Browse files Browse the repository at this point in the history
…patibility (issue #868)

Minor refactoring
  • Loading branch information
s1lentq committed Sep 30, 2023
1 parent b962e0e commit ac07e89
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 77 deletions.
27 changes: 14 additions & 13 deletions regamedll/dlls/gamerules.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,34 +224,35 @@ enum
// Should always be more than 1
const int CS_KILLS_FOR_DOMINATION = 4;

// Flags for specifying extra info about player death
enum DeathMessageFlags
{
// float[3]
// Position where the victim died
// Position where the victim was killed by the enemy
PLAYERDEATH_POSITION = 0x001,

// byte
// Index of the assistant who helped the attacker kill the victim
PLAYERDEATH_ASSISTANT = 0x002,

// short
// Rarity classification bitsums
// 0x001 - Attacker was blind
// 0x002 - Attacker killed victim from sniper rifle without scope
// 0x004 - Attacker killed victim through walls
// Bitsum classification for the rarity of the kill
// See enum KillRarity for details
PLAYERDEATH_KILLRARITY = 0x004
};

// Classifying various player kill methods in the game
enum KillRarity
{
KILLRARITY_HEADSHOT = 0x001, // The killer player kills the victim with a headshot
KILLRARITY_KILLER_BLIND = 0x002, // The killer player was blind
KILLRARITY_NOSCOPE = 0x004, // The killer player kills the victim with a sniper rifle with no scope
KILLRARITY_PENETRATED = 0x008, // The killer player kills the victim through walls
KILLRARITY_THROUGH_SMOKE = 0x010, // The killer player kills the victim through smoke
KILLRARITY_ASSIST_FLASH = 0x020, // The killer player kills the victim with an assistant flashbang grenade
KILLRARITY_DOMINATION = 0x040, // The killer player dominates the victim
KILLRARITY_REVENGE = 0x080 // The killer player got revenge on the victim
KILLRARITY_HEADSHOT = 0x001, // Headshot
KILLRARITY_KILLER_BLIND = 0x002, // Killer was blind
KILLRARITY_NOSCOPE = 0x004, // No-scope sniper rifle kill
KILLRARITY_PENETRATED = 0x008, // Penetrated kill (through walls)
KILLRARITY_THRUSMOKE = 0x010, // Smoke grenade penetration kill (bullets went through smoke)
KILLRARITY_ASSISTEDFLASH = 0x020, // Assister helped with a flash
KILLRARITY_DOMINATION_BEGAN = 0x040, // Killer player began dominating the victim (NOTE: this flag is set once)
KILLRARITY_DOMINATION = 0x080, // Continues domination by the killer
KILLRARITY_REVENGE = 0x100 // Revenge by the killer
};

class CItem;
Expand Down
104 changes: 40 additions & 64 deletions regamedll/dlls/multiplay_gamerules.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4087,7 +4087,6 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(DeathNotice)(CBasePlayer *pVictim,

if (!TheTutor)
{
#ifdef REGAMEDLL_ADD
int iRarityOfKill = 0;
int iDeathMessageFlags = PLAYERDEATH_POSITION; // set default bit

Expand Down Expand Up @@ -4118,14 +4117,6 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(DeathNotice)(CBasePlayer *pVictim,
pKiller->CSPlayer()->m_iNumKilledByUnanswered[iPlayerIndexVictim - 1] = 0;
pVictim->CSPlayer()->m_iNumKilledByUnanswered[iPlayerIndexKiller - 1]++;
}
#else
MESSAGE_BEGIN(MSG_ALL, gmsgDeathMsg);
WRITE_BYTE(pKiller ? pKiller->entindex() : 0); // the killer
WRITE_BYTE(ENTINDEX(pVictim->edict())); // the victim
WRITE_BYTE(pVictim->m_bHeadshotKilled); // is killed headshot
WRITE_STRING(killer_weapon_name); // what they were killed by (should this be a string?)
MESSAGE_END();
#endif
}

// Did he kill himself?
Expand Down Expand Up @@ -5256,7 +5247,7 @@ int CHalfLifeMultiplay::GetRarityOfKill(CBaseEntity *pKiller, CBasePlayer *pVict

// The killer player kills the victim with an assistant flashbang grenade
if (pAssister && bFlashAssist)
iRarity |= KILLRARITY_ASSIST_FLASH;
iRarity |= KILLRARITY_ASSISTEDFLASH;

// The killer player kills the victim with a headshot
if (pVictim->m_bHeadshotKilled)
Expand All @@ -5281,7 +5272,7 @@ int CHalfLifeMultiplay::GetRarityOfKill(CBaseEntity *pKiller, CBasePlayer *pVict
// The killer player kills the victim through smoke
const Vector inEyePos = pKillerPlayer->EyePosition();
if (TheCSBots()->IsLineBlockedBySmoke(&inEyePos, &pVictim->pev->origin))
iRarity |= KILLRARITY_THROUGH_SMOKE;
iRarity |= KILLRARITY_THRUSMOKE;

// Calculate # of unanswered kills between killer & victim
// This is plus 1 as this function gets called before the stat is updated
Expand Down Expand Up @@ -5328,69 +5319,54 @@ LINK_HOOK_CLASS_VOID_CUSTOM_CHAIN(CHalfLifeMultiplay, CSGameRules, SendDeathMess
//
void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(SendDeathMessage)(CBaseEntity *pKiller, CBasePlayer *pVictim, CBasePlayer *pAssister, entvars_t *pevInflictor, const char *killerWeaponName, int iDeathMessageFlags, int iRarityOfKill)
{
#ifdef REGAMEDLL_ADD
iDeathMessageFlags &= (int)deathmsg_flags.value; // leave only allowed bitsums for extra info
#endif

CBasePlayer *pKillerPlayer = (pKiller && pKiller->IsPlayer()) ? static_cast<CBasePlayer *>(pKiller) : nullptr;

for (int i = 1; i <= gpGlobals->maxClients; i++)
// Only the player can dominate the victim
if ((iRarityOfKill & KILLRARITY_DOMINATION) && pKillerPlayer && pVictim != pKillerPlayer)
{
CBasePlayer *pPlayer = UTIL_PlayerByIndex(i);
if (!pPlayer || FNullEnt(pPlayer->edict()))
continue;

if (pPlayer->IsBot() || pPlayer->IsDormant())
continue;
// Sets the beginning of domination over the victim until he takes revenge
int iKillsUnanswered = pVictim->CSPlayer()->m_iNumKilledByUnanswered[pKillerPlayer->entindex() - 1] + 1;
if (iKillsUnanswered == CS_KILLS_FOR_DOMINATION)
iRarityOfKill |= KILLRARITY_DOMINATION_BEGAN;
}

int iSendDeathMessageFlags = iDeathMessageFlags;
MESSAGE_BEGIN(MSG_ALL, gmsgDeathMsg);
WRITE_BYTE((pKiller && pKiller->IsPlayer()) ? pKiller->entindex() : 0); // the killer
WRITE_BYTE(pVictim->entindex()); // the victim
WRITE_BYTE(pVictim->m_bHeadshotKilled); // is killed headshot
WRITE_STRING(killerWeaponName); // what they were killed by (should this be a string?)

// Send the victim's death position only
// if the attacker or victim is a teammate of the recipient player
if (pPlayer == pVictim || (
PlayerRelationship(pVictim, pPlayer) != GR_TEAMMATE &&
PlayerRelationship(pKillerPlayer, pPlayer) != GR_TEAMMATE))
{
iSendDeathMessageFlags &= ~PLAYERDEATH_POSITION;
}
#ifdef REGAMEDLL_ADD
iDeathMessageFlags &= (int)deathmsg_flags.value; // leave only allowed bitsums for extra info

// An recipient a client is a victim that involved in this kill
if (pKillerPlayer && pPlayer == pVictim && pVictim != pKillerPlayer)
{
// Sets a domination kill for recipient of the victim once until revenge
int iKillsUnanswered = pVictim->CSPlayer()->m_iNumKilledByUnanswered[pKillerPlayer->entindex() - 1];
if (iKillsUnanswered >= CS_KILLS_FOR_DOMINATION)
iRarityOfKill &= ~KILLRARITY_DOMINATION;
}
// Send the victim's death position only
// 1. if it is not a free for all mode
// 2. if the attacker is a player and they are not teammates
if (IsFreeForAll() || !pKillerPlayer || PlayerRelationship(pKillerPlayer, pVictim) != GR_TEAMMATE)
iDeathMessageFlags &= ~PLAYERDEATH_POSITION;

MESSAGE_BEGIN(MSG_ONE, gmsgDeathMsg, nullptr, pPlayer->pev);
WRITE_BYTE((pKiller && pKiller->IsPlayer()) ? pKiller->entindex() : 0); // the killer
WRITE_BYTE(pVictim->entindex()); // the victim
WRITE_BYTE(pVictim->m_bHeadshotKilled); // is killed headshot
WRITE_STRING(killerWeaponName); // what they were killed by (should this be a string?)
if (iDeathMessageFlags > 0)
{
WRITE_LONG(iDeathMessageFlags);

if (iSendDeathMessageFlags > 0)
// Writes the coordinates of the place where the victim died
// The victim has just been killed, so this usefully display 'X' dead icon on the HUD radar
if (iDeathMessageFlags & PLAYERDEATH_POSITION)
{
WRITE_LONG(iSendDeathMessageFlags);

// Writes the coordinates of the place where the victim died
// The victim has just been killed, so this usefully display 'X' dead icon on the HUD radar
if (iSendDeathMessageFlags & PLAYERDEATH_POSITION)
{
WRITE_COORD(pVictim->pev->origin.x);
WRITE_COORD(pVictim->pev->origin.y);
WRITE_COORD(pVictim->pev->origin.z);
}

// Writes the index of the teammate who assisted in the kill
if (iSendDeathMessageFlags & PLAYERDEATH_ASSISTANT)
WRITE_BYTE(pAssister->entindex());

// Writes the rarity classification of the kill
if (iSendDeathMessageFlags & PLAYERDEATH_KILLRARITY)
WRITE_LONG(iRarityOfKill);
WRITE_COORD(pVictim->pev->origin.x);
WRITE_COORD(pVictim->pev->origin.y);
WRITE_COORD(pVictim->pev->origin.z);
}

MESSAGE_END();
// Writes the index of the teammate who assisted in the kill
if (iDeathMessageFlags & PLAYERDEATH_ASSISTANT)
WRITE_BYTE(pAssister->entindex());

// Writes the rarity classification of the kill
if (iDeathMessageFlags & PLAYERDEATH_KILLRARITY)
WRITE_LONG(iRarityOfKill);
}
#endif

MESSAGE_END();
}

0 comments on commit ac07e89

Please sign in to comment.