Counter Strike : Global Offensive Source Code
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

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