#include "stdafx.h" #include "KUIWndManager.h" #include "KUIControlStatic.h" #include "KUIControlClockBox.h" #include "SGameManager.h" //#include "SGameMessageUI.h" #include "SUIStateEffectWnd.h" #include "SUIDisplayInfo.h" #include "STenacityDB.h" #include "SkillBaseFile.h" #include "SGameOption.h" #include "SPlayerInfoMgr.h" #include "SGameMessage.h" #include "SGameAvatarEx.h" #include "SGame.h" namespace{ // const int c_nButtonClickArea = 10; } static const int REITERATION_OFFSET = 5; /// 2011.03.30 오버렙 아이콘의 상태 아이콘에 대한 옵셋값 - prodongi static const int MAX_REITERATION_LEVEL = 99; /// 2011.04.01 - prodongi SUIStateHEffectWnd::sUpdateTimeSlotInfo::sUpdateTimeSlotInfo(SStateSlot* stateSlot) { m_code = stateSlot->GetStateCode(); m_handle = stateSlot->GetStateHandle(); m_level = stateSlot->GetStateLevel(); } bool SUIStateHEffectWnd::sUpdateTimeSlotInfo::isEqual(SStateSlot* stateSlot) { if (!stateSlot) return false; if (stateSlot->GetStateCode() == m_code && stateSlot->GetStateHandle() == m_handle && stateSlot->GetStateLevel() == m_level) return true; return false; } bool SUIStateHEffectWnd::InitControls( KPoint kPos ) { //SetCustomMovingRect( KRect( 0, 0, 15, c_nShortMoveRect ) ); // 타이틀 바 선택 영역, 이동위해 클릭 Area //SetValidRect( "state_effect_h_change", KRect(0,c_nButtonClickArea,0,0) ); CreateItemIcon(); // 아이콘 생성 // state 재사용 시간 컨트롤 KUIWnd* pWnd( NULL ); // KUIWnd* pIcon = GetChild( "state_effect_syc_icon" ); // pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "clockbox", "state_effect_syc_clock", " ", pIcon->GetRect(), 0, KFLAG_NO_GET_MESSAGE, this, "", c_szDEF_SPR_NAME, m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); // if( pWnd ) ((KUIControlClockBox*)pWnd)->SetColor( c_ColorClockControl ); /// 2011.03.30 - prodongi KRect rReiteration; for( int i = 1; i <= c_nMaxStateIcon; i++ ) { // 2011.11.30 - servantes : 형변환 버그 수정 // KUIWnd* pIcon = GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", i).c_str() ); KUIControlIconStatic* pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", i).c_str() )); if( pIcon ) { pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "clockbox", CStringUtil::StringFormat("state_effect_h_clock%02d", i).c_str(), " ", pIcon->GetRect(), 0, KFLAG_NO_GET_MESSAGE, this, "", c_szDEF_SPR_NAME, m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); if( pWnd ) { ((KUIControlClockBox*)pWnd)->SetColor( c_ColorClockControl ); pWnd->SetShow(false); } /// 2011.03.30 중첩 아이콘 생성 - prodongi rReiteration.left = pIcon->GetRect().left + REITERATION_OFFSET; rReiteration.top = pIcon->GetRect().top + REITERATION_OFFSET; rReiteration.right = pIcon->GetRect().right; rReiteration.bottom = pIcon->GetRect().bottom; pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "static", CStringUtil::StringFormat("state_effect_h_reiteration%02d", i).c_str(), " ", rReiteration, 0, KFLAG_GET_PASS_MESSAGE, this, "", c_szDEF_SPR_NAME, m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); if (pWnd) { pWnd->SetShow(false); } } } KRect Rt( GetRect() ); SetCorrectionRect( KRect(0,0,Rt.GetWidth()*-1,Rt.GetHeight()*-1), false ); return SUIWnd::InitControls(kPos); } bool SUIStateHEffectWnd::InitData( bool bReload ) { InitChildShow( false ); return SUIWnd::InitData(bReload); } void SUIStateHEffectWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch(nMessage) { case KUI_MESSAGE::KBUTTON_CLICK: { } break; case KUI_MESSAGE::KGENWND_MOVE: // 윈도우 이동 { LimitMoveWnd(0, 0); // 게임 외부로 나가지 못하게 제한 } break; } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUIStateHEffectWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch(pMsg->nType) { case MSG_STATE: { pMsg->bUse = true; } break; case IMSG_UI_MOVE: { MovePos( ((SIMSG_UI_MOVE*)pMsg)->m_nX, ((SIMSG_UI_MOVE*)pMsg)->m_nY ); GetGameOption().SetStateHozX( GetRect().left ); GetGameOption().SetStateHozY( GetRect().top ); pMsg->bUse = true; } break; case IMSG_UI_STATE_UPDATE: { CheckState(); pMsg->bUse = true; } break; case IMSG_UI_STATE_LIST_UPDATE: { UpdateStateData(pMsg); pMsg->bUse = true; } break; } } void SUIStateHEffectWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { SUIWnd::OnNotifyUIWindowOpen(bOpen); if( bOpen ) RefreshAllStateSlot(); else { InitChildShow(false); // 2011.05.17 - servantes GetGameOption().SetStateHozX( GetRect().left ); GetGameOption().SetStateHozY( GetRect().top ); } } // ========================================= // 윈도우 // ========================================= void SUIStateHEffectWnd::CreateItemIcon() { KUIControlIconStatic* pIcon = dynamicCast(GetChild( "state_effect_h_icon01" )); if( pIcon == NULL ) return; int nLeft, nTop; KRect rt = pIcon->GetRect(); KRect rcCashState = rt; KUIWnd* pWnd = NULL; for( int i(0); iCreateControl( KUIWND_CREATE_ARG( "iconstatic", strCtrName.c_str(), " ", rcCashState, 0, KFLAG_GET_PASS_MESSAGE, this, "static_job_unknownicon", c_szDEF_SPR_NAME, m_pManager, 0, "tooltip", KANCHOR_LEFT | KANCHOR_TOP ) ); if( pWnd ) pWnd->SetShow(false); } nLeft = rt.left; nTop = rt.top; rt.left += c_nIconHeight; for( int i = 2; i <= c_nMaxNum; i++ ) { rt.right = rt.left + c_nIconHeight; rt.bottom = rt.top + c_nIconHeight; //마우스 포커스 안 가도록 Flag : KFLAG_GET_PASS_MESSAGE 추가 pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "iconstatic", CStringUtil::StringFormat( "state_effect_h_icon%02d", i ).c_str(), " ", rt, 0, KFLAG_GET_PASS_MESSAGE, this, "static_job_unknownicon", c_szDEF_SPR_NAME, m_pManager, 0, "tooltip", KANCHOR_LEFT | KANCHOR_TOP ) ); pWnd->SetShow(false); if( i%12 == 0 ) { rt.left = nLeft; rt.top = nTop + c_nIconHeight; nTop = rt.top; } else rt.left += c_nIconHeight; } } //////////////////////////////////////////////// /////////////////////////////////////////////// // ========================================= // 스테이트 리스트 // ========================================= void SUIStateHEffectWnd::InitChildShow( bool bShow ) { DisableSlot(0, c_nMaxNum, false); DisableCashStateSlot(bShow); CashStateMoveEffectWnd(bShow); } void SUIStateHEffectWnd::CashStateMoveEffectWnd( bool bInit/*=false*/ ) { KUIControlIconStatic* pSycrutIcon = dynamicCast(GetChild( "state_effect_syc_icon01" )); if( pSycrutIcon == NULL ) return; KRect rt( pSycrutIcon->GetRect() ); if( !IsSetPlayer() ) return; vec_state_slot& CashStateList( m_pLocalplayer->GetCashStateList() ); if( CashStateList.empty() ) return ; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //캐쉬용 버프가 있는지 살펴보고 그에 따른 위치값 산출 ///////////////////////////////////////////////////////////// int nStartLeft(rt.left), nStartTop(rt.top); int nSize( CashStateList.size() ); if( !bInit && nSize>0 ) //(bInit == true) 이면 캐쉬 버프 유무와 무관하게 초기화 하는 것이기 때문에 좌측 상단 최초 위치로 설정 nStartLeft += (nSize+1)/2 * 33; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// KUIControlIconStatic* pFirstIcon = dynamicCast(GetChild( "state_effect_h_icon01" )); if( pSycrutIcon == NULL ) return; KRect FirstRT = pFirstIcon->GetRect(); if( FirstRT.left == nStartLeft ) return; //이미 이동하려는 위치와 동일하기 때문에 return; else { FirstRT.left = nStartLeft; FirstRT.right = FirstRT.left+c_nIconHeight; } //실질적인 버프 아이콘들의 위치이동 int nXpos(0); KUIControlIconStatic* pIcon(NULL); KUIControlClockBox* pClock(NULL); KRect MoveRT(FirstRT.left,FirstRT.top,FirstRT.right,FirstRT.bottom); for( int i = 0; i < c_nMaxNum; i++ ) { nXpos = i%12; // if(i>=10) // { nXpos = i%12; // MoveRT.top = FirstRT.top + c_nIconHeight; // } MoveRT.left = FirstRT.left + (nXpos*c_nIconHeight); MoveRT.top = FirstRT.top + ( (i/12) * c_nIconHeight ); MoveRT.right = MoveRT.left + c_nIconHeight; MoveRT.bottom = MoveRT.top + c_nIconHeight; pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "state_effect_h_icon%02d", i+1 ).c_str() )); pClock = dynamicCast(GetChild( CStringUtil::StringFormat( "state_effect_h_clock%02d", i+1 ).c_str() )); if( pIcon != NULL ) pIcon->MovePos( MoveRT.left, MoveRT.top ); if( pClock != NULL ) pClock->MovePos( MoveRT.left, MoveRT.top ); /// 2011.03.30 - prodongi KUIControlStatic* reiteration = dynamicCast(GetChild( CStringUtil::StringFormat( "state_effect_h_reiteration%02d", i+1 ).c_str() )); if (reiteration) reiteration->MovePos(MoveRT.left+REITERATION_OFFSET, MoveRT.top+REITERATION_OFFSET); } // KRect Rt = GetRect(); // Rt.right = MoveRT.right; // SetCorrectionRect( KRect(0,0,Rt.GetWidth()*-1,Rt.GetHeight()*-1), false ); } bool SUIStateHEffectWnd::IsSetPlayer() { if( !m_pLocalplayer ) { SGame* pGame = m_pGameManager->GetActiveGame(); if( !pGame || pGame->GetGameType() != GAME_TYPE_WORLD ) return false; AR_HANDLE handle = m_PlayerInfoMgr.GetPlayerHandle(); m_pLocalplayer = (SGameAvatarEx*)(pGame->GetGameObject(handle)); if( !m_pLocalplayer ) return false; } return true; } // ========================================= // 스테이트 슬롯 // ========================================= void SUIStateHEffectWnd::DisableCashStateSlot( bool bShow ) { for( int i(0); i(GetChild( strCtrName.c_str() )); if( pIcon ) { pIcon->SetShow(bShow); pIcon->SetIcon(0); pIcon->SetTooltip(); } } } void SUIStateHEffectWnd::ResetStateSet() { ::memset( m_StateIdSet, 0x00, sizeof(m_StateIdSet) ); } void SUIStateHEffectWnd::RefreshAllStateSlot() { if( !IsSetPlayer() ) return; ResetStateSet(); vec_state_slot& PositiveList = m_pLocalplayer->GetPositiveStateList(); vec_state_slot& NegativeList = m_pLocalplayer->GetNegativeStateList(); int nPositiveCount = static_cast(PositiveList.size()); int nNegativeCount = static_cast(NegativeList.size()); if( nPositiveCount>36 ) nPositiveCount = 36; //이로운 지속효과를 세팅 for( int i(0); i 1~10 = 10 / 11~20 = 20 으로 NULL로 쎄팅해야할 마지막 부분을 구하는 식 nPositiveEndIndex = ((nPositiveCount-1)/12+1) * 12; for( int i(nPositiveCount); iGetCashStateList(); int nSize( CashStateList.size() ); for( int i(0); i(GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", i+1).c_str() )); if( pIcon ) { pIcon->SetShow(bShow); pIcon->SetIcon(0); pIcon->SetTooltip(); } pClock = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_clock%02d", i+1).c_str() )); if( pClock ) { pClock->SetShow(bShow); pClock->SetCurTime(0); pClock->SetMaxTime(0); pClock->Begin(); } /// 2011.03.30 - prodongi ctrlReiteration = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_reiteration%02d", i+1).c_str() )); if( ctrlReiteration ) { ctrlReiteration->SetShow(bShow); } } } // ========================================= // 삭제 // ========================================= /// 2011.03.30 - prodongi void SUIStateHEffectWnd::CheckState( SStateSlot* pInfo, KUIControlIconStatic* pIcon, KUIControlClockBox* pClock, KUIControlStatic* ctrlReiteration ) { if( !pInfo ) return; if( pIcon ) { pIcon->SetTooltip( m_pDisplayInfo->GetStateToolTipText(pInfo->GetStateCode(), pInfo->GetEndTime(), pInfo->GetStateLevel(), pInfo->GetStateValue(), pInfo->IsToggleSkill()).c_str() ); } /// 2011.03.30 - prodongi if (ctrlReiteration) { setReiterationCount(pInfo, ctrlReiteration); } //여기서 IsValidProcTime()로 체크를 하고서 m_vUpdateTimeSlot 안에 있는 슬롯들에 해당하는 UI를 업데이트 하는 것은 //해당 slot의 proc()를 한번도 들어가지 않은 상태에서 pClock->SetCurTime()이 쎄팅되었었기 때문이다. //해당 slot의 proc()를 체크 하지 않고 그냥 데이타를 사용하게 되면 잘 못된 값이 들어가게 되어 오작동 하게 된다. if( pClock && pInfo->IsValidProcTime() ) { if (!m_vUpdateTimeSlot.empty()) { std::vector< sUpdateTimeSlotInfo >::iterator it = m_vUpdateTimeSlot.begin(); while( it != m_vUpdateTimeSlot.end() ) { if (it->isEqual(pInfo)) { pClock->SetMaxTime( pInfo->GetMaxTime() ); pClock->SetCurTime( pInfo->GetRemainTime() ); pClock->Begin( true ); m_vUpdateTimeSlot.erase(it); break; } ++it; } } } } void SUIStateHEffectWnd::CheckState() { if( !IsSetPlayer() )return; vec_state_slot& CashList = m_pLocalplayer->GetCashStateList(); vec_state_slot& PositiveList = m_pLocalplayer->GetPositiveStateList(); vec_state_slot& NegativeList = m_pLocalplayer->GetNegativeStateList(); int nIndex (1); int nRealIndex(-1); SStateSlot* pInfo(NULL); KUIControlIconStatic* pIcon(NULL); KUIControlClockBox* pClock(NULL); KUIControlStatic* ctrlReiteration; if( CashList.size() > 0 ) { int nCashIndex(0); iterator_state_slot it = CashList.begin(); while( it != CashList.end() ) { pInfo = (*it); pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_syc_icon%02d", nCashIndex).c_str() )); pClock = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_syc_icon%02d", nCashIndex).c_str() )); CheckState(pInfo, pIcon, pClock); nCashIndex++; it++; } } if( PositiveList.size() > 0 ) { iterator_state_slot it = PositiveList.begin(); while( it != PositiveList.end() ) { pInfo = (*it); nRealIndex = GetUpdateStateIndex(nIndex, pInfo->IsHarmful()); pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", nRealIndex).c_str() )); pClock = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_clock%02d", nRealIndex).c_str() )); /// 2011.03.30 - prodongi ctrlReiteration = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_reiteration%02d", nRealIndex).c_str() )); CheckState(pInfo, pIcon, pClock, ctrlReiteration); nIndex++; it++; } } if( NegativeList.size() > 0 ) { nIndex = 1; iterator_state_slot it = NegativeList.begin(); while( it != NegativeList.end() ) { pInfo = (*it); // 툴팁 갱신 nRealIndex = GetUpdateStateIndex(nIndex, pInfo->IsHarmful()); pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", nRealIndex).c_str() )); pClock = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_clock%02d", nRealIndex).c_str() )); /// 2011.03.30 - prodongi ctrlReiteration = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_reiteration%02d", nRealIndex).c_str() )); CheckState(pInfo, pIcon, pClock, ctrlReiteration); nIndex++; it++; } } } void SUIStateHEffectWnd::AddState( SIMSG_UI_STATE_LIST_UPDATE* pStateMsg ) { if( !pStateMsg ) return; if( !pStateMsg->bharmful ) { vec_state_slot& vNegativeStateList = m_pLocalplayer->GetNegativeStateList(); int nNegativeSize( vNegativeStateList.size() ); if( nNegativeSize ) { vec_state_slot& vPositiveStateList = m_pLocalplayer->GetPositiveStateList(); int nPositiveSize( vPositiveStateList.size() ); int nLine = nPositiveSize / 12 + 1; int nNegativeIndex( nLine*12 ); int nStateIndex(0); if( 0<=nNegativeIndex && nNegativeIndexGetStateCode() ) { for( int i(0); inIndex, pStateMsg->bharmful); if( Index != -1 ) SetStateData(Index, pStateMsg->pState, false); } void SUIStateHEffectWnd::UpdateStateData( SGameMessage* pMsg ) { SIMSG_UI_STATE_LIST_UPDATE* pStateMsg = (SIMSG_UI_STATE_LIST_UPDATE*)pMsg; int Index(-1); switch( pStateMsg->nUpdateType ) { case SIMSG_UI_STATE_LIST_UPDATE::STATE_REFRESH: CashStateMoveEffectWnd(); RefreshAllStateSlot(); break; case SIMSG_UI_STATE_LIST_UPDATE::STATE_ADD: { // AddState( pStateMsg ); CashStateMoveEffectWnd(); RefreshAllStateSlot(); } break; case SIMSG_UI_STATE_LIST_UPDATE::STATE_CHANGE: { Index = GetUpdateStateIndex(pStateMsg->nIndex, pStateMsg->bharmful); if( Index != -1 ) SetStateData(Index, pStateMsg->pState, false); } break; case SIMSG_UI_STATE_LIST_UPDATE::STATE_ADD_CASH: case SIMSG_UI_STATE_LIST_UPDATE::STATE_CHANGE_CASH: { if( pStateMsg->nIndex != -1 ) { CashStateMoveEffectWnd(); SetStateData(pStateMsg->nIndex, pStateMsg->pState, true); } } break; case SIMSG_UI_STATE_LIST_UPDATE::STATE_DELETE: case SIMSG_UI_STATE_LIST_UPDATE::STATE_DELETE_CASH: { CashStateMoveEffectWnd(); RefreshAllStateSlot(); } break; } #ifdef _KUI_INVALIDATION // { [sonador] InvalidateWnd(); // } #endif } int SUIStateHEffectWnd::GetUpdateStateIndex( int Index, bool bHarmhul ) { if( !IsSetPlayer() ) return -1; int nCrrIndex(0); if(bHarmhul) { int nSize( m_pLocalplayer->GetPositiveStateList().size() ); if( nSize>0 ) { if( nSize<=12 ) nCrrIndex = 12; else nCrrIndex = 36; nCrrIndex += Index; if( nCrrIndex<48 ) return nCrrIndex; } else if( Index <= 36 ) { return Index; } } else { if( Index <= 36 ) return Index; } return -1; } void SUIStateHEffectWnd::SetStateData( int Index, SStateSlot* pInfo, bool bCash, bool bOnlyTime/*=false*/ ) { if( Index < 0 || Index >= c_nMaxStateIcon ) return; KUIControlIconStatic* pIcon(NULL); KUIControlClockBox* pClock(NULL); KUIControlStatic* ctrlReiteration = NULL; /// 2011.03.30 - prodongi if( !bCash ) { pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_icon%02d", Index+1).c_str() )); pClock = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_clock%02d", Index+1).c_str() )); /// 2011.03.30 - prodongi ctrlReiteration = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_h_reiteration%02d", Index+1).c_str() )); if( pInfo ) m_StateIdSet[Index] = pInfo->GetStateCode(); } else pIcon = dynamicCast(GetChild( CStringUtil::StringFormat("state_effect_syc_icon%02d", Index).c_str() )); if( pIcon ) { if( pInfo ) { pIcon->SetShow(true); if(!bOnlyTime) pIcon->SetIcon( c_szDEF_SPR_NAME, GetTenacityDB().GetIconName(pInfo->GetStateCode()) ); pIcon->SetTooltip( m_pDisplayInfo->GetStateToolTipText(pInfo->GetStateCode(), pInfo->GetEndTime(), pInfo->GetStateLevel(), pInfo->GetStateValue(), pInfo->IsToggleSkill()).c_str() ); } else pIcon->SetShow(false); } if( pClock ) //토글형 스킬은 쿨타임 생략 { if( pInfo && !pInfo->IsToggleSkill() ) { pClock->SetShow(true); pClock->SetMaxTime( pInfo->GetMaxTime() ); if( !pInfo->IsValidProcTime() ) m_vUpdateTimeSlot.push_back(sUpdateTimeSlotInfo(pInfo)); pClock->SetCurTime( pInfo->GetRemainTime() ); pClock->Begin( true ); } else pClock->SetShow(false); } /// 2011.03.30 - prodongi if (ctrlReiteration) { setReiterationCount(pInfo, ctrlReiteration); } } void SUIStateHEffectWnd::RefreshStateSlot( SStateSlot* pInfo, KUIControlIconStatic* pIcon, KUIControlClockBox* pClock ) { if( !pInfo ) return; if( pIcon ) { pIcon->SetShow(true); pIcon->SetIcon( c_szDEF_SPR_NAME, GetTenacityDB().GetIconName(pInfo->GetStateCode()) ); pIcon->SetTooltip( m_pDisplayInfo->GetStateToolTipText(pInfo->GetStateCode(), pInfo->GetEndTime(), pInfo->GetStateLevel(), pInfo->GetStateValue(), pInfo->IsToggleSkill()).c_str() ); } if( pClock && !pInfo->IsToggleSkill() ) //토글형 스킬은 쿨타임 생략 { pClock->SetShow(true); pClock->SetMaxTime( pInfo->GetMaxTime() ); pClock->SetCurTime( pInfo->GetRemainTime() ); pClock->Begin( true ); } } bool SUIStateHEffectWnd::IsState() { vec_state_slot& PositiveList = m_pLocalplayer->GetPositiveStateList(); vec_state_slot& NegativeList = m_pLocalplayer->GetNegativeStateList(); return !PositiveList.empty() || !NegativeList.empty(); } bool SUIStateHEffectWnd::IsAbleRemove( int nID ) { if( nID ) { StateInfoEx* s_data = GetTenacityDB().GetTenacityData(nID); if( s_data && s_data->state_time_type & 1<<5 ) return true; } return false; } DWORD SUIStateHEffectWnd::OnMouseMessage(DWORD dwMessage, int x, int y) { if( dwMessage == KLBUTTON_DBLCLK ) { AR_HANDLE handle(NULL); KUIWnd* pIcon(NULL); for( int i(0); iIsInRect(x, y) ) { if( IsAbleRemove( m_StateIdSet[i]) ) { handle = m_pLocalplayer->GetArID(); if( m_pLocalplayer && handle ) m_pGameManager->ProcMsgAtStatic( &SIMSG_REQUEST_REMOVE_STATE( handle, m_StateIdSet[i] ) ); } break; } } } return SUIWnd::OnMouseMessage( dwMessage, x, y ); } /// 2011.03.30 - prodongi void SUIStateHEffectWnd::setReiterationCount(SStateSlot const* state, KUIControlStatic* control) { if (!state) { control->SetShow(false); return ; } StateInfoEx const* info = GetTenacityDB().GetTenacityData(state->GetStateCode()); if (info && 0 < info->reiteration_count) { int level = min(state->GetStateLevel(), MAX_REITERATION_LEVEL); control->SetShow(true); control->SetCaption(CStringUtil::StringFormat("<#ffffff>%d", level).c_str()); } else { control->SetShow(false); } }