From ac07e8926956fc85c43823ef378d18d24c9979fe Mon Sep 17 00:00:00 2001 From: s1lentq Date: Sun, 1 Oct 2023 01:30:56 +0700 Subject: [PATCH] Back to using MSG_ALL for the DeathMsg event in favor of backward compatibility (issue #868) Minor refactoring --- regamedll/dlls/gamerules.h | 27 +++---- regamedll/dlls/multiplay_gamerules.cpp | 104 ++++++++++--------------- 2 files changed, 54 insertions(+), 77 deletions(-) diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index 70d67c224..d6590245b 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -224,10 +224,11 @@ 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 @@ -235,23 +236,23 @@ enum DeathMessageFlags 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; diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 3b920abee..37ec8cfe3 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -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 @@ -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? @@ -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) @@ -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 @@ -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(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(); }