hl2_src-leak-2017/src/game/shared/econ/econ_item_view.h

456 lines
18 KiB
C++

//========= 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<CEconItemAttribute> 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