Files
Leviathan/Client/Game/game/Interface/SUIPopupEquip.cpp
T
2026-06-01 12:46:52 +02:00

258 lines
6.4 KiB
C++

#include "stdafx.h"
#include <toolkit/XStringUtil.h>
#include "SStringDB.h"
#include "SGameMessage.h"
#include "SGameManager.h"
//#include "SGameMessageUI.h"
#include "SInventoryMgr.h"
#include "SPlayerInfoMgr.h"
//#include "KUIControl.h"
#include "KUIControlButton.h"
#include "SUIRepairWnd.h"
#include "SUIPopupEquip.h"
SUIPopupEquip::SUIPopupEquip( SGameManager * pGameManager ) :
SUIWnd( pGameManager ), m_pSelectedSlot( NULL )
{
}
SUIPopupEquip::~SUIPopupEquip()
{
Release();
}
void SUIPopupEquip::Release()
{
}
SUIWnd* SUIPopupEquip::CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID )
{
SUIWnd::CreateWnd( szFile, pWndManager, kPos, nWindowID );
m_pSUIRepair = NULL;
m_pCtrlRepair = dynamicCast< KUIControl * >( GetChild( "guild_sub_menu_list_01" ) );
m_pCtrlShow = dynamicCast< KUIControl * >( GetChild( "guild_sub_menu_list_02" ) );
CStringUtil::GetTextDecoration( m_pCtrlRepair->GetCaption(), m_strDecoTag ); // 텍스트 꾸미기 태그.
if( m_pCtrlRepair && m_pCtrlShow )
{
m_pCtrlRepair->SetEnableColor( "<#ffffff>" );
m_pCtrlShow->SetEnableColor( "<#ffffff>" );
}
m_hItem = 0; // 장비창에서 전달받은 아이템의 핸들.
m_nWearType = -1; // 장비창에서 전달받은 아이템의 장착타입.
return this;
}
bool SUIPopupEquip::InitControls( KPoint kPos )
{
return SUIWnd::InitControls( kPos );
}
void SUIPopupEquip::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd)
{
if( bOpen )
{
this->SetShow( true );
// 기존 포커스 제거.
this->m_pManager->RemoveWnd( this );
// wnd 출력 리스트의 최하단에 추가. ( wnd 들중 가장 상위에 뜨게 된다. )
this->m_pManager->AddWnd( this );
// 가장위에 뜨도록 한다.
this->m_pManager->SetFocus( this );
// 메뉴 텍스트 설정.
if( m_pCtrlShow && !m_StrDecoration.empty() )
{
m_pCtrlShow->SetCaption( ( m_strDecoTag + m_StrDecoration ).c_str() );
}
}
else
{
m_hItem = 0; // 장비창에서 전달받은 아이템의 핸들.
m_nWearType = -1; // 장비창에서 전달받은 아이템의 장착타입.
//m_pSelectedSlot = NULL; // 장비창에서 선택된 슬롯.
//m_pStrDecoration = "보이기";
//m_pCtrlShow->SetCaption( m_pStrDecoration );
}
}
void SUIPopupEquip::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch( pMsg->nType )
{
case IMSG_MOUSEMOVE:
{
pMsg->bUse = true;
SIMSG_MOUSEMOVE * pData = dynamicCast< SIMSG_MOUSEMOVE * >( pMsg );
if( !( this->GetRect().IsInRect( LOWORD( pData->lParam ), HIWORD( pData->lParam ) ) ) )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_EQUIPMENT_POPUP, false ) ); // 닫기.
}
}
break;
case IMSG_UI_MOVE:
{
pMsg->bUse = true;
SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg;
MovePos( pMoveMsg->m_nX - 20, pMoveMsg->m_nY - 10 );
}
break;
case IMSG_EQUIPMENT_POPUP:
{
pMsg->bUse = true;
SIMSG_UI_EQUIPMENT_POPUP_WNDMSG * pData = (SIMSG_UI_EQUIPMENT_POPUP_WNDMSG *)pMsg;
// 장비창에서 선택한 아이템에 따른 메뉴설정.
SetMenu( pData->handle, pData->nEquipmentType, pData->nEquipType );
}
break;
}
}
void SUIPopupEquip::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch( nMessage )
{
case KUI_MESSAGE::KBUTTON_CLICK :
{
// 꾸미기 아이템 보임,숨김 처리.
if( m_pSelectedSlot && !::_stricmp( lpszControlID, "guild_sub_menu_list_02" ) )
{
m_pSelectedSlot->SetToggleShowDecoration();
//m_StrDecoration = m_pSelectedSlot->GetShowDecoration() ? S( 9753 ) : S( 9752 ); // stringdb 필요.
m_StrDecoration = m_pSelectedSlot->GetShowDecoration() ? S( 9752 ) : S( 9753 ); // stringdb 필요.
m_pCtrlShow->SetCaption( ( m_strDecoTag + m_StrDecoration ).c_str() );
// 꾸미기정보전달.
SMSG_HIDE_EQUIP_INFO * pInfo = new SMSG_HIDE_EQUIP_INFO;
pInfo->nType = MSG_HIDE_EQUIP_FLAG;
pInfo->hPlayer = this->m_PlayerInfoMgr.GetPlayerHandle();
pInfo->nHideEquipFlag = m_nWearType;
m_pGameManager->ProcMsgAtStatic( pInfo );
}
//
// 수리할 장비를 수리윈도우에 드롭한다.
else if( !::_stricmp( lpszControlID, "guild_sub_menu_list_01" ) )
{
if( m_pSUIRepair == NULL )
m_pSUIRepair = dynamicCast< SUIRepairWnd * >( this->m_pGameManager->GetSUI( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_REPAIR ) );
// 닫혀있으면 연다.
if( !m_pSUIRepair->IsShow() )
{
/// 2011.05.16 ProcMsgAtStatic는 정적 입력 변수이다 - prodongi
//m_pGameManager->ProcMsgAtStatic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_REPAIR, true ) );
m_pGameManager->ProcMsgAtStatic( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_REPAIR, true ) );
}
// 아이템 전달.
if( m_hItem != 0 )
m_pSUIRepair->ReceiveItem( m_hItem, std::string("slot_red_00"), false ); // 수리윈도우 메인슬롯ID.
}
}
break;
// 윈도우 이동
case KUI_MESSAGE::KGENWND_MOVE:
LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한
break;
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
DWORD SUIPopupEquip::OnMouseMessage(DWORD dwMessage, int x, int y)
{
/*switch( dwMessage )
{
case KLBUTTON_DOWN :
break;
}*/
return SUIWnd::OnMouseMessage(dwMessage, x, y);
}
// 장비창에서 선택한 아이템에 따른 메뉴설정.
void SUIPopupEquip::SetMenu( AR_HANDLE handle, int nType, int wearType )
{
m_hItem = handle; // 장비창에서 전달받은 아이템의 핸들.
m_nWearType = wearType; // 장비창에서 전달받은 아이템의 장착타입.
if( m_pCtrlRepair && m_pCtrlShow )
{
switch( nType )
{
case EQUIPMENT_INFO::EQUIPMENT_NONE: // 슬롯이 빈 경우.
case EQUIPMENT_INFO::EQUIPMENT_NORMAL: // 일반템 또는 내구도가 손상되지 않음.
m_pCtrlRepair->Disable();
m_pCtrlShow->Disable();
break;
case EQUIPMENT_INFO::EQUIPMENT_UPPER: // 상급템.
m_pCtrlRepair->Enable();
m_pCtrlShow->Disable();
break;
case EQUIPMENT_INFO::EQUIPMENT_DECORATE: // 꾸미기템.
m_pCtrlRepair->Disable();
// 보임,숨김 설정.
SInventorySlot * pSlot = m_InventoryMgr.GetItemInfo( wearType );
if( pSlot )
{
m_pCtrlShow->Enable();
m_StrDecoration = pSlot->GetShowDecoration() ? S( 9752 ) : S( 9753 ); // stringdb 필요.
m_pSelectedSlot = pSlot;
}
else
{
m_pCtrlShow->Disable();
}
break;
}
}
}