\ #include "SunClientPrecompiledHeader.h" #include "RiderInventoryDialog.h" #include "SlotKeyGenerator.h" #include "ItemUnitRenderer.h" #include "GlobalFunc.h" #include "GameFunc.h" #include "Hero.h" #include "SlotKeyGenerator.h" #include "MouseHandler.h" #include "InterfaceManager.h" #include "uiToolTipMan/uiToolTipMan.h" #include "Mouse.h" #include "InventoryDialog.h" #include "ItemManager.h" #include "Rider.h" #include "RidingInfoParser.h" #include WzVector l_vNormal ={0.0f,0.0f,1.0f}; //---------------------------------------------------------------------------- /** */ RiderInventoryDialog::RiderInventoryDialog(InterfaceManager * pUIMan) : uiBase(pUIMan), m_pItemUnitRenderer(NULL), m_pDisplayRider(NULL), m_bSlotRider(FALSE), m_fScale(1.f), m_fAngleZ(0.3f), m_eRotateType(R_ROTATE_NONE), m_iTooltipStringCode(0), m_pCtrlCloseBtn(NULL) { m_pRotateBtn[0]=NULL; m_pRotateBtn[1]=NULL; m_UseTooltipCtrls.clear(); m_UseTooltipCtrls[RIDER_SLOT_01] = 12112; m_UseTooltipCtrls[RIDER_SLOT_02] = 12113; m_UseTooltipCtrls[RIDER_SLOT_03] = 12114; } //---------------------------------------------------------------------------- /** */ RiderInventoryDialog::~RiderInventoryDialog() { DeleteViewRider(); m_UseTooltipCtrls.clear(); this->Release(); } //---------------------------------------------------------------------------- /** */ POSTYPE RiderInventoryDialog::GetRiderSummonPos() { if(IsSlotRider()) { return m_SummmonPos; } return g_pHero->m_RiderInfo.m_RiderItemPos; } //---------------------------------------------------------------------------- /** */ VOID RiderInventoryDialog::Init( CDrawBase * pDrawBase ) { uiBase::Init(pDrawBase); m_pDraw = pDrawBase; InitRenderer(); InitControls(); } //---------------------------------------------------------------------------- /** ÄÁÆ®·Ñ·¯ ÃʱâÈ­ */ void RiderInventoryDialog::InitControls() { m_pCtrlCloseBtn=static_cast(getControl(RIDER_BTN_EXIT));//´Ý±â m_TxtCtrlTitle =static_cast(getControl(RIDER_BTN_TEXT));//¶óÀÌ´õ¸í m_pRotateBtn[0]=static_cast(getControl(RIDER_BTN_LEFT));//¿ÞÂÊ m_pRotateBtn[1]=static_cast(getControl(RIDER_BTN_RIGHT));//¿À¸¥ÂÊ } //------------------------------------------------------------------------------ int RiderInventoryDialog::getTooltipString(POSTYPE pos) { USE_TOOLTIP_CTRL_EQUIP_WINDOW::iterator iter; iter = m_UseTooltipCtrls.find(pos); if (iter != m_UseTooltipCtrls.end()) { return iter->second; } else { return 0; } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::DeleteViewRider() { UnlockSlotRider(); if(m_pDisplayRider) { m_pDisplayRider->Destroy(); SAFE_DELETE(m_pDisplayRider); } } //---------------------------------------------------------------------------- /** ½½·Ô¶óÀÌ´õ ¾ÆÀÌÅÛÀ» ¶ôÀ» Ç®¾îÁØ´Ù. */ void RiderInventoryDialog::UnlockSlotRider(BOOL bRemove) { if(m_bSlotRider) { m_bSlotRider = FALSE; SCItemSlot & RiderSlot = (SCItemSlot &)g_pHero->GetSlotContainer(SI_INVENTORY)->GetSlot(m_SummmonPos); if(RiderSlot.IsContainValidItem() && RiderSlot.IsRiderItem()) { if(RiderSlot.GetLaxLock()->IsLock()) { RiderSlot.GetLaxLock()->Clear(); } } if(bRemove && m_pDisplayRider) { m_pDisplayRider->Destroy(); SAFE_DELETE(m_pDisplayRider); } } } //---------------------------------------------------------------------------- /** ÁÖÀΰøÀÇ ¼ÒȯµÈ ¶óÀÌ´õ·ÎºÎÅÍ º¹»çº»À» ¸¸µé¾î³½´Ù. */ void RiderInventoryDialog::CopyHeroRider(Rider* pRIder) { //³Î°ªÀÌ µé¾î¿À¸é ÇØÁ¦Çعö¸°´Ù. if(pRIder) { UnlockSlotRider(); //ÃÖÃÊ»ý¼ºÀ̶ó¸é ¸Þ¸ð¸®ÇÒ´çÇØÁØ´Ù. if(!m_pDisplayRider) { m_pDisplayRider = new Rider; } //¿©±â¼­ºÎÅÍ º¹»çÇÑ´Ù. m_pDisplayRider->CopyRider(pRIder); //¾Ö´Ï¼ÂÆÃ m_pDisplayRider->SetAnimation(GlobalFunc::GetRiderAnimationByPlayerAni(eANI_STAND, false),TRUE); m_pDisplayRider->EnableFunction(FALSE); UpdateData(); } else { if(m_pDisplayRider) { DeleteViewRider(); } } } //---------------------------------------------------------------------------- /** ½½·Ô Á¤º¸·ÎºÎÅÍ ¶óÀÌ´õ º¹»çº»À» ¸¸µé¾î³½´Ù.(±âÇÑÁ¦¾ÆÀÌÅÛ ¸¸·á½Ã) */ void RiderInventoryDialog::CopySlotRider(POSTYPE pos) { //pos´Â Àκ¥Æ÷Áö¼ÇÀÌ´Ù: Àκ¥ÀǷκÎÅÍ View¶óÀÌ´õ¸¦ ¸¸µé¾î³½´Ù. SCItemSlot & RiderSlot = (SCItemSlot &)g_pHero->GetSlotContainer(SI_INVENTORY)->GetSlot(pos); //¶óÀÌ´õ¾ÆÀÌÅÛÀÎÁö üũ if(RiderSlot.IsRiderItem() && RiderSlot.IsContainValidItem()) { //ÁÖÀΰøÀÌ Å»°Í»óŰ¡ ¾Æ´Ï¿©¾ß ÇÑ´Ù. if(g_pHero->IsRiding()) { //6455 Å»°Í ¼Òȯ»óÅÂ·Î ÇØ´ç¾ÆÀÌÅÛÀ» »ç¿ëÇÒ¼ö¾ø½À´Ï´Ù. TCHAR szMessage[INTERFACE_STRING_LENGTH]; g_InterfaceManager.GetInterfaceString(6455,szMessage); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return; } //¢º¿©±â¼­ºÎÅÍ´Â ½½·Ôº¹»çº» ¶óÀÌ´õ»óŰ¡µÇ´Â°ÍÀÌ´Ù. m_bSlotRider = TRUE; //¶ô»óŰ¡¾Æ´Ï¶ó¸é Àá±ÅÁØ´Ù. if(!RiderSlot.GetLaxLock()->IsLock()) { m_SummmonPos = pos; RiderSlot.GetLaxLock()->EnterLock(); } //¾ÆÁ÷»ý¼ºÀÌ ¾ÈµÈ»óŶó¸é if(!m_pDisplayRider) { m_pDisplayRider = new Rider; } //¶óÀÌ´õ ½½·ÔÄÁÅ×À̳ʸ¦ À籸ÃàÇÑ´Ù. ±¸ÃàÈÄ¿¡´Â ÆÄÃ÷¸¦¹× ¹Ùµð¸¦ ¸¸µé¾î³½´Ù. this->CopyItem(RiderSlot); //¢º¿©±â¼­ºÎÅÍ ¿ÜÇüº¹»ç(À¯´Ö)°¡ÀÌ·ç¾îÁø´Ù. //step1:BODYº¹»ç m_pDisplayRider->CopyRiderBody(RiderSlot.GetItemInfo()->m_wSkillCode, g_pHero); UpdateData(); //step2:PARTSº¹»ç for(int i=0;iAttachRiderPart(i,rRiderPart.GetCode()); } else { m_pDisplayRider->DetachRiderPart(i); } } m_pDisplayRider->SetAnimation(GlobalFunc::GetRiderAnimationByPlayerAni(eANI_STAND, false),TRUE); m_pDisplayRider->EnableFunction(FALSE); } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::InitRenderer() { if (m_pItemUnitRenderer) { SAFE_RELEASENDELETE( m_pItemUnitRenderer ); } m_pItemUnitRenderer = new ItemUnitRenderer; m_pItemUnitRenderer->Init( m_pDraw, GetMaxSlotNum() ); m_pItemUnitRenderer->SetOverLap(FALSE); } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::OnShowWindow(BOOL val) { if(val) { #if NATION_BUILD_VERSION < 1004 //InventoryDialog *pInven = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); //if(pInven) //{ SolarDialog * pInven = ItemManager::Instance()->GetItemContainerDialog(SI_INVENTORY); if(pInven) { RECT rcHeroInven,rcRiderInven; pInven->GetDialogWZ()->GetClientRect(&rcHeroInven); GetDialogWZ()->GetDlgSize(&rcRiderInven); //Àκ¥ ¾Æ·¡ÂÊ¿¡ ºÙÀÓ MoveWindowWZ(rcHeroInven.left, rcHeroInven.bottom); } //} #endif //NATION_BUILD_VERSION //! //------------------------------------------------------------------------------ } else { UnlockSlotRider(TRUE); } } //---------------------------------------------------------------------------- /** Çʵ尣 À̵¿½Ã ÀúÀåÁ¤º¸¸¦ ÅëÇØ Å»°ÍÀ» ¿ø·¡µÇ·Î µÇµ¹¸°´Ù */ void RiderInventoryDialog::ReloadRider(SCItemSlot &RiderSlot) { //ÆÄÃ÷º¯°æ½Ã ±âÁ¸ ÄÁÅ×À̳ʸ¦ ÀüºÎ ³¯¸°´Ù. Clear(); if(RiderSlot.IsRiderItem()) { DWORD dwRiderCode = RiderSlot.GetItemInfo()->m_wSkillCode; for(int i=0;iInsertSlot( i, ItemSlot); } } else { _asm nop; } } if(dwRiderCode!=0) { g_pHero->CreateRider(dwRiderCode); g_pHero->RefreshRider(); } } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::renderToolTip() { uiToolTipMan* pUIMan = (uiToolTipMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_TOOLTIP); if(!pUIMan) { return; } if ( this->m_MouseOverObject.eMouseOverType != eMOUSE_OVER_MAX) { if ( eMOUSE_OVER_SLOT == m_MouseOverObject.eMouseOverType && m_MouseOverObject.pSlot) { pUIMan->InitTooltip(); pUIMan->RegisterSlotInfoTooltip(static_cast( m_MouseOverObject.pSlot )); pUIMan->SetTooltipDialogID(GetDialogKey()); } } int iMouseX = Mouse::Instance()->GetMouseX(); int iMouseY = Mouse::Instance()->GetMouseY(); BOOL bMouseOver = FALSE; for (POSTYPE a = 0; a < MAX_RIDER_SLOT; a++) { CControlWZ * pControl = getControl(a); 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; } else { if(m_iTooltipStringCode) { pUIMan->RegisterTooltipWithStringCode(m_iTooltipStringCode); pUIMan->SetTooltipDialogID(GetDialogKey()); } } } //---------------------------------------------------------------------------- /** ¸Þ½ÃÁöó¸® */ VOID RiderInventoryDialog::MouseOver_MsgProc( SI_MESSAGE * pMessage ) { switch( pMessage->eResultMsg ) { case RT_MSG_MOUSEOVER: { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); if (pos >= 0 && pos = GetMaxSlotNum() ) { // À߸øµÈ ½½·Ô À§Ä¡¸¦ ÂüÁ¶ÇÒ·Á°íÇÑ´Ù ¸®ÅÏ. return; } if (!IsEmpty( pos )) { m_iTooltipStringCode = 0; SCSlot & rSlot = GetSlot( pos ); m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT; m_MouseOverObject.pSlot = &rSlot; } else { m_iTooltipStringCode = getTooltipString(pos); m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; } } else { m_iTooltipStringCode = 0; m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; } } break; } } //---------------------------------------------------------------------------- /** ½½·Ô»ðÀÔ */ RC::eSLOT_INSERT_RESULT RiderInventoryDialog::InsertSlot(POSTYPE AtPos, SCSlot& rSlot) { //slot_safe_code:¾ÈÀüÇÑ ½½·Ôüũ ±¸¹®(»ðÀÔ) if (ValidPos(AtPos) == false) { return RC_INSERT_SLOT_FAILED; } // ½½·Ô¿¡ ³ÖÀ½ RC::eSLOT_INSERT_RESULT eInsertSlotResult = RiderContainer::InsertSlot( AtPos, rSlot ); // Ŭ¶ó¿¡¼­ µû·Î ½Ã¸®¾óÀ» ¹ß±ÞÇÑ´Ù. SCSlot &SlotRef = GetSlot(AtPos); /// Àκ¥Å丮 CControlWZ * pCtrl = getControl(AtPos); if(pCtrl && m_pItemUnitRenderer) { RECT rect = pCtrl->GetSizeRect(); m_pItemUnitRenderer->AddItemUnit( SlotRef.GetSerial(), SlotRef.GetCode(), &rect, &SlotRef, pCtrl); } return eInsertSlotResult; } //---------------------------------------------------------------------------- /** ½½·ÔÁ¦°Å */ BOOL RiderInventoryDialog::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() ); } RiderContainer::DeleteSlot(AtPos, pSlotOut ); return TRUE; } //---------------------------------------------------------------------------- /** µð½ºÇ÷¹ÀÌ¿ë ¶óÀÌ´õ¸¦ ¾Ö´Ï¸ÞÀ̼ǽÃÄÑÁØ´Ù. */ VOID RiderInventoryDialog::Process(DWORD dwTick) { if(g_pHero && m_pDisplayRider) { m_pDisplayRider->Process(dwTick, NULL); m_pDisplayRider->AnimateUnit(NULL); } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::updateRotate() { static float fRange = 0.07f; if(m_eRotateType==R_ROTATE_NONE) { return; } switch(m_eRotateType) { case R_ROTATE_LEFT: { rotateRider(fRange); } break; case R_ROTATE_RIGHT: { rotateRider(-fRange); } break; } RECT rc; GetDialogWZ()->GetClientRect(&rc); int iMouseX = Mouse::Instance()->GetMouseX(); int iMouseY = Mouse::Instance()->GetMouseY(); if (rc.left <= iMouseX && rc.right >= iMouseX) { if (rc.top <= iMouseY && rc.bottom >= iMouseY) { return; } } m_eRotateType=R_ROTATE_NONE; } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::OnUpdateSolarDialog() { if(m_pItemUnitRenderer) { m_pItemUnitRenderer->Update(); updateRotate(); } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::UpdateData() { if(!m_TxtCtrlTitle) return; POSTYPE Pos= g_pHero->IsRiding() ? (g_pHero->m_RiderInfo.m_RiderItemPos):(m_SummmonPos); SCItemSlot & rSlot = (SCItemSlot &)g_pHero->GetSlotContainer(SI_INVENTORY)->GetSlot(Pos); GlobalFunc::SetCaption(m_TxtCtrlTitle,""); if( rSlot.IsContainValidItem() && rSlot.IsRiderItem()) { if(m_pDisplayRider) { const sRiderInfo* pRiderInfo = RidingInfoParser::Instance()->GetInfo(rSlot.GetItemInfo()->m_wSkillCode); m_fScale = (pRiderInfo) ? (pRiderInfo->size_control_):(1.f); WzVector vScale = {m_fScale,m_fScale,m_fScale}; //ȸÀü°¢Àº °è¼ÓÀ¯Áö m_pDisplayRider->SetRotation(&l_vNormal,m_fAngleZ); m_pDisplayRider->SetScale(vScale); static int nLod =0; m_pDisplayRider->SetForceLod(nLod); } TCHAR szName[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString( rSlot.GetItemInfo()->m_NCode, szName, INTERFACE_STRING_LENGTH ); GlobalFunc::SetCaption(m_TxtCtrlTitle, szName); } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::OnRenderSolarDialog() { if(m_pItemUnitRenderer) { m_pItemUnitRenderer->Render(); } RenderRider(); renderToolTip(); } //---------------------------------------------------------------------------- /** ¶óÀÌ´õ ºäÆ÷Æ®¿¡·£´õÇϱâ(¿©±â¼­ ¾Ö´Ï¸ÞÀ̼ÇÇÑ´Ù) */ void RiderInventoryDialog::RenderRider() { CControlWZ *pControl = getControl(RIDER_SLOT_VIEW); if (pControl && m_pDisplayRider) { RECT rcSize = pControl->GetSizeRect(); const float fMeshHeight = 2.6f; const float fMeshWidth = 4.0f; // ºäÆ÷Æ®´Â ¹Ýµå½Ã g_InterfaceManager.CalcuateViewPortWithRect·Î »ý¼ºÇؾßÇÔ RECT rcViewport; rcViewport = g_InterfaceManager.CalcuateViewPortWithRect(rcSize); g_InterfaceManager.RenderRiderOnRect(m_pDisplayRider,rcViewport,fMeshWidth,fMeshHeight); } } //---------------------------------------------------------------------------- /** */ void RiderInventoryDialog::FlushUnitDraw() { if (!m_pItemUnitRenderer) { return; } for (int i = 0; i < GetMaxSlotNum(); ++i) { if( !IsEmpty(i) ) { DeleteSlot(i, NULL); } } } //---------------------------------------------------------------------------- /** */ VOID RiderInventoryDialog::Release() { FlushUnitDraw(); SAFE_RELEASENDELETE( m_pItemUnitRenderer ); RiderContainer::Release(); } //---------------------------------------------------------------------------- /** */ RiderContainer* RiderInventoryDialog::GetSlotContainer() { return static_cast(this); } void RiderInventoryDialog::rotateRider(float fAngle) { if(m_pDisplayRider) { m_fAngleZ += fAngle; // 0~360µµ »çÀÌ·Î À¯Áö ClampAngle(&m_fAngleZ); m_pDisplayRider->SetRotation(&l_vNormal,m_fAngleZ); } } //---------------------------------------------------------------------------- /** */ VOID RiderInventoryDialog::MessageProc( SI_MESSAGE * pMessage ) { switch( pMessage->eResultMsg ) { case RT_MSG_LBUTTONUP: { m_eRotateType = R_ROTATE_NONE; } break; case RT_MSG_LBUTTONCLICK: { m_eRotateType = R_ROTATE_NONE; if(getCtrlIDToPos( pMessage->dwCtrlID )==RIDER_BTN_EXIT) { ShowInterface(FALSE); } } break; case RT_MSG_LBUTTONDOWN: { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); switch(pos) { case RIDER_BTN_LEFT: { m_eRotateType = R_ROTATE_LEFT; } break; case RIDER_BTN_RIGHT: { m_eRotateType = R_ROTATE_RIGHT; } break; } //¶óÀÌ´õÀκ¥¿¡ ¾ÆÀÌÅÛ ³õ´Ù. if(pos <= RIDER_SLOT_03) { CControlWZ * pControl = getControl(pos); if (pControl) { RECT rcSlot = pControl->GetSizeRect(); MouseHandler::Instance()->ItemTransaction(SI_RIDER, (pos), &rcSlot); break; } } } break; default: { SolarDialog::MessageProc( pMessage ); } break; } }