diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/econ/item_selection_criteria.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/econ/item_selection_criteria.h')
| -rw-r--r-- | game/shared/econ/item_selection_criteria.h | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/game/shared/econ/item_selection_criteria.h b/game/shared/econ/item_selection_criteria.h new file mode 100644 index 0000000..a4da52d --- /dev/null +++ b/game/shared/econ/item_selection_criteria.h @@ -0,0 +1,290 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: CItemSelectionCriteria, which serves as a criteria for selection +// of a econ item +// +//============================================================================= + +#ifndef ITEM_SELECTION_CRITERIA_H +#define ITEM_SELECTION_CRITERIA_H +#ifdef _WIN32 +#pragma once +#endif + +// Maximum string length in item create APIs +const int k_cchCreateItemLen = 64; + +// Operators for BAddNewItemCriteria +enum EItemCriteriaOperator +{ + k_EOperator_String_EQ = 0, // Field is string equal to value + k_EOperator_Not = 1, // Logical not + k_EOperator_String_Not_EQ = 1, // Field is not string equal to value + k_EOperator_Float_EQ = 2, // Field as a float is equal to value + k_EOperator_Float_Not_EQ = 3, // Field as a float is not equal to value + k_EOperator_Float_LT = 4, // Field as a float is less than value + k_EOperator_Float_Not_LT = 5, // Field as a float is not less than value + k_EOperator_Float_LTE = 6, // Field as a float is less than or equal value + k_EOperator_Float_Not_LTE = 7, // Field as a float is not less than or equal value + k_EOperator_Float_GT = 8, // Field as a float is greater than value + k_EOperator_Float_Not_GT = 9, // Field as a float is not greater than value + k_EOperator_Float_GTE = 10, // Field as a float is greater than or equal value + k_EOperator_Float_Not_GTE = 11, // Field as a float is not greater than or equal value + k_EOperator_Subkey_Contains = 12, // Field contains value as a subkey + k_EOperator_Subkey_Not_Contains = 13, // Field does not contain value as a subkey + + // Must be last + k_EItemCriteriaOperator_Count = 14, +}; + + +EItemCriteriaOperator EItemCriteriaOperatorFromName( const char *pch ); +const char *PchNameFromEItemCriteriaOperator( int eItemCriteriaOperator ); + +class CEconItemSchema; +class CEconItemDefinition; +class CSOItemCriteria; +class CSOItemCriteriaCondition; + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// CItemSelectionCriteria +// A class that contains all the conditions a server needs to specify what +// kind of random item they wish to generate. +//----------------------------------------------------------------------------- +class CItemSelectionCriteria +{ +public: + // Constructors and destructor + CItemSelectionCriteria() : + m_bItemLevelSet( false ), + m_unItemLevel( 0 ), + m_bQualitySet( false ), + m_nItemQuality( k_unItemQuality_Any ), + m_unInitialInventory( 0 ), + m_bInitialQuantitySet( false ), + m_unInitialQuantity( 1 ), + m_bIgnoreEnabledFlag( false ) + { + } + + CItemSelectionCriteria( const CItemSelectionCriteria &that ); + CItemSelectionCriteria &operator=( const CItemSelectionCriteria& rhs ); + ~CItemSelectionCriteria(); + + // Accessors and Settors + bool BItemLevelSet( void ) const { return m_bItemLevelSet; } + uint32 GetItemLevel( void ) const { Assert( m_bItemLevelSet ); return m_unItemLevel; } + void SetItemLevel( uint32 unLevel ) { m_unItemLevel = unLevel; m_bItemLevelSet = true; } + bool BQualitySet( void ) const { return m_bQualitySet; } + int32 GetQuality( void ) const { Assert( m_bQualitySet ); return m_nItemQuality; } + void SetQuality( int32 nQuality ) { m_nItemQuality = nQuality; m_bQualitySet = true; } + uint32 GetInitialInventory( void ) const { return m_unInitialInventory; } + void SetInitialInventory( uint32 unInventory ) { m_unInitialInventory = unInventory; } + bool BInitialQuantitySet( void ) const { return m_bQualitySet; } + uint32 GetInitialQuantity( void ) const { Assert( m_bQualitySet ); return m_unInitialQuantity; } + void SetInitialQuantity( uint32 unQuantity ) { m_unInitialQuantity = unQuantity; m_bInitialQuantitySet = true; } + void SetIgnoreEnabledFlag( bool bIgnore ) { m_bIgnoreEnabledFlag = bIgnore; } + + // Tags + void SetTags( const char *pszTags ); + + + // Add conditions to the criteria + class ICondition + { + public: + virtual ~ICondition() { } + + virtual bool BItemDefinitionPassesCriteria( const CEconItemDefinition *pItemDef ) const = 0; + + virtual EItemCriteriaOperator GetEOp() const { return k_EItemCriteriaOperator_Count; } + virtual const char *GetField() const { return ""; } + virtual const char *GetValue() const { return ""; } + + virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const { Assert( !"BSerializeToMsg() called on for unimplementing ICondition!" ); return false; } + }; + + bool BAddCondition( const char *pszField, EItemCriteriaOperator eOp, float flValue, bool bRequired ); + bool BAddCondition( const char *pszField, EItemCriteriaOperator eOp, const char * pszValue, bool bRequired ); + bool BAddCondition( ICondition *pCondition ); + int GetConditionsCount() { return m_vecConditions.Count(); } + const char *GetValueForFirstConditionOfType( EItemCriteriaOperator eType ) const; + const char *GetFieldForFirstConditionOfType( EItemCriteriaOperator eType ) const; + + // Alternate ways of initializing + bool BInitFromKV( KeyValues *pKVCriteria ); + + // Serializes the criteria to and from messages + bool BSerializeToMsg( CSOItemCriteria & msg ) const; + bool BDeserializeFromMsg( const CSOItemCriteria & msg ); + + // Evaluates an item definition against this criteria. Returns true if + // the definition passes the filter + bool BEvaluate( const CEconItemDefinition* pItemDef ) const; + + // Validation +#ifdef DBGFLAG_VALIDATE + void Validate( CValidator &validator, const char *pchName ); +#endif + +private: + //----------------------------------------------------------------------------- + // CItemSelectionCriteria::CCondition + // Represents one condition of the criteria + //----------------------------------------------------------------------------- + class CCondition : public ICondition + { + public: + CCondition( const char *pszField, EItemCriteriaOperator eOp, bool bRequired ) + : m_sField( pszField ), m_EOp( eOp ), m_bRequired( bRequired ) + { + } + + // ICondition interface. + virtual bool BItemDefinitionPassesCriteria( const CEconItemDefinition *pItemDef ) const OVERRIDE; + + // Serializes the condition to the message + virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const; + + // Validation +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, const char *pchName ); +#endif + + EItemCriteriaOperator GetEOp( void ) const OVERRIDE { return m_EOp; } + virtual const char *GetField( void ) const OVERRIDE { return m_sField.Get(); } + virtual const char *GetValue( void ) const OVERRIDE { Assert(0); return NULL; } + + private: + // Returns if the given KeyValues block passes this condition + // Performs common checks and calls BInternalEvaluate + bool BEvaluate( KeyValues *pKVItem ) const; + + protected: + // Returns true if applying the element's operator on m_sField of + // pKVItem returns true. This is only called if m_pszField exists in pKVItem + virtual bool BInternalEvaluate( KeyValues *pKVItem ) const = 0; + + // The field of the raw KeyValue form of the item definition to check + CUtlString m_sField; + // The operator this clause uses + EItemCriteriaOperator m_EOp; + // When true, BEvaluate returns false if m_sField does not exist in pKVItem + bool m_bRequired; + }; + + + //----------------------------------------------------------------------------- + // CItemSelectionCriteria::CStringCondition + // CCondition that handles the string-based operators + //----------------------------------------------------------------------------- + class CStringCondition : public CCondition + { + public: + CStringCondition( const char *pszField, EItemCriteriaOperator eOp, const char *pszValue, bool bRequired ) + : CCondition( pszField, eOp, bRequired ), m_sValue( pszValue ) + { + } + + virtual ~CStringCondition( ) { } + + virtual const char *GetValue( void ) const OVERRIDE { return m_sValue.Get(); } + + // Validation +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, const char *pchName ); +#endif + + protected: + virtual bool BInternalEvaluate( KeyValues *pKVItem ) const; + virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const; + + // The value to check against + CUtlString m_sValue; + }; + + + //----------------------------------------------------------------------------- + // CItemSelectionCriteria::CFloatCondition + // CCondition that handles the float-based operators + //----------------------------------------------------------------------------- + class CFloatCondition : public CCondition + { + public: + CFloatCondition( const char *pszField, EItemCriteriaOperator eOp, float flValue, bool bRequired ) + : CCondition( pszField, eOp, bRequired ), m_flValue( flValue ) + { + } + + virtual ~CFloatCondition( ) { } + + protected: + virtual bool BInternalEvaluate( KeyValues *pKVItem ) const; + virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const; + + // The value to check against + float m_flValue; + }; + + + //----------------------------------------------------------------------------- + // CItemSelectionCriteria::CSetCondition + // CCondition that handles subkey checks + //----------------------------------------------------------------------------- + class CSetCondition : public CCondition + { + public: + CSetCondition( const char *pszField, EItemCriteriaOperator eOp, const char *pszValue, bool bRequired ) + : CCondition( pszField, eOp, bRequired ), m_sValue( pszValue ) + { + } + + virtual ~CSetCondition( ) { } + + // Validation +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, const char *pchName ); +#endif + + protected: + virtual bool BInternalEvaluate( KeyValues *pKVItem ) const; + + virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const; + + // The subkey to look for + CUtlString m_sValue; + }; + + // True if item level is specified in this criteria + bool m_bItemLevelSet; + // The level of the item to generate + uint32 m_unItemLevel; + // True if quality is specified in this criteria + bool m_bQualitySet; + // The quality of the item to generate + int32 m_nItemQuality; + // The initial inventory token of the item + uint32 m_unInitialInventory; + // True if initial quantity is specified in this criteria. + bool m_bInitialQuantitySet; + // The initial quantity of the item + uint32 m_unInitialQuantity; + // Enforced explicit quality matching + bool m_bForcedQualityMatch; + // Ignoring enabled flag (used when crafting) + bool m_bIgnoreEnabledFlag; + + // A list of tags + CUtlString m_strTags; + CUtlVector<econ_tag_handle_t> m_vecTags; + + // A list of the conditions + CUtlVector<ICondition *> m_vecConditions; +}; + + +#endif //ITEM_SELECTION_CRITERIA_H |