Seaside/SpyCustom/econ_item_view.h
2021-06-16 16:08:23 +03:00

515 lines
18 KiB
C++

#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"
#include "utlhashtable.h"
#if defined(CLIENT_DLL)
#include "iclientrenderable.h"
#if defined(CSTRIKE15)
#include "custommaterialowner.h"
#endif
#include "icompositetexturegenerator.h"
#endif
#include "MaterialSystemUtil.h"
#if defined(TF_DLL)
#include "tf_item_schema.h"
#endif
#if defined(CLIENT_DLL)
#define CEconItemView C_EconItemView
#if defined(CSTRIKE15)
typedef void (*ImageReadyCallback_t)(const CEconItemView* pItemView, CUtlBuffer& rawImageRgba, int nWidth, int nHeight, uint64 nItemID);
struct RenderToRTData_t;
class CMergedMDL;
#endif
#endif
#include "econ_item_view_helpers.h"
#define RGB_INT_RED 12073019
#define RGB_INT_BLUE 5801378
#define ECON_ITEM_GENERATED_ICON_WIDTH 512
#define ECON_ITEM_GENERATED_ICON_HEIGHT 384
#define ECON_ITEM_GENERATED_PINBOARD_ICON_WIDTH 512
#define ECON_ITEM_GENERATED_PINBOARD_ICON_HEIGHT 384
#define ECON_ITEM_GENERATED_ICON_DIR "resource/Flash/econ/weapons/cached/"
#define SCHEMA_BASE_ITEM_MAX 499
class CEconItemAttribute;
class CAttributeManager;
#if defined(CSTRIKE_CLIENT_DLL)
class IVisualsDataProcessor;
#endif
struct stickerMaterialReference_t
{
CMaterialReference m_pMaterialReferenceFirstPerson;
CMaterialReference m_pMaterialReferenceThirdPerson;
int m_nSlotIndex;
};
class CAttributeList
{
friend class CEconItemView;
friend class CTFPlayer;
DECLARE_CLASS_NOBASE(CAttributeList);
public:
DECLARE_EMBEDDED_NETWORKVAR();
DECLARE_DATADESC();
CAttributeList();
CAttributeList& operator=(const CAttributeList& src);
void Init();
void SetManager(CAttributeManager* pManager);
void IterateAttributes(class IEconItemAttributeIterator* pIterator);
void DestroyAllAttributes(void);
private:
void AddAttribute(CEconItemAttribute* pAttribute);
void SetOrAddAttributeValueByName(const char* pszAttribDefName, float flValue);
void RemoveAttribute(const char* pszAttribDefName);
void RemoveAttributeByIndex(int iIndex);
public:
CEconItemAttribute* GetAttributeByName(const char* pszAttribDefName);
const CEconItemAttribute* GetAttributeByName(const char* pszAttribDefName) const;
CEconItemAttribute* GetAttributeByClass(const char* szAttribClass);
const CEconItemAttribute* GetAttributeByClass(const char* szAttribClass) const;
CEconItemAttribute* GetAttributeByDefIndex(uint16 unAttrDefIndex);
const CEconItemAttribute* GetAttributeByDefIndex(uint16 unAttrDefIndex) const;
void SetValue(CEconItemAttribute* pAttrib, float flValue);
void UpdateManagerCache(void);
private:
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]; }
CUtlVector<CEconItemAttribute> m_Attributes;
CAttributeManager* m_pManager;
};
class CEconItemAttribute
{
DECLARE_CLASS_NOBASE(CEconItemAttribute);
public:
DECLARE_EMBEDDED_NETWORKVAR();
CEconItemAttribute(const attrib_definition_index_t iAttributeIndex, float flValue);
CEconItemAttribute(const attrib_definition_index_t iAttributeIndex, uint32 unValue);
CEconItemAttribute& operator=(const CEconItemAttribute& val);
attrib_definition_index_t GetAttribIndex(void) const { return m_iAttributeDefinitionIndex; }
void SetAttribIndex(attrib_definition_index_t iIndex) { m_iAttributeDefinitionIndex = iIndex; }
const CEconItemAttributeDefinition* GetStaticData(void) const;
float GetValue(void) const;
uint32 GetIntValue(void) const;
float GetInitialValue(void) const { return m_flInitialValue; }
int GetRefundableCurrency(void) const { return m_nRefundableCurrency; }
void AddRefundableCurrency(int nAdd) { m_nRefundableCurrency += nAdd; }
void RemovedRefundableCurrency(int nSubtract) { m_nRefundableCurrency -= nSubtract; }
bool GetSetBonus(void) { return m_bSetBonus; }
void SetSetBonus(bool bBonus) { m_bSetBonus = bBonus; }
private:
void SetValue(float flValue);
void SetIntValue(uint32 unValue);
friend class CAttributeList;
friend class CEconItemSystem;
void Init(void);
private:
CNetworkVar(attrib_definition_index_t, m_iAttributeDefinitionIndex);
CNetworkVar(float, m_flValue);
CNetworkVar(float, m_flInitialValue);
CNetworkVar(int, m_nRefundableCurrency);
CNetworkVar(bool, m_bSetBonus);
public:
CEconItemAttribute(void);
};
#if defined(CLIENT_DLL)
class CEconItemView : public CDefaultClientRenderable, public IEconItemInterface, public CCustomMaterialOwner
#else
class CEconItemView : public IEconItemInterface
#endif
{
#if defined(CLIENT_DLL) || defined(GAME_DLL)
DECLARE_CLASS_NOBASE(CEconItemView);
public:
DECLARE_EMBEDDED_NETWORKVAR();
DECLARE_DATADESC();
#endif
public:
CEconItemView();
CEconItemView(const CEconItemView& src);
virtual ~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:
virtual int32 GetQuality() const;
virtual int32 GetRarity() const;
virtual style_index_t GetStyle() const;
virtual uint8 GetFlags() const;
virtual eEconItemOrigin GetOrigin() const;
virtual uint16 GetQuantity() const;
virtual const char* GetCustomName() const;
virtual const char* GetCustomDesc() const;
virtual int GetItemSetIndex() 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);
void Init(int iDefIndex, int iQuality, int iLevel, uint32 iAccountID = 0);
void SetInitialized(bool bInit) { m_bInitialized = bInit; }
bool Init(CEconItem* pItem);
const GameItemDefinition_t* GetStaticData(void) const;
void SetNonSOEconItem(CEconItem* pItem) { m_pNonSOEconItem = pItem; }
void MarkDescriptionDirty(void);
virtual bool IsStyleUnlocked(int iStyle) const;
private:
void EnsureDescriptionIsBuilt(void) const;
public:
void SetGrayedOutReason(const char* pszGrayedOutReason);
void SetItemIndex(item_definition_index_t iIndex) { m_iItemDefinitionIndex = iIndex; MarkDescriptionDirty(); }
item_definition_index_t GetItemIndex(void) const { return m_iItemDefinitionIndex; }
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 SetIsStoreItem(bool bIsStoreItem) { m_bIsStoreItem = bIsStoreItem; MarkDescriptionDirty(); }
void SetIsTradeItem(bool bIsTradeItem) { m_bIsTradeItem = bIsTradeItem; MarkDescriptionDirty(); }
void SetItemQuantity(int iQuantity) { m_iEntityQuantity = iQuantity; MarkDescriptionDirty(); }
void SetClientItemFlags(uint8 unFlags);
void SetItemRarityOverride(int iRarity) { m_iRarityOverride = iRarity; MarkDescriptionDirty(); }
void SetItemQualityOverride(int iQuality) { m_iQualityOverride = iQuality; MarkDescriptionDirty(); }
void SetItemStyleOverride(style_index_t unNewStyleOverride);
#endif
style_index_t GetItemStyle() const;
void SetItemID(itemid_t iIdx) { m_iItemID = iIdx; m_iItemIDHigh = (m_iItemID >> 32); m_iItemIDLow = (m_iItemID & 0xFFFFFFFF); }
#ifdef CLIENT_DLL
virtual 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 GetItemIDHigh(void) const { return m_iItemIDHigh; }
uint32 GetItemIDLow(void) const { return m_iItemIDLow; }
itemid_t GetFauxItemIDFromDefinitionIndex(void) const;
uint32 GetAccountID(void) const { return m_iAccountID; }
void SetInventoryPosition(uint32 iPosition) { m_iInventoryPosition = iPosition; }
const uint32 GetInventoryPosition(void) const { return m_iInventoryPosition; }
const char* GetInventoryModel(void);
const char* GetInventoryImage(void) const;
bool HasGeneratedInventoryImage(void) const;
bool GetInventoryImageData(int* iPosition, int* iSize);
const char* GetInventoryOverlayImage(int idx);
int GetInventoryOverlayImageCount(void);
IMaterial* GetToolStickerMaterial(void);
bool IsStickerTool(void);
const char* GetPlayerDisplayModel(int iClass = 0) const;
const char* GetWorldDisplayModel();
const char* GetExtraWearableModel();
const char* GetIconDisplayModel();
const char* GetBuyMenuDisplayModel();
const char* GetWorldDroppedModel();
const char* GetPedestalDisplayModel();
const char* GetMagazineModel();
const char* GetScopeLensMaskModel();
const char* GetStatTrakModelByType(int nStatTrakType);
const char* GetUidModel();
int GetAnimationSlot(void);
int GetDropType(void);
void DestroyAllAttributes(void);
void AddAttribute(CEconItemAttribute* pAttribute);
void SetOrAddAttributeValueByName(const char* pszAttribDefName, float flValue);
void InitNetworkedDynamicAttributesForDemos(void);
void UpdateNetworkedDynamicAttributesForDemos(attrib_definition_index_t nDef, float flNewValue);
#if defined(CSTRIKE_CLIENT_DLL)
void UpdateGeneratedMaterial(bool bIgnorePicMip = false, CompositeTextureSize_t diffuseTextureSize = COMPOSITE_TEXTURE_SIZE_512);
#endif
const char* GetStickerSlotModelBySlotIndex(int nIndex);
int GetNumSupportedStickerSlots(void);
Vector GetStickerSlotWorldProjectionStartBySlotIndex(int nIndex);
Vector GetStickerSlotWorldProjectionEndBySlotIndex(int nIndex);
const char* GetStickerWorldModelBoneParentNameBySlotIndex(int nIndex);
const char* GetStickerSlotMaterialBySlotIndex(int nIndex);
IMaterial* GetStickerIMaterialBySlotIndex(int nIndex, bool bThirdPerson = false);
void GenerateStickerMaterials(void);
bool ItemHasAnyStickersApplied(void);
bool ItemHasAnyFreeStickerSlots(void);
int GetStickerSlotFirstFreeFromIndex(int nIndex = 0);
void SetCustomNameOverride(const char* pszCustomName);
virtual void GenerateKillEaterTypeVector(void);
virtual void GetKillEaterTypes(CUtlSortVector<uint32>& types);
virtual int32 GetKillEaterValueByType(uint32 uKillEaterType);
bool m_bKillEaterTypesCached;
CUtlSortVector<uint32> m_vCachedKillEaterTypes;
int m_nKillEaterValuesCacheFrame;
CUtlHashtable<uint32, int32> m_vCachedKillEaterValues;
private:
void Cleanup(void);
#if defined(CSTRIKE_CLIENT_DLL)
void CreateCustomWeaponMaterials(int nWeaponId, bool bIgnorePicMip, CompositeTextureSize_t diffuseTextureSize = COMPOSITE_TEXTURE_SIZE_512);
void CreateCustomClothingMaterials(const char* pchSkinIdent, int nSlotId, int nTeam, bool bIgnorePicMip, CompositeTextureSize_t diffuseTextureSize = COMPOSITE_TEXTURE_SIZE_512);
public:
void Update(void);
void SaveInventoryImageAsPNG(int nWidth, int nHeight);
const CUtlBuffer* GetInventoryImageRgba(int nWidth, int nHeight, ImageReadyCallback_t pImageReadyCallback);
bool CanGenerateInventoryImageRgba(void);
void ClearInventoryImageRgba(void);
bool LoadCachedInventoryImage(void);
void SaveInventoryImage(CUtlBuffer& rawImageRgba);
void GenerateCachedInventoryImageName();
static void CleanInventoryImageCacheDir(void);
void FinishLoadCachedInventoryImage(void* pData, int numReadBytes, FSAsyncStatus_t asyncStatus);
enum AsyncFixupState_t
{
AFS_Init,
AFS_LoadingInProgress,
AFS_LoadingDone,
AFS_FixupDone,
} m_asyncFixupState;
int m_nNumAsyncReadBytes;
FSAsyncStatus_t m_asyncStatus;
CUtlBuffer m_inventoryImageRgba;
private:
static bool m_sbHasCleanedInventoryImageCacheDir;
bool m_bInventoryImageRgbaRequested;
bool m_bInventoryImageTriedCache;
ImageReadyCallback_t m_pImageReadyCallback;
int m_nInventoryImageRgbaWidth;
int m_nInventoryImageRgbaHeight;
FSAsyncControl_t m_hAsyncControl;
char m_szCurrentLoadCachedFileName[MAX_PATH];
RenderToRTData_t* m_pRenderToRTData;
IVTFTexture* m_pScratchVTF;
CMergedMDL* m_pRenderToRTMDL;
#endif
CUtlVector< stickerMaterialReference_t > m_pStickerMaterials;
void RemoveAttribute(const char* pszAttribDefName);
public:
const bool GetCombinedAttributeClassValue(float& flValue, string_t iszAttribClass) const;
CEconItemAttribute* GetAttributeByClass(const char* szAttribClass);
const CEconItemAttribute* GetAttributeByClass(const char* szAttribClass) const;
CEconItemAttribute* GetAttributeByDefIndex(int iAttributeDefIndex);
const CEconItemAttribute* GetAttributeByDefIndex(int iAttributeDefIndex) const;
CEconItemAttribute* GetAttributeByName(const char* pszAttribDefName);
const CEconItemAttribute* GetAttributeByName(const char* pszAttribDefName) const;
int GetNumAttributes(void) const { return m_AttributeList.GetNumAttributes(); }
CEconItemAttribute* GetAttribute(int iIndex) { return m_AttributeList.GetAttribute(iIndex); }
const CEconItemAttribute* GetAttribute(int iIndex) const { return m_AttributeList.GetAttribute(iIndex); }
CAttributeList* GetAttributeList(void) { return m_AttributeList.Get(); }
const CAttributeList* GetAttributeList(void) const { return m_AttributeList.Get(); }
int GetModifiedRGBValue(bool bAltColor = false);
int GetCustomPaintKitIndex(void) const;
const char* GetCustomPaintKitDbgName(void) const;
bool CanCollect(CEconItemView& subject);
uint64 GetCustomUserTextureID();
const CPaintKit* GetCustomPaintKit(void) const;
CEconItem* GetSOCData(void) const;
bool IsEquipped(void) const { return GetSOCData() && GetSOCData()->IsEquipped(); }
bool IsEquippedForClass(equipped_class_t unClass) const { return GetSOCData() && GetSOCData()->IsEquippedForClass(unClass); }
void UpdateEquippedState(equipped_class_t unClass, equipped_slot_t unSlot) { if (GetSOCData()) { GetSOCData()->UpdateEquippedState(unClass, unSlot); } }
equipped_slot_t GetEquippedPositionForClass(equipped_class_t unClass) const { return GetSOCData() ? GetSOCData()->GetEquippedPositionForClass(unClass) : INVALID_EQUIPPED_SLOT; }
EItemSlot GetSlot(void) const { return EItemSlotFromName(GetItemDefinition()->GetRawDefinition()->GetString("item_slot")); }
int GetQualityParticleType();
int GetSkin() const;
#if defined(CSTRIKE_CLIENT_DLL)
IVisualsDataProcessor* GetVisualsDataProcessor(int nIndex) { return (nIndex < m_ppVisualsDataProcessors.Count()) ? m_ppVisualsDataProcessors[nIndex] : NULL; }
IVisualsDataProcessor* GetVisualsDataProcessorByName(const char* szName) const;
static CEconItemView* FindOrCreateEconItemViewForItemID(uint64 uiItemId);
#else
typedef CUtlMap< itemid_t, uint64, int, CDefLess< itemid_t > > UtlMapLookupByID_t;
static UtlMapLookupByID_t s_mapLookupByID;
#endif
#if defined ( GAME_DLL )
void UpdateNetworkedCustomName();
#endif
protected:
CNetworkVar(item_definition_index_t, m_iItemDefinitionIndex);
CNetworkVar(int, m_iEntityQuality);
CNetworkVar(uint32, m_iEntityLevel);
itemid_t m_iItemID;
CNetworkVar(uint32, m_iItemIDHigh);
CNetworkVar(uint32, m_iItemIDLow);
CNetworkVar(uint32, m_iAccountID);
CNetworkVar(uint32, m_iInventoryPosition);
CEconItem* m_pNonSOEconItem;
CNetworkVar(bool, m_bInitialized);
#if defined( CLIENT_DLL )
bool m_bIsStoreItem;
bool m_bIsTradeItem;
int m_iEntityQuantity;
int m_iRarityOverride;
int m_iQualityOverride;
uint8 m_unClientFlags;
style_index_t m_unOverrideStyle;
public:
const wchar_t* GetItemName(bool bUncustomized = false) const;
const class CEconItemDescription* GetDescription() const { EnsureDescriptionIsBuilt(); return m_pDescription; }
private:
mutable class CEconItemDescription* m_pDescription;
mutable char* m_pszGrayedOutReason;
#endif
#if defined(CSTRIKE_CLIENT_DLL)
CUtlVector< IVisualsDataProcessor* > m_ppVisualsDataProcessors;
#endif
protected:
#if defined(CLIENT_DLL)
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) { return; }
#endif
private:
CNetworkVarEmbedded(CAttributeList, m_AttributeList);
CNetworkVarEmbedded(CAttributeList, m_NetworkedDynamicAttributesForDemos);
CNetworkString(m_szCustomName, MAX_ITEM_CUSTOM_NAME_DATABASE_SIZE);
char m_szCustomNameOverride[MAX_ITEM_CUSTOM_NAME_DATABASE_SIZE];
GCSDK::CAutoPtr< char > m_autoptrInventoryImageGeneratedPath;
};
#endif