972 lines
30 KiB
C++
972 lines
30 KiB
C++
|
|
#include "stdafx.h"
|
|
#include "KUIControlStatic.h"
|
|
#include "KUIControlGauge.h"
|
|
#include "KUIControlButton.h"
|
|
#include "KUIControl3DStatic.h"
|
|
#include "KSeqForm.h"
|
|
#include "GameDefine.h"
|
|
#include "SGameManager.h"
|
|
#include "SUITargetWnd.h"
|
|
#include "SUIDisplayInfo.h"
|
|
#include "SJobDB.h"
|
|
#include "SMonsterDB.h"
|
|
#include "SCreatureDB.h"
|
|
#include "SNpcResourceDB.h"
|
|
#include "SPetDB.h"
|
|
#include "SPlayerInfoMgr.h"
|
|
#include "SGameSystem.h"
|
|
//#include "SGameMessageUI.h"
|
|
#include "SGameMessage.h"
|
|
#include "SSummonSlotMgr.h"
|
|
#include "SMessengerMgr.h"
|
|
#include "SGameOption.h"
|
|
//#include "Util.h"
|
|
#include "SGameSystem.h"
|
|
|
|
extern SGameSystem* g_pCurrentGameSystem;
|
|
|
|
/// 2010.11.10 - proodngi
|
|
#include "SGameLobbyDefine.h"
|
|
/// 2011.01.11 - prodongi
|
|
#include "SCobManager.h"
|
|
/// 2010.11.24 - prodongi
|
|
//#include "SUIUtil.h"
|
|
#include "SGame.h"
|
|
#include "SGameAvatarEx.h"
|
|
#include "SGameInterface.h"
|
|
|
|
namespace
|
|
{
|
|
const DWORD c_dwGaugeFillTime = 0;
|
|
|
|
enum TARGETINFO
|
|
{
|
|
RANK_6LV_MOB = 0, // 몹과 렙 차가 -9 이상
|
|
RANK_5LV_MOB, // 몹과 렙 차가 -6-8
|
|
RANK_4LV_MOB, // 몹과 렙 차가 -3-5
|
|
SAME_RANK_MOB, // 몹과 렙 차가 +-2
|
|
RANK_3LV_MOB, // 몹과 렙 차가 +3+5
|
|
RANK_2LV_MOB, // 몹과 렙 차가 +6+8
|
|
RANK_1LV_MOB, // 몹과 렙 차가 +9
|
|
};
|
|
|
|
enum LEVELINFO
|
|
{
|
|
RANK_1LV = 18, // -9 = +9 이상 차이
|
|
RANK_2LV = 15, // -9 = +6 이상 차이
|
|
RANK_3LV = 12, // -9 = +3 이상 차이
|
|
SAME_LEVEL = 7, // -9 = -2 이상 차이
|
|
RANK_4LV = 4, // -9 = -5 이상 차이
|
|
RANK_5LV = 1, // -9 = -8 이상 차이
|
|
RANK_6LV = 0, // -9 = -9 이상 차이
|
|
};
|
|
|
|
enum MOB_TYPE
|
|
{
|
|
TYPE_PLAYER = 0,
|
|
TYPE_MOB = 1,
|
|
};
|
|
|
|
const char* c_szLvFont[7] =
|
|
{
|
|
"<#e20203>",//"font_target_level07", //검붉은
|
|
"<#ff8f21>",//"font_target_level06", //빨강
|
|
"<#ffd800>",//"font_target_level05", //주황
|
|
"<#ffffff>",//"font_target_level04", //흰색
|
|
"<#43eafc>",//"font_target_level03", //청녹
|
|
"<#59a6ff>",//"font_target_level02", //파랑
|
|
"<#a780fd>",//"font_target_level01", //보라
|
|
};
|
|
|
|
//const char* c_szLvNumFont[7] =
|
|
//{
|
|
// "font_target_levelnumber01",
|
|
// "font_target_levelnumber02",
|
|
// "font_target_levelnumber03",
|
|
// "font_target_levelnumber04",
|
|
// "font_target_levelnumber05",
|
|
// "font_target_levelnumber06",
|
|
// "font_target_levelnumber07",
|
|
//};
|
|
|
|
/// 2010.10.15 - prodongi
|
|
enum MOB_ATTACK_TYPE
|
|
{
|
|
ATTACK_TYPE_00 = 11,//강화몹
|
|
ATTACK_TYPE_01 = 12,//필드 중보스
|
|
ATTACK_TYPE_02 = 21,//던전몹
|
|
ATTACK_TYPE_03 = 22,//던전 중보스
|
|
ATTACK_TYPE_04 = 31,//C급 보스
|
|
ATTACK_TYPE_05 = 32,//B급 보스
|
|
ATTACK_TYPE_06 = 33,//A급 보스
|
|
ATTACK_TYPE_07 = 34,//S급 보스
|
|
ATTACK_TYPE_08 = 6, //강화던전몹
|
|
ATTACK_TYPE_09 = 7, //강화버서커
|
|
ATTACK_TYPE_10 = 8, //강화방어
|
|
};
|
|
|
|
const char * c_szHP_BAR = "target_hpbar";
|
|
const char * c_szMP_BAR = "target_mpbar";
|
|
const char * c_szNAME = "target_name_text";
|
|
const char * c_szLEVEL = "target_lv_number";
|
|
const char * c_szJOB_ICON = "target_job";
|
|
const char * c_szJOB_ICONBOX = "jobiconbox";
|
|
const char * c_szPVP_ICON = "pvp_icon";
|
|
const char * c_szPVP_ICONBOX = "pvp_iconbox";
|
|
const char * c_szHI_TEXT = "messagebox";
|
|
/// 2010.10.15 - prodongi
|
|
const char * c_szMark_Rank = "mark_rank_monster";
|
|
const char* c_szJOB_NAME = "mainframe_jobname_text";
|
|
const char * c_szHP_TEXT = "static_hp_value";
|
|
const char * c_szMP_TEXT = "static_mp_value";
|
|
};
|
|
|
|
//////////////////////////////////////////
|
|
// SUITargetWnd
|
|
//
|
|
//////////////////////////////////////////
|
|
/// 2011.01.20 - prodongi
|
|
SUITargetWnd::~SUITargetWnd()
|
|
{
|
|
SAFE_DELETE(m_markState);
|
|
}
|
|
|
|
bool SUITargetWnd::InitData( bool bReload )
|
|
{
|
|
m_bTarget = false;
|
|
m_bTargetPortrait = true;
|
|
m_nTargetType = 0;
|
|
m_nTargetLevel = 0;
|
|
m_nTargetJobID = -1;
|
|
|
|
#ifndef NDEBUG
|
|
SetChildCaption( c_szHI_TEXT, "<#cac9aa><shadow><hcenter><vcenter>인사말" );
|
|
#else
|
|
SetChildShow( c_szHI_TEXT, false );
|
|
#endif
|
|
|
|
SetChildShow( "guildiconbox", false );
|
|
SetCorrectionRect( KRect(0,0,0,-30), false );
|
|
|
|
/// 2011.01.19 - prodongi
|
|
m_markState = new sui::sMarkState;
|
|
m_markState->hideAll();
|
|
|
|
return SUIWnd::InitData(bReload);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// Idle 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUITargetWnd::Process( DWORD dwTime )
|
|
{
|
|
if( m_bIsInFreePassMarkIcon )
|
|
{
|
|
if( m_markState )
|
|
m_markState->UpdateFreePassEndTimeTooltip( this, m_pDisplayInfo );
|
|
}
|
|
|
|
SUIWnd::Process( dwTime );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 마우스 메시지 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
DWORD SUITargetWnd::OnMouseMessage(DWORD dwMessage, int x, int y)
|
|
{
|
|
if( m_markState )
|
|
m_bIsInFreePassMarkIcon = m_markState->IsInRectFreePass( this, KPoint( x, y ) ); ;
|
|
|
|
return SUIWnd::OnMouseMessage(dwMessage, x, y);
|
|
}
|
|
|
|
|
|
void SUITargetWnd::ProcMsgAtStatic( SGameMessage* pMsg )
|
|
{
|
|
if ( g_pCurrentGameSystem->GetShowPVPIcon() )
|
|
{
|
|
m_bPVPCheck = true;
|
|
UpdateTargetInfo();
|
|
}
|
|
else
|
|
{
|
|
m_bPVPCheck = false;
|
|
UpdateTargetInfo();
|
|
}
|
|
|
|
switch(pMsg->nType)
|
|
{
|
|
case MSG_CHANGE_NAME:
|
|
{
|
|
SetTargetName( m_PlayerInfoMgr.GetTargetName(), -1 );
|
|
}
|
|
break;
|
|
case MSG_PROPERTY:
|
|
{
|
|
SMSG_PROPERTY* pPropertyMsg = ( SMSG_PROPERTY* )pMsg;
|
|
if( pPropertyMsg->handle == m_PlayerInfoMgr.GetTarget() )
|
|
{
|
|
switch(pPropertyMsg->nPropertyType)
|
|
{
|
|
case SMSG_PROPERTY::PROPERTY_JOB:
|
|
m_nTargetJobID = ::atoi( pPropertyMsg->strValue.c_str() );
|
|
break;
|
|
case SMSG_PROPERTY::PROPERTY_LEVEL:
|
|
m_nTargetLevel = ::atoi( pPropertyMsg->strValue.c_str() );
|
|
break;
|
|
}
|
|
}
|
|
|
|
UpdateTargetInfo();
|
|
pMsg->bUse = true;
|
|
}
|
|
break;
|
|
case IMSG_UI_TARGET_INFO:
|
|
{
|
|
SIMSG_UI_TARGET_INFO* pTargetMsg = (SIMSG_UI_TARGET_INFO*)pMsg;
|
|
|
|
if( pTargetMsg->handle/* pTargetMsg->pSeqForm*/ )
|
|
{
|
|
/// 2011.01.27 - prodongi
|
|
SetTargetName( m_PlayerInfoMgr.GetTargetName(), pTargetMsg->nMobID );
|
|
|
|
RefreshHP( pTargetMsg->nHP, pTargetMsg->nMaxHP );
|
|
RefreshMP( pTargetMsg->nMP, pTargetMsg->nMaxMP );
|
|
|
|
m_nTargetLevel = pTargetMsg->nLevel;
|
|
m_nTargetType = pTargetMsg->nObjType;
|
|
|
|
if( m_PlayerInfoMgr.IsTargetPlayer(m_PlayerInfoMgr.GetPlayerHandle()) ) // 내가 타겟이면
|
|
m_nTargetJobID = m_PlayerInfoMgr.GetPlayerInfo().GetJobID();
|
|
else m_nTargetJobID = pTargetMsg->nJobID;
|
|
|
|
// 플레이어 타입의 경우 잡 아이콘, 이름 표시 // 몹일 경우 레벨 차이, 이름 표시
|
|
UpdateTargetInfo();
|
|
}
|
|
else
|
|
ReleaseTarget();
|
|
|
|
pMsg->bUse = true;
|
|
}
|
|
break;
|
|
case IMSG_UI_TARGET_STAT:
|
|
{
|
|
SIMSG_UI_TARGET_STAT* pStatMsg = dynamicCast<SIMSG_UI_TARGET_STAT* >(pMsg);
|
|
if( pStatMsg->handle == m_PlayerInfoMgr.GetTarget() ||
|
|
pStatMsg->handle == m_PlayerInfoMgr.GetPlayerHandle() )
|
|
{
|
|
// _oprint( "handle[%d] : HP %d %d - MP %d %d\n", pStatMsg->handle, pStatMsg->m_nVar1, pStatMsg->m_nVar3, pStatMsg->m_nVar2, pStatMsg->m_nVar4 );
|
|
|
|
RefreshHP( pStatMsg->m_nVar1, pStatMsg->m_nVar3, true ); /// 2011.08.08 prodongi
|
|
RefreshMP( pStatMsg->m_nVar2, pStatMsg->m_nVar4, true );
|
|
|
|
pMsg->bUse = true;
|
|
}
|
|
}
|
|
break;
|
|
|
|
/// 2011.01.17 - prodongi
|
|
case IMSG_UI_STATE_LIST_UPDATE:
|
|
{
|
|
SIMSG_UI_STATE_LIST_UPDATE* pStateMsg = (SIMSG_UI_STATE_LIST_UPDATE*)pMsg;
|
|
if (SIMSG_UI_STATE_LIST_UPDATE::STATE_UPDATE_MARK == pStateMsg->nUpdateType)
|
|
{
|
|
updateMarkStateList(pStateMsg->hPlayer);
|
|
pMsg->bUse = true;
|
|
}
|
|
}
|
|
break;
|
|
/// 2011.01.17 - prodongi
|
|
case IMSG_MARK_STATUS_CHANGE:
|
|
{
|
|
SMSG_MARK_STATUS_CHANGE* status = dynamicCast<SMSG_MARK_STATUS_CHANGE*>(pMsg);
|
|
updateMarkStatusList(status->m_status);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void SUITargetWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
|
|
{
|
|
SUIWnd::OnNotifyUIWindowOpen(bOpen);
|
|
|
|
if( bOpen )
|
|
{
|
|
// 타겟이 있으면 보여주고 아니면 보여주지 않는다
|
|
if( !m_bTarget )
|
|
{
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGET, false ) );
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, false ) );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, false ) );
|
|
|
|
//막음 -N4-
|
|
// if( m_nTargetType == TS_ENTER::GAME_PLAYER )
|
|
// {
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETPLAYER, false ) );
|
|
// }
|
|
// else if( m_nTargetType == TS_ENTER::GAME_MOB )
|
|
// {
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETMONSTER, false ) );
|
|
// }
|
|
}
|
|
}
|
|
void SUITargetWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
|
|
{
|
|
switch(nMessage)
|
|
{
|
|
case KUI_MESSAGE::KBUTTON_CLICK:
|
|
{
|
|
if( !m_bTarget ) break;
|
|
|
|
if( ::_stricmp( "target_off", lpszControlID ) == 0 )
|
|
{
|
|
// 타겟 해제, 게임 내에 NULL 타겟을 보낸다
|
|
SIMSG_UI_ACT_TARGET msg;
|
|
msg.m_nTargetHandle = NULL;
|
|
m_pGameManager->ProcMsgAtStatic(&msg);
|
|
}
|
|
// MJ 2005/04/19 임시로 simplebutton 으로 작업한다.. 차후에 check 버튼으로 교체
|
|
if( ::_stricmp( "target_facecut_button", lpszControlID ) == 0 )
|
|
{
|
|
m_bTargetPortrait = !m_bTargetPortrait;
|
|
ShowTargetPortrait();
|
|
|
|
// 미니맵 옆으로 이동
|
|
// 150 = 타겟포트레이트창 width
|
|
int nX = 0;
|
|
if( m_bTargetPortrait ) nX = GetRect().left - 150 + 2;
|
|
else nX = GetRect().left + 150 - 2;
|
|
MovePos( nX, 0 );
|
|
}
|
|
}
|
|
break;
|
|
//막음 -N4-
|
|
// case KUI_MESSAGE::KGENWND_RIGHT_CLICK:
|
|
// {
|
|
// if( m_nTargetType == TS_ENTER::GAME_PLAYER )
|
|
// {
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_TOGGLE_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETPLAYER ) );
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETPLAYER, GetRect().right, GetRect().bottom ) );
|
|
// }
|
|
// else if( m_nTargetType == TS_ENTER::GAME_MOB )
|
|
// {
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_TOGGLE_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETMONSTER ) );
|
|
// m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_FULLDOWN_TARGETMONSTER, GetRect().right, GetRect().bottom ) );
|
|
// }
|
|
// }
|
|
// break;
|
|
}
|
|
|
|
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
|
|
}
|
|
|
|
void SUITargetWnd::UpdateTargetInfo()
|
|
{
|
|
/// 2011.01.12 - prodongi
|
|
SetChildShow( c_szJOB_NAME, (m_nTargetType == TS_ENTER::GAME_PLAYER ) ? true : false );
|
|
|
|
// SetChildShow( "target_lv_font" , (m_nTargetType == TS_ENTER::GAME_PLAYER) ? false : true );
|
|
|
|
//GM 모드로 실행시 레벨 나오게
|
|
//2009-05-20 : hunee
|
|
#ifdef _DEV
|
|
{
|
|
setShowLevel(true); /// 2011.02.14 - prodongi
|
|
SetChildShow( c_szHP_TEXT, true );
|
|
SetChildShow( c_szMP_TEXT, true );
|
|
|
|
int nLevelInfo = GetTargetLevelInfo();
|
|
/// 2011.01.12 - prodongi
|
|
SetChildCaption( c_szLEVEL, CStringUtil::StringFormat( "<font:font_02><size:9><#fff200><hcenter><vcenter>%s%d", c_szLvFont[nLevelInfo], m_nTargetLevel ).c_str() );
|
|
}
|
|
#else
|
|
SetChildShow( c_szHP_TEXT, true );
|
|
SetChildShow( c_szMP_TEXT, true );
|
|
|
|
/// 2011.02.14 - prodongi
|
|
bool showLevel = (m_nTargetType == TS_ENTER::GAME_PLAYER ) ? false : true;
|
|
setShowLevel(showLevel);
|
|
int nLevelInfo = GetTargetLevelInfo();
|
|
SetChildCaption( c_szLEVEL, CStringUtil::StringFormat( "<font:font_02><size:9><#fff200><hcenter><vcenter>%s%d", c_szLvFont[nLevelInfo], m_nTargetLevel ).c_str() );
|
|
|
|
//상대방 크리쳐
|
|
if( m_nTargetType == TS_ENTER::GAME_SUMMON && m_nTargetLevel == 0 )
|
|
{
|
|
/// 2011.02.14 - prodongi
|
|
setShowLevel(false);
|
|
}
|
|
#endif
|
|
|
|
//KUIControlIconStatic* pIcon = (KUIControlIconStatic*)GetChild("target_lv_back");
|
|
//if( pIcon == NULL ) return;
|
|
//pIcon->SetTooltip(NULL);
|
|
|
|
//// 위치 변경 해준다..if_player : else if_mob 달라지므로
|
|
//KUIWnd* pTitle = GetChild( "target_nametitle" );
|
|
//if( pTitle == NULL ) return;
|
|
|
|
switch(m_nTargetType)
|
|
{
|
|
case TS_ENTER::GAME_PLAYER:
|
|
{
|
|
// pIcon->SetIcon( TYPE_PLAYER, "icon_target_back" );
|
|
// pIcon->MovePos( pTitle->GetRect().left-pIcon->GetRect().GetWidth(), pTitle->GetRect().top );
|
|
SetChildShow( c_szJOB_ICON , true );
|
|
SetChildShow( c_szJOB_ICONBOX, true );
|
|
SetChildShow( c_szHI_TEXT , false );
|
|
SetChildShow( c_szPVP_ICON , m_bPVPCheck );
|
|
SetChildShow( c_szPVP_ICONBOX, m_bPVPCheck );
|
|
|
|
// 캐릭 직업 아이콘 표시
|
|
KUIControlIconStatic* pJobIcon = dynamicCast<KUIControlIconStatic*>(GetChild( c_szJOB_ICON ));
|
|
// KUIControlIconStatic* pPVPIcon = dynamicCast<KUIControlIconStatic*>(GetChild( c_szPVP_ICON )); // 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
|
|
|
|
/// 2011.01.17 - prodongi
|
|
updateMarkStateList(m_PlayerInfoMgr.GetTarget());
|
|
updateMarkStatusList(m_PlayerInfoMgr.GetTarget());
|
|
|
|
if( pJobIcon )
|
|
{
|
|
// pJobIcon->MovePos( pIcon->GetRect().right-(pIcon->GetRect().GetWidth()/2)-pJobIcon->GetRect().GetWidth(), pIcon->GetRect().top+2 );
|
|
|
|
if( m_nTargetJobID > 0 )
|
|
{
|
|
//바꿔야 한다.
|
|
pJobIcon->SetIcon( c_szDEF_SPR_NAME, GetJobDB().GetJobIconName(m_nTargetJobID) );
|
|
if( GetJobDB().GetJobName(m_nTargetJobID) != NULL )
|
|
{
|
|
std::string strJobName = GetJobDB().GetJobName(m_nTargetJobID);
|
|
std::string strTooltip = m_PlayerInfoMgr.GetTargetName();
|
|
if( strJobName.size() > 0 )
|
|
{
|
|
strTooltip += " [";
|
|
strTooltip += strJobName;
|
|
strTooltip += "]";
|
|
}
|
|
pJobIcon->SetTooltip( strTooltip.c_str() );
|
|
/// 2011.01.12 - prodongi
|
|
SetChildCaption( c_szJOB_NAME, CStringUtil::StringFormat( "<font:font_01><size:9><#ffffff><left>%s", strJobName.c_str()).c_str() );
|
|
}
|
|
else
|
|
{
|
|
pJobIcon->SetTooltip( NULL );
|
|
/// 2011.01.12 - prodongi
|
|
SetChildCaption( c_szJOB_NAME, "");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// pJobIcon->SetIcon( 0, "job00" );
|
|
pJobIcon->SetTooltip( NULL );
|
|
/// 2011.01.12 - prodongi
|
|
SetChildCaption( c_szJOB_NAME, "");
|
|
}
|
|
|
|
// 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
|
|
//if( pPVPIcon )
|
|
//{
|
|
// pPVPIcon->SetIcon( c_szDEF_SPR_NAME, "icon_pvp_normal" );
|
|
//}
|
|
}
|
|
}
|
|
break;
|
|
case TS_ENTER::GAME_NPC:
|
|
{
|
|
/// 2011.02.14 - prodongi
|
|
setShowLevel(false);
|
|
SetChildShow( c_szJOB_ICON , false );
|
|
SetChildShow( c_szJOB_ICONBOX, false );
|
|
SetChildShow( c_szHI_TEXT , false );
|
|
SetChildShow( c_szPVP_ICON , false );
|
|
SetChildShow( c_szPVP_ICONBOX, false );
|
|
/// 2011.01.17 - prodongi
|
|
hideAllMark();
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
// pIcon->SetIcon( TYPE_MOB, "icon_target_back" );
|
|
// pIcon->MovePos( pTitle->GetRect().left-pIcon->GetRect().GetWidth(), 1 );
|
|
|
|
//// lv_font, lv_number 애니 바꿔준다
|
|
int nLevelInfo = GetTargetLevelInfo();
|
|
//KUIControlStatic* pLvFont = ( KUIControlStatic* )GetChild( "target_lv_font" );
|
|
//if( pLvFont ) pLvFont->SetBack( c_szDEF_SPR_NAME, c_szLvFont[nLevelInfo] );
|
|
|
|
//KUIWnd* pLvNumber = GetChild( c_szLEVEL );
|
|
//if( pLvNumber && (m_nOldDiffLevel == -1 || m_nOldDiffLevel != nLevelInfo) )
|
|
//{
|
|
// KRect rt = pLvNumber->GetRect();
|
|
// RemoveChild( pLvNumber );
|
|
|
|
// m_pManager->CreateControl( KUIWND_CREATE_ARG( "static", c_szLEVEL, CStringUtil::StringFormat("%d", m_nTargetLevel).c_str(), rt, KSTYLE_NUMBER_CENTER, 0, this, c_szLvNumFont[nLevelInfo], c_szDEF_SPR_NAME, m_pManager ) );
|
|
// m_nOldDiffLevel = nLevelInfo;
|
|
//}
|
|
|
|
/// 2011.01.12 - prodongi
|
|
SetChildCaption( c_szLEVEL, CStringUtil::StringFormat( "<font:font_02><size:9><#fff200><hcenter><vcenter>%s%d", c_szLvFont[nLevelInfo], m_nTargetLevel ).c_str() );
|
|
SetChildShow( c_szJOB_ICON , false );
|
|
SetChildShow( c_szJOB_ICONBOX, false );
|
|
SetChildShow( c_szHI_TEXT , false );
|
|
SetChildShow( c_szPVP_ICON , false );
|
|
SetChildShow( c_szPVP_ICONBOX, false );
|
|
/// 2011.01.17 - prodongi
|
|
hideAllMark();
|
|
}
|
|
break;
|
|
}
|
|
|
|
/// 2011.02.14 - prodongi
|
|
setTargetNameWithLenth(NULL);
|
|
}
|
|
int SUITargetWnd::GetTargetLevelInfo()
|
|
{
|
|
int nDiff = m_PlayerInfoMgr.GetPlayerInfo().GetLevel() - m_nTargetLevel;
|
|
|
|
if( nDiff >= RANK_1LV-9 ) return RANK_1LV_MOB;
|
|
else if( nDiff >= RANK_2LV-9 ) return RANK_2LV_MOB;
|
|
else if( nDiff >= RANK_3LV-9 ) return RANK_3LV_MOB;
|
|
else if( nDiff >= SAME_LEVEL-9 ) return SAME_RANK_MOB;
|
|
else if( nDiff >= RANK_4LV-9 ) return RANK_4LV_MOB;
|
|
else if( nDiff >= RANK_5LV-9 ) return RANK_5LV_MOB;
|
|
else return RANK_6LV_MOB;
|
|
|
|
return SAME_RANK_MOB;
|
|
}
|
|
void SUITargetWnd::ReleaseTarget()
|
|
{
|
|
SetChildCaption( c_szNAME, "" );
|
|
SetChildCaption("target_name_text_middle", ""); /// 2011.02.14 - prodongi
|
|
SetChildCaption("target_name_text_long", "");
|
|
SetChildCaption( c_szJOB_NAME, "" );
|
|
|
|
m_bTarget = false;
|
|
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGET, false ) );
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, false ) );
|
|
}
|
|
void SUITargetWnd::SetTargetName( const char* szName, int nMobID )
|
|
{
|
|
m_bTarget = true;
|
|
/*
|
|
/// 2010.10.15 - prodongi
|
|
KUIWnd* pStaticName = GetChild( c_szNAME );
|
|
if( NULL != pStaticName )
|
|
{
|
|
/// 2011.01.12 - prodongi
|
|
std::string strName = CStringUtil::StringFormat( "<font:font_02><size:10><hcenter><#ffffff><vcenter>%s", szName );
|
|
pStaticName->SetCaption( strName.c_str() );
|
|
}
|
|
*/
|
|
KUIWnd* wndRank = GetChild(c_szMark_Rank);
|
|
if (wndRank)
|
|
{
|
|
if (nMobID != 0)
|
|
{
|
|
int type = GetMonsterDB().GetMobAttackType( nMobID );
|
|
std::string strName = CStringUtil::StringFormat("common_mark_rank_monster_%02d", type);
|
|
wndRank->SetAniName(strName.c_str());
|
|
wndRank->SetShow(true);
|
|
}
|
|
else
|
|
{
|
|
wndRank->SetShow(false);
|
|
}
|
|
}
|
|
|
|
|
|
/// 2011.02.14 - prodongi
|
|
setTargetNameWithLenth(szName);
|
|
|
|
/*
|
|
KUIWnd* pStaticName = GetChild( c_szNAME );
|
|
if( NULL != pStaticName )
|
|
{
|
|
std::string strColor = "<#000000>";
|
|
std::string strFlag; strFlag.clear();
|
|
switch(GetMonsterDB().GetMobAttackType( nMobID ))
|
|
{
|
|
case ATTACK_TYPE_00 : strFlag = " [ + ]"; break;
|
|
case ATTACK_TYPE_01 : strFlag = " [ * ]"; break;
|
|
case ATTACK_TYPE_02 : strFlag = " [ ++ ]"; break;
|
|
case ATTACK_TYPE_03 : strFlag = " [ ** ]"; break;
|
|
case ATTACK_TYPE_04 :
|
|
case ATTACK_TYPE_05 :
|
|
case ATTACK_TYPE_06 :
|
|
case ATTACK_TYPE_07 :
|
|
{
|
|
strColor = "<#FF0000>";
|
|
strFlag = " [ ?? ]";
|
|
}
|
|
break;
|
|
case ATTACK_TYPE_08: // sonador 1.2.8 몬스터 타입에 따른 타겟창 이름 표시 룰 추가
|
|
case ATTACK_TYPE_09:
|
|
case ATTACK_TYPE_10:
|
|
{
|
|
strFlag = " [ +++ ]";
|
|
}
|
|
break;
|
|
}
|
|
|
|
std::string strName = CStringUtil::StringFormat( "<size:10><HCENTER><VCENTER>%s%s%s", strColor.c_str(), szName, strFlag.c_str() );
|
|
pStaticName->SetCaption( strName.c_str() );
|
|
}
|
|
*/
|
|
}
|
|
|
|
/// 2011.08.08 - prodongi
|
|
void SUITargetWnd::RefreshHP( int nHP, int nMaxHP, bool aniGauge )
|
|
{
|
|
KUIControlGauge* pGauge = dynamicCast<KUIControlGauge*>(GetChild( c_szHP_BAR ));
|
|
if( pGauge ) RefreshGauge( pGauge, nHP, nMaxHP, aniGauge );
|
|
|
|
SetChildCaption( c_szHP_TEXT , CStringUtil::StringFormat( "<font:font_01><b><size:8><#FFFFFF><hcenter><right>%d/%d", nHP, nMaxHP ).c_str() );
|
|
}
|
|
|
|
void SUITargetWnd::RefreshMP( int nMP, int nMaxMP, bool aniGauge )
|
|
{
|
|
KUIControlGauge* pGauge = dynamicCast<KUIControlGauge*>(GetChild( c_szMP_BAR ));
|
|
if( pGauge ) RefreshGauge( pGauge, nMP, nMaxMP, aniGauge );
|
|
|
|
SetChildCaption( c_szMP_TEXT, CStringUtil::StringFormat( "<font:font_01><b><size:8><#FFFFFF><hcenter><right>%d/%d", nMP, nMaxMP ).c_str() );
|
|
}
|
|
|
|
/// 2010.11.10 - prodongi
|
|
//#ifdef _DEV
|
|
//extern bool g_bDebugMode;
|
|
//#endif
|
|
/// 2011.08.08 - prodongi
|
|
void SUITargetWnd::RefreshGauge( class KUIControlGauge* pGaugeControl, int nCurrent, int nMax, bool aniGauge )
|
|
{
|
|
if( !m_bTarget ) return;
|
|
if( pGaugeControl == NULL ) return;
|
|
|
|
int gageFillTime = 0;
|
|
if (aniGauge)
|
|
gageFillTime = 1000;
|
|
|
|
nMax = max( nCurrent, nMax );
|
|
nCurrent = max( nCurrent, 0 );
|
|
|
|
int nPer = 0;
|
|
if( nMax > 0 ) nPer = ((float)nCurrent/(float)nMax)*100;
|
|
|
|
pGaugeControl->SetMax( DWORD(nMax) );
|
|
|
|
bool bFriend(false);
|
|
unsigned char Type(NULL);
|
|
|
|
//현재 타겟이 동료인지 체크하는 부분 -N4-
|
|
AR_HANDLE TargetHandle(NULL);
|
|
TargetHandle = m_PlayerInfoMgr.GetTarget();
|
|
bFriend = m_pDisplayInfo->IsFriend( TargetHandle, Type );
|
|
|
|
//TODO: 타겟 피보기 수정
|
|
//2009-05-20: hunee
|
|
/// 2010.11.10 - prodongi
|
|
//#ifdef _DEV
|
|
if (g_UserInfo.isMonkeyTail())
|
|
{
|
|
extern bool g_bDebugMode;
|
|
// 동료의 체력 게이지일때는 바의 색이 변한다.. 50% > guagebar_07, 20% > guagebar_08, 20% < guagebar_09
|
|
if( pGaugeControl && pGaugeControl == dynamicCast<KUIControlGauge*>(GetChild(c_szHP_BAR) ))
|
|
{
|
|
if (bFriend)
|
|
{
|
|
// 게이지 남은 양에 따라 텍스처 바꿔줌 // 2012.02.03 - servantes
|
|
setHPGaugeTexture( nPer, pGaugeControl, 11 );
|
|
}
|
|
else
|
|
{
|
|
if( stricmp( pGaugeControl->GetAniName(), "common_gauge_titanium_monster_middle" ) != 0 )
|
|
pGaugeControl->SetBack( c_szDEF_SPR_NAME, "common_gauge_titanium_monster_middle" );
|
|
}
|
|
}
|
|
|
|
pGaugeControl->SetGauge( DWORD(nCurrent), gageFillTime/*c_dwGaugeFillTime*/ );
|
|
}
|
|
//#else
|
|
else
|
|
{
|
|
//if( bFriend || ( g_bDebugMode && ( GetKeyState( VK_SCROLL ) & 0x01 )) )
|
|
if ( bFriend )
|
|
{
|
|
// 동료의 체력 게이지일때는 바의 색이 변한다.. 50% > guagebar_07, 20% > guagebar_08, 20% < guagebar_09
|
|
if( pGaugeControl && pGaugeControl == dynamicCast<KUIControlGauge*>(GetChild(c_szHP_BAR) ))
|
|
{
|
|
// 게이지 남은 양에 따라 텍스처 바꿔줌 // 2012.02.03 - servantes
|
|
setHPGaugeTexture( nPer, pGaugeControl, 11 );
|
|
}
|
|
pGaugeControl->SetGauge( DWORD(nCurrent), gageFillTime/*c_dwGaugeFillTime*/ );
|
|
}
|
|
else
|
|
{
|
|
/// 2010.11.24 - prodongi
|
|
// 적군의 체력 게이지는 항상 붉은 색의 리소스를 사용한다.
|
|
if( pGaugeControl && pGaugeControl == dynamicCast<KUIControlGauge*>(GetChild(c_szHP_BAR) ))
|
|
pGaugeControl->SetBack( c_szDEF_SPR_NAME, "common_gauge_titanium_monster_middle" );
|
|
|
|
if( Type == TS_ENTER::GAME_MOB )
|
|
{
|
|
if( m_pDisplayInfo->ShowMobHPMP( TargetHandle ) )
|
|
pGaugeControl->SetGauge( DWORD(nCurrent), gageFillTime/*c_dwGaugeFillTime*/ );
|
|
else
|
|
pGaugeControl->SetGauge( DWORD(0), gageFillTime/*c_dwGaugeFillTime*/ );
|
|
}
|
|
else
|
|
{
|
|
/// 2011.06.28 적대적 플레이어도 게이지를 보여준다, - prodongi
|
|
pGaugeControl->SetGauge( DWORD(nCurrent), gageFillTime/*c_dwGaugeFillTime*/ );
|
|
}
|
|
}
|
|
}
|
|
//#endif
|
|
}
|
|
|
|
void SUITargetWnd::ShowTargetPortrait()
|
|
{
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, GetGameOption().IsMobFace() ) );
|
|
}
|
|
|
|
/// 2011.01.17 - prodongi
|
|
void SUITargetWnd::updateMarkStateList(AR_HANDLE handle)
|
|
{
|
|
if(handle == NULL) // 2011.11.29 - servantes : 보호코드
|
|
return ;
|
|
|
|
SGame* pGame = m_pGameManager->GetActiveGame();
|
|
if (!pGame)
|
|
return ;
|
|
|
|
SGameAvatarEx* targetPlayer = dynamicCast<SGameAvatarEx*>(pGame->GetGameObject(handle));
|
|
m_markState->updateMarkStateList(this, m_pDisplayInfo, targetPlayer);
|
|
}
|
|
|
|
/// 2011.01.17 - prodongi
|
|
void SUITargetWnd::updateMarkStatusList(AR_HANDLE handle)
|
|
{
|
|
int markStatus = m_pGameManager->GetGameInterface()->getCharacterWndMarkStatus(handle);
|
|
updateMarkStatusList(markStatus);
|
|
}
|
|
|
|
/// 2011.01.17 - prodongi
|
|
void SUITargetWnd::updateMarkStatusList(int status)
|
|
{
|
|
m_markState->updateMarkStatusList(this, m_pDisplayInfo, status);
|
|
}
|
|
|
|
/// 2011.01.19 - prodongi
|
|
void SUITargetWnd::hideAllMark()
|
|
{
|
|
m_markState->hideAllControl(this);
|
|
}
|
|
|
|
/// 2011.02.14 - prodongi
|
|
void SUITargetWnd::setShowLevel(bool show)
|
|
{
|
|
SetChildShow(c_szLEVEL, show);
|
|
SetChildShow("titlebar_lv", show);
|
|
}
|
|
|
|
/// 2011.02.14 - prodongi
|
|
void SUITargetWnd::setTargetNameWithLenth(char const* targetName)
|
|
{
|
|
if (!targetName)
|
|
targetName = m_PlayerInfoMgr.GetTargetName();
|
|
|
|
char const* nameControl;
|
|
SetChildShow("target_name_text", false);
|
|
SetChildShow("target_name_text_middle", false);
|
|
SetChildShow("target_name_text_long", false);
|
|
|
|
KUIWnd* wndLevel = GetChild(c_szLEVEL);
|
|
KUIWnd* wndRank = GetChild(c_szMark_Rank);
|
|
|
|
if (wndRank->IsShow())
|
|
{
|
|
nameControl = "target_name_text";
|
|
}
|
|
else if (wndLevel->IsShow())
|
|
{
|
|
nameControl = "target_name_text_middle";
|
|
}
|
|
else
|
|
{
|
|
nameControl = "target_name_text_long";
|
|
}
|
|
|
|
KUIWnd* wndName = GetChild(nameControl);
|
|
wndName->SetShow(true);
|
|
std::string caption = CStringUtil::StringFormat( "<font:font_02><size:10><hcenter><#ffffff><vcenter>%s", targetName );
|
|
wndName->SetCaption(caption.c_str());
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// SUITargetPortraitWnd
|
|
//
|
|
//////////////////////////////////////////
|
|
bool SUITargetPortraitWnd::InitData( bool bReload )
|
|
{
|
|
m_handle = NULL;
|
|
|
|
#ifdef _KUI_INVALIDATION
|
|
// { [sonador]
|
|
KUIControl3DStatic* pStaticTarget = dynamicCast<KUIControl3DStatic*>(GetChild( "target_portrait_face" ));
|
|
KUIControl3DStatic* pFacecutStaticTarget = dynamicCast<KUIControl3DStatic*>(GetChild( "facecut" ));
|
|
if( pStaticTarget ) this->AddPopupControl( pStaticTarget );
|
|
if( pFacecutStaticTarget ) this->AddPopupControl( pFacecutStaticTarget );
|
|
// }
|
|
#endif
|
|
|
|
/// 2011.04.01 right click tool tip - prodongi
|
|
KUIControl* rmark = dynamicCast<KUIControl*>(GetChild("mark_right_click_01"));
|
|
if (rmark)
|
|
{
|
|
std::string str;
|
|
XStringUtil::Format(str, "<#b92c36>%s", S(6777)); /// 2011.05.24 칼라 적용 - prodongi
|
|
rmark->SetTooltip(str.c_str());
|
|
}
|
|
|
|
return SUIWnd::InitData(bReload);
|
|
}
|
|
|
|
void SUITargetPortraitWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd/* = true*/ )
|
|
{
|
|
SUIWnd::OnNotifyUIWindowOpen(bOpen);
|
|
}
|
|
|
|
void SUITargetPortraitWnd::ProcMsgAtStatic( SGameMessage* pMsg )
|
|
{
|
|
switch( pMsg->nType )
|
|
{
|
|
case IMSG_UI_TARGET_CAM_POS :
|
|
{
|
|
SIMSG_UI_TARGET_CAM_POS * pTargetMsg = dynamicCast<SIMSG_UI_TARGET_CAM_POS*>(pMsg);
|
|
SetTargetCamPos( pTargetMsg->pos );
|
|
}
|
|
break;
|
|
case IMSG_UI_TARGET_PORTRAIT_REFRESH:
|
|
{
|
|
SIMSG_UI_TARGET_PORTRAIT_REFRESH* msg = dynamicCast<SIMSG_UI_TARGET_PORTRAIT_REFRESH*>(pMsg);
|
|
if (msg)
|
|
{
|
|
SetSeqForm( msg );
|
|
}
|
|
}
|
|
break;
|
|
case IMSG_UI_TARGET_INFO:
|
|
{
|
|
SIMSG_UI_TARGET_INFO* pTargetMsg = (SIMSG_UI_TARGET_INFO*)pMsg;
|
|
|
|
if( pTargetMsg->handle )
|
|
{
|
|
if( pTargetMsg->nObjType != TS_ENTER::GAME_MOB || GetGameOption().IsMobFace() )
|
|
{
|
|
/// 2011.04.01 - prodongi
|
|
if (TS_ENTER::GAME_PLAYER == pTargetMsg->nObjType) SetChildShow("mark_right_click_01", true);
|
|
else SetChildShow("mark_right_click_01", false);
|
|
|
|
//옵션 쎄팅에 따라서 표시하는 것으로 바뀜
|
|
SetSeqForm( pTargetMsg );
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, true ) );
|
|
}
|
|
else m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, false ) );
|
|
}
|
|
else
|
|
{
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGETPORTRAIT, false ) );
|
|
}
|
|
pMsg->bUse = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SUITargetPortraitWnd::SetTargetCamPos( K3DVertex & pos )
|
|
{
|
|
KUIControl3DStatic* pStaticTarget = dynamicCast<KUIControl3DStatic*>(GetChild( "target_portrait_face" ));
|
|
if( NULL != pStaticTarget )
|
|
{
|
|
/// 2012.07.23 SetCamPos를 호출하게 되면, 다른 값들도 초기화 되고, m_bPosValid = false가 되기 때문에
|
|
/// 렌더링이 되지 않는다, 그래서 순수하게 카메라 위치만 바꾸는 함수를 만들어서 호출 함 - prodongi
|
|
//pStaticTarget->SetCamPos( pos );
|
|
pStaticTarget->SetCamPosOnly( pos );
|
|
}
|
|
}
|
|
|
|
void SUITargetPortraitWnd::SetSeqForm( SIMSG_UI_TARGET_INFO* pMsg )
|
|
{
|
|
SetSeqForm(pMsg->handle, pMsg->nObjType, pMsg->nMobID, pMsg->strCobName.c_str(), pMsg->pSeqForm, false);
|
|
}
|
|
|
|
void SUITargetPortraitWnd::SetSeqForm(SIMSG_UI_TARGET_PORTRAIT_REFRESH *msg)
|
|
{
|
|
SetSeqForm(msg->handle, msg->nObjType, msg->nMobID, msg->pCobName, msg->pSeqForm, true);
|
|
}
|
|
|
|
void SUITargetPortraitWnd::SetSeqForm(AR_HANDLE handle, int objType, int mobID, char const* cobName, KSeqAvatarEx* seqForm, bool refresh)
|
|
{
|
|
KUIControl3DStatic* pStaticTarget = dynamicCast<KUIControl3DStatic*>(GetChild( "target_portrait_face" ));
|
|
if( NULL != pStaticTarget )
|
|
{
|
|
const KRect& rRect = pStaticTarget->GetRect();
|
|
if( refresh || m_handle != handle ) //다른 Object면 갱신
|
|
{
|
|
K3DVertex pos = K3DVertex(0, -8, 13);
|
|
if( objType == TS_ENTER::GAME_MOB )
|
|
{
|
|
pos = GetMonsterDB().GetMonsterCameraPos( mobID );
|
|
}
|
|
else if( objType == TS_ENTER::GAME_SUMMON )
|
|
{
|
|
pos = GetCreatureDB().GetSummonCameraPos( mobID );
|
|
}
|
|
else if( objType == TS_ENTER::GAME_PET )
|
|
{
|
|
pos = GetPetDB().Find( mobID ).getFaceCutCameraPosition();
|
|
}
|
|
else if( objType == TS_ENTER::GAME_NPC )
|
|
{
|
|
GetNpcResourceDB().GetFaceCut( mobID, pos );
|
|
}
|
|
else if( objType == TS_ENTER::GAME_PLAYER && cobName != NULL )
|
|
{
|
|
//데바 남 0//데바 여 1//아수라 남 2//아수라 여 3//가이아 남 4//가이아 여 5
|
|
int nRand = rand()%5;
|
|
if( strstr( cobName, "dem" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[0][nRand][0], cam_pos[0][nRand][1], cam_pos[0][nRand][2]);
|
|
}
|
|
else if( strstr( cobName, "def" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[1][nRand][0], cam_pos[1][nRand][1], cam_pos[1][nRand][2]);
|
|
}
|
|
else if( strstr( cobName, "asm" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[2][nRand][0], cam_pos[2][nRand][1], cam_pos[2][nRand][2]);
|
|
}
|
|
else if( strstr( cobName, "asf" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[3][nRand][0], cam_pos[3][nRand][1], cam_pos[3][nRand][2]);
|
|
}
|
|
else if( strstr( cobName, "gam" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[4][nRand][0], cam_pos[4][nRand][1], cam_pos[4][nRand][2]);
|
|
}
|
|
else if( strstr( cobName, "gaf" ) )
|
|
{
|
|
pos = K3DVertex(cam_pos[5][nRand][0], cam_pos[5][nRand][1], cam_pos[5][nRand][2]);
|
|
}
|
|
}
|
|
pStaticTarget->SetSeqForm( seqForm, KSize( rRect.GetWidth(), rRect.GetHeight() ), objType, pos );
|
|
}
|
|
|
|
m_handle = handle;
|
|
}
|
|
} |