diff options
Diffstat (limited to 'game/client/econ/tool_items/paint_can_tool.cpp')
| -rw-r--r-- | game/client/econ/tool_items/paint_can_tool.cpp | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/game/client/econ/tool_items/paint_can_tool.cpp b/game/client/econ/tool_items/paint_can_tool.cpp new file mode 100644 index 0000000..3570c47 --- /dev/null +++ b/game/client/econ/tool_items/paint_can_tool.cpp @@ -0,0 +1,205 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + + +#include "cbase.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/TextEntry.h" +#include "vgui/IInput.h" +#include "econ_item_system.h" +#include "econ_item_constants.h" +#include "econ_gcmessages.h" +#include "econ_item_inventory.h" +#include "econ_item_tools.h" +#include "tool_items.h" +#include "paint_can_tool.h" +#include "econ_ui.h" +#include "gc_clientsystem.h" + +#ifdef TF_CLIENT_DLL +#include "tf_shareddefs.h" +#endif // TF_CLIENT_DLL + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +enum +{ +#ifdef TF_CLIENT_DLL + kTeamID0 = TF_TEAM_RED, + kTeamID1 = TF_TEAM_BLUE, +#else // !defined( TF_CLIENT_DLL ) + kTeamID0 = -1, + kTeamID1 = -1, +#endif // TF_CLIENT_DLL +}; + +//----------------------------------------------------------------------------- +// Purpose: Confirm / abort paint application +//----------------------------------------------------------------------------- +class CConfirmApplyPaintCanBaseDialog : public CBaseToolUsageDialog +{ + DECLARE_CLASS_SIMPLE( CConfirmApplyPaintCanBaseDialog, CBaseToolUsageDialog ); + +protected: + CConfirmApplyPaintCanBaseDialog( vgui::Panel *pParent, const char *szType, CEconItemView *pTool, CEconItemView *pToolSubject ) + : CBaseToolUsageDialog( pParent, szType, pTool, pToolSubject ) + { + // + } + +public: + virtual void Apply( void ) + { + // Send the apply request to the GC + GCSDK::CGCMsg< MsgGCPaintItem_t > msg( k_EMsgGCPaintItem ); + + msg.Body().m_unToolItemID = m_pToolModelPanel->GetItem()->GetItemID(); + msg.Body().m_unSubjectItemID = m_pSubjectModelPanel->GetItem()->GetItemID(); + + EconUI()->Gamestats_ItemTransaction( IE_ITEM_USED_TOOL, m_pToolModelPanel->GetItem(), "painted_item" ); + + GCClientSystem()->BSendMessage( msg ); + } + +protected: + // Set up a particular panel for a certain item with a certain preview color. + static void SetupPaintModelPanel( CItemModelPanel *pPaintModelPanel, CEconItemView *pToolSubjectView, int iTeam, int iPaintRGB ) + { + static CSchemaAttributeDefHandle pAttrDef_ItemTintRGB( "set item tint RGB" ); + + if ( !pAttrDef_ItemTintRGB ) + return; + + // Fake-paint the demonstration items. + pPaintModelPanel->SetItem( pToolSubjectView ); + pPaintModelPanel->GetItem()->GetAttributeList()->SetRuntimeAttributeValue( pAttrDef_ItemTintRGB, iPaintRGB ); + + // Set the appropriate skins for each item given the team and the style selected. + int iStyleSkin = pToolSubjectView->GetSkin( iTeam ); + + if ( iStyleSkin == -1 ) + { + // Fallback case: rely on default skins. + pPaintModelPanel->SetSkin( iTeam == kTeamID0 ? 0 : 1 ); + } + else + { + pPaintModelPanel->SetSkin( iStyleSkin ); + } + + pPaintModelPanel->SetActAsButton( true, false ); + pPaintModelPanel->GetItem()->InvalidateColor(); + pPaintModelPanel->GetItem()->InvalidateOverrideColor(); + } + + CItemModelPanel *m_pPaintModelPanel; +}; + +//----------------------------------------------------------------------------- +// Purpose: Preview a single-color paint +//----------------------------------------------------------------------------- +class CConfirmApplyPaintCanDialog : public CConfirmApplyPaintCanBaseDialog +{ + DECLARE_CLASS_SIMPLE( CConfirmApplyPaintCanDialog, CConfirmApplyPaintCanBaseDialog ); + +public: + CConfirmApplyPaintCanDialog( vgui::Panel *pParent, CEconItemView *pTool, CEconItemView *pToolSubject ) + : CConfirmApplyPaintCanBaseDialog( pParent, "ConfirmApplyPaintCanDialog", pTool, pToolSubject ) + { + m_pPaintModelPanel = new CItemModelPanel( this, "paint_model" ); + m_pPaintModelPanel->SetItem( pToolSubject ); + } + + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) + { + LoadControlSettings( "Resource/UI/econ/ConfirmApplyPaintCanDialog.res" ); + + BaseClass::ApplySchemeSettings( pScheme ); + + SetupPaintModelPanel( m_pPaintModelPanel, m_pSubjectModelPanel->GetItem(), kTeamID0, m_pToolModelPanel->GetItem()->GetModifiedRGBValue( false ) ); + } + +private: + CItemModelPanel *m_pPaintModelPanel; +}; + +//----------------------------------------------------------------------------- +// Purpose: Preview team-colored paint +//----------------------------------------------------------------------------- +class CConfirmApplyTeamColorPaintCanDialog : public CConfirmApplyPaintCanBaseDialog +{ + DECLARE_CLASS_SIMPLE( CConfirmApplyTeamColorPaintCanDialog, CConfirmApplyPaintCanBaseDialog ); + +public: + CConfirmApplyTeamColorPaintCanDialog( vgui::Panel *pParent, CEconItemView *pTool, CEconItemView *pToolSubject ) + : CConfirmApplyPaintCanBaseDialog( pParent, "ConfirmApplyTeamColorPaintCanDialog", pTool, pToolSubject ) + { + m_pPaintModelPanel_Red = new CItemModelPanel( this, "paint_model_red" ); + m_pPaintModelPanel_Red->SetItem( pToolSubject ); + m_pPaintModelPanel_Blue = new CItemModelPanel( this, "paint_model_blue" ); + m_pPaintModelPanel_Blue->SetItem( pToolSubject ); + } + + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) + { + LoadControlSettings( "Resource/UI/econ/ConfirmApplyTeamColorPaintCanDialog.res" ); + + BaseClass::ApplySchemeSettings( pScheme ); + + SetupPaintModelPanel( m_pPaintModelPanel_Red, m_pSubjectModelPanel->GetItem(), kTeamID0, m_pToolModelPanel->GetItem()->GetModifiedRGBValue( false ) ); + SetupPaintModelPanel( m_pPaintModelPanel_Blue, m_pSubjectModelPanel->GetItem(), kTeamID1, m_pToolModelPanel->GetItem()->GetModifiedRGBValue( true ) ); + + // @note Tom Bui: we need to change the global index so that the material does not get + // re-used for each item. Should be ok to change the high bit. + Assert( m_pPaintModelPanel_Red->GetItem() ); + m_pPaintModelPanel_Red->GetItem()->SetItemID( m_pPaintModelPanel_Red->GetItem()->GetItemID() | ( 1LL << 63 ) ); + } + +private: + CItemModelPanel *m_pPaintModelPanel_Red; + CItemModelPanel *m_pPaintModelPanel_Blue; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEconTool_PaintCan::OnClientApplyTool( CEconItemView *pTool, CEconItemView *pSubject, vgui::Panel *pParent ) const +{ + // Bizarro logic: we have no way of finding out whether an item has two different + // colors of paint applied so instead we ask whether both colors are + // the same. + CBaseToolUsageDialog *dialog = NULL; + if ( pTool->GetModifiedRGBValue( true ) != pTool->GetModifiedRGBValue( false ) ) + { + dialog = new CConfirmApplyTeamColorPaintCanDialog( pParent, pTool, pSubject ); + } + else + { + dialog = new CConfirmApplyPaintCanDialog( pParent, pTool, pSubject ); + } + vgui::SETUP_PANEL( dialog ); + MakeModalAndBringToFront( dialog ); +} + +//----------------------------------------------------------------------------- +// Purpose: GC Msg handler to receive the paint can response +//----------------------------------------------------------------------------- +class CGCPaintItemResponse : public GCSDK::CGCClientJob +{ +public: + CGCPaintItemResponse( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CGCMsg<MsgGCStandardResponse_t> msg( pNetPacket ); + InventoryManager()->ShowItemsPickedUp( true ); + return true; + } + +}; + +GC_REG_JOB( GCSDK::CGCClient, CGCPaintItemResponse, "CGCPaintItemResponse", k_EMsgGCPaintItemResponse, GCSDK::k_EServerTypeGCClient ); |