#include "stdafx.h" #include #include "SStringDB.h" #include "SItemDB.h" //#include "SUIUtil.h" #include "SUIDisplayInfo.h" #include "SGameManager.h" #include "SGameSystem.h" #include "SGameMessage.h" //#include "SGameMessageUI.h" #include "SInventoryMgr.h" #include "KUIDragAndDrop.h" #include "KUIControlStatic.h" #include "SUIDestructionWnd.h" #include "SStorageMgr.h" #include "SUILazyTooltip.h" extern SGameSystem * g_pCurrentGameSystem; const int nLayer = 8; // // ID 에 해당하는 Slot Index 반환. // int GetSlotIndex( std::string strID ) { int index = -1; std::string::size_type fPos = strID.find( "icon_item" ); if( fPos != std::string::npos ) { /// 2010.12.20 - prodongi //index = ::atoi( strID.substr( fPos + 1, strID.size() ).c_str() ); std::string strIndex = strID.substr( fPos + strlen("icon_item"), strID.size()); index = ::atoi(strIndex.c_str()); } return index; } // 파괴할 아이템의 유효성 검사. bool SUIDestructionWnd::ValidateDestructionItem( AR_HANDLE hItem ) { SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( hItem ); if( pSlot ) { // 파괴불가 아이템. const ItemBase* pItem = (ItemBase*)GetItemDB().GetItemData( pSlot->GetItemCode() ); if( pItem->CheckFlag( ItemBase::ITEM_FLAG::FLAG_CANT_DESTRUCTION ) ) { return false; } // 장착중인 아이템은 불가. (카드, 장비) int nType = GetItemDB().GetUseType(pSlot->GetItemCode()); if( nType == ItemBase::TYPE_CARD || nType == ItemBase::TYPE_ARMOR ) { if( m_InventoryMgr.IsEquipCard( hItem ) || m_InventoryMgr.IsEquip( hItem ) ) { //m_pGameManager->PostMsgAtDynamic( new SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_GENERAL, S(297), true ) ); return false; } } /// 2011.05.13 벨트 슬롯 체크 - prodongi if (m_InventoryMgr.IsBeltSlotCard(hItem)) { return false; } } return true; } // // Destruction. // SUIDestructionWnd::~SUIDestructionWnd() { Release(); } // // Release. // void SUIDestructionWnd::Release() { m_arrItems.clear(); // 아이템묶음 이중배열. m_arrSlotControl.clear(); // 슬롯컨트롤 배열. m_arrCountControl.clear(); // 아이템 개수 컨트롤 배열. } // // CreateWnd. // SUIWnd * SUIDestructionWnd::CreateWnd( const char * szNUIFileName, KUIWndManager * pWndManager, KPoint kPos, int nWindowID ) { SUIWnd::CreateWnd( szNUIFileName, pWndManager, kPos, nWindowID ); m_ReserveDropItemHandle = 0; m_decreaseIndex = -1; // 개수 감소시킬 아이템 인덱스. // 슬롯컨트롤 배열, 아이템개수 컨트롤 배열. m_arrSlotControl.resize( DESTRUCTION_TOTAL ); m_arrCountControl.resize( DESTRUCTION_TOTAL ); for( int i=0; i( GetChild( CStringUtil::StringFormat("icon_item%02d", i).c_str() ) ); m_arrCountControl[ i ] = GetChild( CStringUtil::StringFormat("static_itemcount%02d", i).c_str() ); m_arrCountControl[ i ]->SetShow( false ); m_arrSlotControl[ i ]->SetIconLayer(nLayer); } this->MovePos( 300, 200 ); //servantes 2010.11.23 OnNotifyUIWindowOpen에 있던 걸 갖 고옴 return this; } // // InitControls. // bool SUIDestructionWnd::InitControls( KPoint kPos ) { return SUIWnd::InitControls( kPos ); } // // Perform. // void * SUIDestructionWnd::Perform( KID id, KArg & msg ) { _CID( UI_BEGIN_DRAG ); _CID( UI_SEND_DROP ); _CID( UI_RECV_DROP ); if ( id == id_UI_BEGIN_DRAG ) { KUIBeginDragMessage* pBeginMsg = static_cast( &msg ); const char* szControlID = pBeginMsg->sDragControlID.c_str(); SInventorySlot * pSlot = NULL; int slotIndex = GetSlotIndex( szControlID ); if( slotIndex < m_arrItems.size() ) pSlot = m_InventoryMgr.GetItemInfo( m_arrItems[ slotIndex ].handle ); // ★ Drag Start. if( pSlot ) { KUIControlMultiIcon* pWndMultiIcon = m_arrSlotControl[ slotIndex ]; if( pWndMultiIcon ) { const KUIControlMultiIcon::ICON_INFO& rIconInfo = pWndMultiIcon->GetIconInfoByLayer(0); m_pDisplayInfo->SetUIDragInfo( new SUIDestructionItemDragInfo( pSlot->GetHandle() ) ); m_pDragAndDropIcon->SetStateIcon( pWndMultiIcon->GetSprName(), rIconInfo.sAniName.c_str(), rIconInfo.nFrameIndex, STATE_NORMAL ); pBeginMsg->pDragAndDropRenderer = m_pDragAndDropIcon; } } return NULL; } else if ( id == id_UI_SEND_DROP ) { KUISendRecvDropMessage* pSendMsg = static_cast( &msg ); SUIDragInfo* pUIDragInfo = m_pDisplayInfo->GetUIDragInfo(); if( NULL != pUIDragInfo && SUIDragInfo::DRAGTYPE_DESTRUCTION == pUIDragInfo->m_type ) { SUIDestructionItemDragInfo* pDestructionDragInfo = (SUIDestructionItemDragInfo*)pUIDragInfo; // 동일한 창이 아닌 곳에 드롭했다면 슬롯을 비운다. // 2010.10.13 - servantes if( pSendMsg->sRecvDropParentID != std::string(GetID()) ) { int nCnt = GetItemCount( pSendMsg->sSendDropControlID.c_str() ); if(nCnt > 1) // 여러개가 있을 경우 { m_bDeleteItemFlag = true; m_strDeleteItem = pSendMsg->sSendDropControlID; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, count_t(nCnt) ) ); //수입력기가 뜬다 } else // 한 개일 경우 { DecreaseItem( pSendMsg->sSendDropControlID.c_str() ); } } // Drag & Drop 정보 제거 m_pDisplayInfo->SetUIDragInfo(); } return NULL; } else if ( id == id_UI_RECV_DROP ) { KUISendRecvDropMessage* pRecvMsg = static_cast( &msg ); SUIDragInfo* pUIDragInfo = m_pDisplayInfo->GetUIDragInfo(); if( pUIDragInfo && SUIDragInfo::DRAGTYPE_INVENITEM == pUIDragInfo->m_type ) // 아이템인 경우만 { SUIInvenItemDragInfo* pItemDragInfo = (SUIInvenItemDragInfo*)pUIDragInfo; const char* szDropControlID = pRecvMsg->sRecvDropControlID.c_str(); SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( pItemDragInfo->m_hItem ); if( !pSlot ) return NULL; // ★ 파괴할 아이템의 유효성 검사. if( !ValidateDestructionItem( pSlot->GetHandle() ) ) { return NULL; } // 개수가 여러개인 경우 계산기 열기. if( pSlot->GetItemCount() > 1 ) { m_ReserveDropItemHandle = pItemDragInfo->m_hItem; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, pSlot->GetItemCount() ) ); } // 1개, 바로 추가. else { AddItem( pItemDragInfo->m_hItem, count_t( 1 ), FROM_INVENTORY ); // 2011. 9. 19 - marine //AddItem( pItemDragInfo->m_hItem, count_t( 1 ) ); m_pGameManager->StartSound( m_pDisplayInfo->GetMaterialSound( GetItemDB().GetMaterial(pSlot->GetItemCode()) ) ); } } // 2011. 9. 16 - marine 창고에서도 파괴 가능하게.. else if( pUIDragInfo && SUIDragInfo::DRAGTYPE_STORAGE == pUIDragInfo->m_type ) // 아이템인 경우만 { SUIStorageDragInfo* pItemDragInfo = (SUIStorageDragInfo*)pUIDragInfo; const char* szDropControlID = pRecvMsg->sRecvDropControlID.c_str(); SInventorySlot* pSlot = m_StorageMgr.GetItemInfo( pItemDragInfo->m_hItem ); //SUIInvenItemDragInfo* pItemDragInfo = (SUIInvenItemDragInfo*)pUIDragInfo; //const char* szDropControlID = pRecvMsg->sRecvDropControlID.c_str(); //SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( pItemDragInfo->m_hItem ); if( !pSlot ) return NULL; // ★ 파괴할 아이템의 유효성 검사. if( !ValidateDestructionItem( pSlot->GetHandle() ) ) { return NULL; } // 개수가 여러개인 경우 계산기 열기. if( pSlot->GetItemCount() > 1 ) { m_ReserveDropItemHandle = pItemDragInfo->m_hItem; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, pSlot->GetItemCount() ) ); } // 1개, 바로 추가. else { AddItem( pItemDragInfo->m_hItem, count_t( 1 ), FROM_STORAGE ); // 2011. 9. 19 - marine //AddItem( pItemDragInfo->m_hItem, count_t( 1 ) ); m_pGameManager->StartSound( m_pDisplayInfo->GetMaterialSound( GetItemDB().GetMaterial(pSlot->GetItemCode()) ) ); } } return NULL; } return SUIWnd::Perform( id, msg ); } // // PumpUpMessage. // void SUIDestructionWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch( nMessage ) { // KBUTTON_CLICK. case KUI_MESSAGE::KBUTTON_CLICK : // 닫기. if( !::_stricmp( lpszControlID, "button_close_trim_01" ) ) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, false ) ); // 파괴. else if( !::_stricmp( lpszControlID, "button_inchant" ) ) m_pGameManager->PostMsgAtDynamic( new SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_ITEMDESTRUCTION, S( 731 ), true ) ); break; //servantes 2010.10.25 case KUI_MESSAGE::KICON_PRESSING: { if(m_bShiftKey) { int nCnt = GetItemCount( lpszControlID ); if(nCnt > 1) // 여러개가 있을 경우 { m_bDeleteItemFlag = true; m_strDeleteItem = lpszControlID; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, count_t(nCnt) ) ); //수입력기가 뜬다 } else // 한 개일 경우 { DecreaseItem( lpszControlID ); } } else if(m_bControlKey) { int nCnt = GetItemCount( lpszControlID ); if(nCnt == 1) DecreaseItem( lpszControlID ); else if(nCnt <= 10) { std::string strCtrl = lpszControlID; int index = ::atoi( strCtrl.substr( strlen( "icon_item" ) ).c_str() ); EraseItem( index ); RefreshAllSlot(); } else if(nCnt > 10) { int tc = nCnt - 10; SetItemCount( lpszControlID, tc ); RefreshAllSlot(); } else break; } } break; // KICON_DBLCLK. case KUI_MESSAGE::KICON_DBLCLK: { //servantes 2010.10.25 if(m_bControlKey) //servantes 2011.01.05 break; int nCnt = GetItemCount( lpszControlID ); if(nCnt > 1) // 여러개가 있을 경우 { m_bDeleteItemFlag = true; m_strDeleteItem = lpszControlID; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, count_t(nCnt) ) ); //수입력기가 뜬다 } else // 한 개일 경우 { DecreaseItem( lpszControlID ); } } break; case KUI_MESSAGE::KGENWND_MOVE: { LimitMoveWnd(); } break; } } // // ProcMsgAtStatic. // void SUIDestructionWnd::ProcMsgAtStatic( SGameMessage * pMsg ) { switch( pMsg->nType ) { // 아이템파괴 결정. ( 메세지박스에서 확인선택 ). case IMSG_UI_DESTRUCTIONITEM: ItemDestroy(); break; // 인벤토리에서 파괴할 아이템정보 전달. case IMSG_DESTRY_ITEM : { pMsg->bUse = true; //AddItem( pMsg ); // 아이템추가. SIMSG_UI_DESTROY_ITEM * pItemData = dynamicCast< SIMSG_UI_DESTROY_ITEM * >( pMsg ); AddItem( pItemData->handle, pItemData->count ); } break; //servantes 2010.10.25 case IMSG_HOTKEY_EX: { SIMSG_HOTKEY_EX* pHotKey = dynamicCast(pMsg); if( pHotKey->wParam == VK_SHIFT ) m_bShiftKey = (pHotKey->bUp == 0); //servantes 2010.10.15 if( pHotKey->wParam == VK_CONTROL ) //servantes 2010.10.15 m_bControlKey = (pHotKey->bUp == 0); if( pHotKey->wParam == VK_MENU ) { bool bPreState = m_bAltKey; m_bAltKey = (pHotKey->bUp == 0); if( bPreState != m_bAltKey && IsShow() ) { RefreshAllSlot(); } } } break; case IMSG_DESTROY_MOVEITEM: { SIMSG_DESTROY_MOVEITEM * pItemData = dynamicCast< SIMSG_DESTROY_MOVEITEM * >( pMsg ); /// 2011.05.13 유효성 검사 - prodongi if(!ValidateDestructionItem(pItemData->m_handle)) { pMsg->bUse = true; return ; } // 2012. 8. 6 - marine 수입력기 호출 플래그 추가 if( pItemData->m_bCallNumberInput ) { m_ReserveDropItemHandle = pItemData->m_handle; m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, pItemData->m_nMax ) ); } else AddItem( pItemData->m_handle, pItemData->m_nValue ); pMsg->bUse = true; } break; case IMSG_UI_INPUTNUMBER: { SIMSG_UI_INPUTNUMBER* pInputNumberMsg = (SIMSG_UI_INPUTNUMBER*)pMsg; if(m_bDeleteItemFlag) // 2010.10.13 - servnates { int tc = GetItemCount(m_strDeleteItem.c_str()); if(tc - pInputNumberMsg->m_nValue.getAmount() <=0) { DecreaseItem( m_strDeleteItem.c_str() ); } else { tc -= pInputNumberMsg->m_nValue.getAmount(); SetItemCount( m_strDeleteItem.c_str(), tc ); RefreshAllSlot(); } m_strDeleteItem = ""; m_bDeleteItemFlag = false; } else { if( pInputNumberMsg->m_nValue > 0 ) { if(m_ReserveDropItemHandle != 0) { int FromWhere = FROM_INVENTORY; // 2011. 9 .19 - marine AddItem 함수 호출시 창고아이템인지 가방아이템인지 알려줘야 한다. SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( m_ReserveDropItemHandle ); if( !pSlot ) { pSlot = m_StorageMgr.GetItemInfo(m_ReserveDropItemHandle); // 2011. 9 .19 - marine 인벤토리에서 찾을 수 없다면 창고에서 한번더 찾자.. FromWhere = FROM_STORAGE; } if( !pSlot ) break; count_t nCount(pSlot->GetItemCount()); //servantes 2012.12.20 if(pInputNumberMsg->m_nValue > pSlot->GetItemCount()) pInputNumberMsg->m_nValue = nCount; AddItem( m_ReserveDropItemHandle, pInputNumberMsg->m_nValue, FromWhere); //AddItem( m_ReserveDropItemHandle, pInputNumberMsg->m_nValue ); m_pGameManager->StartSound( m_pDisplayInfo->GetMaterialSound( GetItemDB().GetMaterial(pSlot->GetItemCode()) ) ); m_ReserveDropItemHandle = 0; } } } pMsg->bUse = true; } break; /// 2011.05.16 - prodongi case MSG_ITEM_WEAR_INFO: case MSG_BELT_SLOT_INFO: { RefreshAllSlot(); } break; } } // // OnNotifyUIWindowOpen. // void SUIDestructionWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { // Open. if( bOpen ) { RefreshAllSlot(); m_pManager->SetMouseClickWnd(this); //servantes 2010.12.17 } // Close. else { m_decreaseIndex = -1; // 개수 감소시킬 아이템 인덱스. // 아이템제거. ReleaseAllSlot(); m_pManager->SetMouseClickWnd(NULL); //servantes 2010.12.17 } } //// 아이템추가. //void SUIDestructionWnd::AddItem( SGameMessage * pMsg ) //{ // // 아이템이 꽉찼음. // if( m_arrItems.size() >= DESTRUCTION_TOTAL ) // return; // // SIMSG_UI_DESTROY_ITEM * pItemData = static_cast< SIMSG_UI_DESTROY_ITEM * >( pMsg ); // SInventorySlot * pSlot = m_InventoryMgr.GetItemInfo( pItemData->handle ); // if( pSlot ) // { // // 추가되어있는 아이템이면 중첩여부에 따라 처리. // int index = 0; // for( std::vector< SItemSet >::iterator it=m_arrItems.begin(); it!=m_arrItems.end(); ++it, ++index ) // { // if( (*it).handle == pItemData->handle ) // 존재. // { // // 중첩가능한 아이템. // if( GetItemDB().IsJoin( pSlot->GetItemCode() ) ) // { // count_t count = (*it).count + pItemData->count; // count = count > pSlot->GetItemCount() ? pSlot->GetItemCount() : count; // // if( (*it).count != count ) // { // (*it).count = count; // RefreshSlot( index, pSlot ); // } // // // 추가처리됐으므로 함수종료. // return; // } // // 중첩불가 아이템. // else // { // return; // } // } // } // // // 아이템 추가. // SItemSet itemSet( pItemData->handle, pItemData->count ); // m_arrItems.push_back( itemSet ); // RefreshSlot( m_arrItems.size() - 1, pSlot ); // // } // //} // 아이템추가. void SUIDestructionWnd::AddItem(AR_HANDLE handle, count_t _count , int FromWhere /* = 0 */) { // 아이템이 꽉찼음. if( m_arrItems.size() >= DESTRUCTION_TOTAL ) return; // 2011. 9. 19 - marine //SInventorySlot *pSlot = m_InventoryMgr.GetItemInfo( handle ); SInventorySlot * pSlot = NULL; if(FromWhere == FROM_INVENTORY) pSlot = m_InventoryMgr.GetItemInfo( handle ); else pSlot = m_StorageMgr.GetItemInfo( handle ); if( pSlot ) { // 추가되어있는 아이템이면 중첩여부에 따라 처리. int index = 0; for( std::vector< SItemSet >::iterator it=m_arrItems.begin(); it!=m_arrItems.end(); ++it, ++index ) { if( (*it).handle == handle ) // 존재. { if(it->FromWhere == FromWhere) // 2011. 9. 19 - marine 같은데서 온 아이템이어야 함.. { // 같은 아이템인데 하나는 인벤토리 하나는 창고일 경우 카운트만 증가하면 안됨. // 중첩가능한 아이템. if( GetItemDB().IsJoin( pSlot->GetItemCode(), IsInstanceUnstackable(pSlot) ) ) { count_t count = (*it).count + _count; count = count > pSlot->GetItemCount() ? pSlot->GetItemCount() : count; if( (*it).count != count ) { (*it).count = count; RefreshSlot( index, pSlot ); } // 추가처리됐으므로 함수종료. return; } // 중첩불가 아이템. else { return; } } } } // 아이템 추가. SItemSet itemSet( handle, _count, FromWhere ); // 2011. 9. 19 - marine //SItemSet itemSet( handle, _count ); m_arrItems.push_back( itemSet ); RefreshSlot( m_arrItems.size() - 1, pSlot ); } } // 아이템 감소. void SUIDestructionWnd::DecreaseItem( std::string strID ) { int index = -1; std::string::size_type fPos = strID.find( "icon_item" ); if( fPos != std::string::npos ) { // 2012. 2. 13 - marine substr 함수의 인자가 잘못쓰여서 두자리수 이상의 숫자가 제대로 읽히지 않음 index = ::atoi( strID.substr( strlen( "icon_item" ) ).c_str() ); //index = ::atoi( strID.substr( strlen( "icon_item" ) + 1, strID.size() ).c_str() ); } else return; if( index != -1 && index < m_arrItems.size() ) { //// 계산기를 열자. //if( m_arrItems[ index ].count.getAmount() > 1 ) //{ // m_decreaseIndex = index; // 개수 감소시킬 아이템 인덱스. // m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DESTRUCTION, // m_arrItems[ index ].count ) ); //} // 한개뿐이므로 제거. //else //{ EraseItem( index ); //} } } // 아이템묶음 배열의 해당인덱스의 요소 제거. void SUIDestructionWnd::EraseItem( int index, count_t count ) { if( index < m_arrItems.size() ) { //m_arrItems[ index ].count = m_arrItems[ index ].count - count; // 감소. // 개수가 1개 이하면 제거. //if( m_arrItems[ index ].count.getAmount() < 1 ) //{ std::vector< SItemSet >::iterator it=m_arrItems.begin(); while( index ) { ++it; --index; } if( it != m_arrItems.end() ) m_arrItems.erase( it ); //} //m_decreaseIndex = -1; // Refresh. RefreshAllSlot(); } } // // RefreshSlot. // void SUIDestructionWnd::RefreshSlot( int index, SInventorySlot * pSlot ) { KUIControlMultiIcon * pMultiIcon = m_arrSlotControl[ index ]; if( pMultiIcon ) { ResetMultiIcon( pMultiIcon, 0, 8 ); if( pSlot ) { /// 2011.08.03 - prodongi if( !setSkillCardIcon(pMultiIcon, pSlot->GetItemCode()) && !setSummonCardIcon( pMultiIcon, pSlot ) ) { std::string iconName; getIconNameAtDurability( pSlot, iconName ); pMultiIcon->SetIcon( 0, "ui_frame.spr", iconName.c_str() ); } if( pSlot->GetItemAppearance() ) pMultiIcon->SetIcon( 4, c_szDEF_SPR_NAME, g_strLookChangeIcon ); pMultiIcon->SetIcon( 1, "ui_frame.spr", pSlot->GetXFlag().IsOn( ItemInstance::ITEM_FLAG_CARD ) ? "static_common_useunitcardicon" : NULL ); EquipItemAddtionalIconSetter icon_setter( pMultiIcon, pSlot ); pMultiIcon->SetLazyTooltip( new rp::KLazyItemTooltip( *m_pDisplayInfo, pSlot, true ) ); if( m_bAltKey ) { m_pDisplayInfo->SetComparableEquipItemSubTooltip( pMultiIcon, pSlot ); } if( m_arrItems[ index ].count >= 1 ) // 2010.10.25 { m_arrCountControl[ index ]->SetShow( true ); /// 2011.01.20 - prodongi //m_arrCountControl[ index ]->SetCaption( CStringUtil::StringFormat( "%d", m_arrItems[ index ].count ).c_str() ); m_arrCountControl[ index ]->SetCaption( CStringUtil::StringFormat( "%d", m_arrItems[ index ].count ).c_str() ); } else { m_arrCountControl[ index ]->SetShow( false ); } } else { pMultiIcon->SetIcon( 0, c_szDEF_SPR_NAME, "static_common_itemslot" ); pMultiIcon->SetTooltip(); m_arrCountControl[ index ]->SetShow( false ); } } } // // RefreshAllSlot. // void SUIDestructionWnd::RefreshAllSlot() { /*int index = 0; for( std::vector< SItemSet >::iterator it=m_arrItems.begin(); it!=m_arrItems.end(); ++it, ++index ) RefreshSlot( index, m_InventoryMgr.GetItemInfo( (*it).handle ) );*/ /// 2011.05.16 아이템의 유효 검사 추가 - prodongi /* SInventorySlot * pSlot = NULL; int size = m_arrItems.size(); for( int i=0; i::iterator it = m_arrItems.begin(); for (; it != m_arrItems.end();) { if (ValidateDestructionItem(it->handle)) { // 2011. 9 . 19 - marine //pSlot = m_InventoryMgr.GetItemInfo(it->handle); if(it->FromWhere == FROM_INVENTORY) pSlot = m_InventoryMgr.GetItemInfo(it->handle); else pSlot = m_StorageMgr.GetItemInfo(it->handle); RefreshSlot( index++, pSlot ); ++it; } else { it = m_arrItems.erase(it); } } for( int i=index; i 0 ) { // Item 의 요청상태. this->m_InventoryMgr.SetItemRqState( RQ_ITEM_STATE::RQ_ITEM_STATE_ERASE ); TS_CS_ERASE_ITEM::EraseItemInfo * arrItems = new TS_CS_ERASE_ITEM::EraseItemInfo[ size ]; for( int i=0; i> 0 일경우 인벤토리에 있는 아이템 1 일경우 창고 아이템 } g_pCurrentGameSystem->Rq_DestroyItem( arrItems, size ); // 아이템제거. ReleaseAllSlot(); } } // 아이템제거. void SUIDestructionWnd::ReleaseAllSlot() { m_arrItems.clear(); KUIWnd * pCountControl; KUIControlMultiIcon * pMultiIcon; for( int i=0; iSetIcon( 0, c_szDEF_SPR_NAME, "static_common_itemslot" ); pMultiIcon->SetTooltip(); } // Count Control. pCountControl = m_arrCountControl[ i ]; if( pCountControl ) pCountControl->SetShow( false ); } } //servantes 2010.10.25 SInventorySlot* SUIDestructionWnd::GetItemSlot(LPCSTR lpszControlID) { int index = -1; std::string strID = lpszControlID; std::string::size_type fPos = strID.find( "icon_item" ); if( fPos != std::string::npos ) { index = ::atoi( strID.substr( strlen( "icon_item" ) + 1, strID.size() ).c_str() ); } else return NULL; if( index != -1 && index < m_arrItems.size() ) { if( index < m_arrItems.size() ) { std::vector< SItemSet >::iterator it=m_arrItems.begin(); while( index ) { ++it; --index; } if( it != m_arrItems.end() ) { SItemSet itSet = *it; // 2011. 9. 19 - marine //return m_InventoryMgr.GetItemInfo( itSet.handle ); if(itSet.FromWhere == FROM_INVENTORY) return m_InventoryMgr.GetItemInfo( itSet.handle ); else return m_StorageMgr.GetItemInfo( itSet.handle ); } } } return NULL; } int SUIDestructionWnd::GetItemCount(LPCSTR lpszControlID) { int index = -1; std::string strID = lpszControlID; std::string::size_type fPos = strID.find( "icon_item" ); if( fPos != std::string::npos ) { index = ::atoi( strID.substr( strlen( "icon_item" ) + 1, strID.size() ).c_str() ); } else return NULL; if( index != -1 && index < m_arrItems.size() ) { if( index < m_arrItems.size() ) { std::vector< SItemSet >::iterator it=m_arrItems.begin(); while( index ) { ++it; --index; } if( it != m_arrItems.end() ) { SItemSet itSet = *it; return itSet.count.getAmount(); } } } return NULL; } int SUIDestructionWnd::SetItemCount(LPCSTR lpszControlID, int nCnt) { int index = -1; std::string strID = lpszControlID; std::string::size_type fPos = strID.find( "icon_item" ); if( fPos != std::string::npos ) { index = ::atoi( strID.substr( strlen( "icon_item" ) + 1, strID.size() ).c_str() ); } else return NULL; if( index != -1 && index < m_arrItems.size() ) { if( index < m_arrItems.size() ) { std::vector< SItemSet >::iterator it=m_arrItems.begin(); while( index ) { ++it; --index; } if( it != m_arrItems.end() ) { (*it).count = count_t(nCnt); } } } return NULL; }