summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_item_inventory.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_item_inventory.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_item_inventory.h')
-rw-r--r--game/shared/tf/tf_item_inventory.h304
1 files changed, 304 insertions, 0 deletions
diff --git a/game/shared/tf/tf_item_inventory.h b/game/shared/tf/tf_item_inventory.h
new file mode 100644
index 0000000..8d1f305
--- /dev/null
+++ b/game/shared/tf/tf_item_inventory.h
@@ -0,0 +1,304 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Container that allows client & server access to data in player inventories & loadouts
+//
+//=============================================================================
+
+#ifndef TF_ITEM_INVENTORY_H
+#define TF_ITEM_INVENTORY_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "econ_item_inventory.h"
+#include "tf_shareddefs.h"
+#include "econ_item_constants.h"
+#include "tf_item_constants.h"
+
+#ifdef CLIENT_DLL
+#include "econ_notifications.h"
+#endif
+
+#define LOADOUT_SLOT_USE_BASE_ITEM 0
+
+namespace vgui
+{
+ class Panel;
+}
+
+struct baseitemcriteria_t;
+
+//===============================================================================================================
+//-----------------------------------------------------------------------------
+// Purpose: A single TF player's inventory.
+// On the client, the inventory manager contains an instance of this for the local player.
+// On the server, each player contains an instance of this.
+//-----------------------------------------------------------------------------
+class CTFPlayerInventory : public CPlayerInventory
+{
+ DECLARE_CLASS( CTFPlayerInventory, CPlayerInventory );
+public:
+ CTFPlayerInventory();
+ virtual ~CTFPlayerInventory();
+
+ virtual CEconItemView *GetItemInLoadout( int iClass, int iSlot );
+
+#ifdef CLIENT_DLL
+ // Removes any item in a loadout slot. If the slot has a base item,
+ // the player essentially returns to using that item.
+ // NOTE: This can fail if the player has no backpack space to contain the equipped item.
+ bool ClearLoadoutSlot( int iClass, int iSlot );
+ CEconItemView *GetCacheServerItemInLoadout( int iClass, int iSlot );
+
+ void UpdateWeaponSkinRequest();
+#endif
+
+ virtual int GetMaxItemCount( void ) const;
+ virtual bool CanPurchaseItems( int iItemCount ) const;
+ virtual int GetPreviewItemDef( void ) const;
+
+ // Derived inventory hooks
+ virtual void ItemHasBeenUpdated( CEconItemView *pItem, bool bUpdateAckFile, bool bWriteAckFile ) OVERRIDE;
+ virtual void ItemIsBeingRemoved( CEconItemView *pItem );
+ bool UpdateEquipStateForClass( const itemid_t& itemID, equipped_slot_t nSlot, itemid_t *pLoadout, int nCount );
+
+ // Debugging
+ virtual void DumpInventoryToConsole( bool bRoot );
+
+ bool ClassLoadoutHasChanged( int iClass ) { return m_bLoadoutChanged[iClass]; }
+ void ClearClassLoadoutChangeTracking( void );
+
+ virtual void NotifyHasNewItems() { OnHasNewItems(); }
+
+#ifdef CLIENT_DLL
+ virtual ITexture *GetWeaponSkinBaseLowRes( itemid_t nItemId, int iTeam ) const;
+#endif
+
+ void OnHasNewQuest();
+
+ static CEconItemView *GetFirstItemOfItemDef( item_definition_index_t nDefIndex, CPlayerInventory* pInventory = NULL );
+
+protected:
+ virtual void SOCreated( const CSteamID & steamIDOwner, const GCSDK::CSharedObject *pObject, GCSDK::ESOCacheEvent eEvent ) OVERRIDE;
+#ifdef CLIENT_DLL
+ // Converts an old format inventory to the new format.
+ void ConvertOldFormatInventoryToNew( void );
+
+ virtual void PostSOUpdate( const CSteamID & steamIDOwner, GCSDK::ESOCacheEvent eEvent ) OVERRIDE;
+ virtual void SOCacheSubscribed( const CSteamID & steamIDOwner, GCSDK::ESOCacheEvent eEvent ) OVERRIDE;
+
+ virtual bool AddEconItem( CEconItem * pItem, bool bUpdateAckFile, bool bWriteAckFile, bool bCheckForNewItems ) OVERRIDE;
+
+ void VerifyChangedLoadoutsAreValid();
+ void VerifyLoadoutItemsAreValid( int iClass );
+#endif
+
+ virtual void OnHasNewItems();
+ virtual void ValidateInventoryPositions( void );
+
+ // Extracts the position that should be used to sort items in the inventory from the backend position.
+ // Necessary if your inventory packs a bunch of info into the position instead of using it just as a position.
+ virtual int ExtractInventorySortPosition( uint32 iBackendPosition )
+ {
+ // Consider unack'd items as -1, so they get stacked up before the 0th slot item
+ if ( IsUnacknowledged(iBackendPosition) )
+ return -1;
+ return ExtractBackpackPositionFromBackend(iBackendPosition);
+ }
+
+ virtual void SOUpdated( const CSteamID & steamIDOwner, const GCSDK::CSharedObject *pObject, GCSDK::ESOCacheEvent eEvent ) OVERRIDE;
+
+#ifdef CLIENT_DLL
+private:
+ void CheckSaxtonMaskAchievement( const CEconItem *pEconItem );
+ void UpdateCachedServerLoadoutItems();
+#endif
+
+protected:
+ // Global indices of the items in our inventory in the loadout slots
+#ifdef CLIENT_DLL
+ struct SkinRequest_t
+ {
+ int m_nTeam;
+ itemid_t m_nID;
+ MDLHandle_t m_hModel;
+ };
+ CUtlVector< SkinRequest_t > m_vecWeaponSkinRequestList;
+
+
+ itemid_t m_CachedServerLoadoutItems[ TF_CLASS_COUNT ][ CLASS_LOADOUT_POSITION_COUNT ];
+
+ CUtlMap< itemid_t, ITexture* > m_CachedBaseTextureLowRes[ TF_TEAM_COUNT ];
+
+#endif // CLIENT_DLL
+ itemid_t m_LoadoutItems[ TF_CLASS_COUNT ][ CLASS_LOADOUT_POSITION_COUNT ];
+ bool m_bLoadoutChanged[ TF_CLASS_COUNT ];
+ itemid_t m_AccountLoadoutItems[ ACCOUNT_LOADOUT_POSITION_COUNT ];
+
+
+ friend class CTFInventoryManager;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CTFInventoryManager : public CInventoryManager
+{
+ DECLARE_CLASS( CTFInventoryManager, CInventoryManager );
+public:
+ CTFInventoryManager();
+ ~CTFInventoryManager();
+
+ virtual void PostInit( void );
+
+#ifdef CLIENT_DLL
+ virtual CPlayerInventory *GeneratePlayerInventoryObject() const { return new CTFPlayerInventory; }
+
+ //-----------------------------------------------------------------------
+ // CLIENT PICKUP UI HANDLING
+ //-----------------------------------------------------------------------
+
+ // Get the number of items picked up
+ virtual int GetNumItemPickedUpItems( void );
+
+ // Show the player a pickup screen with any items they've collected recently, if any
+ virtual bool ShowItemsPickedUp( bool bForce = false, bool bReturnToGame = true, bool bNoPanel = false );
+
+ // Show the player a pickup screen with the items they've crafted
+ virtual void ShowItemsCrafted( CUtlVector<itemid_t> *vecCraftedIndices );
+
+ // Force the player to discard an item to make room for a new item, if they have one
+ virtual bool CheckForRoomAndForceDiscard( void );
+
+ // Tells the GC that the player has acknowledged an item and attempts to move it in to the first available BP slot
+ virtual void AcknowledgeItem( CEconItemView *pItem, bool bMoveToBackpack = true );
+
+ // Gets called each frame
+ virtual void Update( float frametime ) OVERRIDE;
+#endif
+
+ // Returns the item data for the base item in the loadout slot for a given class
+ CEconItemView *GetBaseItemForClass( int iClass, int iSlot );
+ void GenerateBaseItems( void );
+
+ // Gets the specified inventory for the steam ID
+ CTFPlayerInventory *GetInventoryForPlayer( const CSteamID &playerID );
+
+ // Returns the item in the specified loadout slot for a given class
+ CEconItemView *GetItemInLoadoutForClass( int iClass, int iSlot, CSteamID *pID = NULL );
+
+ CEconItemView *GetItemInLoadoutForAccount( int nSlot, CSteamID *pID = NULL );
+
+ // Fills out the vector with the sets that are currently active on the specified player & class
+ void GetActiveSets( CUtlVector<const CEconItemSetDefinition *> *pItemSets, CSteamID steamIDForPlayer, int iClass );
+
+ // We're generating a base item. We need to add the game-specific keys to the criteria so that it'll find the right base item.
+ virtual void AddBaseItemCriteria( baseitemcriteria_t *pCriteria, CItemSelectionCriteria *pSelectionCriteria );
+
+ bool SlotContainsBaseItems( EEquipType_t eType, int iSlot );
+
+ int GetBaseItemCount( ) { return m_pBaseLoadoutItems.Count(); }
+ CEconItemView* GetBaseItem( int iIndex ) { return m_pBaseLoadoutItems[iIndex]; }
+
+private:
+ // Base items, returned for slots that the player doesn't have anything in
+ CEconItemView *m_pDefaultItem;
+ CUtlVector<CEconItemView*> m_pBaseLoadoutItems;
+
+#ifdef CLIENT_DLL
+ // On the client, we have a single inventory for the local player. Stored here, instead of in the
+ // local player entity, because players need to access it while not being connected to a server.
+public:
+ CPlayerInventory *GetLocalInventory( void ) { return &m_LocalInventory; }
+ CTFPlayerInventory *GetLocalTFInventory( void );
+
+ // Try and equip the specified item in the specified class's loadout slot
+ bool EquipItemInLoadout( int iClass, int iSlot, itemid_t iItemID );
+
+ // Fills out pList with all inventory items that could fit into the specified loadout slot for a given class
+ int GetAllUsableItemsForSlot( int iClass, int iSlot, CUtlVector<CEconItemView*> *pList );
+
+ virtual int GetBackpackPositionFromBackend( uint32 iBackendPosition ) { return ExtractBackpackPositionFromBackend(iBackendPosition); }
+
+ // Fills out pList with all quest item in the local inventory
+ int GetAllQuestItems( CUtlVector<CEconItemView*> *pList );
+
+private:
+ CTFPlayerInventory m_LocalInventory;
+#endif // CLIENT_DLL
+};
+
+CTFInventoryManager *TFInventoryManager( void );
+
+
+
+#ifdef CLIENT_DLL
+//-----------------------------------------------------------------------------
+// Econ Notifications
+//-----------------------------------------------------------------------------
+class CEconNotification_HasNewItems : public CEconNotification
+{
+public:
+ CEconNotification_HasNewItems();
+ ~CEconNotification_HasNewItems();
+
+ virtual void SetLifetime( float flSeconds )
+ {
+ m_flExpireTime = engine->Time() + flSeconds;
+ }
+
+ virtual float GetExpireTime() const
+ {
+ if ( m_flExpireTime != 0 )
+ return -1.0f;
+ return 0;
+ }
+
+ virtual float GetInGameLifeTime() const
+ {
+ return m_flExpireTime;
+ }
+
+ virtual void MarkForDeletion()
+ {
+ m_bHasTriggered = true;
+ CEconNotification::MarkForDeletion();
+ }
+
+ virtual EType NotificationType() { return eType_Trigger; }
+ virtual void Trigger()
+ {
+ m_bHasTriggered = true;
+ TFInventoryManager()->ShowItemsPickedUp( true );
+ MarkForDeletion();
+ }
+
+ virtual bool BShowInGameElements() const
+ {
+ return m_bShowInGame;
+ }
+
+ static bool IsNotificationType( CEconNotification *pNotification ) { return dynamic_cast<CEconNotification_HasNewItems *>( pNotification ) != NULL; }
+
+protected:
+
+ bool m_bHasTriggered;
+ bool m_bShowInGame;
+};
+
+//-----------------------------------------------------------------------------
+class CEconNotification_HasNewItemsOnKill : public CEconNotification_HasNewItems
+{
+public:
+ CEconNotification_HasNewItemsOnKill( int iVictimID );
+
+ virtual EType NotificationType() { return eType_Basic; }
+ virtual void Trigger() {}
+
+ static bool HasUnacknowledgedItems();
+ static bool IsNotificationType( CEconNotification *pNotification ) { return dynamic_cast<CEconNotification_HasNewItemsOnKill *>( pNotification ) != NULL; }
+};
+#endif
+
+
+#endif // TF_ITEM_INVENTORY_H