Files
2026-06-01 12:46:52 +02:00

509 lines
14 KiB
C++

#include "stdafx.h"
#include "SGameManager.h"
#include "SGameMessage.h"
//#include "SGameMessageUI.h"
#include "SPlayerInfoMgr.h"
#include "SMessengerMgr.h"
#include "KUITabControl.h"
#include "KUIControlStatic.h"
#include "KUIControlButton.h"
#include "SUIGuildSubMasterTabManage.h"
#include "SUIGuildSubMasterTabAuthority.h"
#include "SUIGuildSubMasterWnd.h"
namespace
{
// 탭 Wnd 타입.
enum GUILDMasterTab_TYPE
{
GUILDMasterTab_NONE = -1,
GUILDMasterTab_MANAGE = 0,
GUILDMasterTab_AUTHORITY = 1,
GUILDMasterTab_MAX
};
const char g_arrLine[][128] = { "common_guage_titanium_line_orange", "common_guage_titanium_member_low" };
const char g_arrTabButton[][128] = { "common_button_tab_beamblue_orange", "common_button_tab_beamblue_red", "common_button_tab_beamblue_cyan" };
}
SUIGuildSubMasterWnd::SUIGuildSubMasterWnd( SGameManager * pGameManager )
: SUIWnd( pGameManager ),
m_pGauge( NULL ),
m_nIndexShowTab( GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE ),
m_bRefresh( GUILD_UPDATE::GUILD_UPDATE_NONE ),
m_bUIRefresh( true )
{
}
SUIGuildSubMasterWnd::~SUIGuildSubMasterWnd()
{
Release();
}
// 메모리 해제.
void SUIGuildSubMasterWnd::Release()
{
m_arrTabWnd.clear(); // Tab Wnd 배열.
}
SUIWnd* SUIGuildSubMasterWnd::CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID )
{
SUIWnd::CreateWnd( szFile, pWndManager, kPos, nWindowID );
// 탭 컨트롤이 위치할 영역지정 컨트롤.
m_pTabOutline = dynamicCast< KUIControl * >( GetChild( "select_list_orange_01" ) );
//--------------------------------
// 탭 컨트롤 생성.
// 길드등급관리설정.
SUIWnd * pTabManage = new SUIGuildSubMasterTabManage( m_pGameManager );
pTabManage->SetUseCutCaption(); // 컨트롤의 Caption 텍스트 자르기.
pTabManage->CreateWnd( "window_guild_sub_master_tab_class_manage.nui", pWndManager, KPoint( kPos.x, kPos.y ) );
pTabManage->SetParent( this );
// 길드마스터권한.
SUIWnd * pTabAuthority = new SUIGuildSubMasterTabAuthority( m_pGameManager );
pTabAuthority->SetUseCutCaption(); // 컨트롤의 Caption 텍스트 자르기.
pTabAuthority->CreateWnd( "window_guild_sub_master_tab_authority.nui", pWndManager, KPoint( kPos.x, kPos.y ) );
pTabAuthority->SetParent( this );
// 부모에 자식으로 등록.
this->AddChild( pTabManage ); m_arrTabWnd.push_back( pTabManage );
this->AddChild( pTabAuthority ); m_arrTabWnd.push_back( pTabAuthority );
// 위치지정.
KRect rt = m_pTabOutline->GetRect();
pTabManage->MovePos( rt.left, rt.top );
pTabAuthority->MovePos( rt.left, rt.top );
//// 최초엔 길드등급관리설정 탭을 보여줌. // 주석. bintitle.2010.11.30.
//pTabManage->SetShow( true );
//
// 탭 버튼. 탭컨트롤 기능을 대신한다.
m_arrTabButton.push_back( dynamicCast< KUIControlButton * >( GetChild( "tab00" ) ) );
m_arrTabButton.push_back( dynamicCast< KUIControlButton * >( GetChild( "tab_01" ) ) );
int size = m_arrTabButton.size();
for( int i=0; i<size; ++i )
{
m_arrTabButton[ i ]->SetEnableColor( "<#ffffff>" );
m_arrTabButton[ i ]->SetDisableColor( "<#a0a0a0>" );
}
// 이부분 때문에 탭컨트롤 대신 버튼을 사용했다.
// 활성화된 탭의 레이아웃을 탭에 속한 Wnd 보다 높게하여 ------
// _____| |_______
// 이런 모양이 되도록 해야하지만,
// 탭컨트롤은 탭컨트롤안에 버튼기능의 TabItem 이 포함된다.
// 탭컨트롤의 레이아웃이 탭에속한 Wnd 보다 낮은 상태에서 TabItem의 레이아웃은 탭에속한 Wnd 보다 높게 할 수 없다.
std::list<KUIWnd*> & rChildList = const_cast< std::list<KUIWnd*> & >( this->GetChildList() );
std::list< KUIWnd* >::iterator it = std::find( rChildList.begin(), rChildList.end(), m_arrTabButton[ 0 ] );
if( it != rChildList.end() )
{
rChildList.erase( it );
rChildList.push_back( m_arrTabButton[ 0 ] );
}
m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->SetAniName( g_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_MAX ] );
m_arrTabButton[ 1 ]->SetAniName( "common_button_tab_beamblue_off" ); // 길드마스터권한탭 - 최초엔 비활성 이미지.
////
//// 탭 컨트롤 설정.
//KUISimpleTabControl * pTab = static_cast< KUISimpleTabControl * >( GetChild( "tab00" ) );
//if( pTab )
//{
// pTab->SetTabProperty( 0, false, 2 );
// pTab->AddTabItem( "길드등급관리설정", "길드등급관리설정", 0, 1.0f, "<#a0a0a0>" );
// pTab->AddTabItem( "길드마스터권한", "길드마스터권한", 0, 1.0f, "<#a0a0a0>" );
// pTab->SetSelectedItem( 0 );
//}
//m_pTabControl = pTab;
//// 탭 컨트롤과 탭에 속한 wnd 의 레이어 순서변경(탭컨트롤을 더앞쪽으로).
//std::list<KUIWnd*> rChildList = this->GetChildList();
//std::list< KUIWnd* >::iterator it = std::find( rChildList.begin(), rChildList.end(), m_pTabControl );
//if( it != rChildList.end() )
//{
// rChildList.erase( it );
// this->AddChild( m_pTabControl );
//}
// 라인컨트롤.
m_pGauge = dynamicCast< KUIControlStatic * >( GetChild( "gauge_guild_master_01" ) );
return this;
}
bool SUIGuildSubMasterWnd::InitControls( KPoint kPos )
{
m_selectedTempTabIdx = -1;
return SUIWnd::InitControls( kPos );
}
// Tab 에 속한 Wnd 보임/숨김 처리.
void SUIGuildSubMasterWnd::TabShow( bool bFlag )
{
// 열기.
// 이전에 열어놨던 탭이 열려야한다.
if( bFlag )
{
for( int i=0; i<GUILDMasterTab_TYPE::GUILDMasterTab_MAX; i++ )
{
if( i == m_nIndexShowTab )
{
m_arrTabWnd[ i ]->SetShow( true );
m_arrTabWnd[ i ]->OnNotifyUIWindowOpen( true );
}
else
{
m_arrTabWnd[ i ]->SetShow( false );
m_arrTabWnd[ i ]->OnNotifyUIWindowOpen( false );
}
}
}
// 닫기.
else
{
for( int i=0; i<GUILDMasterTab_TYPE::GUILDMasterTab_MAX; i++ )
{
m_arrTabWnd[ i ]->SetShow( bFlag );
m_arrTabWnd[ i ]->OnNotifyUIWindowOpen( bFlag );
}
}
}
void SUIGuildSubMasterWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd)
{
// Guild Main Wnd 옆의 위치 잡기.
KUIWnd *pInfoWnd = m_pManager->FindWnd( "window_guild_main" );
if( pInfoWnd )
MovePos( pInfoWnd->GetRect().right - 4, pInfoWnd->GetRect().top );
if( bOpen )
{
// 권한처리.
if( m_bUIRefresh &&
( m_bRefresh & GUILD_UPDATE::GUILD_UPDATE_GMEMBER ) || /// 2010.12.14 or 연산 수정 - prodongi
( m_bRefresh & GUILD_UPDATE_PROMOTE ) ||
( m_bRefresh & GUILD_UPDATE_CHANGE_PERMISSION )
)
{
AuthorityProcess();
}
TabShow( true );
UpdateTabWnd(); // Tab Wnd Update.
m_bUIRefresh = false;
m_bRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE;
}
else
{
TabShow( false );
// 길드장 인계 팝업 윈도우 닫기.
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_GUILD_SUB_MASTER_PROMOTE, false ) );
m_bUIRefresh = false;
m_bRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE;
}
}
void SUIGuildSubMasterWnd::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch( pMsg->nType )
{
case IMSG_UI_MOVE:
{
SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg;
MovePos( pMoveMsg->m_nX, pMoveMsg->m_nY );
pMsg->bUse = true;
}
break;
case IMSG_UI_GUILD_DESTROY : // 길드해체.
case IMSG_UI_GUILD_UPGRADE:
// 길드마스터 탭 으로 메세지 전송.
m_arrTabWnd[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->ProcMsgAtStatic( pMsg );
break;
case IMSG_UI_SEND_DATA:
{
SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg;
//
// 길드 업데이트.
if( pData->m_strString == "guild_update" )
{
pData->bUse = true;
// 권한처리.
if( this->IsShow() )
{
if( ( ( pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_GMEMBER ) && ( pData->m_strText == "Self" ) ) || /// 2010.12.14 or 연산 수정 - prodongi
( pData->m_dwData & GUILD_UPDATE_PROMOTE ) ||
( pData->m_dwData & GUILD_UPDATE_CHANGE_PERMISSION )
)
{
AuthorityProcess();
}
m_bRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE;
m_bUIRefresh = false;
}
else
{
m_bRefresh |= pData->m_dwData;
m_bUIRefresh = true;
}
if( ( pData->m_dwData & GUILD_UPDATE_GPERMISSION ) || /// 2010.12.14 or 연산 수정 - prodongi
( pData->m_dwData & GUILD_UPDATE_CHANGE_PERMISSION_NAME ) ||
( pData->m_dwData & GUILD_UPDATE_CHANGE_PERMISSION ) ||
( pData->m_dwData & GUILD_UPDATE_DONATION ) ||
( pData->m_dwData & GUILD_UPDATE_CHANGE_PERMISSION_SET )
)
{
// 길드마스터 탭 으로 메세지 전송.
m_arrTabWnd[ GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE ]->ProcMsgAtStatic( pMsg );
}
}
//
// 길드장 변경.
else if( pData->m_strString == "change_guild_master" )
{
pData->bUse = true;
// 권한처리.
AuthorityProcess();
// 길드마스터 탭 으로 메세지 전송.
m_arrTabWnd[ GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE ]->ProcMsgAtStatic( pMsg );
}
}
break;
}
}
void SUIGuildSubMasterWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch( nMessage )
{
// 윈도우 이동
case KUI_MESSAGE::KGENWND_MOVE:
{
LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한
}
break;
case KUI_MESSAGE::KBUTTON_CLICK :
if( !::_stricmp( lpszControlID, "button_close" ) )
{
CloseWnd(); // m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MASTER, false) );
}
else if( !::_stricmp( lpszControlID, "tab00" ) )
{
m_selectedTempTabIdx = GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE;
//ShowTabWnd( GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE );
}
else if( !::_stricmp( lpszControlID, "tab_01" ) )
{
m_selectedTempTabIdx = GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY;
//ShowTabWnd( GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY );
}
break;
//// 탭 변경
//case KUI_MESSAGE::KTAB_SELECT :
//
// ShowTabWnd( (int)lparam );
// break;
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
DWORD SUIGuildSubMasterWnd::OnMouseMessage(DWORD dwMessage, int x, int y)
{
return SUIWnd::OnMouseMessage( dwMessage, x, y );
}
void SUIGuildSubMasterWnd::Process(DWORD dwTime)
{
updateShowTabWnd();
SUIWnd::Process(dwTime);
}
void SUIGuildSubMasterWnd::updateShowTabWnd()
{
if (-1 == m_selectedTempTabIdx)
return ;
ShowTabWnd(m_selectedTempTabIdx);
m_selectedTempTabIdx = -1;
}
// 창 닫기.
void SUIGuildSubMasterWnd::CloseWnd()
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MASTER, false) );
}
// Tab Wnd Update.
void SUIGuildSubMasterWnd::UpdateTabWnd()
{
m_arrTabWnd[ 0 ]->SetShow( true );
int size = m_arrTabWnd.size();
for( int i=0; i<size; i++ )
m_arrTabWnd[ i ]->ForcedProcess( 0 );
}
// 탭 Wnd 보임, 숨김 처리.
void SUIGuildSubMasterWnd::ShowTabWnd( int tabIndex )
{
if( tabIndex > GUILDMasterTab_TYPE::GUILDMasterTab_NONE && tabIndex < GUILDMasterTab_TYPE::GUILDMasterTab_MAX )
{
// 탭에 속하는 윈도우들의 레이아웃을 최하단으로 이동.
std::list<KUIWnd*> & rChildList = const_cast< std::list<KUIWnd*> & >( this->GetChildList() );
int size = m_arrTabWnd.size();
for( int i=0; i<size; ++i )
{
std::list< KUIWnd* >::iterator it = std::find( rChildList.begin(), rChildList.end(), m_arrTabWnd[ i ] );
if( it != rChildList.end() )
{
rChildList.erase( it );
rChildList.push_back( m_arrTabWnd[ i ] );
}
}
for( int i=0; i<GUILDMasterTab_TYPE::GUILDMasterTab_MAX; i++ )
{
if( i == tabIndex )
{
m_nIndexShowTab = tabIndex;
m_arrTabWnd[ i ]->SetShow( true );
m_arrTabWnd[ i ]->OnNotifyUIWindowOpen( true );
// 선택된 탭버튼의 레이아웃을 최하단으로 이동.
std::list< KUIWnd* >::iterator it = std::find( rChildList.begin(), rChildList.end(), m_arrTabButton[ tabIndex ] );
if( it != rChildList.end() )
{
rChildList.erase( it );
rChildList.push_back( m_arrTabButton[ tabIndex ] );
m_arrTabButton[ tabIndex ]->SetAniName( g_arrTabButton[ tabIndex ] );
}
}
else
{
m_arrTabWnd[ i ]->SetShow( false );
m_arrTabWnd[ i ]->OnNotifyUIWindowOpen( false );
// 비선택 탭버튼 이미지 변경.
if( m_arrTabButton[ i ] )
{
//m_arrTabButton[ i ]->SetAniName( g_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_MAX ] );
m_arrTabButton[ i ]->SetAniName( "common_button_tab_beamblue_off" );
}
}
//m_arrTabWnd[ i ]->SetShow( ( i == tabIndex ? true : false ) );
}
// 라인컨트롤.
m_pGauge->SetAniName( g_arrLine[ tabIndex ] );
}
// 탭컨트롤 Ani 변경.
//m_pTabControl->SetTabItemAniName( 1, tabIndex > 0 ? "common_button_tab_beamblue_red" : "common_button_tab_beamblue_orange" );
}
// 권한처리.
void SUIGuildSubMasterWnd::AuthorityProcess()
{
SPlayerInfo player = m_PlayerInfoMgr.GetPlayerInfo();
SPlayerSlot * pPlayerSlot = this->m_GuildMgr.FindMember( player.GetName() );
if( pPlayerSlot )
{
int nAuthority = pPlayerSlot->GetAuthority();
//// 길드마스터 탭.
//if( nClass == _PERMISSION::PERMISSION_LEADER )
// m_pTabControl->SetEnableTab( GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY );
//else
// m_pTabControl->SetDisableTab( GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY );
// 길드마스터 탭.
if( nAuthority == _PERMISSION::PERMISSION_LEADER )
m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->Enable();
else
m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->Disable();
//// 길드마스터 탭.
//if( nAuthority == _PERMISSION::PERMISSION_LEADER )
// m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->Enable();
//else
//{
// // 길드마스터 탭.
// m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_AUTHORITY ]->Disable();
// // 등급별권한설정 권한 추가.
// int nBitSet = m_GuildMgr.GetAuthorityClassBitSet( nAuthority - 1 ); // 권한 비트셋.
//
// if( _PERMIT_REQUIRED_ACTION::PRA_CLASS_AUTHORITY_SET & nBitSet )
// m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE ]->Enable();
// else
// m_arrTabButton[ GUILDMasterTab_TYPE::GUILDMasterTab_MANAGE ]->Disable();
//}
}
}