csgo-2018-source/game/server/logic_achievement.cpp
2021-07-24 21:11:47 -07:00

116 lines
3.4 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ====
//
// Defines a logical entity which passes achievement related events to the gamerules system.
#include "cbase.h"
#include "gamerules.h"
#include "entityinput.h"
#include "entityoutput.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// Allows map logic to send achievement related events.
class CLogicAchievement : public CLogicalEntity
{
public:
DECLARE_CLASS( CLogicAchievement, CLogicalEntity );
CLogicAchievement();
protected:
// Inputs
void InputFireEvent( inputdata_t &inputdata );
void InputEnable( inputdata_t &inputdata );
void InputDisable( inputdata_t &inputdata );
void InputToggle( inputdata_t &inputdata );
void InputSetTargetPlayer( inputdata_t &inputdata );
bool m_bDisabled;
string_t m_iszAchievementName; // Which achievement event this entity marks
EHANDLE m_hActivatingPlayer;
COutputEvent m_OnFired;
DECLARE_DATADESC();
};
LINK_ENTITY_TO_CLASS( logic_achievement, CLogicAchievement );
BEGIN_DATADESC( CLogicAchievement )
DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "StartDisabled" ),
DEFINE_KEYFIELD( m_iszAchievementName, FIELD_STRING, "achievementname" ),
DEFINE_FIELD( m_hActivatingPlayer, FIELD_EHANDLE ),
// Inputs
DEFINE_INPUTFUNC( FIELD_VOID, "FireEvent", InputFireEvent ),
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
DEFINE_INPUTFUNC( FIELD_VOID, "SetTargetPlayer", InputSetTargetPlayer ),
// Outputs
DEFINE_OUTPUT( m_OnFired, "OnFired" ),
END_DATADESC()
//-----------------------------------------------------------------------------
// Purpose: Constructor.
//-----------------------------------------------------------------------------
CLogicAchievement::CLogicAchievement(void)
{
m_hActivatingPlayer = NULL;
m_iszAchievementName = NULL_STRING;
}
//-----------------------------------------------------------------------------
// Purpose: Sends the achievement event to the achievement marking system.
//-----------------------------------------------------------------------------
void CLogicAchievement::InputFireEvent( inputdata_t &inputdata )
{
// If we're active, and our string matched a valid achievement ID
CBasePlayer *pPlayer = (CBasePlayer*)m_hActivatingPlayer.Get();
if ( !m_bDisabled && m_iszAchievementName != NULL_STRING )
{
UTIL_RecordAchievementEvent( m_iszAchievementName.ToCStr(), pPlayer );
m_OnFired.FireOutput( inputdata.pActivator, this );
}
}
//------------------------------------------------------------------------------
// Purpose: Turns on the relay, allowing it to fire outputs.
//------------------------------------------------------------------------------
void CLogicAchievement::InputEnable( inputdata_t &inputdata )
{
m_bDisabled = false;
}
//------------------------------------------------------------------------------
// Purpose: Turns off the relay, preventing it from firing outputs.
//------------------------------------------------------------------------------
void CLogicAchievement::InputDisable( inputdata_t &inputdata )
{
m_bDisabled = true;
}
void CLogicAchievement::InputToggle( inputdata_t &inputdata )
{
m_bDisabled = !m_bDisabled;
}
void CLogicAchievement::InputSetTargetPlayer( inputdata_t &inputdata )
{
m_hActivatingPlayer = inputdata.value.Entity();
}