#include "StdAfx.h" #include "FriendWindow.h" #include "UIImage.h" #include "ChatWindow.h" #include "ChatManager.h" #include "Button.h" #include "RadioButton.h" #include "GameUIManager.h" #include "Player_Common.h" #include "PartyManager.h" #include "GameResourceManager.h" #include "ObjectManager.h" #include "Hero.h" cFriendWindow::cFriendWindow() : mpFriendList(0) , mParty(0) , mAddFriend(0) , mDelFriend(0) , mWhisper(0) { for( int i = 0; i < MAXPAGE_NUM; ++i ) mpRadioNode[i] = 0; memset( mpNodeSkin, 0, sizeof(mpNodeSkin) ); } cFriendWindow::~cFriendWindow() { Clear(); } /// void cFriendWindow::Clear() { if( mpFriendList ) mpFriendList->Clear(); /// ¹öư ¼³Á¤ ÃʱâÈ­ if( mParty ) mParty->SetEnabled( false ); if( mDelFriend ) mDelFriend->SetEnabled( false ); if( mWhisper ) mWhisper->SetEnabled( false ); for( int i = 0 ; i < MAXPAGE_NUM; ++i ) { if( mpRadioNode[i] ) mpRadioNode[i]->Hide(); } } /// ÁÖÀÇ»çÇ× : bool cFriendWindow::OnCreate( cUINodeProperty* pproperty ) { if( cUIWindow::OnCreate( pproperty ) == false ) return false; mpFriendList = (cFriendListbox*)GetChild( eUIID_GAME_FRIEND_LISTBOX ); mParty = (cButton*)GetChild( eUIID_GAME_FRIEND_PARTYBUTTON ); mAddFriend = (cButton*)GetChild( eUIID_GAME_FRIEND_ADDFRIENDBUTTON ); mDelFriend = (cButton*)GetChild( eUIID_GAME_FRIEND_DELETEFREINDBUTTON ); mWhisper = (cButton*)GetChild( eUIID_GAME_FRIEND_WHISPERBUTTON ); /// ¹öư ÃʱâÈ­ ¼³Á¤ if( mParty ) mParty->SetEnabled( false ); if( mDelFriend ) mDelFriend->SetEnabled( false ); if( mWhisper ) mWhisper->SetEnabled( false ); /// »ç¿ëÀ̹ÌÁö »ý¼º cUISkin* pSkin = UIMAN->GetSkin(); if( !pSkin ) { assert(0); return false; } cString str[FRIEND_IMGNUM]; str[0] = "Human_M"; str[1] = "Beast_M"; str[2] = "Elf_M"; str[3] = "Human_W"; str[4] = "Beast_W"; str[5] = "Elf_W"; for( int i = 0; i < FRIEND_IMGNUM; ++i ) { cUINodeSkin* pNodeSkin = pSkin->GetNodeSkin( str[i] ); if( pNodeSkin ) mpNodeSkin[i] = pNodeSkin; else { assert(0); return false; } } for( int i = 0; i < MAXPAGE_NUM; ++i ) { mpRadioNode[i] = GetChild( eUIID_GAME_FRIEND_PAGERADIO1 + i ); if( mpRadioNode[i] ) mpRadioNode[i]->Hide(); } return true; } void cFriendWindow::UpdateSkin() { cUIWindow::UpdateSkin(); UpdateButton(); } /// void cFriendWindow::OnListBoxChanged( cUINode*, unsigned int ) { if( !mpFriendList ) { assert(0); return; } unsigned int index = mpFriendList->GetSelectIndex(); unsigned long characterIdx = (unsigned long)mpFriendList->GetExtraData( index ); sFriendData* data = CHATMANAGER->GetFriendData( characterIdx ); if( !data ) { assert(0); return; } bool connect = (data->ChannelNum > 0); if( mParty ) mParty->SetEnabled( connect ); if( mWhisper ) mWhisper->SetEnabled( connect ); } /// void cFriendWindow::OnCommand( cUINode*, unsigned int id ) { if( !mpFriendList ) return; switch( id ) { case eUIID_GAME_FRIEND_CLOSE: Hide(); break; case eUIID_GAME_FRIEND_PARTYBUTTON: { /// ÆÄƼ ¿äû unsigned int index = mpFriendList->GetSelectIndex(); unsigned long characterIdx = (unsigned long)mpFriendList->GetExtraData( index ); sFriendData* data = CHATMANAGER->GetFriendData( characterIdx ); if( !data ) { assert(0); return; } PARTYMAN->RequestPartyAdd( data->CharacterName ); } break; case eUIID_GAME_FRIEND_WHISPERBUTTON: { /// ±Ó¼Ó¸» ÀÚµ¿ÀÔ·Â cChatWindow* pWindow = (cChatWindow*)UIMAN->FindNodeByID( eUIID_GAME_CHATWINDOW ); if( pWindow ) { /// ¼±ÅÃµÈ Ä£±¸ÀÇ ¾ÆÀ̵𸦠°¡Á®¿È unsigned int index = mpFriendList->GetSelectIndex(); unsigned long characterIdx = (unsigned long)mpFriendList->GetExtraData( index ); sFriendData* data = CHATMANAGER->GetFriendData( characterIdx ); if( !data ) { assert(0); return; } /// "/w %s " cStringT str; str.Format( UIMAN->GetUIText(10005), data->CharacterName ); /// äÆÃÀ©µµ¿ì·Î Æ÷Ä¿½º ¿Å±â±â pWindow->SetFocusToEdit(); pWindow->SetChatText( (LPCTSTR)str.Cstr() ); } } break; case eUIID_GAME_FRIEND_ADDFRIENDBUTTON: { /// Ä£±¸ Ãß°¡ â ¶ç¿ì±â UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_FRIEND_ADD, eSKIN_EDIT, GAMERESOURCEMAN->GetGameText( 21 ), // Ä£±¸ Ãß°¡ ¸Þ½ÃÁö GAMERESOURCEMAN->GetGameText( 18 ), // Ä£±¸Ãß°¡ 0, 0, 0, false, false, 2, MAX_NAME_SIZE ); } break; case eUIID_GAME_FRIEND_DELETEFREINDBUTTON: if( mpFriendList->GetRowCount() > 0 ) { unsigned int index = mpFriendList->GetSelectIndex(); unsigned long characterIdx = (unsigned long)mpFriendList->GetExtraData( index ); sFriendData* data = CHATMANAGER->GetFriendData( characterIdx ); if( !data ) { assert(0); return; } /// Ä£±¸ »èÁ¦ â ¶ç¿ì±â UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_FRIEND_DELETE, eSKIN_YESNO, GAMERESOURCEMAN->GetGameText( 22 ), // Ä£±¸ »èÁ¦ ¸Þ½ÃÁö GAMERESOURCEMAN->GetGameText( 19 ), // Ä£±¸»èÁ¦ (void*)data->Idx ); } break; default: assert(0); break; } } /// void cFriendWindow::OnRadioPressed( cUINode*, unsigned int id ) { int row = 0; switch( id ) { case eUIID_GAME_FRIEND_PAGERADIO1: row = 0; break; case eUIID_GAME_FRIEND_PAGERADIO2: row = 10; break; case eUIID_GAME_FRIEND_PAGERADIO3: row = 20; break; case eUIID_GAME_FRIEND_PAGERADIO4: row = 30; break; case eUIID_GAME_FRIEND_PAGERADIO5: row = 40; break; default: assert(0); return; } if( mpFriendList ) mpFriendList->ChangeTopIndex( row ); } /// bool cFriendWindow::AddFriend( sFriendData* data ) { if( !data ) { assert(0); return false; } if( !mpFriendList ) { assert(0); return false; } // °¹¼ö Á¦ÇÑ °Ë»ç if( mpFriendList->GetRowCount() >= MAX_FRIEND ) { assert(0); return false; } // µ¥ÀÌÅÍ »ðÀÔ char i = GetFriendImage( data->Race, data->Gender ); if( i >= FRIEND_IMGNUM ) { assert(0); return false; } if( mpNodeSkin[i] ) { cUIImage* image = 0; image = new cUIImage( mpNodeSkin[i]->mpTexture ); if( image ) { unsigned int tx = mpNodeSkin[i]->mSkinInfo->mTexX; unsigned int ty = mpNodeSkin[i]->mSkinInfo->mTexY; unsigned int tw = mpNodeSkin[i]->mSkinInfo->mTexWidth; unsigned int th = mpNodeSkin[i]->mSkinInfo->mTexHeight; int x = mpNodeSkin[i]->mSkinInfo->mX; int y = mpNodeSkin[i]->mSkinInfo->mY; image->SetTextureRect( tx, ty, tx + tw, ty + th ); image->SetScreenRect( cUIRect( x, y, x+tw, y+th ) ); } else assert(0); bool connect = ( data->ChannelNum > 0 ); unsigned long color = ( connect == true && data->Block == 0 ) ? mDefaultColor : COLOR_DARKGRAY; // »ðÀÔ int row = mpFriendList->AddRow( data->CharacterName, color, image, (void*)data->CharacterIdx ); if( row != -1 ) { // Á¢¼ÓÁß if( connect == true && data->Block == 0 ) { if( HERO->GetChannelNum() == data->ChannelNum ) { // ·¹º§ lv Á÷¾÷ ¸ÊÀ̸§ cStringT str; str.Format( _T("%d Lv %s %s"), data->Level, GAMERESOURCEMAN->GetJobName( data->Job ), GAMERESOURCEMAN->GetMapName( data->MapNum ) ); mpFriendList->AddColume( row, (LPCTSTR)str.Cstr(), color ); } else { // Ÿä³ÎÀÇ ÀÏ¹Ý ¸ÊÀΰæ¿ì if( data->MapNum >= MAP_MIN && data->MapNum <= MAP_MAX ) { cStringT channel; channel.Format( GAMERESOURCEMAN->GetGameText( 1260 ), data->ChannelNum ); cStringT str; str.Format( _T("%d Lv %s %s"), data->Level, GAMERESOURCEMAN->GetJobName( data->Job ), (LPTSTR)channel.Cstr() ); mpFriendList->AddColume( row, (LPCTSTR)str.Cstr(), color ); } else { // Ÿä³ÎÀÇ ´øÀü ¸ÊÀΰæ¿ì cStringT str; str.Format( _T("%d Lv %s %s"), data->Level, GAMERESOURCEMAN->GetJobName( data->Job ), GAMERESOURCEMAN->GetMapName( data->ChannelNum ) ); mpFriendList->AddColume( row, (LPCTSTR)str.Cstr(), color ); } } } else { // ¹ÌÁ¢¼Ó mpFriendList->AddColume( row, GAMERESOURCEMAN->GetGameText( 38 ), color ); } } else assert(0); } // µî·Ï ½Åû Ãâ·Â if( data->Status == 1 ) { cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 40 ), data->CharacterName ); /// Ä£±¸µî·Ï ½Åû UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_FRIEND_ADD_REQ, eSKIN_YESNO, (LPCTSTR)str.Cstr(), // Ä£±¸ ¿äû ¸Þ½ÃÁö GAMERESOURCEMAN->GetGameText( 20 ), // Ä£±¸ ¿äû (void*)data->Idx ); } // ¹öư ó¸® if( mpFriendList->GetRowCount() == MAX_FRIEND ) { if( mAddFriend ) mAddFriend->SetEnabled( false ); } // °»½Å Update(); return true; } void cFriendWindow::Update() { /// ¼±ÅÃµÈ ¸®½ºÆ®¿¡ µû¸¥ ¹öư ¾÷µ¥ÀÌÆ® if( !mpFriendList || !mDelFriend ) return; bool connect = false; if( mpFriendList->GetRowCount() == 0 ) { mDelFriend->SetEnabled( false ); } else { mDelFriend->SetEnabled( true ); unsigned int index = mpFriendList->GetSelectIndex(); unsigned long characterIdx = (unsigned long)mpFriendList->GetExtraData( index ); sFriendData* data = CHATMANAGER->GetFriendData( characterIdx ); if( data ) { connect = (data->ChannelNum > 0); } else assert(0); } if( mParty ) mParty->SetEnabled( connect ); if( mWhisper ) mWhisper->SetEnabled( connect ); /// UpdateButton(); } void cFriendWindow::UpdateButton() { if( !mpFriendList ) { assert(0); return; } /// ¹öư À§Ä¡ ¾÷µ¥ÀÌÆ® int total = mpFriendList->GetRowCount() - 1; int page = ( total / 10 ); /// À§Ä¡ Á¶Á¤ if( mpRadioNode[0] ) { int w = mpRadioNode[0]->GetAbsoluteRect().GetWidth(); int x = mpFriendList->GetRelativeRect().mLeft + (int)((mpFriendList->GetRelativeRect().GetWidth() - (w*(page+1))) * 0.5f); for( int i = 0; i <= page; ++i ) { cUIPos pos; pos.mX = x + (w*i); pos.mY = mpRadioNode[i]->GetRelativeRect().mTop; mpRadioNode[i]->SetRelativePos( pos ); } ((cRadioButton*)mpRadioNode[0])->SetPress( true ); } for( int i = 0; i < MAXPAGE_NUM; ++i ) { if( mpRadioNode[i] ) { if( i <= page ) mpRadioNode[i]->Show(); else mpRadioNode[i]->Hide(); } } } char cFriendWindow::GetFriendImage( char race, char gender ) { /// ³²ÀÚ¸é ±×´ë·Î ¸®ÅÏ, ¼ºº°ÀÌ ¿©ÀÚ¸é °Ë»ç char result = race; if( gender == eGENDER_FEMALE ) { if( race == eRACE_HUMAN ) result = 3; if( race == eRACE_BEAST ) result = 4; if( race == eRACE_ELF ) result = 5; } return result; } void cFriendWindow::OnNetLock( int lockTry ) { if( mParty ) mParty->NetLock( lockTry ); if( mAddFriend ) mAddFriend->NetLock( lockTry ); if( mDelFriend ) mDelFriend->NetLock( lockTry ); } void cFriendWindow::OnNetUnLock( int lockTry ) { if( mParty ) mParty->NetUnLock( lockTry ); if( mAddFriend ) mAddFriend->NetUnLock( lockTry ); if( mDelFriend ) mDelFriend->NetUnLock( lockTry ); /// Update(); } ////////////////////////////////////////////////////////////////////////////////////////// #include "ListBox.h" #include "FontAgent.h" cFriendListbox::cFriendListbox( eUINodeType type ) : cImageListBox( type ) { } cFriendListbox::~cFriendListbox() { } /// ÁÖÀÇ»çÇ× : ¸®½ºÆ® ¾ÆÀÌÅÛ ±×·ÁÁÖ±â void cFriendListbox::RenderData( cUIFontItemKeeper* pKeeper ) { /// Àüü ¸®½ºÆ®¸¦ ¾ò¾î¿È if( GetRowCount() <= 0 ) return; /// ½ºÅ² ¹Þ¾Æ¿À±â cListBoxSkin* pListSkin = (cListBoxSkin*)mpSkin; if( !pListSkin ) return; /// ¸®½ºÆ® ¹Ú½ºÀÇ ÁÂÇ¥ ¹Þ¾Æ¿À±â int textposX = 0; int textPosY = GetAbsoluteRect().mTop; unsigned int rowCount = ( mMaxRowInPage > GetRowCount() )? GetRowCount() : mMaxRowInPage; for( unsigned int row = mTopRowIdx; row < mTopRowIdx + rowCount; ++row ) { sRowData* rData = GetRowData( row ); if( !rData ) continue; /// ¸®½ºÆ® µ¥ÀÌÅÍ Ãâ·Â unsigned int colCount = rData->mColumes.GetSize(); unsigned int fixposY = textPosY; for( unsigned int col = 0; col< colCount; ++col ) { /// °¢ Ä÷³ µ¥ÀÌÅÍ °¡Á®¿À±â sListImageData* data = (sListImageData*)rData->mColumes[col]; if( data->mpImage && col == 0 ) { cUIImage* image = data->mpImage; sListCtrlParam* pParam = pListSkin->mpImgParam; unsigned int imageX = pParam->mColumnX; unsigned int imageY = textPosY + (int)((mRowHeight-image->GetHeight())*0.5f); image->SetPos( GetAbsoluteRect().mLeft + imageX, imageY ); image->Draw(); } sListCtrlParam* pParam = pListSkin->GetCtrlParam( col ); unsigned int tX = 0; unsigned int tW = 0; eText_Align align = eALIGN_LEFT; if( pParam ) { tX = pParam->mColumnX; tW = pParam->mColumnW; align = pParam->mAlign; } /// ÃÖÁ¾ Ãâ·Â ÁÂÇ¥ °è»ê unsigned int strWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_System, (LPTSTR)data->mText.Cstr(), data->mText.GetLength() ); textposX = UpdateTextPos( align, strWidth, tX, tW ); /// Hover µÈ ¾ÆÀÌÅÛÀº ´Ù¸¥ »öÀ¸·Î Ç¥½Ã unsigned color = data->mTextColor; if( mHoveredRowIdx != -1 && row - mTopRowIdx == (unsigned int)mHoveredRowIdx ) color = COLOR_RED; pKeeper->AddFontItem( cFontAgent::eFont_System, (LPTSTR)data->mText.Cstr(), textposX, fixposY + 5, color ); /// µÎ¹øÂ° Ä÷³ºÎÅÍ´Â ¹Ù·Î ÇÑÁÙ ¹Ø¿¡ Âï´Â´Ù fixposY += FONTAGENT->GetTextHeight(cFontAgent::eFont_System) + 2; } textPosY += mRowHeight; } }