You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
9.1 KiB
248 lines
9.1 KiB
//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. =======
|
|
//
|
|
// Purpose: Container that allows client & server access to data in player inventories & loadouts
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef CS_ITEM_INVENTORY_H
|
|
#define CS_ITEM_INVENTORY_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "item_inventory.h"
|
|
#include "cs_shareddefs.h"
|
|
|
|
#define LOADOUT_SLOT_USE_BASE_ITEM 0
|
|
|
|
//===============================================================================================================
|
|
// POSITION HANDLING
|
|
//===============================================================================================================
|
|
// Items at this position have been found, but not presented to the player
|
|
#define BACKEND_POSITION_FOR_NEW_ITEM 0
|
|
|
|
// We store a bag index in the highbits of the inventory position.
|
|
// The lowbit stores the position of the item within the bag.
|
|
enum inventory_bags_t
|
|
{
|
|
BAG_ALL_ITEMS = 0,
|
|
BAG_BACKPACK = 1,
|
|
|
|
BAG_TEAM_BASE = 1000,
|
|
};
|
|
|
|
#define MAX_BACKPACK_SLOTS 50
|
|
|
|
inline uint32 GetBackendPositionFor( int iBag, int iSlot )
|
|
{
|
|
uint32 iPos = iSlot | (iBag << 16);
|
|
return iPos;
|
|
}
|
|
inline int ExtractBagFromBackendPosition( uint32 iBackendPosition )
|
|
{
|
|
int iHighbits = iBackendPosition >> 16;
|
|
return iHighbits;
|
|
}
|
|
inline int ExtractBagSlotFromBackendPosition( uint32 iBackendPosition )
|
|
{
|
|
int iLowbits = iBackendPosition & 0xFFFF;
|
|
return iLowbits;
|
|
}
|
|
|
|
/*
|
|
inline int GetClassFromLoadoutBag( int iBag )
|
|
{
|
|
return (iBag - BAG_CLASS_LOADOUT_SCOUT + 1);
|
|
}
|
|
inline inventory_bags_t GetLoadoutBagForClass( int iClass )
|
|
{
|
|
return (inventory_bags_t)(BAG_CLASS_LOADOUT_SCOUT + iClass - 1);
|
|
}
|
|
*/
|
|
|
|
|
|
//===============================================================================================================
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: A single CS player's inventory.
|
|
// On the client, the inventory manager contains contains an instance of this for the local player.
|
|
// On the server, each player contains an instance of this.
|
|
//-----------------------------------------------------------------------------
|
|
class CCSPlayerInventory : public CPlayerInventory
|
|
{
|
|
DECLARE_CLASS( CCSPlayerInventory, CPlayerInventory );
|
|
public:
|
|
CCSPlayerInventory();
|
|
|
|
void SetBag( int iBag ) { m_iBag = iBag; }
|
|
int GetBag( void ) { return m_iBag; }
|
|
|
|
// Returns true if the specified item is allowed to be stored at the specified position
|
|
// DOES NOT check to make sure the position is clear. It's just a class / slot validity check.
|
|
virtual bool IsItemAllowedInPosition( CScriptCreatedItem *pItem, int iPosition ) { return true; }
|
|
|
|
// Used to reject items on the backend for inclusion into this inventory.
|
|
// Mostly used for division of bags into different in-game inventories.
|
|
virtual bool ItemShouldBeIncluded( int iItemPosition );
|
|
|
|
protected:
|
|
// Item movement functions that are called by the inventory manager
|
|
#ifdef CLIENT_DLL
|
|
// Updates the backpack or loadout for the specified item
|
|
// Returns false if the item isn't allowed to be placed in the specified position.
|
|
virtual bool MoveItemToPosition( globalindex_t iGlobalIndex, int iPosition );
|
|
|
|
// Tries to move the specified item into the player's backpack. If this inventory isn't the
|
|
// backpack, it'll find the matching player's backpack and move it.
|
|
// FAILS if the backpack is full. Returns false in that case.
|
|
virtual bool MoveItemToBackpack( globalindex_t iGlobalIndex );
|
|
#endif
|
|
|
|
// Inventory updating, called by the Inventory Manager only. If you want an inventory updated,
|
|
// use the SteamRequestX functions in CInventoryManager.
|
|
virtual void InventoryReceived( EItemRequestResult eResult, int iItems );
|
|
|
|
// Debugging
|
|
virtual void DumpInventoryToConsole( bool bRoot );
|
|
|
|
protected:
|
|
// The bag position of this inventory, if any (0 == contains all items)
|
|
// If this inventory has a bag position, items inside other bags will be ignored.
|
|
int m_iBag;
|
|
|
|
friend class CCSInventoryManager;
|
|
// friend class CTFPlayerInventoryLoadout;
|
|
};
|
|
|
|
/*
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Custom TF inventory that manages the player's loadout
|
|
//-----------------------------------------------------------------------------
|
|
class CTFPlayerInventoryLoadout : public CCSPlayerInventory
|
|
{
|
|
DECLARE_CLASS( CTFPlayerInventoryLoadout, CCSPlayerInventory );
|
|
public:
|
|
CTFPlayerInventoryLoadout( void );
|
|
|
|
// Returns the item in the specified loadout slot for a given class
|
|
CScriptCreatedItem *GetItemInLoadout( int iSlot );
|
|
|
|
// Get the class that this loadout inventory is for
|
|
int GetLoadoutClass( void ) { return GetClassFromLoadoutBag(m_iBag); }
|
|
|
|
// Returns true if the specified item is allowed to be stored at the specified position
|
|
// DOES NOT check to make sure the position is clear. It's just a class / slot validity check.
|
|
bool IsItemAllowedInPosition( CScriptCreatedItem *pItem, int iPosition );
|
|
|
|
// Debugging
|
|
virtual void DumpInventoryToConsole( bool bRoot );
|
|
|
|
protected:
|
|
// Item movement functions that are called by the inventory manager
|
|
#ifdef CLIENT_DLL
|
|
// Updates the backpack or loadout for the specified item
|
|
// Returns false if the item isn't allowed to be placed in the specified position.
|
|
virtual bool MoveItemToPosition( globalindex_t iGlobalIndex, int iPosition );
|
|
|
|
// 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 iSlot );
|
|
#endif
|
|
|
|
protected:
|
|
// Inventory updating, called by the Inventory Manager only. If you want an inventory updated,
|
|
// use the SteamRequestX functions in CInventoryManager.
|
|
virtual void InventoryReceived( EItemRequestResult eResult, int iItems );
|
|
|
|
// Derived inventory hooks
|
|
virtual void ItemHasBeenUpdated( CScriptCreatedItem *pItem );
|
|
virtual void ItemIsBeingRemoved( CScriptCreatedItem *pItem );
|
|
|
|
private:
|
|
// Global indices of the items in our inventory in the loadout slots
|
|
globalindex_t m_LoadoutItems[ LOADOUT_POSITION_COUNT ];
|
|
|
|
friend class CCSInventoryManager;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Custom TF inventory that manages the player's loadout
|
|
//-----------------------------------------------------------------------------
|
|
class CTFPlayerInventoryBackpack : public CCSPlayerInventory
|
|
{
|
|
DECLARE_CLASS( CTFPlayerInventoryBackpack, CCSPlayerInventory );
|
|
public:
|
|
CTFPlayerInventoryBackpack( void );
|
|
|
|
#ifdef CLIENT_DLL
|
|
// Tries to move the specified item into the player's backpack.
|
|
// FAILS if the backpack is full. Returns false in that case.
|
|
virtual bool MoveItemToBackpack( globalindex_t iGlobalIndex );
|
|
|
|
protected:
|
|
virtual void ItemHasBeenUpdated( CScriptCreatedItem *pItem );
|
|
void CalculateNextEmptySlot( void );
|
|
#endif
|
|
|
|
private:
|
|
int m_iPredictedEmptySlot;
|
|
};
|
|
*/
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
class CCSInventoryManager : public CInventoryManager
|
|
{
|
|
DECLARE_CLASS( CCSInventoryManager, CInventoryManager );
|
|
public:
|
|
CCSInventoryManager();
|
|
|
|
virtual void PostInit( void );
|
|
|
|
#ifdef CLIENT_DLL
|
|
// Show the player a pickup screen with any items they've collected recently, if any
|
|
bool ShowItemsPickedUp( void );
|
|
// Force the player to discard an item to make room for a new item, if they have one
|
|
bool CheckForRoomAndForceDiscard( void );
|
|
#endif
|
|
|
|
// Returns the item data for the base item in the loadout slot for a given class
|
|
CScriptCreatedItem *GetBaseItemForClass( int iSlot );
|
|
void GenerateBaseItems( void );
|
|
|
|
// Gets the specified inventory for the steam ID
|
|
CCSPlayerInventory *GetBagForPlayer( CSteamID &playerID, inventory_bags_t iBag );
|
|
|
|
// Returns the item in the specified loadout slot for a given class
|
|
CScriptCreatedItem *GetItemInLoadoutForClass( int iClass, int iSlot, CSteamID *pID = NULL );
|
|
|
|
private:
|
|
// Base items, returned for slots that the player doesn't have anything in
|
|
CScriptCreatedItem m_pBaseLoadoutItems[ LOADOUT_POSITION_COUNT ];
|
|
|
|
#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:
|
|
virtual void UpdateLocalInventory( void );
|
|
CPlayerInventory *GetLocalInventory( void ) { return &m_LocalInventory; }
|
|
CCSPlayerInventory *GetLocalTFInventory( void );
|
|
|
|
// Try and equip the specified item in the specified class's loadout slot
|
|
bool EquipItemInLoadout( int iClass, int iSlot, globalindex_t iGlobalIndex );
|
|
|
|
// 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<CScriptCreatedItem*> *pList );
|
|
private:
|
|
CCSPlayerInventory m_LocalInventory;
|
|
/*
|
|
CTFPlayerInventoryBackpack m_LocalBackpack;
|
|
CTFPlayerInventoryLoadout m_LoadoutInventories[TF_CLASS_COUNT];
|
|
*/
|
|
#endif // CLIENT_DLL
|
|
};
|
|
|
|
CCSInventoryManager *CSInventoryManager( void );
|
|
|
|
#endif // CS_ITEM_INVENTORY_H
|