summaryrefslogtreecommitdiff
path: root/game/server/dod/dod_eventlog.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/dod/dod_eventlog.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/dod/dod_eventlog.cpp')
-rw-r--r--game/server/dod/dod_eventlog.cpp547
1 files changed, 547 insertions, 0 deletions
diff --git a/game/server/dod/dod_eventlog.cpp b/game/server/dod/dod_eventlog.cpp
new file mode 100644
index 0000000..0434b05
--- /dev/null
+++ b/game/server/dod/dod_eventlog.cpp
@@ -0,0 +1,547 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include "cbase.h"
+#include "../EventLog.h"
+#include "team.h"
+#include "KeyValues.h"
+#include "dod_shareddefs.h"
+#include "dod_team.h"
+
+#define LOG_DETAIL_ENEMY_ATTACKS 1
+#define LOG_DETAIL_TEAMMATE_ATTACKS 2
+
+ConVar mp_logdetail( "mp_logdetail", "0", FCVAR_NONE, "Logs attacks. Values are: 0=off, 1=enemy, 2=teammate, 3=both)", true, 0.0f, true, 3.0f );
+
+class CDODEventLog : public CEventLog
+{
+private:
+ typedef CEventLog BaseClass;
+
+public:
+ bool PrintEvent( IGameEvent * event ) // override virtual function
+ {
+ if ( !PrintDodEvent( event ) ) // allow DOD to override logging
+ {
+ return BaseClass::PrintEvent( event );
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ bool Init()
+ {
+ BaseClass::Init();
+
+ ListenForGameEvent( "player_death" );
+ ListenForGameEvent( "player_hurt" );
+ ListenForGameEvent( "player_changeclass" );
+ ListenForGameEvent( "dod_warmup_begins" );
+ ListenForGameEvent( "dod_warmup_ends" );
+ ListenForGameEvent( "dod_round_start" );
+ ListenForGameEvent( "dod_restart_round" );
+ ListenForGameEvent( "dod_ready_restart" );
+ ListenForGameEvent( "dod_allies_ready" );
+ ListenForGameEvent( "dod_axis_ready" );
+ ListenForGameEvent( "dod_round_restart_seconds" );
+ ListenForGameEvent( "dod_team_scores" );
+ ListenForGameEvent( "dod_round_win" );
+ ListenForGameEvent( "dod_tick_points" );
+ ListenForGameEvent( "dod_game_over" );
+ ListenForGameEvent( "dod_point_captured" );
+ ListenForGameEvent( "dod_capture_blocked" );
+ ListenForGameEvent( "dod_bomb_planted" );
+ ListenForGameEvent( "dod_bomb_exploded" );
+ ListenForGameEvent( "dod_bomb_defused" );
+ ListenForGameEvent( "dod_kill_planter" );
+ ListenForGameEvent( "dod_kill_defuser" );
+
+ return true;
+ }
+
+protected:
+
+ bool PrintDodEvent( IGameEvent * event ) // print Mod specific logs
+ {
+ const char *eventName = event->GetName();
+
+ if ( !Q_strncmp( eventName, "server_", strlen("server_")) )
+ {
+ return false; // ignore server_ messages
+ }
+
+ if ( FStrEq( eventName, "player_death" ) )
+ {
+ const int userid = event->GetInt( "userid" );
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid );
+
+ if ( !pPlayer )
+ {
+ return false;
+ }
+
+ const int attackerid = event->GetInt("attacker" );
+ const char *weapon = event->GetString( "weapon" );
+ CBasePlayer *pAttacker = UTIL_PlayerByUserId( attackerid );
+
+ if ( pPlayer == pAttacker )
+ {
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"%s\"\n",
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ weapon
+ );
+ }
+ else if ( pAttacker )
+ {
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"\n",
+ pAttacker->GetPlayerName(),
+ attackerid,
+ pAttacker->GetNetworkIDString(),
+ pAttacker->GetTeam()->GetName(),
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ weapon
+ );
+ }
+ else
+ {
+ // killed by the world
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"world\"\n",
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName()
+ );
+ }
+
+ // Domination and Revenge
+ // pAttacker //int attackerid = engine->GetPlayerForUserID( event->GetInt( "attacker" ) );
+ // pPlayer //int userid = engine->GetPlayerForUserID( event->GetInt( "userid" ) );
+
+ if ( event->GetInt( "dominated" ) > 0 && pAttacker )
+ {
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"domination\" against \"%s<%i><%s><%s>\"\n",
+ pAttacker->GetPlayerName(),
+ attackerid,
+ pAttacker->GetNetworkIDString(),
+ pAttacker->GetTeam()->GetName(),
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName()
+ );
+ }
+ if ( event->GetInt( "revenge" ) > 0 && pAttacker )
+ {
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"revenge\" against \"%s<%i><%s><%s>\"\n",
+ pAttacker->GetPlayerName(),
+ attackerid,
+ pAttacker->GetNetworkIDString(),
+ pAttacker->GetTeam()->GetName(),
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName()
+ );
+ }
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "player_hurt" ) )
+ {
+ const int userid = event->GetInt( "userid" );
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid );
+
+ if ( !pPlayer )
+ {
+ return false;
+ }
+
+ const int attackerid = event->GetInt("attacker" );
+ const char *weapon = event->GetString( "weapon" );
+ CBasePlayer *pAttacker = UTIL_PlayerByUserId( attackerid );
+ if ( !pAttacker )
+ {
+ return false;
+ }
+
+ bool isTeamAttack = ( (pPlayer->GetTeamNumber() == pAttacker->GetTeamNumber() ) && (pPlayer != pAttacker) );
+ int detail = mp_logdetail.GetInt();
+ if ( ( isTeamAttack && ( detail & LOG_DETAIL_TEAMMATE_ATTACKS ) ) ||
+ ( !isTeamAttack && ( detail & LOG_DETAIL_ENEMY_ATTACKS ) ) )
+ {
+ int hitgroup = event->GetInt( "hitgroup" );
+ const char *hitgroupStr = "GENERIC";
+ switch ( hitgroup )
+ {
+ case HITGROUP_GENERIC:
+ hitgroupStr = "generic";
+ break;
+ case HITGROUP_HEAD:
+ hitgroupStr = "head";
+ break;
+ case HITGROUP_CHEST:
+ hitgroupStr = "chest";
+ break;
+ case HITGROUP_STOMACH:
+ hitgroupStr = "stomach";
+ break;
+ case HITGROUP_LEFTARM:
+ hitgroupStr = "left arm";
+ break;
+ case HITGROUP_RIGHTARM:
+ hitgroupStr = "right arm";
+ break;
+ case HITGROUP_LEFTLEG:
+ hitgroupStr = "left leg";
+ break;
+ case HITGROUP_RIGHTLEG:
+ hitgroupStr = "right leg";
+ break;
+ }
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" attacked \"%s<%i><%s><%s>\" with \"%s\" (damage \"%d\") (health \"%d\") (hitgroup \"%s\")\n",
+ pAttacker->GetPlayerName(),
+ attackerid,
+ pAttacker->GetNetworkIDString(),
+ pAttacker->GetTeam()->GetName(),
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ weapon,
+ event->GetInt( "damage" ),
+ event->GetInt( "health" ),
+ hitgroupStr );
+ }
+ return true;
+ }
+ else if ( FStrEq( eventName, "player_changeclass" ) )
+ {
+ const int userid = event->GetInt( "userid" );
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid );
+
+ if ( !pPlayer )
+ {
+ return false;
+ }
+
+ int iClass = event->GetInt("class");
+ int iTeam = pPlayer->GetTeamNumber();
+
+ if ( iTeam != TEAM_ALLIES && iTeam != TEAM_AXIS )
+ return true;
+
+ CDODTeam *pTeam = GetGlobalDODTeam( iTeam );
+
+ if ( iClass == PLAYERCLASS_RANDOM )
+ {
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" changed role to \"Random\"\n",
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pTeam->GetName()
+ );
+ }
+ else if ( iClass < GetGlobalDODTeam(iTeam)->GetNumPlayerClasses() )
+ {
+ const CDODPlayerClassInfo &pInfo = GetGlobalDODTeam(iTeam)->GetPlayerClassInfo( iClass );
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" changed role to \"%s\"\n",
+ pPlayer->GetPlayerName(),
+ userid,
+ pPlayer->GetNetworkIDString(),
+ pTeam->GetName(),
+ pInfo.m_szPrintName
+ );
+ }
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_warmup_begins" ) )
+ {
+ UTIL_LogPrintf( "World triggered \"Warmup_Begin\"\n" );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_warmup_ends" ) )
+ {
+ UTIL_LogPrintf( "World triggered \"Warmup_Ends\"\n" );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_round_start" ) )
+ {
+ UTIL_LogPrintf("World triggered \"Round_Start\"\n");
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_restart_round" ) )
+ {
+ UTIL_LogPrintf("World triggered \"Round_Restart\"\n");
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_ready_restart" ) )
+ {
+ UTIL_LogPrintf( "World triggered \"Ready_Restart_Begin\"\n" );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_allies_ready" ) )
+ {
+ UTIL_LogPrintf("World triggered \"Allies Ready\"\n");
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_axis_ready" ) )
+ {
+ UTIL_LogPrintf("World triggered \"Axis Ready\"\n");
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_round_restart_seconds" ) )
+ {
+ UTIL_LogPrintf( "World triggered \"Round_Restart_In\" (delay \"%d\")\n", event->GetInt("seconds") );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_team_scores" ) )
+ {
+ int iAlliesRoundsWon = event->GetInt( "allies_caps" );
+ int iAlliesTickPoints = event->GetInt( "allies_tick" );
+ int iNumAllies = event->GetInt( "allies_players" );
+ int iAxisRoundsWon = event->GetInt( "axis_caps" );
+ int iAxisTickPoints = event->GetInt( "axis_tick" );
+ int iNumAxis = event->GetInt( "axis_players" );
+
+ UTIL_LogPrintf( "Team \"Allies\" triggered \"team_scores\" (roundswon \"%d\") (tickpoints \"%d\") (numplayers \"%d\")\n", iAlliesRoundsWon, iAlliesTickPoints, iNumAllies );
+ UTIL_LogPrintf( "Team \"Allies\" triggered \"team_scores\" (roundswon \"%d\") (tickpoints \"%d\") (numplayers \"%d\")\n", iAxisRoundsWon, iAxisTickPoints, iNumAxis );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_round_win" ) )
+ {
+ CDODTeam *pTeam = GetGlobalDODTeam( event->GetInt( "team" ) );
+
+ UTIL_LogPrintf( "Team \"%s\" triggered \"round_win\" (rounds_won \"%d\") (numplayers \"%d\")\n",
+ pTeam->GetName(),
+ pTeam->GetRoundsWon(),
+ pTeam->GetNumPlayers() );
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_tick_points" ) )
+ {
+ CDODTeam *pTeam = GetGlobalDODTeam( event->GetInt( "team" ) );
+
+ int iScore = event->GetInt( "score" );
+ int iTotalScore = event->GetInt( "totalscore" );
+
+ UTIL_LogPrintf( "Team \"%s\" triggered \"tick_score\" (score \"%i\") (totalscore \"%d\") (numplayers \"%d\")\n",
+ pTeam->GetName(),
+ iScore,
+ iTotalScore,
+ pTeam->GetNumPlayers() );
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_game_over" ) )
+ {
+ UTIL_LogPrintf( "World triggered \"Game_Over\" reason \"%s\"\n", event->GetString( "reason" ) );
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_point_captured" ) )
+ {
+ // identifier of the area "cp" "cpname"
+ int iPointIndex = event->GetInt( "cp" );
+ const char *szPointName = event->GetString( "cpname" );
+
+ const char *szCappers = event->GetString( "cappers" );
+
+ int iNumCappers = Q_strlen( szCappers );
+
+ if ( iNumCappers <= 0 )
+ return true;
+
+ //"Team "Allies" captured location "<3><#map_flag_2nd_axis>" with "2"
+ // players (1 "Matt<UID><STEAMID><TEAM>") (2 "Player2<2><STEAMID><TEAM>")
+
+ char buf[512];
+
+ for ( int i=0;i<iNumCappers;i++ )
+ {
+ int iPlayerIndex = szCappers[i];
+
+ Assert( iPlayerIndex != '\0' && iPlayerIndex > 0 && iPlayerIndex < MAX_PLAYERS );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByIndex( iPlayerIndex );
+
+ if ( i == 0 )
+ {
+ Q_snprintf( buf, sizeof(buf), "Team \"%s\" triggered \"captured_loc\" (flagindex \"%d\") (flagname \"%s\") (numplayers \"%d\") ",
+ pPlayer->GetTeam()->GetName(),
+ iPointIndex,
+ szPointName,
+ iNumCappers );
+ }
+
+ char playerBuf[256];
+ Q_snprintf( playerBuf, sizeof(playerBuf), "(player \"%s<%i><%s><%s>\") ",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName() );
+
+ Q_strncat( buf, playerBuf, sizeof(buf), COPY_ALL_CHARACTERS );
+ }
+
+ UTIL_LogPrintf( "%s\n", buf );
+ }
+ else if ( FStrEq( eventName, "dod_capture_blocked" ) )
+ {
+ int iPointIndex = event->GetInt( "cp" );
+ const char *szPointName = event->GetString( "cpname" );
+
+ int iBlocker = event->GetInt( "blocker" );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByIndex( iBlocker );
+
+ if ( !pPlayer )
+ return false;
+
+ // "Matt<2><UNKNOWN><Allies>" triggered "capblock" (flagindex "2") (flagname "#map_flag_2nd_axis")
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"capblock\" (flagindex \"%d\") (flagname \"%s\")\n",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ iPointIndex,
+ szPointName );
+ }
+ else if ( FStrEq( eventName, "dod_bomb_planted" ) )
+ {
+ int iPointIndex = event->GetInt( "cp" );
+ const char *szPointName = event->GetString( "cpname" );
+
+ int iPlanter = event->GetInt( "userid" );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( iPlanter );
+
+ if ( !pPlayer )
+ return false;
+
+ // "Matt<2><UNKNOWN><Allies>" triggered "bomb_plant" (flagindex "2") (flagname "#map_flag_2nd_axis")
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"bomb_plant\" (flagindex \"%d\") (flagname \"%s\")\n",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ iPointIndex,
+ szPointName );
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_bomb_defused" ) )
+ {
+ int iPointIndex = event->GetInt( "cp" );
+ const char *szPointName = event->GetString( "cpname" );
+
+ int iDefuser = event->GetInt( "userid" );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( iDefuser );
+
+ if ( !pPlayer )
+ return false;
+
+ // "Matt<2><UNKNOWN><Allies>" triggered "bomb_defuse" (flagindex "2") (flagname "#map_flag_2nd_axis")
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"bomb_defuse\" (flagindex \"%d\") (flagname \"%s\")\n",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ iPointIndex,
+ szPointName );
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_kill_planter" ) )
+ {
+ int iKiller = event->GetInt( "userid" );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( iKiller );
+
+ if ( !pPlayer )
+ return false;
+
+ int iVictim = event->GetInt( "victimid" );
+
+ CBasePlayer *pVictim = UTIL_PlayerByUserId( iVictim );
+
+ if ( !pVictim )
+ return false;
+
+ // "Matt<2><UNKNOWN><Allies>" triggered "kill_planter" against "Fred<3><UNKNOWN><Axis>"
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"kill_planter\" against \"%s<%i><%s><%s>\"\n",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ pVictim->GetPlayerName(),
+ pVictim->GetUserID(),
+ pVictim->GetNetworkIDString(),
+ pVictim->GetTeam()->GetName() );
+
+ return true;
+ }
+ else if ( FStrEq( eventName, "dod_kill_defuser" ) )
+ {
+ int iKiller = event->GetInt( "userid" );
+
+ CBasePlayer *pPlayer = UTIL_PlayerByUserId( iKiller );
+
+ if ( !pPlayer )
+ return false;
+
+ int iVictim = event->GetInt( "victimid" );
+
+ CBasePlayer *pVictim = UTIL_PlayerByUserId( iVictim );
+
+ if ( !pVictim )
+ return false;
+
+ // "Matt<2><UNKNOWN><Allies>" triggered "kill_defuser" against "Fred<3><UNKNOWN><Axis>"
+
+ UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"kill_defuser\" against \"%s<%i><%s><%s>\"\n",
+ pPlayer->GetPlayerName(),
+ pPlayer->GetUserID(),
+ pPlayer->GetNetworkIDString(),
+ pPlayer->GetTeam()->GetName(),
+ pVictim->GetPlayerName(),
+ pVictim->GetUserID(),
+ pVictim->GetNetworkIDString(),
+ pVictim->GetTeam()->GetName() );
+
+ return true;
+ }
+
+ return false;
+ }
+
+};
+
+CDODEventLog g_DODEventLog;
+
+//-----------------------------------------------------------------------------
+// Singleton access
+//-----------------------------------------------------------------------------
+IGameSystem* GameLogSystem()
+{
+ return &g_DODEventLog;
+}
+