diff --git a/sizzlinglib/include/SizzPluginContext.h b/sizzlinglib/include/SizzPluginContext.h index e0d39ac..cfbd52f 100644 --- a/sizzlinglib/include/SizzPluginContext.h +++ b/sizzlinglib/include/SizzPluginContext.h @@ -274,4 +274,5 @@ class CSizzPluginContext ConVarRef m_refRedTeamName; }; +static const int sCrusadersCrossbowType = 11; #endif // SIZZ_PLUGIN_CONTEXT_H diff --git a/sizzlingstats/LogStats.cpp b/sizzlingstats/LogStats.cpp index da8974e..5f37bc7 100644 --- a/sizzlingstats/LogStats.cpp +++ b/sizzlingstats/LogStats.cpp @@ -88,6 +88,7 @@ bool CLogStats::Load( CSizzPluginContext &plugin_context ) m_context->AddListener( this, "item_pickup", true ); m_context->AddListener( this, "player_hurt", true ); m_context->AddListener( this, "player_healed", true ); + m_context->AddListener( this, "arrow_impact", true ); m_context->AddListener( this, "player_spawn", true ); m_context->AddListener( this, "player_team", true ); m_context->AddListener( this, "player_changename", true ); @@ -275,6 +276,49 @@ void CLogStats::FireGameEvent( IGameEvent *event ) WriteLog( log ); //L 03/21/2011 - 02:35:56: "GooB<330>" picked up item "tf_ammo_pack" } + else if ( FStrEq( name, "arrow_impact" ) ) + { + // Only count crusader's crossbow + if ( event->GetInt("projectileType") == sCrusadersCrossbowType ) + { + + int healer = event->GetInt( "shooter" ); + playerInfo &pInfo1 = m_entIndexToPlayerInfo[healer]; + + int patient = event->GetInt( "attachedEntity" ); + playerInfo &pInfo2 = m_entIndexToPlayerInfo[patient]; + + if (pInfo1.teamid == pInfo2.teamid) + { + vec_t distance = pInfo1.pPlayerInfo->GetAbsOrigin().DistTo(pInfo2.pPlayerInfo->GetAbsOrigin()); + + if ( pInfo1.steamid[0] == '\0' ) + { + m_context->GetSteamIDString(pInfo1.userid, pInfo1.steamid, sizeof(pInfo1.steamid)); + } + + if ( pInfo2.steamid[0] == '\0' ) + { + m_context->GetSteamIDString(pInfo2.userid, pInfo2.steamid, sizeof(pInfo2.steamid)); + } + + char log[196]; + Q_snprintf( log, 196, "\"%s<%d><%s><%s>\" triggered \"arrow_impact\" against \"%s<%d><%s><%s> (distance \"%.2f\")\"\n", + pInfo1.name, + healer, + pInfo1.steamid, + teamNames[pInfo1.teamid], + pInfo2.name, + patient, + pInfo2.steamid, + teamNames[pInfo2.teamid], + distance ); + WriteLog( log ); + // L 08/15/2016 - 15:47:39: "happs<1><[U:1:20443063]>" triggered "arrow_impact" against "Chell<2> (distance "822.21")" + } + } + + } else if ( FStrEq( name, "player_spawn" ) ) { int userid = event->GetInt( "userid" ); diff --git a/sizzlingstats/SSPlayerData.cpp b/sizzlingstats/SSPlayerData.cpp index a75e5a5..7049a64 100644 --- a/sizzlingstats/SSPlayerData.cpp +++ b/sizzlingstats/SSPlayerData.cpp @@ -61,6 +61,8 @@ void SS_PlayerData::UpdateRoundExtraData( const extradata_t &dat ) m_RoundScoreData.data[MedPicks] = dat.medpicks; m_RoundScoreData.data[UbersDropped] = dat.ubersdropped; m_RoundScoreData.data[OverkillDamage] = dat.overkillDamage; + m_RoundScoreData.data[ArrowsLanded] = dat.arrowslanded; + m_RoundScoreData.data[ArrowsReceived] = dat.arrowsrecv; } int SS_PlayerData::GetStat( int StatID ) diff --git a/sizzlingstats/SSPlayerData.h b/sizzlingstats/SSPlayerData.h index afb0d67..10ec6ab 100644 --- a/sizzlingstats/SSPlayerData.h +++ b/sizzlingstats/SSPlayerData.h @@ -44,15 +44,15 @@ enum stats MedPicks, UbersDropped, OverkillDamage, - ShotsFired, - ShotsHit, + ArrowsLanded, + ArrowsReceived, NumOfStats }; typedef struct extradata_s { extradata_s(): - healsrecv(0), medpicks(0), ubersdropped(0), overkillDamage(0) + healsrecv(0), medpicks(0), ubersdropped(0), overkillDamage(0), arrowslanded(0), arrowsrecv(0) { } @@ -62,6 +62,8 @@ typedef struct extradata_s medpicks = a; ubersdropped = a; overkillDamage = a; + arrowslanded = a; + arrowsrecv = a; return *this; } @@ -69,6 +71,8 @@ typedef struct extradata_s short medpicks; short ubersdropped; int overkillDamage; + short arrowslanded; + short arrowsrecv; } extradata_t; struct ScoreData diff --git a/sizzlingstats/SizzlingStats.cpp b/sizzlingstats/SizzlingStats.cpp index 8504d69..fd86541 100644 --- a/sizzlingstats/SizzlingStats.cpp +++ b/sizzlingstats/SizzlingStats.cpp @@ -131,6 +131,15 @@ void SizzlingStats::PlayerHealed( int entindex, int amount ) data.m_pExtraData->healsrecv += amount; } +void SizzlingStats::PlayerArrowed( int patientEntIndex, int medicEntIndex, float distance ) +{ + playerAndExtra_t medic_data = m_PlayerDataManager.GetPlayerData(medicEntIndex); + medic_data.m_pExtraData->arrowslanded += 1; + + playerAndExtra_t data = m_PlayerDataManager.GetPlayerData(patientEntIndex); + data.m_pExtraData->arrowsrecv += 1; +} + void SizzlingStats::MedPick( int entindex ) { playerAndExtra_t data = m_PlayerDataManager.GetPlayerData(entindex); @@ -512,6 +521,8 @@ void SizzlingStats::SS_DisplayStats( CSizzPluginContext *pPluginContext, int ent int ubers = playerData.GetStat(Invulns); int drops = playerData.GetStat(UbersDropped); int medpicks = playerData.GetStat(MedPicks); + int arrowsLanded = playerData.GetStat(ArrowsLanded); + int arrowsReceived = playerData.GetStat(ArrowsReceived); IPlayerInfo *pPlayerInfo = pPluginContext->GetPlayerInfo(ent_index); CTFPlayerWrapper player(pPluginContext->BaseEntityFromEntIndex(ent_index)); @@ -549,6 +560,13 @@ void SizzlingStats::SS_DisplayStats( CSizzPluginContext *pPluginContext, int ent SS_SingleUserChatMessage(pPluginContext, ent_index, pText); } + if ( arrowsReceived != 0 ) + { + memset( pText, 0, sizeof(pText) ); + V_snprintf( pText, 64, "Arrows Received: %i\n", arrowsReceived ); + SS_SingleUserChatMessage(pPluginContext, ent_index, pText); + } + if ( medpicks != 0 ) { memset( pText, 0, sizeof(pText) ); @@ -556,6 +574,13 @@ void SizzlingStats::SS_DisplayStats( CSizzPluginContext *pPluginContext, int ent SS_SingleUserChatMessage(pPluginContext, ent_index, pText); } + if ( arrowsLanded != 0 ) + { + memset( pText, 0, sizeof(pText) ); + V_snprintf( pText, 64, "Arrows Landed: %i\n", arrowsLanded ); + SS_SingleUserChatMessage(pPluginContext, ent_index, pText); + } + if ( (backstabs != 0) && (headshots != 0) ) { memset( pText, 0, sizeof(pText) ); diff --git a/sizzlingstats/SizzlingStats.h b/sizzlingstats/SizzlingStats.h index 54bbc3c..fbb0c01 100644 --- a/sizzlingstats/SizzlingStats.h +++ b/sizzlingstats/SizzlingStats.h @@ -51,6 +51,7 @@ class SizzlingStats void LoadConfig( CSizzPluginContext *pPluginContext ); void PlayerHealed( int entindex, int amount ); + void PlayerArrowed( int patientEntIndex, int medicEntIndex, float distance ); void MedPick( int entindex ); void UberDropped( int entindex ); void OnPlayerDeath(int inflictorEntIndex, int victimEntIndex); diff --git a/sizzlingstats/WebStatsHandler.cpp b/sizzlingstats/WebStatsHandler.cpp index 9a541dc..502d3cd 100644 --- a/sizzlingstats/WebStatsHandler.cpp +++ b/sizzlingstats/WebStatsHandler.cpp @@ -300,6 +300,8 @@ void CWebStatsHandler::producePostString(const hostInfo_t &host, const CUtlVecto jsonWriter.InsertKV("medpicks", pScores->getStat(MedPicks)); jsonWriter.InsertKV("ubersdropped", pScores->getStat(UbersDropped)); jsonWriter.InsertKV("overkillDamage", pScores->getStat(OverkillDamage)); + jsonWriter.InsertKV("arrowsLanded", pScores->getStat(ArrowsLanded)); + jsonWriter.InsertKV("arrowsReceived", pScores->getStat(ArrowsReceived)); jsonWriter.EndObject(); } } diff --git a/sizzlingstats/serverplugin_empty.cpp b/sizzlingstats/serverplugin_empty.cpp index dca683e..47d7f55 100644 --- a/sizzlingstats/serverplugin_empty.cpp +++ b/sizzlingstats/serverplugin_empty.cpp @@ -291,6 +291,9 @@ bool CEmptyServerPlugin::Load( CreateInterfaceFn interfaceFactory, CreateInterfa // player healed (not incl buffs) m_plugin_context.AddListener( this, "player_healed", true ); + + // player arrowed (crusader, same team only) + m_plugin_context.AddListener( this, "arrow_impact", true ); // happens when mp_winlimit or mp_timelimit is met or something i don't know, i forget m_plugin_context.AddListener( this, "teamplay_game_over", true ); @@ -514,7 +517,7 @@ void CEmptyServerPlugin::GameFrame( bool simulating ) { using namespace Teamplay_GameRule_States; - //Msg( UTIL_VarArgs( "round state is now %s\n", GetStateName(state) ) ); + //Msg( UTIL_VarArgs( "round state is now %s\n", GetStateName((gamerules_roundstate_t)roundstate) ) ); switch (roundstate) { case GR_STATE_PREROUND: @@ -841,6 +844,26 @@ void CEmptyServerPlugin::FireGameEvent( IGameEvent *event ) } } } + else if ( m_bShouldRecord && FStrEq( name, "arrow_impact" ) ) + { + if (event->GetInt("projectileType") == sCrusadersCrossbowType) + { + const int victim = event->GetInt("attachedEntity"); + const int medic = event->GetInt("shooter"); + if (victim > 0 && medic > 0) + { + IPlayerInfo *pVictim = m_plugin_context.GetPlayerInfo( victim ); + IPlayerInfo *pMedic = m_plugin_context.GetPlayerInfo( medic ); + + if (pVictim && pMedic && pVictim->GetTeamIndex() == pMedic->GetTeamIndex()) + { + vec_t distance = pVictim->GetAbsOrigin().DistTo(pMedic->GetAbsOrigin()); + m_SizzlingStats.PlayerArrowed(victim, medic, distance); + } + } + } + + } else if ( m_bShouldRecord && FStrEq( name, "player_death" ) ) { const int victim = event->GetInt("victim_entindex");