Files
Leviathan/Client/Game/game/Interface/SUITargetWnd.cpp
T
2026-06-01 12:46:52 +02:00

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;
}
}