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.
268 lines
10 KiB
268 lines
10 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef DYNAMIC_RECIPE_SUBPANEL_H
|
||
|
#define DYNAMIC_RECIPE_SUBPANEL_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "backpack_panel.h"
|
||
|
#include "vgui_controls/ScrollableEditablePanel.h"
|
||
|
#include "tf_gcmessages.h"
|
||
|
#include "econ_gcmessages.h"
|
||
|
#include "tf_imagepanel.h"
|
||
|
#include "tf_controls.h"
|
||
|
#include "item_selection_panel.h"
|
||
|
#include "econ_dynamic_recipe.h"
|
||
|
|
||
|
class CImageButton;
|
||
|
|
||
|
#define DYNAMIC_RECIPE_INPUT_ROWS 4
|
||
|
#define DYNAMIC_RECIPE_INPUT_COLS 3
|
||
|
#define DYNAMIC_RECIPE_INPUT_COUNT ( DYNAMIC_RECIPE_INPUT_ROWS * DYNAMIC_RECIPE_INPUT_COLS )
|
||
|
#define DYNAMIC_RECIPE_OUTPUT_ROWS 4
|
||
|
#define DYNAMIC_RECIPE_OUTPUT_COLS 3
|
||
|
#define DYNAMIC_RECIPE_OUTPUT_COUNT ( DYNAMIC_RECIPE_OUTPUT_ROWS * DYNAMIC_RECIPE_OUTPUT_COLS )
|
||
|
|
||
|
#define DYNAMIC_RECIPE_BACKPACK_ROWS 4
|
||
|
#define DYNAMIC_RECIPE_BACKPACK_COLS 4
|
||
|
#define DYNAMIC_RECIPE_PACKPACK_COUNT_PER_PAGE ( DYNAMIC_RECIPE_BACKPACK_ROWS * DYNAMIC_RECIPE_BACKPACK_COLS )
|
||
|
|
||
|
class CRecipeComponentItemModelPanel;
|
||
|
|
||
|
class CRecipeComponentItemModelPanel : public CItemModelPanel
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_CLASS_SIMPLE( CRecipeComponentItemModelPanel, CItemModelPanel );
|
||
|
CRecipeComponentItemModelPanel( vgui::Panel *parent, const char *name );
|
||
|
|
||
|
void AddRecipe( itemid_t nRecipe );
|
||
|
virtual void DeleteRecipes();
|
||
|
virtual void SetItem( const CEconItemView *pItem ) OVERRIDE;
|
||
|
void SetRecipeItem( itemid_t nRecipeItem, int nPageNumber );
|
||
|
void AddDefaultItem( CEconItemView *pItem );
|
||
|
CEconItemView* GetRecipeItem( int nPageNumber ) const;
|
||
|
itemid_t GetRecipeIndex( int nPageNumber ) const;
|
||
|
bool IsSlotAvailable( int nPageNumber );
|
||
|
CEconItemView* GetDefaultItem() const { return m_nPageNumber < m_vecDefaultItems.Count() ? m_vecDefaultItems[ m_nPageNumber ] : NULL; }
|
||
|
void UpdateDisplayItem();
|
||
|
|
||
|
void SetPageNumber( int nPageNumber );
|
||
|
int GetPageNumber() const { return m_nPageNumber; }
|
||
|
protected:
|
||
|
struct RecipeItem_t
|
||
|
{
|
||
|
itemid_t m_nRecipeIndex;
|
||
|
CEconItemView* m_pRecipeItem;
|
||
|
};
|
||
|
|
||
|
void UpdateRecipeItem( RecipeItem_t* pRecipeItem );
|
||
|
virtual void SetBlankState();
|
||
|
|
||
|
CUtlVector< CEconItemView* > m_vecDefaultItems;
|
||
|
CUtlVector< RecipeItem_t > m_vecRecipes;
|
||
|
int m_nPageNumber;
|
||
|
};
|
||
|
|
||
|
class CInputPanelItemModelPanel : public CRecipeComponentItemModelPanel
|
||
|
{
|
||
|
public:
|
||
|
CInputPanelItemModelPanel( vgui::Panel *parent, const char *name, const CEconItemView* pDynamicRecipeItem )
|
||
|
: CRecipeComponentItemModelPanel( parent, name )
|
||
|
, m_pDynamicRecipeItem( pDynamicRecipeItem )
|
||
|
{}
|
||
|
|
||
|
virtual void DeleteRecipes();
|
||
|
void AddComponentInfo( const CEconItemAttributeDefinition *pComponentAttrib );
|
||
|
bool MatchesAttribCriteria( itemid_t itemID ) const;
|
||
|
bool MatchesAttribCriteria( itemid_t itemID, int nPageNumber ) const;
|
||
|
const CEconItemAttributeDefinition * GetAttrib( int nPageNumber ) const;
|
||
|
void SetDynamicRecipeItem( const CEconItemView* pDynamicRecipeItem ) { m_pDynamicRecipeItem = pDynamicRecipeItem; }
|
||
|
|
||
|
protected:
|
||
|
virtual void SetBlankState() OVERRIDE;
|
||
|
|
||
|
private:
|
||
|
CUtlVector< const CEconItemAttributeDefinition* > m_vecAttrDef;
|
||
|
const CEconItemView* m_pDynamicRecipeItem;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// An inventory screen that handles displaying the crafting screen
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CDynamicRecipePanel : public CBackpackPanel
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CDynamicRecipePanel, CBackpackPanel );
|
||
|
public:
|
||
|
|
||
|
#ifdef STAGING_ONLY
|
||
|
void Debug_GiveRequiredInputs() const;
|
||
|
CExButton *m_pDevGiveInputsButton;
|
||
|
#endif
|
||
|
|
||
|
CDynamicRecipePanel( vgui::Panel *parent, const char *panelName, CEconItemView* pRecipeItem );
|
||
|
~CDynamicRecipePanel( void );
|
||
|
|
||
|
void SetNewRecipe( CEconItemView* pNewRecipeItem );
|
||
|
void ConsumeItem( );
|
||
|
void InitItemPanels();
|
||
|
virtual const char *GetResFile( void ) { return "Resource/UI/DynamicRecipePanel.res"; }
|
||
|
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE;
|
||
|
virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE;
|
||
|
virtual void PerformLayout( void ) OVERRIDE;
|
||
|
virtual void OnCommand( const char *command ) OVERRIDE;
|
||
|
virtual void OnKeyCodePressed( vgui::KeyCode code ) OVERRIDE;
|
||
|
void OnButtonChecked( KeyValues *pData ) OVERRIDE;
|
||
|
|
||
|
virtual void OpenContextMenu() OVERRIDE {}
|
||
|
virtual int GetNumItemPanels( void ) OVERRIDE;
|
||
|
virtual void AddNewItemPanel( int iPanelIndex ) OVERRIDE;
|
||
|
void Craft();
|
||
|
virtual void OnTick( void ) OVERRIDE;
|
||
|
virtual void OnShowPanel( bool bVisible, bool bReturningFromArmory ) OVERRIDE;
|
||
|
void OnCraftResponse( itemid_t nNewToolID, EGCMsgResponse eResponse );
|
||
|
private:
|
||
|
|
||
|
bool IsInputPanel( int iPanelIndex ) const;
|
||
|
bool IsOutputPanel( int iPanelIndex) const;
|
||
|
bool IsBackpackPanel( int iPanelIndex) const;
|
||
|
bool IsInvPanelOnThisPage( unsigned nIndex ) const;
|
||
|
int GetNumBackpackPanelsPerPage() const { return DYNAMIC_RECIPE_BACKPACK_ROWS * DYNAMIC_RECIPE_BACKPACK_COLS; }
|
||
|
virtual int GetNumPages() OVERRIDE;
|
||
|
virtual void SetCurrentPage( int nNewPage ) OVERRIDE;
|
||
|
int GetFirstBackpackIndex() const { return DYNAMIC_RECIPE_INPUT_COUNT + DYNAMIC_RECIPE_OUTPUT_COUNT; }
|
||
|
|
||
|
void SetCurrentInputPage( int nNewPage );
|
||
|
int GetNumInputPages() const;
|
||
|
int GetNumInputPanelsPerPage() const { return DYNAMIC_RECIPE_INPUT_COUNT; }
|
||
|
|
||
|
int GetNumOutputPage() const;
|
||
|
int GetNumOutputPanelsPerPage() const { return DYNAMIC_RECIPE_OUTPUT_COUNT; }
|
||
|
|
||
|
class CRecipeComponentAttributeCounter : public CEconItemSpecificAttributeIterator
|
||
|
{
|
||
|
public:
|
||
|
CRecipeComponentAttributeCounter()
|
||
|
: m_nInputCount( 0 )
|
||
|
{}
|
||
|
~CRecipeComponentAttributeCounter() { Reset(); }
|
||
|
|
||
|
virtual bool OnIterateAttributeValue( const CEconItemAttributeDefinition *pAttrDef, const CAttribute_DynamicRecipeComponent& value ) OVERRIDE;
|
||
|
int GetInputCount() const { return m_nInputCount; }
|
||
|
int GetOutputCount() const { return m_vecOutputItems.Count(); }
|
||
|
CEconItemView* GetOutputItem( int i );
|
||
|
CEconItemView* GetInputItem( int i );
|
||
|
const CEconItemAttributeDefinition* GetInputAttrib( int i );
|
||
|
|
||
|
void Reset();
|
||
|
|
||
|
private:
|
||
|
|
||
|
struct InputComponent_t
|
||
|
{
|
||
|
CEconItemView m_ItemView;
|
||
|
const CEconItemAttributeDefinition* m_pAttrib;
|
||
|
};
|
||
|
|
||
|
typedef CUtlVector< CCopyableUtlVector<InputComponent_t> > InputComponentVec;
|
||
|
|
||
|
static int LeastCommonInputSortFunc( const CCopyableUtlVector<InputComponent_t> *p1, const CCopyableUtlVector<InputComponent_t> *p2 );
|
||
|
InputComponent_t* GetInputComponent( int i );
|
||
|
|
||
|
InputComponentVec m_vecInputItems;
|
||
|
CUtlVector< CEconItemView > m_vecOutputItems;
|
||
|
CUtlVector< CEconItem* > m_vecTempEconItems;
|
||
|
int m_nInputCount;
|
||
|
};
|
||
|
|
||
|
class CDynamicRecipeItemMatchFind : public CEconItemSpecificAttributeIterator
|
||
|
{
|
||
|
public:
|
||
|
CDynamicRecipeItemMatchFind( const CEconItemView* pSourceItem, const CEconItemView* pItemTomatch )
|
||
|
: m_bMatchesAny( false )
|
||
|
, m_pSourceItem( pSourceItem )
|
||
|
, m_pItemToMatch( pItemTomatch )
|
||
|
{}
|
||
|
|
||
|
virtual bool OnIterateAttributeValue( const CEconItemAttributeDefinition *pAttrDef, const CAttribute_DynamicRecipeComponent& value ) OVERRIDE;
|
||
|
bool MatchesAnyAttributes() const { return m_bMatchesAny; }
|
||
|
private:
|
||
|
const CEconItemView* m_pSourceItem;
|
||
|
const CEconItemView* m_pItemToMatch;
|
||
|
bool m_bMatchesAny;
|
||
|
};
|
||
|
|
||
|
CEconItemView* m_pDynamicRecipeItem;
|
||
|
CRecipeComponentAttributeCounter m_RecipeIterator;
|
||
|
|
||
|
bool AllRecipePanelsFilled( void );
|
||
|
bool CheckForUntradableItems( void );
|
||
|
bool WarnAboutPartialCompletion( void );
|
||
|
void FindPossibleBackpackItems();
|
||
|
virtual void PositionItemPanel( CItemModelPanel *pPanel, int iIndex );
|
||
|
void PopulatePanelsForCurrentPage();
|
||
|
virtual void UpdateModelPanels( void );
|
||
|
virtual void SetBorderForItem( CItemModelPanel *pItemPanel, bool bMouseOver );
|
||
|
void SetRecipeComponentIntoPanel( itemid_t nSrcRecipeIndex, CRecipeComponentItemModelPanel* pSrcPanel, int nSrcPage, CRecipeComponentItemModelPanel* pDstPanel, int nDstPage );
|
||
|
bool InputPanelCanAcceptItem( CItemModelPanel* pPanel, itemid_t nItemID );
|
||
|
|
||
|
CTFTextToolTip *m_pToolTip;
|
||
|
vgui::EditablePanel *m_pToolTipEmbeddedPanel;
|
||
|
CExButton *m_pRecipeCraftButton;
|
||
|
CExLabel *m_pNoMatchesLabel;
|
||
|
CExLabel *m_pUntradableOutputsLabel;
|
||
|
CExLabel *m_pInputsLabel;
|
||
|
CExLabel *m_pOutputsLabel;
|
||
|
vgui::Label *m_pCurInputPageLabel;
|
||
|
CExButton *m_pNextInputPageButton;
|
||
|
CExButton *m_pPrevInputPageButton;
|
||
|
CItemModelPanel *m_pMouseOverItemPanel;
|
||
|
vgui::CheckButton *m_pShowUntradableItemsCheckbox;
|
||
|
|
||
|
CUtlVector<CInputPanelItemModelPanel*> m_vecRecipeInputModelPanels;
|
||
|
CUtlVector<CRecipeComponentItemModelPanel*> m_vecBackpackModelPanels;
|
||
|
CUtlVector<CItemModelPanel*> m_vecRecipeOutputModelPanels;
|
||
|
|
||
|
vgui::EditablePanel *m_pRecipeContainer;
|
||
|
vgui::EditablePanel *m_pInventoryContainer;
|
||
|
|
||
|
unsigned m_nNumRecipeItems;
|
||
|
bool m_bAllRecipePanelsFilled;
|
||
|
bool m_bInputPanelsDirty;
|
||
|
bool m_bShowUntradable;
|
||
|
|
||
|
int m_nInputPage;
|
||
|
int m_nOutputPage;
|
||
|
|
||
|
float m_flAbortCraftingAt;
|
||
|
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelMouseDoublePressed, "ItemPanelMouseDoublePressed", panel );
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelEntered, "ItemPanelEntered", panel );
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelExited, "ItemPanelExited", panel );
|
||
|
MESSAGE_FUNC( OnRecipeCompleted, "RecipeCompleted" );
|
||
|
|
||
|
virtual bool AllowDragging( CItemModelPanel *panel ) OVERRIDE;
|
||
|
virtual void StartDrag( int x, int y ) OVERRIDE;
|
||
|
virtual void StopDrag( bool bSucceeded ) OVERRIDE;
|
||
|
virtual bool CanDragTo( CItemModelPanel *pItemPanel, int iPanelIndex ) OVERRIDE;
|
||
|
virtual void HandleDragTo( CItemModelPanel *pItemPanel, int iPanelIndex ) OVERRIDE;
|
||
|
|
||
|
void ReturnRecipeItemToBackpack( itemid_t nItemID, CRecipeComponentItemModelPanel* pSrcPanel, int nSrcPage );
|
||
|
|
||
|
CPanelAnimationVarAliasType( int, m_iItemCraftingOffcenterX, "item_crafting_offcenter_x", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iOutputItemYPos, "output_item_ypos", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iInventoryXPos, "inventory_xpos", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iInventoryYPos, "inventory_ypos", "0", "proportional_int" );
|
||
|
|
||
|
friend void ConfirmDestroyItems( bool bConfirmed, void* pContext );
|
||
|
};
|
||
|
|
||
|
#endif // DYNAMIC_RECIPE_SUBPANEL_H
|