#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>인사말" ); #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(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(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( "<#fff200>%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( "<#fff200>%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(GetChild( c_szJOB_ICON )); // KUIControlIconStatic* pPVPIcon = dynamicCast(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( "<#ffffff>%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( "<#fff200>%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( "<#ffffff>%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( "%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(GetChild( c_szHP_BAR )); if( pGauge ) RefreshGauge( pGauge, nHP, nMaxHP, aniGauge ); SetChildCaption( c_szHP_TEXT , CStringUtil::StringFormat( "<#FFFFFF>%d/%d", nHP, nMaxHP ).c_str() ); } void SUITargetWnd::RefreshMP( int nMP, int nMaxMP, bool aniGauge ) { KUIControlGauge* pGauge = dynamicCast(GetChild( c_szMP_BAR )); if( pGauge ) RefreshGauge( pGauge, nMP, nMaxMP, aniGauge ); SetChildCaption( c_szMP_TEXT, CStringUtil::StringFormat( "<#FFFFFF>%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(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(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(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(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( "<#ffffff>%s", targetName ); wndName->SetCaption(caption.c_str()); } ////////////////////////////////////////// // SUITargetPortraitWnd // ////////////////////////////////////////// bool SUITargetPortraitWnd::InitData( bool bReload ) { m_handle = NULL; #ifdef _KUI_INVALIDATION // { [sonador] KUIControl3DStatic* pStaticTarget = dynamicCast(GetChild( "target_portrait_face" )); KUIControl3DStatic* pFacecutStaticTarget = dynamicCast(GetChild( "facecut" )); if( pStaticTarget ) this->AddPopupControl( pStaticTarget ); if( pFacecutStaticTarget ) this->AddPopupControl( pFacecutStaticTarget ); // } #endif /// 2011.04.01 right click tool tip - prodongi KUIControl* rmark = dynamicCast(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(pMsg); SetTargetCamPos( pTargetMsg->pos ); } break; case IMSG_UI_TARGET_PORTRAIT_REFRESH: { SIMSG_UI_TARGET_PORTRAIT_REFRESH* msg = dynamicCast(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(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(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; } }