//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #ifndef ECON_ITEM_CONSTANTS_H #define ECON_ITEM_CONSTANTS_H #ifdef _WIN32 #pragma once #endif #include "game_item_schema.h" #include "econ_item_constants.h" #include "localization_provider.h" #include "econ_item_interface.h" #include "econ_item.h" #if defined(CLIENT_DLL) #include "iclientrenderable.h" #endif #if defined(TF_DLL) #include "tf_item_schema.h" #endif #if defined(CLIENT_DLL) #define CEconItemView C_EconItemView #endif #if defined(GC_DLL) #error "econ_item_view.h is not intended to be built on the GC!" #endif #if defined(TF_DLL) || defined(TF_CLIENT_DLL) #define ENABLE_ATTRIBUTE_CURRENCY_TRACKING 1 #else #define ENABLE_ATTRIBUTE_CURRENCY_TRACKING 0 #endif class CEconItemAttribute; class CAttributeManager; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CAttributeList { friend class CEconItemView; friend class CTFPlayer; DECLARE_CLASS_NOBASE( CAttributeList ); public: DECLARE_EMBEDDED_NETWORKVAR(); DECLARE_DATADESC(); CAttributeList(); void operator=( const CAttributeList &src ); void Init(); void SetManager( CAttributeManager *pManager ); void IterateAttributes( class IEconItemAttributeIterator *pIterator ) const; // Remove all attributes on this item void DestroyAllAttributes( void ); void AddAttribute( CEconItemAttribute *pAttribute ); // Remove an attribute by name void RemoveAttribute( const CEconItemAttributeDefinition *pAttrDef ); void RemoveAttributeByIndex( int iIndex ); public: // Returns the attribute that matches the attribute defname const CEconItemAttribute *GetAttributeByName( const char *pszAttribDefName ) const; // Returns the attribute that matches the attribute id const CEconItemAttribute *GetAttributeByID( int iAttributeID ) const; // The only way to set the value of an attribute after its creation is through the attribute list // that contains it. This way the matching attribute manager is told one of its attributes has changed. void SetRuntimeAttributeValue( const CEconItemAttributeDefinition *pAttrDef, float flValue ); #if ENABLE_ATTRIBUTE_CURRENCY_TRACKING void SetRuntimeAttributeRefundableCurrency( const CEconItemAttributeDefinition *pAttrDef, int iRefundableCurrency ); int GetRuntimeAttributeRefundableCurrency( const CEconItemAttributeDefinition *pAttrDef ) const; void AdjustRuntimeAttributeRefundableCurrency( const CEconItemAttributeDefinition *pAttrDef, int iRefundableCurrencyAdjustment ) { SetRuntimeAttributeRefundableCurrency( pAttrDef, GetRuntimeAttributeRefundableCurrency( pAttrDef ) + iRefundableCurrencyAdjustment ); } #endif // ENABLE_ATTRIBUTE_CURRENCY_TRACKING private: void NotifyManagerOfAttributeValueChanges(); // Attribute accessing int GetNumAttributes( void ) const { return m_Attributes.Count(); } CEconItemAttribute *GetAttribute( int iIndex ) { Assert( iIndex >= 0 && iIndex < m_Attributes.Count()); return &m_Attributes[iIndex]; } const CEconItemAttribute *GetAttribute( int iIndex ) const { Assert( iIndex >= 0 && iIndex < m_Attributes.Count()); return &m_Attributes[iIndex]; } // Our list of attributes CUtlVector m_Attributes; CAttributeManager *m_pManager; }; //----------------------------------------------------------------------------- // Purpose: An attribute that knows how to read itself from a datafile, describe itself to the user, // and serialize itself between Servers, Clients, and Steam. // Unlike the attributes created in the Game DLL, this attribute doesn't know how to actually // do anything in the game, it just knows how to describe itself. //----------------------------------------------------------------------------- class CEconItemAttribute { DECLARE_CLASS_NOBASE( CEconItemAttribute ); public: DECLARE_EMBEDDED_NETWORKVAR(); CEconItemAttribute(); CEconItemAttribute( const attrib_definition_index_t iAttributeIndex, float flValue ); CEconItemAttribute( const attrib_definition_index_t iAttributeIndex, uint32 unValue ); void operator=( const CEconItemAttribute &val ); // Get the index of this attribute's definition inside the script file attrib_definition_index_t GetAttribIndex( void ) const { return m_iAttributeDefinitionIndex; } void SetAttribIndex( attrib_definition_index_t iIndex ) { m_iAttributeDefinitionIndex = iIndex; } // Get the static data contained in this attribute's definition const CEconItemAttributeDefinition *GetStaticData( void ) const; // Get the float value of this attribute. //float GetValue( void ) const; #if ENABLE_ATTRIBUTE_CURRENCY_TRACKING int GetRefundableCurrency( void ) const { return m_nRefundableCurrency; } #endif // ENABLE_ATTRIBUTE_CURRENCY_TRACKING private: // The only way to set the value of an attribute after its creation is through the attribute list // that contains it. This way the matching attribute manager is told one of its attributes has changed. // Set the float value of this attribute. // Note that the value must be stored as a float! void SetValue( float flValue ); // Set the value of this attribute as an unsigned integer. // Note that the value must be stored as an integer! // See CEconItemAttributeDefinition void SetIntValue( uint32 unValue ); friend class CAttributeList; void Init( void ); //-------------------------------------------------------- private: // This is the index of the attribute into the attributes read from the data files CNetworkVar( attrib_definition_index_t, m_iAttributeDefinitionIndex ); // This is the value of the attribute. Used to modify the item's variables. CNetworkVar( float, m_flValue ); #if ENABLE_ATTRIBUTE_CURRENCY_TRACKING // This is the value that the attribute was first set to by an item definition CNetworkVar( int, m_nRefundableCurrency ); #endif // ENABLE_ATTRIBUTE_CURRENCY_TRACKING }; //----------------------------------------------------------------------------- // Purpose: An item that knows how to read itself from a datafile, describe itself to the user, // and serialize itself between Servers, Clients, and Steam. // // In the client DLL, we derive it from CDefaultClientRenderable so that // it can be passed in the pProxyData parameter of material proxies. //----------------------------------------------------------------------------- #if defined(CLIENT_DLL) class CEconItemView : public CDefaultClientRenderable, public CMaterialOverrideContainer< IEconItemInterface > #else class CEconItemView : public CMaterialOverrideContainer< IEconItemInterface > #endif { DECLARE_CLASS_NOBASE( CEconItemView ); public: DECLARE_EMBEDDED_NETWORKVAR(); DECLARE_DATADESC(); public: CEconItemView(); CEconItemView( const CEconItemView &src ); ~CEconItemView(); CEconItemView& operator=( const CEconItemView &src ); bool operator==( const CEconItemView &other ) const; bool operator!=( const CEconItemView &other ) const { return !operator==( other ); } virtual const GameItemDefinition_t *GetItemDefinition() const { return GetStaticData(); } public: // IEconItemInterface implementation. virtual itemid_t GetID() const { return GetItemID(); } virtual int32 GetQuality() const; virtual style_index_t GetStyle() const; virtual uint8 GetFlags() const; virtual eEconItemOrigin GetOrigin() const; virtual int GetQuantity() const; uint64 GetOriginalID() const { return GetSOCData() ? GetSOCData()->GetOriginalID() : 0; } virtual const char *GetCustomName() const; virtual const char *GetCustomDesc() const; virtual bool GetInUse() const { return GetSOCData() ? GetSOCData()->GetInUse() : false; } virtual void IterateAttributes( class IEconItemAttributeIterator *pIterator ) const OVERRIDE; bool IsValid( void ) const { return m_bInitialized; } void Invalidate( void ) { m_bInitialized = false; m_iItemDefinitionIndex = INVALID_ITEM_DEF_INDEX; m_iItemID = INVALID_ITEM_ID; } void InvalidateColor() { m_bColorInit = false; } void InvalidateOverrideColor() { m_bPaintOverrideInit = false; } // Initialize from the specified data // client will load SO cache as needed void Init( int iDefIndex, int iQuality, int iLevel, uint32 iAccountID = 0 ); void SetInitialized( bool bInit ) { m_bInitialized = bInit; } // Get the static data contained in this item's definition GameItemDefinition_t *GetStaticData( void ) const; void SetNonSOEconItem( CEconItem* pItem ) { m_pNonSOEconItem.SetItem( pItem ); } void OnAttributeValuesChanged() { NetworkStateChanged(); MarkDescriptionDirty(); } private: void EnsureDescriptionIsBuilt( void ) const; void MarkDescriptionDirty( void ); public: void SetGrayedOutReason( const char *pszGrayedOutReason ); // Set & Get the index of this item's definition inside the script file void SetItemDefIndex( item_definition_index_t iIndex ) { m_iItemDefinitionIndex = iIndex; MarkDescriptionDirty(); } virtual item_definition_index_t GetItemDefIndex( void ) const { return m_iItemDefinitionIndex; } // Set & Get the quality & level of this item. void SetItemQuality( int iQuality ) { m_iEntityQuality = iQuality; MarkDescriptionDirty(); } int GetItemQuality( void ) const { return m_iEntityQuality; } void SetItemLevel( uint32 unLevel ) { m_iEntityLevel = unLevel; MarkDescriptionDirty(); } uint32 GetItemLevel( void ) const { return m_iEntityLevel; } int GetItemQuantity() const; #ifdef CLIENT_DLL void SetIsTradeItem( bool bIsTradeItem ) { m_bIsTradeItem = bIsTradeItem; MarkDescriptionDirty(); } void SetItemQuantity( int iQuantity ) { m_iEntityQuantity = iQuantity; MarkDescriptionDirty(); } void SetClientItemFlags( uint8 unFlags ); void SetItemStyleOverride( style_index_t unNewStyleOverride ); void SetItemOriginOverride( eEconItemOrigin unNewOriginOverride ); #endif style_index_t GetItemStyle() const; // Access the worldwide global index of this item void SetItemID( itemid_t iIdx ) { m_iItemID = iIdx; m_iItemIDHigh = (m_iItemID >> 32); m_iItemIDLow = (m_iItemID & 0xFFFFFFFF); } #ifdef CLIENT_DLL // On the client, we need to rebuild it from the high & low networked pieces itemid_t GetItemID( void ) const { uint64 iTmp = ((((int64)m_iItemIDHigh)<<32) | m_iItemIDLow); return (itemid_t)iTmp; } #else itemid_t GetItemID( void ) const { return m_iItemID; } #endif uint32 GetAccountID( void ) const { return m_iAccountID; } void SetOverrideAccountID( uint32 nAccountID ) { m_iAccountID = nAccountID; } // Access the inventory position of this item void SetInventoryPosition( uint32 iPosition ) { m_iInventoryPosition = iPosition; } const uint32 GetInventoryPosition( void ) const { return m_iInventoryPosition; } // Return the model to use for model panels containing this item const char *GetInventoryModel( void ); // Return the image to use for model panels containing this item const char *GetInventoryImage( void ); bool GetInventoryImageData( int *iPosition, int *iSize ); const char *GetInventoryOverlayImage( int idx ); int GetInventoryOverlayImageCount( void ); // Return the model to use when displaying this model on the player character model, if any const char *GetPlayerDisplayModel( int iClass, int iTeam ) const; // Return the model to use when displaying this model in the world. See the notes on this in econ_item_schema.h const char *GetWorldDisplayModel() const; const char *GetExtraWearableModel() const; const char *GetExtraWearableViewModel() const; const char *GetVisionFilteredDisplayModel() const; // Return the load-out slot that this item must be placed into int GetAnimationSlot( void ) const; // Return an int that indicates whether the item should be dropped from a dead owner. int GetDropType( void ); // Remove all attributes on this item void DestroyAllAttributes( void ); void InitNetworkedDynamicAttributesForDemos( void ); // Items that have attributes that modify their RGB values int GetModifiedRGBValue( bool bAltColor=false ); // Returns the UGC file ID of the custom texture assigned to this item. If non-zero, then it has a custom texture. uint64 GetCustomUserTextureID(); CEconItem *GetSOCData( void ) const; bool IsEquipped( void ) const { return GetSOCData() && GetSOCData()->IsEquipped(); } bool IsEquippedForClass( equipped_class_t unClass ) const { return GetSOCData() && GetSOCData()->IsEquippedForClass( unClass ); } equipped_slot_t GetEquippedPositionForClass( equipped_class_t unClass ) const { return GetSOCData() ? GetSOCData()->GetEquippedPositionForClass( unClass ) : INVALID_EQUIPPED_SLOT; } // Attached particle systems int GetQualityParticleType() const; int GetSkin( int iTeam, bool bViewmodel = false ) const; public: // ... CAttributeList *GetAttributeList() { return &m_AttributeList; } const CAttributeList *GetAttributeList() const { return &m_AttributeList; } public: virtual CEconItemPaintKitDefinition *GetCustomPainkKitDefinition( void ) const { return GetItemDefinition()->GetCustomPainkKitDefinition(); } #ifdef CLIENT_DLL void SetWeaponSkinBase( ITexture* pBaseTex ); void SetWeaponSkinBaseCompositor( ITextureCompositor * pTexCompositor ); inline void SetWeaponSkinGeneration( RTime32 nGeneration ) { m_nWeaponSkinGeneration = nGeneration; } inline void SetWeaponSkinGenerationTeam( int iTeam ) { m_iLastGeneratedTeamSkin = iTeam; } inline void SetWeaponSkinBaseCreateFlags( uint32 flags ) { m_unWeaponSkinBaseCreateFlags = flags; } void CancelWeaponSkinComposite( ); inline void SetWeaponSkinUseHighRes( bool bUseHighRes ) { m_bWeaponSkinUseHighRes = bUseHighRes; } inline void SetWeaponSkinUseLowRes( bool bUseLowRes ) { m_bWeaponSkinUseLowRes = bUseLowRes; } inline ITexture *GetWeaponSkinBase() const { return m_pWeaponSkinBase; } inline ITextureCompositor *GetWeaponSkinBaseCompositor() const { return m_pWeaponSkinBaseCompositor; } inline uint32 GetWeaponSkinBaseCreateFlags() const { return m_unWeaponSkinBaseCreateFlags; } inline RTime32 GetWeaponSkinGeneration() const { return m_nWeaponSkinGeneration; } inline int GetWeaponSkinGenerationTeam() const { return m_iLastGeneratedTeamSkin; } inline bool ShouldWeaponSkinUseHighRes() const { return m_bWeaponSkinUseHighRes; } inline bool ShouldWeaponSkinUseLowRes() const { return m_bWeaponSkinUseLowRes; } #endif // CLIENT_DLL inline int GetTeamNumber() const { return m_iTeamNumber; } inline void SetTeamNumber( int iTeamNumber ) { m_iTeamNumber = iTeamNumber; } protected: // Index of the item definition in the item script file. CNetworkVar( item_definition_index_t, m_iItemDefinitionIndex ); // The quality of this item. CNetworkVar( int, m_iEntityQuality ); // The level of this item. CNetworkVar( uint32, m_iEntityLevel ); // The global index of this item, worldwide. itemid_t m_iItemID; CNetworkVar( uint32, m_iItemIDHigh ); CNetworkVar( uint32, m_iItemIDLow ); // Account ID of the person who has this in their inventory CNetworkVar( uint32, m_iAccountID ); // Position inside the player's inventory CNetworkVar( uint32, m_iInventoryPosition ); // This is an alternate source of data, if this item models something that isn't in the SO cache. CEconItemHandle m_pNonSOEconItem; #if defined( CLIENT_DLL ) // exist on the client only bool m_bIsTradeItem; int m_iEntityQuantity; uint8 m_unClientFlags; // clients have the ability to force a style on an item view -- this is used for store previews, // character panels, etc. style_index_t m_unOverrideStyle; // clients can also force an origin on an item view -- this is used for crafting item previews eEconItemOrigin m_unOverrideOrigin; #endif bool m_bColorInit; bool m_bPaintOverrideInit; bool m_bHasPaintOverride; float m_flOverrideIndex; uint32 m_unRGB; uint32 m_unAltRGB; #ifdef CLIENT_DLL ITexture* m_pWeaponSkinBase; ITextureCompositor* m_pWeaponSkinBaseCompositor; RTime32 m_nWeaponSkinGeneration; uint32 m_unWeaponSkinBaseCreateFlags; int m_iLastGeneratedTeamSkin; bool m_bWeaponSkinUseHighRes; bool m_bWeaponSkinUseLowRes; #endif // CLIENT_DLL CNetworkVar( int, m_iTeamNumber ); CNetworkVar( bool, m_bInitialized ); #ifdef CLIENT_DLL // we avoid using "BUILD_ITEM_NAME_AND_DESC" to prevent everything depending on the CEconItemDescription public: // Return the single-line name of this item. const wchar_t *GetItemName( void ) const; // Return the full structure with all of our description lines. const class CEconItemDescription *GetDescription() const { EnsureDescriptionIsBuilt(); return m_pDescription; } private: mutable class CEconItemDescription *m_pDescription; mutable char *m_pszGrayedOutReason; // IClientRenderable virtual const Vector& GetRenderOrigin( void ) { return vec3_origin; } virtual const QAngle& GetRenderAngles( void ) { return vec3_angle; } virtual bool ShouldDraw( void ) { return false; } virtual bool IsTransparent( void ) { return false;} virtual const matrix3x4_t &RenderableToWorldTransform() { static matrix3x4_t mat; SetIdentityMatrix( mat ); return mat; } virtual void GetRenderBounds( Vector& mins, Vector& maxs ); #endif private: CNetworkVarEmbedded( CAttributeList, m_AttributeList ); CNetworkVarEmbedded( CAttributeList, m_NetworkedDynamicAttributesForDemos ); // Some custom gamemodes are using server plugins to modify weapon attributes. // This variable allows them to completely set their own attributes on a weapon // and have the client and server ignore the static attributes. CNetworkVar( bool, m_bOnlyIterateItemViewAttributes ); }; #ifdef CLIENT_DLL bool DoesItemPassSearchFilter( const class IEconItemDescription *pDescription, const wchar_t* wszFilter ); CBasePlayer *GetPlayerByAccountID( uint32 unAccountID ); #endif // CLIENT_DLL #endif // ECON_ITEM_CONSTANTS_H