#include "SunClientPrecompiledHeader.h" #include "LotteryInventoryDialog.h" #include "SlotKeyGenerator.h" #include "ItemUnitRenderer.h" #include "GlobalFunc.h" #include "Hero.h" #include "SlotKeyGenerator.h" #include "MouseHandler.h" #include "InterfaceManager.h" #include "uiToolTipMan/uiToolTipMan.h" #include "Mouse.h" #include "KeyQueueManager.h" #include "Application.h" #include "CastLeaveFieldDialog.h" #include "CursorChangeTransact.h" #include "InventoryDialog.h" #include "ItemManager.h" #include "LotteryInfoParser.h" #include //---------------------------------------------------------------------------- /** */ WzID LotteryInventoryDialog::m_wzId[LOTTERY_MAX] = { StrToWzID("BT00"),//LOTTERY_SLOT_00 StrToWzID("BT01"),//LOTTERY_SLOT_01 StrToWzID("BT02"),//LOTTERY_SLOT_02 StrToWzID("BT03"),//LOTTERY_SLOT_03 StrToWzID("BT04"),//LOTTERY_SLOT_04 StrToWzID("BT05"),//LOTTERY_SLOT_05 StrToWzID("BT06"),//LOTTERY_SLOT_06 StrToWzID("BT07"),//LOTTERY_SLOT_07 StrToWzID("ST00"),//LOTTERY_TEXT StrToWzID("BT08"),//LOTTERY_BTN_OK StrToWzID("BT09"),//LOTTERY_BTN_CLOSE }; //---------------------------------------------------------------------------- /** */ LotteryInventoryDialog::LotteryInventoryDialog(InterfaceManager * pUIMan) : uiBase(pUIMan), m_pItemUnitRenderer(NULL), m_pCtrlOkBtn(NULL), m_pCtrlCloseBtn(NULL) { SCItemSlotContainer::Init( MAX_PANDORA_SLOT_NUM, SI_LOTTERY ); } //---------------------------------------------------------------------------- /** */ LotteryInventoryDialog::~LotteryInventoryDialog() { this->Release(); } //---------------------------------------------------------------------------- /** */ VOID LotteryInventoryDialog::Init( CDrawBase * pDrawBase ) { uiBase::Init(pDrawBase); m_pDraw = pDrawBase; InitRenderer(); InitControls(); } //---------------------------------------------------------------------------- /** ÄÁÆ®·Ñ·¯ ÃʱâÈ­ */ void LotteryInventoryDialog::InitControls() { m_pCtrlOkBtn = static_cast(getControl(LOTTERY_BTN_OK)); m_pCtrlCloseBtn = static_cast(getControl(LOTTERY_BTN_CLOSE)); m_TxtCtrlTitle = static_cast(getControl(LOTTERY_TEXT)); } //---------------------------------------------------------------------------- /** */ void LotteryInventoryDialog::InitRenderer() { if (m_pItemUnitRenderer) { SAFE_RELEASENDELETE( m_pItemUnitRenderer ); } m_pItemUnitRenderer = new ItemUnitRenderer; m_pItemUnitRenderer->Init( m_pDraw, GetMaxSlotNum() ); m_pItemUnitRenderer->SetOverLap(FALSE); } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó ¾ÆÀÌÅÛ ÀϰýÀ̵¿ */ void LotteryInventoryDialog::SendItemMoveAllSync() { MSG_CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN SendPacket; SendPacket.m_InventoryPos = m_InvenPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó »óÀÚ ´Ý±â */ void LotteryInventoryDialog::SendItemCloseSync() { MSG_CG_ITEM_PANDORABOX_CLOSE_SYN SendPacket; SendPacket.m_InventoryPos = this->m_InvenPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó »óÀÚ ¿ÀÇ */ void LotteryInventoryDialog::SendItemUseSync(BOOL bOpen) { MSG_CG_ITEM_USE_PANDORA_ITEM_SYN SendPacket; SendPacket.m_InventoryPos = this->m_InvenPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó »óÀÚ ¿ÀÇ */ void LotteryInventoryDialog::SetLotteryOpenStatus(BOOL bOpen) { SCSlotContainer * pInvenContainer = g_pHero->GetSlotContainer( SI_INVENTORY); if(!pInvenContainer) return; SCItemSlot & rItemSlot = static_cast(pInvenContainer->GetSlot(m_InvenPos)); SCLottoInfo* pSlotLottoInfo= rItemSlot.GetLottoInfo(); if (pSlotLottoInfo) { pSlotLottoInfo->SetOpenStatus(bOpen); } } //---------------------------------------------------------------------------- /** ·Î¶Ç¾ÆÀÌÅÛ ½½·ÔÁ¤º¸°»½Å(½½·Ô¹öÀü¹Ù²ñ) */ void LotteryInventoryDialog::RefreshLotteryItem(SCItemSlot &rcLottoSlot) { SCSlotContainer * pInvenContainer = g_pHero->GetSlotContainer( SI_INVENTORY); if(!pInvenContainer) return; SCItemSlot & rItemSlot = static_cast(pInvenContainer->GetSlot(m_InvenPos)); //¼­¹ö·ÎºÎÅÍ ¹ÞÀº ¿øº»ÀÌ´Ù ¿ä°ñ ¾Æ·¡Àִ³ðÇÑÅ× º¹»ç½ÃÄÑÁà¾ßµÈ´Ù -_- º¹Àâ; SCLottoInfo* pSrcSlot= rcLottoSlot.GetLottoInfo(); SCLottoInfo* pDestSlot= rItemSlot.GetLottoInfo(); if(!pDestSlot) return; pDestSlot->SetCount(pSrcSlot->GetCount()); pDestSlot->SetOpenStatus(TRUE); pDestSlot->SetLottoIndex(pSrcSlot->GetLottoIndex()); pDestSlot->SetIdentityStatus(pSrcSlot->GetIdentityStatus()); for(int i=0;iGetMiniSlot(i); MiniSlot TempMiniSlot; TempMiniSlot.ExistItem = srcMiniSlot.ExistItem; TempMiniSlot.InfoPos = srcMiniSlot.InfoPos; TempMiniSlot.Random = srcMiniSlot.Random; pDestSlot->SetMiniSlot(i,TempMiniSlot); } } //---------------------------------------------------------------------------- /** ½½·ÔÀ»µ¹¸é¼­ ¾ÆÅÛ·£´õÁ¤º¸ »ðÀÔ */ void LotteryInventoryDialog::RefreshPandoraSlot() { ItemUnitRenderer::RenderUnit * pRender = NULL; RECT rcSlot; CControlWZ * pCtrl = NULL; for(int i=0;iGetItemUnit( rSlot.GetSerial() ); if (pRender == NULL) { pCtrl = getControl( i ); rcSlot = pCtrl->GetSizeRect(); m_pItemUnitRenderer->AddItemUnit( rSlot.GetSerial(), rSlot.GetCode(), &rcSlot, &rSlot ,pCtrl); } if (pRender) { pRender->SetShow(TRUE); } } } } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó »óÀÚ»ý¼º */ void LotteryInventoryDialog::CreatePandoraSlot(ITEMSTREAMEX &rItemInfo) { if(!g_pHero) return; SCItemSlot slot; slot.Copy(rItemInfo); //·Î¶Ç¾ÆÀÌÅÛÀϰæ¿ì¸¸ÇÑ´Ù. if(!slot.IsLottoItem()) { return; } SCLottoInfo* scLottoInfo = slot.GetLottoInfo(); if(!scLottoInfo) { return; } const LotteryIndexGroup* pLotteryGroup = LotteryInfoParser::Instance()->GetLotteryIndexGroup(scLottoInfo->GetLottoIndex()); if(!pLotteryGroup) return; for(int i=0;iDeleteSlot(i,NULL); MiniSlot minislot = scLottoInfo->GetMiniSlot(i); if(!minislot.ExistItem) continue; const MiniSlotInfo* Minislotinfo = pLotteryGroup->GetMiniSlotInfo(minislot.InfoPos); if (Minislotinfo == NULL) { continue; } SCItemSlot ItemSlot; ItemSlot.SetSlotType(ST_ITEM); SLOTCODE ItemCode = (SLOTCODE)(Minislotinfo->Random ? (7270):(Minislotinfo->Index)); ItemSlot.SetCode(ItemCode); this->InsertSlot( i, ItemSlot); } RefreshLotteryItem(slot);//Àκ¥½½·Ô°»½Å RefreshPandoraSlot(); } //---------------------------------------------------------------------------- /** ÆÇµµ¶ó ÅøÆÁ·£´õ¸µ */ void LotteryInventoryDialog::renderToolTip() { if ( this->m_MouseOverObject.eMouseOverType != eMOUSE_OVER_MAX) { if ( eMOUSE_OVER_SLOT == m_MouseOverObject.eMouseOverType ) { uiToolTipMan* pUIMan = (uiToolTipMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_TOOLTIP); if(pUIMan && m_MouseOverObject.pSlot) { //GS_BUG_FIX¹°À½Ç¥¾ÆÀÌÅÛÀº Ç¥±â¾ÈÇÔ if(m_MouseOverObject.pSlot->GetCode()!=7270) { pUIMan->InitTooltip(); pUIMan->SetTooltipDialogID(GetDialogKey()); pUIMan->RegisterPandoraItemName(static_cast( m_MouseOverObject.pSlot )); } } } } int iMouseX = Mouse::Instance()->GetMouseX(); int iMouseY = Mouse::Instance()->GetMouseY(); BOOL bMouseOver = FALSE; for (POSTYPE a = 0; a < MAX_PANDORA_SLOT_NUM; a++) { CControlWZ * pControl = getControl(a); // ½½·Ô¿¡ ¼±ÅÃµÈ ¾ÆÀÌÅÛ Ç¥½ÃÇϱâ if (!IsEmpty( a )) { int islotcode = SCSlotContainer::GetSlot(a).GetCode(); //¹°À½Ç¥¾ÆÀÌÅÛ¸¸ ¹Ý¦ÀδÙ. if(SCSlotContainer::GetSlot(a).GetCode()==7270) { CControlWZ* pControl = this->getControl(a); RECT rt = pControl->GetSizeRect(); g_InterfaceManager.RenderActivateMark( rt.left - 13, rt.top - 13); } } if(pControl && bMouseOver==FALSE) { RECT rc = pControl->GetSizeRect(); if (rc.left <= iMouseX && rc.right >= iMouseX) { if (rc.top <= iMouseY && rc.bottom >= iMouseY) { bMouseOver = TRUE; } } } } if ( !bMouseOver ) { m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; return; } } //---------------------------------------------------------------------------- /** ¸Þ½ÃÁöó¸® */ VOID LotteryInventoryDialog::MouseOver_MsgProc( SI_MESSAGE * pMessage ) { switch( pMessage->eResultMsg ) { case RT_MSG_MOUSEOVER: { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); if (pos < this->GetMaxSlotNum() && pos >= 0 && pos < MAX_PANDORA_SLOT_NUM) { if (!IsEmpty( pos )) { SCSlot & rSlot = GetSlot( pos ); m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT; m_MouseOverObject.pSlot = &rSlot; } else { m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; } } else { m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; } } break; } } //---------------------------------------------------------------------------- /** ½½·Ô»ðÀÔ */ RC::eSLOT_INSERT_RESULT LotteryInventoryDialog::InsertSlot(POSTYPE AtPos, SCSlot& rSlot) { //slot_safe_code:¾ÈÀüÇÑ ½½·Ôüũ ±¸¹®(»ðÀÔ) if (ValidPos(AtPos) == false) { return RC_INSERT_SLOT_FAILED; } // ½½·Ô¿¡ ³ÖÀ½ RC::eSLOT_INSERT_RESULT eInsertSlotResult = SCSlotContainer::InsertSlot( AtPos, rSlot ); // Ŭ¶ó¿¡¼­ µû·Î ½Ã¸®¾óÀ» ¹ß±ÞÇÑ´Ù. DBSERIAL dwSerial = g_SlotKeyGenerator.GetKey(); SCSlot & rSetSlot = GetSlot(AtPos); rSetSlot.SetSerial(dwSerial); /// Àκ¥Å丮 CControlWZ * pCtrl = getControl(AtPos); RECT rect = pCtrl->GetSizeRect(); if(m_pItemUnitRenderer) { m_pItemUnitRenderer->AddItemUnit( rSetSlot.GetSerial(), rSetSlot.GetCode(), &rect, &rSetSlot, pCtrl); } else { assert(!"m_pItemUnitRenderer == NULL"); } return eInsertSlotResult; } //---------------------------------------------------------------------------- /** ½½·ÔÁ¦°Å */ BOOL LotteryInventoryDialog::DeleteSlot( POSTYPE AtPos, SCSlot * pSlotOut ) { //slot_safe_code: ¾ÈÀüÇÑ ½½·Ôüũ ±¸¹®(»èÁ¦) if ((ValidPos(AtPos) == false) || IsEmpty(AtPos)) { return FALSE; } SCItemSlot & rItemSlot = (SCItemSlot & )GetSlot(AtPos); if(m_pItemUnitRenderer) { m_pItemUnitRenderer->RemoveItemUnit( rItemSlot.GetSerial() ); } else { assert(!"m_pItemUnitRenderer == NULL"); } g_SlotKeyGenerator.Restore((DWORD)rItemSlot.GetSerial()); SCSlotContainer::DeleteSlot(AtPos, pSlotOut ); return TRUE; } //---------------------------------------------------------------------------- /** */ void LotteryInventoryDialog::OnUpdateSolarDialog() { if(m_pItemUnitRenderer) m_pItemUnitRenderer->Update(); //safecode:´Ù¸¥¶ôÀÌ º¹±ÇâÀ» µ¤¾î¹ö·ÈÀ»°æ¿ì °­Á¦·Î ´Ý¾Æ¹ö¸°´Ù. if(!g_InterfaceManager.IsLockDlg()) { this->ShowInterface(FALSE); } } //---------------------------------------------------------------------------- /** */ void LotteryInventoryDialog::SetPandoraBoxName() { if(!m_TxtCtrlTitle) return; SCSlotContainer * pInvenContainer = g_pHero->GetSlotContainer( SI_INVENTORY); if(!pInvenContainer) return; SCItemSlot & rItemSlot = static_cast(pInvenContainer->GetSlot(m_InvenPos)); const BASE_ITEMINFO * pItemInfo = rItemSlot.GetItemInfo(); if(!pItemInfo) return; TCHAR szName[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString( pItemInfo->m_NCode, szName, INTERFACE_STRING_LENGTH ); GlobalFunc::SetCaption(m_TxtCtrlTitle, szName); } //---------------------------------------------------------------------------- /** */ void LotteryInventoryDialog::OnRenderSolarDialog() { //¶ôÀϰæ¿ì¸¸ ¾ÏÀüÈ¿°ú ³Ö´Â´Ù if(g_InterfaceManager.IsLockDlg()) { POINT pt = g_pApplication->Get2DModeMapping(); RECT rc; SetRect(&rc,0,0,pt.x,pt.y); g_pSunRenderer->ColorFill(WzColor_RGBA(0,0,0,128),0,0,(float)rc.right,(float)rc.bottom); GetDialogWZ()->OnDraw(true); } if(m_pItemUnitRenderer) m_pItemUnitRenderer->Render(); renderToolTip(); } //---------------------------------------------------------------------------- /** */ void LotteryInventoryDialog::FlushUnitDraw() { if (!m_pItemUnitRenderer) { return; } for (int i = 0; i < GetMaxSlotNum(); ++i) { if( !IsEmpty(i) ) { DeleteSlot(i, NULL); } } } //---------------------------------------------------------------------------- /** */ VOID LotteryInventoryDialog::Release() { FlushUnitDraw(); SAFE_RELEASENDELETE( m_pItemUnitRenderer ); SCItemSlotContainer::Release(); } //---------------------------------------------------------------------------- /** */ SCSlotContainer* LotteryInventoryDialog::GetSlotContainer() { return static_cast(this); } //---------------------------------------------------------------------------- /** */ VOID LotteryInventoryDialog::MessageProc( SI_MESSAGE * pMessage ) { switch( pMessage->eResultMsg ) { case RT_MSG_RBUTTONCLICK: { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); //ÆÇµµ¶ó ½½·Ô¾ÆÀÌÅÛÀ» Àκ¥À¸·Î À̵¿½ÃŲ´Ù. if( pos < MAX_PANDORA_SLOT_NUM ) { if(IsEmpty(pos)) break; MSG_CG_ITEM_MOVE_PANDORA_ITEM_SYN SendPacket; SendPacket.m_InventoryPos = m_InvenPos; SendPacket.m_PandoraItemPosFrom = pos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); } } break; case RT_MSG_EDIT_ENTERKEYDOWN: { } break; case RT_MSG_LBUTTONCLICK: { //¶ô»óÅ¿¡¼­¸¸ ¹ÝÀÀÇÑ´Ù. if(g_InterfaceManager.IsLockDlg()) { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); switch(pos) { //¾ÆÀÌÅÛÀ» ÀϰýÀ̵¿½ÃŲ´Ù. case LOTTERY_BTN_OK: { g_InterfaceManager.UnLockDlgs(); //Àκ¥Å丮´Â ¶ô°ÉÀÚ uiInventoryMan* inventory_manager = GET_DIALOG_MANAGER(uiInventoryMan, UIMAN_INVENTORY); if (inventory_manager != NULL) { inventory_manager->LockInventoryUI(); } //ÆÇµµ¶óÀÌÀÌÅÛ ÀϰýÀ̵¿ MouseHandler::Instance()->RollbackItemAtHand(); SendItemMoveAllSync(); } break; //âÀ» ´Ý´Â´Ù´Â ÆÐŶÀ» ¼­¹ö¿¡°Ô º¸³»ÁØ´Ù. case LOTTERY_BTN_CLOSE: { g_InterfaceManager.UnLockDlgs(); this->ShowInterface(FALSE); SendItemCloseSync(); } break; } } } break; default: { SolarDialog::MessageProc( pMessage ); } break; } }