Files
2022-10-26 12:25:11 +08:00

1860 lines
54 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "targetdialog.h"
#include "ObjectManager.h"
#include "Player.h"
#include "Monster.h"
#include "InterfaceManager.h"
#include "IconImage.h"
#include "StateInfoParser.h"
#include "../Utility/Nstring.h"
#include "Hero.h"
#include "Mouse.h"
#include "globalfunc.h"
#include "uiCharPopupMenu/uiCharPopupMenu.h"
#include "uiCharPopupMan/uiCharPopupMan.h"
#include "GameFramework.h"
#include "BattleScene.h"
#include "uiToolTipMan/uiToolTipMan.h"
#include "HeroActionInput.h"
#include "GameFunc.h"
#include "uiPartyMan/uiPartyMan.h"
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
#include "GuildSystem/GuildSystemData.h"
#else
#include "uiGuildMan/uiGuildMan.h"
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
#include "Player.h"
#include "GuildMarkInfoParser.h"
#include "uiRadarMan/uiRadarMan.h"
#include "RadarFullDialog.h"
#include "BaseRadarDialog.h"
#include "GuildRightInfoParser.h"
#include "uiTargetMan/uiTargetMan.h"
#include "uiTargetZoneMarkDialog/uiTargetZoneMarkDialog.h"
#include "StatusIconManager.h"
#include "uiTargetAggro/uiTargetAggro.h"
#ifdef _NA_002935_20110704_ITEM_SCORE
#include "equipmentcontainer.h"
#endif //_NA_002935_20110704_ITEM_SCORE
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
#include "ChaosSystem/ChaosSystemData.h"
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
#define UPDATE_HP_TIME 3000
#include "SkillMain.h"
WzID TargetDialog::m_wzId[] =
{
StrToWzID("P000"),
StrToWzID("PI00"),
#ifdef _NA_008139_20150318_MODIFY_BUFF_ICON_UI
#else
StrToWzID("P101"),
#endif //_NA_008139_20150318_MODIFY_BUFF_ICON_UI
StrToWzID("P102"),
StrToWzID("P103"),
StrToWzID("P104"),
StrToWzID("P105"),
StrToWzID("P106"),
StrToWzID("P107"),
StrToWzID("P108"),
StrToWzID("P109"),
StrToWzID("P110"),
#ifdef _NA_000000_20130114_RENEWER_UI
StrToWzID("P111"),
StrToWzID("P112"),
StrToWzID("P113"),
StrToWzID("P114"),
StrToWzID("P115"),
StrToWzID("P116"),
StrToWzID("P117"),
StrToWzID("P118"),
StrToWzID("P119"),
#ifdef _NA_008139_20150318_MODIFY_BUFF_ICON_UI
#else
StrToWzID("P120"),
StrToWzID("P121"),
#endif //_NA_008139_20150318_MODIFY_BUFF_ICON_UI
StrToWzID("P122"),
StrToWzID("P123"),
StrToWzID("P124"),
StrToWzID("P125"),
StrToWzID("P126"),
StrToWzID("P127"),
StrToWzID("P128"),
StrToWzID("P129"),
StrToWzID("P130"),
StrToWzID("P131"),
StrToWzID("P132"),
StrToWzID("P133"),
StrToWzID("P134"),
StrToWzID("P135"),
StrToWzID("P136"),
StrToWzID("P137"),
StrToWzID("P138"),
StrToWzID("P139"),
#ifdef _NA_008139_20150318_MODIFY_BUFF_ICON_UI
#else
StrToWzID("P140"),
#endif //_NA_008139_20150318_MODIFY_BUFF_ICON_UI
#endif
StrToWzID("ST00"),
StrToWzID("T002"),
StrToWzID("PI05"),
StrToWzID("PI04"),
StrToWzID("PI03"),
StrToWzID("PI02"),
StrToWzID("PI01"),//은색
StrToWzID("P011"),
StrToWzID("TI04"), //TARGET_PIC_GUILD_MARK
StrToWzID("ST00"),
StrToWzID("P011"),//FIRE
StrToWzID("P012"),//WATER
StrToWzID("P013"),//WIND
StrToWzID("P014"),//EARTH
StrToWzID("P015"),//DARK
StrToWzID("P016"),//금색
StrToWzID("B000"),//열기
StrToWzID("B001"),//닫기
#ifdef _NA_000000_20130114_RENEWER_UI
StrToWzID("S001"), //TARGET_SCORE_BG
#else
#ifdef _NA_002935_20110704_ITEM_SCORE
StrToWzID("P017"), //TARGET_SCORE_BG // 장비평점
StrToWzID("P018"), //TARGET_SCORE_NUMBER1
StrToWzID("P057"), //TARGET_SCORE_NUMBER2
StrToWzID("P058"), //TARGET_SCORE_NUMBER3
StrToWzID("P059"), //TARGET_SCORE_NUMBER4
StrToWzID("P060"), //TARGET_SCORE_NUMBER5
#endif //_NA_002935_20110704_ITEM_SCORE
#endif
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
StrToWzID("P003"), //TARGET_PIC_SD_GAUGE, // 쉴드 게이지
StrToWzID("S002"), //TARGET_TEXT_SD_INFO, // 쉴드 스트링
StrToWzID("P002"), //TARGET_PIC_SECOND_GAUGE, // 밑 게이지
StrToWzID("P001"), //TARGET_PIC_SECOND_GAUGE_BACK, // 밑 게이지 배경
StrToWzID("S000"), //TARGET_TEXT_SECOND_HP_INFO, // 밑 스트링
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
#ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
StrToWzID("B003"), //TARGET_BUTTON_SUMMON_CANCLE, // 소환수 취소(역소환)
#endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
};
TargetDialog::TargetDialog(InterfaceManager *pUIMan):
uiBase(pUIMan)
{
}
TargetDialog::~TargetDialog(void)
{
}
VOID TargetDialog::Init( CDrawBase * pDrawBase )
{
uiBase::Init(pDrawBase);
m_dwPrevTargetKEY = 0;
m_dwTargetKEY = 0;
m_fGaugeSize = (float)getControl(TARGET_PIC_GAUGE)->GetSize().right;
m_fGaugeBackSize= (float)getControl(TARGET_PIC_GAUGE_BACK)->GetSize().right;
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP(100 , false);
SetSD(100.0f);
#else
SetHP( 100 ,1.0f);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
m_iHpRequestTime=UPDATE_HP_TIME;
status_icon_container_.reserve(10);
CCtrlStaticWZ * pStatic = (CCtrlStaticWZ *)getControl(TARGET_TEXT_MONSTER_INFO);
if( pStatic )
{
pStatic->ShowWindowWZ(WZ_HIDE);
}
CCtrlButtonWZ * pButton = (CCtrlButtonWZ *)getControl(TARGET_PIC_GUILD_MARK);
if( pButton )
{
pButton->ShowWindowWZ(WZ_HIDE);
}
#ifdef _SCJ_LONG_TEXT_REDUCING
CCtrlStaticWZ* static_control = (CCtrlStaticWZ*)getControl(TARGET_TEXT_INFO);
if ( static_control != NULL )
{
static_control->SetTextReducing(true);
}
#endif //_SCJ_LONG_TEXT_REDUCING
is_show_aggro_ = false;
int i = 0;
for (i = kElement_Color_Fire; i < kElement_Color_Max; ++i)
{
picture_element_frames_[i] = static_cast<CCtrlPictureWZ*>(getControl(TARGET_PICTURE_FIRE + i));
if (picture_element_frames_[i])
{
picture_element_frames_[i]->ShowWindowWZ(WZ_HIDE);
}
else
{
assert(picture_element_frames_[i]);
}
}
CCtrlPictureWZ* picture_element_frames_old = static_cast<CCtrlPictureWZ*>(getControl(TARGET_PIC_BER));
if (picture_element_frames_old)
{
picture_element_frames_old->ShowWindowWZ(WZ_HIDE);
picture_element_frames_[kElement_Color_Max-1] = picture_element_frames_old;
}
for (i = kShow_Value_Open; i < kShow_Value_Max; ++i)
{
show_aggro_window_buttons_[i] = static_cast<CCtrlButtonWZ*>(getControl(TARGET_BUTTON_OPEN + i));
if (show_aggro_window_buttons_[i])
{
show_aggro_window_buttons_[i]->ShowWindowWZ(WZ_HIDE);
}
else
{
assert(show_aggro_window_buttons_[i]);
}
}
#ifdef _NA_000000_20130114_RENEWER_UI
#else
#ifdef _NA_002935_20110704_ITEM_SCORE
CCtrlPictureWZ* picture_control;
for (int index = TARGET_SCORE_START; index < TARGET_SCORE_END; ++index)
{
picture_control = static_cast<CCtrlPictureWZ*>(getControl(index));
if (picture_control)
{
picture_control->ShowWindowWZ(WZ_HIDE);
}
}
#endif //_NA_002935_20110704_ITEM_SCORE
#endif
}
VOID TargetDialog::Release()
{
}
VOID TargetDialog::MessageProc( SI_MESSAGE * pMessage )
{
switch (pMessage->eResultMsg)
{
#ifdef _KIKI_20080418_MOUSECLICK_BUG_FIX // 엔진이 수정되면 CLICK으로 처리해도 됨
case RT_MSG_RBUTTONCLICK:
{
_showCharPopupMenu(TRUE);
}
#else
case RT_MSG_RBUTTONDOWN: // 클릭시 문제가 있어서 DOWN으로 처리
{
_showCharPopupMenu(TRUE);
}
break;
#endif
case RT_MSG_LBUTTONCLICK:
{
POSTYPE control_postion = getCtrlIDToPos(pMessage->dwCtrlID);
switch (control_postion)
{
case TARGET_BUTTON_OPEN://열기
{
is_show_aggro_ = true;
show_aggro_window_buttons_[kShow_Value_Open]->ShowWindowWZ(WZ_HIDE);
show_aggro_window_buttons_[kShow_Value_Close]->ShowWindowWZ(WZ_SHOW);
ShowAggroDialog();//열기 버튼은 몬스터 일때만 나타난다.
}
break;
case TARGET_BUTTON_CLOSE://닫기
{
is_show_aggro_ = false;
show_aggro_window_buttons_[kShow_Value_Close]->ShowWindowWZ(WZ_HIDE);
show_aggro_window_buttons_[kShow_Value_Open]->ShowWindowWZ(WZ_SHOW);
ShowAggroDialog();
}
break;
#ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
case TARGET_BUTTON_SUMMON_CANCLE: // 소환수 취소(역소환)
{
MSG_CG_SUMMON_COMMAND_SYN Packet;
Packet.m_dwTargetKey = GetTargetKey(); // 타겟키에 오브젝트ID를 넣으면 해당 ID만 역소환
Packet.m_byCommand = eSUMMON_COMMAND_DESTROY;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &Packet, sizeof(Packet));
}
break;
#endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
}
}
break;
default:
{
SolarDialog::MessageProc( pMessage );
}
break;
}
}
VOID TargetDialog::NetworkProc( MSG_BASE * pMsg )
{
}
CControlWZ * TargetDialog::getControl( POSTYPE AtPos )
{
if( AtPos < Dialog_Max )
{
return GetControlWZ( m_wzId[AtPos] );
}
else
{
return NULL;
}
}
POSTYPE TargetDialog::getCtrlIDToPos( WzID wzId )
{
for( POSTYPE i = 0 ; i < Dialog_Max; ++i )
{
if( m_wzId[i] == wzId )
{
return i;
}
}
return Dialog_Max;
}
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
VOID TargetDialog::SetHP(float hp_ratio ,bool is_player)
{
hp_ratio = min(max(hp_ratio, 0.0f), 100.0f);
float ho_width = m_fGaugeSize * (hp_ratio / 100.0f);
if (is_player)
{
CControlWZ* control_pointer = NULL;
for (int i = TARGET_SECOND_GAUGE_START; i <= TARGET_SECOND_GAUGE_END; ++i)
{
control_pointer = getControl(i);
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_SHOW);
}
}
control_pointer = getControl(TARGET_TEXT_HP_INFO); // 체력 수치
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_HIDE);
}
control_pointer = getControl(TARGET_PIC_GAUGE); // 체력 게이지
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_HIDE);
}
control_pointer = getControl(TARGET_PIC_SECOND_GAUGE); // 밑 체력 게이지
if (control_pointer)
{
RECT rtPicGauge = control_pointer->GetSizeRect();
control_pointer->MoveWindowWZ(
(float)rtPicGauge.left,
(float)rtPicGauge.top,
(float)ho_width,
(float)rtPicGauge.bottom - rtPicGauge.top);
}
}
else
{
CControlWZ* control_pointer = NULL;
for (int i = TARGET_SECOND_GAUGE_START; i <= TARGET_SECOND_GAUGE_END; ++i)
{
control_pointer = getControl(i);
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_HIDE);
}
}
control_pointer = getControl(TARGET_TEXT_HP_INFO); // 체력 수치
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_SHOW);
}
control_pointer = getControl(TARGET_PIC_GAUGE); // 체력 게이지
if (control_pointer)
{
control_pointer->ShowWindowWZ(WZ_SHOW);
RECT rtPicGauge = control_pointer->GetSizeRect();
control_pointer->MoveWindowWZ(
(float)rtPicGauge.left,
(float)rtPicGauge.top,
(float)ho_width,
(float)rtPicGauge.bottom - rtPicGauge.top);
}
}
}
VOID TargetDialog::SetSD(float sd_ratio)
{
if (100.f < sd_ratio)
{
sd_ratio = 100.f;
}
if (sd_ratio >= 0.0f)
{
float sd_width = m_fGaugeSize * (sd_ratio / 100.0f);
RECT rect_gauge = getControl(TARGET_PIC_SD_GAUGE)->GetSizeRect();
getControl(TARGET_PIC_SD_GAUGE)->MoveWindowWZ(
static_cast<float>(rect_gauge.left),
static_cast<float>(rect_gauge.top),
static_cast<float>(sd_width),
static_cast<float>(rect_gauge.bottom - rect_gauge.top));
CCtrlStaticWZ* control_pointer = static_cast<CCtrlStaticWZ*>(getControl(TARGET_TEXT_SD_INFO));
if (control_pointer)
{
TCHAR sd_info_string[INTERFACE_STRING_LENGTH];
Sprintf(sd_info_string, _T("%.0f%%"), sd_ratio);
GlobalFunc::SetCaption(control_pointer, sd_info_string);
control_pointer->SetTextColor(RGBA(255, 255, 255, 255));
}
}
}
#else //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
VOID TargetDialog::SetHP( float fHPPercent ,float fRadio)
{
if(100.f < fHPPercent)
{
WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_SYSCHAT, "[Warning]TargetDialog::HPPercent = %f", fHPPercent);
fHPPercent = 100.f;
}
if (fHPPercent >= 0.0f )
{
float fHpWidth = m_fGaugeSize *(fHPPercent/100.0f);
RECT rtPicGauge = getControl(TARGET_PIC_GAUGE)->GetSizeRect();
getControl(TARGET_PIC_GAUGE)->MoveWindowWZ(
(float)rtPicGauge.left,
(float)rtPicGauge.top,
(float)fHpWidth,
(float)rtPicGauge.bottom - rtPicGauge.top);
}
}
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
//=====================================================================================
// DESC: 파티원의 타켓정보를 셋팅
//=====================================================================================
BOOL TargetDialog::SetPartyMember()
{
uiPartyMan* partyMan = GET_DIALOG_MANAGER( uiPartyMan, UIMAN_PARTY );
assert(partyMan);
//해당키가파티멤버가 아니라면 리턴해버린다.
if(partyMan->GetPartyMemberInfo(m_dwTargetKEY)==FALSE)
return FALSE;
_targetChange(TRUE);
//0.파티원의 정보얻기
_PARTY_MEMBER_INFO rMember = partyMan->GetPartyMemberInfo(m_dwTargetKEY)->Get();
//1.파티원이름,레벨셋팅
Sprintf(m_szResultInfo, _T("%ld %s"), rMember.m_wLevel,rMember.m_szCharName);
Sprintf(m_szResultHpInfo, _T("%ld%%"),(DWORD)rMember.m_byHPRatio);
float fHPPercent = (float)rMember.m_byHPRatio;
m_dwTargetName = util::_tstring(rMember.m_szCharName);
//2.다이얼로그에 업데이트
CCtrlStaticWZ* pStaticControl = (CCtrlStaticWZ*)getControl(TARGET_TEXT_INFO); // 아이디
assert(pStaticControl);
pStaticControl->SetTextColor(RGBA(189, 198, 198, 255));
GlobalFunc::SetCaption(pStaticControl, m_szResultInfo);
pStaticControl->ShowWindowWZ(WZ_SHOW);
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP(fHPPercent, true);
SetSD((float)rMember.m_bySDRatio); //(float)rMember.m_byHPRatio
CCtrlStaticWZ* control_pointer = static_cast<CCtrlStaticWZ*>(getControl(TARGET_TEXT_SECOND_HP_INFO));
if (control_pointer)
{
GlobalFunc::SetCaption(control_pointer, m_szResultHpInfo);
control_pointer->SetTextColor(RGBA(255, 255, 255, 255));
}
#else //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP(fHPPercent, 90.0f/100.0f);
CCtrlStaticWZ* pHpStaticControl = (CCtrlStaticWZ*)getControl(TARGET_TEXT_HP_INFO); // 체력
assert(pHpStaticControl);
pHpStaticControl->SetTextColor(RGBA(255, 255, 255, 255));
GlobalFunc::SetCaption(pHpStaticControl, m_szResultHpInfo);
pHpStaticControl->ShowWindowWZ(WZ_SHOW);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
CCtrlPictureWZ* picture_control = static_cast<CCtrlPictureWZ*>(getControl(TARGET_PIC_BER));
if (picture_control)
{
picture_control->ShowWindowWZ(WZ_SHOW);
}
return TRUE;
}
//=====================================================================================
// DESC: 타켓팅리셋(중복구문 분리)
//=====================================================================================
void TargetDialog::_targetChange(BOOL bPlayer)
{
if (m_dwPrevTargetKEY != m_dwTargetKEY)
{
m_dwPrevTargetKEY = m_dwTargetKEY;
g_InterfaceManager.UpdateTargetHeadTexture();
if (bPlayer)
{
// 마을일때 Player 타겟이 바꼈으면 정보 요청
if (GameFramework::GetCurScene() == SCENE_TYPE_VILLAGE||
GameFramework::GetCurScene() == SCENE_TYPE_FIELD)
{
MSG_CG_CHARINFO_SELECT_INFO_SYN msg;
msg.m_dwObjectKey = m_dwTargetKEY;
GlobalFunc::SendPacket( CI_GAMESERVERIDX, &msg, sizeof(msg) );
_showCharPopupMenu(FALSE);
}
}
}
}
//=====================================================================================
// DESC: 타켓정보셋팅
//=====================================================================================
VOID TargetDialog::SetTargetInfo()
{
uiTargetZoneMarkDialog* target_zonemark_dialog = GET_CAST_DIALOG(uiTargetZoneMarkDialog, IM_TARGET_MANAGER::TARGET_ZONEMARK_DIALOG);
uiTargetAggro* target_aggro_dialog = GET_CAST_DIALOG(uiTargetAggro, IM_TARGET_MANAGER::TARGET_AGGRO);
Object * pTargetObject = g_ObjectManager.GetObject(m_dwTargetKEY);
if(!pTargetObject)
{
if(SetPartyMember())
{
return;
}
}
for (int i = 0; i < kElement_Color_Max; ++i)
{
picture_element_frames_[i]->ShowWindowWZ(WZ_HIDE);
}
for (i = kShow_Value_Open; i < kShow_Value_Max; ++i)
{
show_aggro_window_buttons_[i]->ShowWindowWZ(WZ_HIDE);
}
#ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
if (getControl(TARGET_BUTTON_SUMMON_CANCLE))
{
getControl(TARGET_BUTTON_SUMMON_CANCLE)->ShowWindowWZ(WZ_HIDE);
}
#endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
CCtrlStaticWZ* pStaticControl = (CCtrlStaticWZ *)getControl(TARGET_TEXT_INFO); // 이름
assert(pStaticControl);
CCtrlStaticWZ* pHpStaticControl = (CCtrlStaticWZ *)getControl(TARGET_TEXT_HP_INFO); // 체력
assert(pHpStaticControl);
if (pTargetObject && g_pHero)
{
picture_element_frames_[kElement_Color_Common]->ShowWindowWZ(WZ_SHOW);
_targetChange(pTargetObject->IsKindOfObject(PLAYER_OBJECT));
if (pTargetObject->IsKindOfObject(PLAYER_OBJECT))
{
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
pHpStaticControl = (CCtrlStaticWZ *)getControl(TARGET_TEXT_SECOND_HP_INFO); // 밑 체력
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
Player * pPlayer = static_cast<Player *>(pTargetObject);
DWORD maxhp = pPlayer->GetMaxHP();
if(maxhp==0)
maxhp=1;
DWORD curhp = pPlayer->GetHP();
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
if ((GlobalFunc::IsBattleGroundScene() == TRUE) &&
(pPlayer->IsMyHero()) &&
(ChaosSystem::GetBattleGroundData().false_name() != NULL))
{
m_dwTargetName = ChaosSystem::GetBattleGroundData().false_name();
}
else
{
BASE_PLAYERINFO *bp = pPlayer->GetCharInfo();
m_dwTargetName = util::_tstring(bp->m_tszCharName);
}
#else
BASE_PLAYERINFO *bp = pPlayer->GetCharInfo();
m_dwTargetName = util::_tstring(bp->m_tszCharName);
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
if( pPlayer->IsGM() )
{
// GM 캐릭터는 이름만 출력
Sprintf(m_szResultInfo, _T("%s"), m_dwTargetName.c_str());
pStaticControl->SetTextColor(RGBA(189, 198, 198, 255));
GlobalFunc::SetCaption( pStaticControl, m_szResultInfo );
pHpStaticControl->SetTextWZ(_T(""));
}
else
{
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
// 전장에선 이름만 출력
if (GlobalFunc::IsBattleGroundScene() == TRUE)
{
Sprintf(m_szResultInfo, _T("%s"), m_dwTargetName.c_str());
}
else
{
Sprintf(m_szResultInfo, _T("%ld %s"),
pPlayer->GetLevel(),
m_dwTargetName.c_str()
);
}
#else
Sprintf(m_szResultInfo, _T("%ld %s"),
pPlayer->GetLevel(),
m_dwTargetName.c_str()
);
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
float percent=( (float)curhp / (float)maxhp ) * 100.0f;
uiPartyMan* const party_man = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
if ((party_man) &&
(m_dwTargetKEY != g_pHero->GetObjectKey()) &&
(party_man->IsPartyMember(m_dwTargetKEY) == true))
{
_PARTY_MEMBER_INFO member_info = party_man->GetPartyMemberInfo(m_dwTargetKEY)->Get();
DWORD hp_ratio = static_cast<DWORD>(member_info.m_byHPRatio);
Sprintf(m_szResultHpInfo, _T("%ld%%"),hp_ratio);
}
else
{
Sprintf(m_szResultHpInfo, _T("%ld%%"),(DWORD)percent);
}
WzColor FinalColor=RGBA(189, 198, 198, 255);
if( GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pPlayer, g_HeroInput.lsForceAttack() ) == RELATIONKIND::Enemy )
FinalColor=RGBA( 255, 0, 0, 255 );
if(pPlayer->GetChaoState()==eCHAO_STATE_PREV_CHAO)
FinalColor=RGBA( 255, 128, 0, 255 );
if(pPlayer->IsAttackBeginPlayer())
FinalColor=RGBA( 128, 0, 255, 255 );
if(pPlayer->GetChaoState()==eCHAO_STATE_CHAO)
FinalColor=RGBA( 255, 0,0, 255 );
pStaticControl->SetTextColor(FinalColor);
GlobalFunc::SetCaption( pStaticControl, m_szResultInfo );
pHpStaticControl->SetTextColor(RGBA(255,255,255,255));
GlobalFunc::SetCaption( pHpStaticControl, m_szResultHpInfo );
}
assert(maxhp > 0);
if (curhp > maxhp)
curhp = maxhp;
uiPartyMan* const party_man = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
if ((party_man) &&
(m_dwTargetKEY != g_pHero->GetObjectKey()) &&
(party_man->IsPartyMember(m_dwTargetKEY) == true))
{
_PARTY_MEMBER_INFO member_info = party_man->GetPartyMemberInfo(m_dwTargetKEY)->Get();
float hp_ratio = static_cast<float>(member_info.m_byHPRatio);
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP(hp_ratio, true);
SetSD(static_cast<float>(member_info.m_bySDRatio)); //member_info.m_byHPRatio
#else
SetHP(hp_ratio, 90.0f/100.0f);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
}
else
{
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP( ((float)curhp / (float)maxhp) * 100.0f, true);
if (pPlayer->HasSDInfo() == FALSE)
{
SetSD(100.0f);
}
else if (pPlayer->GetMaxSD() != 0)
{
SetSD((float)pPlayer->GetSD() / (float)pPlayer->GetMaxSD() * 100);
}
else
{
SetSD(0.0f);
}
#else
this->SetHP( ( (float)curhp / (float)maxhp ) * 100.0f,90.0f/100.0f);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
}
if (pPlayer->HasHPInfo())
{
pStaticControl->ShowWindowWZ(WZ_SHOW);
pHpStaticControl->ShowWindowWZ(WZ_SHOW);
}
else
{
pStaticControl->ShowWindowWZ(WZ_HIDE);
pHpStaticControl->ShowWindowWZ(WZ_HIDE);
}
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == TRUE)
{
target_aggro_dialog->ShowInterface(FALSE);
}
if (target_zonemark_dialog)
{
#ifdef _NA_008334_20150608_SONNENSCHEIN
if (GlobalFunc::HideSonnenScheinnBuffScene() == TRUE)
{
// 소넨샤인 버프 가리는 분기인데 점령전 버프 숫자까지 가리려고 여기로 옴
if (target_zonemark_dialog->IsVisible() == TRUE)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
}
else
#else
#ifdef _NA_000000_20120527_CHAOS_ZONE
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
if (GameFramework::GetCurScene() &&
((GameFramework::GetCurScene() == SCENE_TYPE_FREEPVP) ||
(GameFramework::GetCurScene() == SCENE_TYPE_BATTLEGROUND) ||
(GameFramework::GetCurScene() == SCENE_TYPE_GOLDRUSH)))
#else
if (GameFramework::GetCurScene() &&
((GameFramework::GetCurScene() == SCENE_TYPE_FREEPVP) ||
(GameFramework::GetCurScene() == SCENE_TYPE_BATTLEGROUND)))
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
{
// PVP룸 or 전장에서 마크 숨김
if (target_zonemark_dialog->IsVisible() == TRUE)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
}
else
#endif //_NA_000000_20120527_CHAOS_ZONE
#endif //_NA_008334_20150608_SONNENSCHEIN
{
size_t size_of_Info = pPlayer->GetDominationStateInfo().size();
#ifdef _NA_008334_20150608_SONNENSCHEIN
BYTE sonnenschein_level = 0;
if (pPlayer->IsHero())
{
sonnenschein_level = GuildSystem::GetGuildSystemData().get_sonnenschein_phase();
}
else
{
if (GlobalFunc::HideSonnenScheinnBuffScene() == FALSE)
{
sonnenschein_level = pPlayer->GetGuildRenderInfo().sonnenschein_phase;
}
}
size_of_Info += sonnenschein_level;
#endif //_NA_008334_20150608_SONNENSCHEIN
if (size_of_Info > 0)
{
#ifdef _NA_008334_20150608_SONNENSCHEIN
target_zonemark_dialog->SetZoneMarkInfo(pPlayer->GetDominationStateInfo(), sonnenschein_level);
#else
target_zonemark_dialog->SetZoneMarkInfo(pPlayer->GetDominationStateInfo());
#endif //_NA_008334_20150608_SONNENSCHEIN
if (target_zonemark_dialog->IsVisible() == FALSE)
{
target_zonemark_dialog->ShowInterface(TRUE);
}
}
else
{
if (target_zonemark_dialog->IsVisible() == TRUE)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
}
}
}
}
else if (pTargetObject->IsKindOfObject(MONSTER_OBJECT))
{
if (target_zonemark_dialog && target_zonemark_dialog->IsVisible() == TRUE)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
Monster * pMonster = static_cast<Monster *>(pTargetObject);
DWORD maxhp = pMonster->GetMaxHP();
if(maxhp==0)
maxhp=1;
DWORD curhp = pMonster->GetHP();
TCHAR szMessage[MAX_MESSAGE_LENGTH];
int stringId=0;
float fRadio=1.0f;
#ifdef _NA_007113_SHADOW_PATCH_UNTARGET_MONSTER_DIE
if( xGetSkillData()->GetSkillDataBySkillClassCode( eSKILL_SOUL_CONTROL ) == NULL )
{
if (0 == curhp)
{
// 아직 정의된것이없다.
SolarDialog::ShowWindow(FALSE);
}
}
#else // _NA_007113_SHADOW_PATCH_UNTARGET_MONSTER_DIE
if (0 == curhp)
{
// 아직 정의된것이없다.
SolarDialog::ShowWindow(FALSE);
}
#endif // _NA_007113_SHADOW_PATCH_UNTARGET_MONSTER_DIE
nString str;
switch(pMonster->GetMonsterInfo()->m_byGrade)
{
case eNPC_SUMMON_NPC:
{
stringId=11501;
fRadio=80.0f/100.0f;
}
break;
case eNPC_MAPOBJECT_NPC:
{
stringId=11501;
fRadio=80.0f/100.0f;
}
break;
case eNPC_GENERAL:
{
stringId=11501;
fRadio=80.0f/100.0f;
}
break;
case eNPC_ELITE:
{
stringId=11503;
fRadio=95.0f/100.0f;
}
break;
case eNPC_LEADER:
{
stringId=11502;
fRadio=85.0f/100.0f;
}
break;
case eNPC_MIDDLEBOSS:
{
stringId=11504;
fRadio=95.0f/100.0f;
}
break;
case eNPC_BOSS:
{
stringId=11505;
fRadio=110.0f/100.0f;
}
break;
case eNPC_LUCKY_MONSTER:
{
//11500 럭키
stringId=11500;
fRadio=85.0f/100.0f;
}
break;
default:
{
stringId=11501;
fRadio=1.0f;
}
break;
}
g_InterfaceManager.GetInterfaceString( stringId, szMessage, MAX_MESSAGE_LENGTH );
if (pMonster->IsShadowSummon())
{
//몬스터이름재정의 :속박된 + 몬스터이름
// 1724 속박된
Sprintf(m_szResultInfo, _T("%s %ld %s %s"),
szMessage,
pMonster->GetMonsterInfo()->m_DisplayLevel,
g_InterfaceManager.GetInterfaceString(1724),
pMonster->GetName()
);
}
else
{
Sprintf(m_szResultInfo, _T("%s %ld %s"),
szMessage,
pMonster->GetMonsterInfo()->m_DisplayLevel,
pMonster->GetName()
);
}
if (pMonster->GetMonsterInfo()->m_byGrade != eNPC_SUMMON_NPC &&
pMonster->GetMonsterInfo()->m_byGrade != eNPC_MAPOBJECT_NPC && !pMonster->IsShadowSummon())
{
if (is_show_aggro_)
{
show_aggro_window_buttons_[kShow_Value_Close]->ShowWindowWZ(WZ_SHOW);
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == FALSE)
{
target_aggro_dialog->ShowInterface(TRUE);
}
}
else
{
show_aggro_window_buttons_[kShow_Value_Open]->ShowWindowWZ(WZ_SHOW);
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == TRUE)
{
target_aggro_dialog->ShowInterface(FALSE);
}
}
}
else
{
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == TRUE)
{
target_aggro_dialog->ShowInterface(FALSE);
}
}
if (pMonster->IsShadowSummon() &&
(g_pHero->GetObjectKey() == pMonster->GetParentId()))
{
picture_element_frames_[kElement_Color_Common]->ShowWindowWZ(WZ_SHOW);
pStaticControl->SetTextColor(RGBATOARGB(128, 128, 128, 255));
#ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
if (getControl(TARGET_BUTTON_SUMMON_CANCLE))
{
getControl(TARGET_BUTTON_SUMMON_CANCLE)->ShowWindowWZ(WZ_SHOW);
}
#endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
}
else
{
if (pMonster)
{
picture_element_frames_[pMonster->GetMyResist()]->ShowWindowWZ(WZ_SHOW);
}
pStaticControl->SetTextColor(GetColorText(pMonster));
}
m_dwTargetName = util::_tstring(pMonster->GetName());
GlobalFunc::SetCaption(pStaticControl, m_szResultInfo);
float percent = ((float)curhp / (float)maxhp) * 100.0f;
Sprintf(m_szResultHpInfo, _T("%ld%%"), (DWORD)percent);
pHpStaticControl->SetTextColor(RGBA(198,178,137,255));
GlobalFunc::SetCaption( pHpStaticControl, m_szResultHpInfo );
assert(maxhp > 0);
if (curhp > maxhp)
curhp = maxhp;
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
SetHP( ( (float)curhp / (float)maxhp ) * 100.0f, false);
#else
SetHP( ( (float)curhp / (float)maxhp ) * 100.0f,fRadio);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
}
else
{
SolarDialog::ShowWindow(FALSE);
}
pStaticControl->ShowWindowWZ(WZ_SHOW);
pHpStaticControl->ShowWindowWZ(WZ_SHOW);
picture_element_frames_[kElement_Color_Common]->ShowWindowWZ(WZ_SHOW);
}
else
{
if (target_zonemark_dialog && target_zonemark_dialog->IsVisible() == TRUE)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == TRUE)
{
target_aggro_dialog->ShowInterface(FALSE);
}
SolarDialog::ShowWindow(FALSE);
m_dwPrevTargetKEY = 0;
}
}
DWORD TargetDialog::GetColorText(Monster* monster_ptr)
{
DWORD color;
switch (monster_ptr->GetMyResist())
{
case NpcElementWeakness::eElementWeakness_Fire:
color = RGBA(255, 29, 75, 255);
break;
case NpcElementWeakness::eElementWeakness_Water:
color = RGBA(108, 165, 250, 255);
break;
case NpcElementWeakness::eElementWeakness_Wind:
color = RGBA(79, 210, 226, 255);
break;
case NpcElementWeakness::eElementWeakness_Earth:
color = RGBA(252, 176, 86, 255);
break;
case NpcElementWeakness::eElementWeakness_Dark:
color = RGBA(171, 153, 209, 255);
break;
//case Monster::kElement_Common:
default:
color = RGBA(189, 198, 198, 255);
break;
}
return color;
}
VOID TargetDialog::OnShowWindow( BOOL val )
{
if (val)
{
if(false == CheckShowState())
{
SolarDialog::ShowWindow(FALSE);
return;
}
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_Target;
msg.DoSomething = GlobalFunc::DoTarget;
// 타겟창은 맨 마지막에 닫히도록 함.
g_KeyQueueManager.PushFront(msg);
SetTargetInfo();
}
else
{
uiTargetZoneMarkDialog* target_zonemark_dialog = GET_CAST_DIALOG(uiTargetZoneMarkDialog, IM_TARGET_MANAGER::TARGET_ZONEMARK_DIALOG);
if (target_zonemark_dialog)
{
target_zonemark_dialog->ShowInterface(FALSE);
}
uiTargetAggro* target_aggro_dialog = GET_CAST_DIALOG(uiTargetAggro, IM_TARGET_MANAGER::TARGET_AGGRO);
if (target_aggro_dialog && target_aggro_dialog->IsVisible())
{
target_aggro_dialog->ShowInterface(FALSE);
}
_showCharPopupMenu(FALSE);
m_dwPrevTargetKEY = 0;
g_KeyQueueManager.DeleteMsg(eDoType_Target);
}
}
bool TargetDialog::CheckShowState()
{
if(NULL == g_pHero)
return false;
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
#else
Object* pObj = g_ObjectManager.GetObject(m_dwTargetKEY);
if(pObj && pObj->IsKindOfObject(MONSTER_OBJECT))
{
Monster* pMon = (Monster*)pObj;
//eNPC_DOMINATION_MAPOBJECT_NPC일 경우 주인길드에게만 타겟창 출력
if(eNPC_DOMINATION_MAPOBJECT_NPC == pMon->GetMonsterInfo()->m_byGrade)
{
if(g_pHero->GetPlayerGuildID() != pMon->GetMasterGuildID())
return false;
}
}
#endif //_NA_006826_20130722_DOMINATION_RENEWAL
return true;
}
VOID TargetDialog::SetTargetName(TCHAR* pszTargetName)
{
Object* pObject = g_ObjectManager.GetObject(pszTargetName);
// 타락한 사원내에서 타겟팅 명령어 사용되면 안됨
if ((pObject != NULL) &&
(GlobalFunc::IsSSQScene() != TRUE))
{
if( pObject->GetSCObject().GetObjectType() == PLAYER_OBJECT)
{
g_HeroInput.SetCurrentTarget(pObject->GetObjectKey());
}
}
else
{
TCHAR szMessage[INTERFACE_STRING_LENGTH];
// 85143 타겟을 찾을 수 없습니다.
g_InterfaceManager.GetInterfaceString(85143, szMessage, INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
}
}
VOID TargetDialog::SetTargetKey(DWORD dwTargetKEY)
{
m_dwTargetKEY = dwTargetKEY;
}
VOID TargetDialog::OnUpdateSolarDialog()
{
SetTargetInfo();
#ifdef _NA_000000_20130114_RENEWER_UI
UpdateItemScore();
#else
#ifdef _NA_002935_20110704_ITEM_SCORE
UpdateItemScore();
#endif //_NA_002935_20110704_ITEM_SCORE
#endif
}
VOID TargetDialog::OnRenderSolarDialog()
{
if( g_pHero == NULL )
{
return;
}
RadarFullDialog* pRFD = GET_CAST_DIALOG(RadarFullDialog, IM_RADAR_MANAGER::RADAR_DIALOG_FULL);
if(pRFD)
{
if(eFULL_RADAR_STATE_ALL == pRFD->GetRadarState())
return;
}
_renderGuildMark();
#ifdef _SCJ_LONG_TEXT_REDUCING
int mouse_x = Mouse::Instance()->GetMouseX();
int mouse_y = Mouse::Instance()->GetMouseY();
RECT control_rect;
control_rect = getControl(TARGET_TEXT_INFO)->GetSizeRect();
if ( control_rect.left <= mouse_x && control_rect.right >= mouse_x )
{
if ( control_rect.top <= mouse_y && control_rect.bottom >= mouse_y )
{
uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if ( tooltip_manager != NULL )
{
TCHAR* result_string;
result_string = GetTargetName();
tooltip_manager->RegisterTooltipSimpleText( result_string );
tooltip_manager->SetTooltipDialogID(GetDialogKey());
}
}
}
#endif //_SCJ_LONG_TEXT_REDUCING
#ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
if (getControl(TARGET_BUTTON_SUMMON_CANCLE) &&
(getControl(TARGET_BUTTON_SUMMON_CANCLE)->IsState(WZ_SHOW) == true))
{
int mouse_x = Mouse::Instance()->GetMouseX();
int mouse_y = Mouse::Instance()->GetMouseY();
RECT control_rect = getControl(TARGET_BUTTON_SUMMON_CANCLE)->GetSizeRect();
if ( control_rect.left <= mouse_x && control_rect.right >= mouse_x )
{
if ( control_rect.top <= mouse_y && control_rect.bottom >= mouse_y )
{
uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if ( tooltip_manager != NULL )
{
TCHAR string_[INTERFACE_STRING_LENGTH + 1] = {0,};
g_InterfaceManager.GetInterfaceString(11263, string_);
tooltip_manager->RegisterTooltipSimpleText(string_);
tooltip_manager->SetTooltipDialogID(GetDialogKey());
}
}
}
}
#endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL
#ifdef _NA_000000_20130114_RENEWER_UI
DrawItemScore();
#else
#ifdef _NA_002935_20110704_ITEM_SCORE
DrawItemScore();
#endif //_NA_002935_20110704_ITEM_SCORE
#endif
}
static DWORD GetIconIDForStatus(DWORD dwStatus)
{
BASE_STATEINFO *pInfo = StateInfoParser::Instance()->GetStateInfo(dwStatus);
if (pInfo)
{
return pInfo->m_dwIconCode;
}
else
{
return 0xFFFFFFFF;
}
}
void TargetDialog::UpdateStatusIcon()
{
if (IsVisible() == FALSE)
{
return;
}
status_icon_container_.clear();
Character* target_character = static_cast<Character*>(g_ObjectManager.GetObject(m_dwTargetKEY));
if ((target_character == NULL) ||
(target_character->IsKindOfObject(CHARACTER_OBJECT) != TRUE))
{
return;
}
int mouse_x_position = Mouse::Instance()->GetMouseX();
int mouse_y_position = Mouse::Instance()->GetMouseY();
// 타겟 의 SKILL_EFFECT 를 순회
BASE_STATEINFO* state_info = NULL;
SKILL_EFFECT_IMAGE status_icon;
DWORD hero_object_key = m_dwTargetKEY;
int status_Index = 0;
CControlWZ* buff_control = NULL;
std::vector<SKILL_EFFECT*>& skill_effect_array = target_character->GetSkillEffectArray();
for( size_t i=0;i!=skill_effect_array.size();++i)
{
SKILL_EFFECT* skill_effect = skill_effect_array[i];
state_info = StateInfoParser::Instance()->GetStateInfo(skill_effect->dwStatusID);
status_icon.iEffectID = skill_effect->iEffectID;
status_icon.dwStatusID = skill_effect->dwStatusID;
status_icon.dwOwnerID = hero_object_key;
status_icon.pSkillEffect = skill_effect;
status_icon.pStateInfo = state_info;
if(status_Index < 20)
{
status_icon.m_byAlpha = 0xFF;
}
else
{
status_icon.m_byAlpha = StatusIconManager::ALPHA_VALUE_MOUSE_OVER_ICON;
}
// draw_rect 계산
#ifdef _NA_008139_20150318_MODIFY_BUFF_ICON_UI
buff_control = getControl(TARGET_SKILL_EFFECT2 + status_Index);
#else
buff_control = getControl(TARGET_SKILL_EFFECT1 + status_Index);
#endif //_NA_008139_20150318_MODIFY_BUFF_ICON_UI
if (buff_control != NULL)
{
status_icon.rcDrawRect = buff_control->GetSizeRect();
// 마우스 오버체크
if ((status_icon.rcDrawRect.left <= mouse_x_position) &&
(status_icon.rcDrawRect.right >= mouse_x_position) &&
(status_icon.rcDrawRect.top <= mouse_y_position) &&
(status_icon.rcDrawRect.bottom >= mouse_y_position))
{
// 툴팁 출력
uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if (tooltip_manager)
{
tooltip_manager->RegisterSkillEffectInfoTooltip(&status_icon, TRUE);
tooltip_manager->SetTooltipDialogID(GetDialogKey());
}
}
status_icon_container_.push_back(status_icon);
}
++status_Index;
if (status_Index >= StatusIconManager::MAX_TARGET_ICON)
{
break;
}
}
// status_icon_manager에 삽입
StatusIconManager* status_icon_manager = g_InterfaceManager.GetStatusIconManager();
if (status_icon_manager)
{
status_icon_manager->RegisterStatusIconInfo(status_icon_container_);
}
}
VOID
TargetDialog::Process(DWORD dwTick)
{
if (GameFramework::GetCurrentScene() &&
(GameFramework::GetCurrentScene()->IsEnablePkScene() ||
GameFramework::GetCurrentScene()->InPVPScene()))
{
m_iHpRequestTime-=dwTick;
if(m_iHpRequestTime<=0)
{
m_iHpRequestTime=UPDATE_HP_TIME;
Object * pTargetObject = g_ObjectManager.GetObject(m_dwTargetKEY);
if (pTargetObject)
{
if (pTargetObject!=g_pHero&&pTargetObject->IsKindOfObject(PLAYER_OBJECT))
{
MSG_CG_CHARINFO_SELECT_INFO_SYN msg;
msg.m_dwObjectKey = m_dwTargetKEY;
GlobalFunc::SendPacket( CI_GAMESERVERIDX, &msg, sizeof(msg) );
}
}
}
}
static int monster_info_time = 0;
static DWORD pre_target_monster_key = 0;
Object * pTargetObject = g_ObjectManager.GetObject(m_dwTargetKEY);
if (pTargetObject)
{
if (monster_info_time >= 0)
{
monster_info_time -= dwTick;
}
if (pTargetObject->IsKindOfObject(MONSTER_OBJECT) && pre_target_monster_key != m_dwTargetKEY)
{
pre_target_monster_key = m_dwTargetKEY;
monster_info_time = 0;//새 타겟이 몬스터이고 바뀐 경우 바로보냄
}
if (monster_info_time <= 0 && is_show_aggro_)
{
monster_info_time = 2000;//같은 타겟은 2초 딜레이
if (pTargetObject->IsKindOfObject(MONSTER_OBJECT))
{
MSG_CG_MONSTER_SELECT_INFO_SYN msg;
msg.monster_key = m_dwTargetKEY;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg));
}
}
}
}
void TargetDialog::_showCharPopupMenu(BOOL bShow)
{
uiBase* popupMenu = GET_DIALOG(IM_CHAR_POPUP_MANAGER::CHAR_POPUP_MENU);
if(!popupMenu)
return;
if(bShow && g_pHero)
{
if(m_dwTargetKEY == g_pHero->GetObjectKey()) return; // 내가 타겟이면 리턴
Object *pObj = g_ObjectManager.GetObject(m_dwTargetKEY);
if( pObj )
{
if(!pObj->IsKindOfObject(PLAYER_OBJECT)) // 일반유저 아니면 리턴
return;
}
#ifdef _DH_SHOW_VENDOR_LIST_POPUP
//popupMenu->ShowInterface(FALSE);//껏다켜기 초기화를 위해
uiCharPopupMan* popup_menu_manager = GET_DIALOG_MANAGER(uiCharPopupMan, UIMAN_CHAR_POPUP);
if (popup_menu_manager)
{
popup_menu_manager->set_is_vendor_popup(false);
if (pObj)
{
popup_menu_manager->CheckPopupType(m_dwTargetKEY, pObj->GetName(), pObj->GetObjectType());
}
else
{
popup_menu_manager->CheckPopupType(m_dwTargetKEY);
}
}
#endif//_DH_SHOW_VENDOR_LIST_POPUP
popupMenu->ShowInterface(TRUE);
}
else
{
popupMenu->ShowInterface(FALSE);
}
}
void TargetDialog::_renderGuildMark()
{
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
if (GlobalFunc::IsBattleGroundScene())
{
return;
}
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
HANDLE hGuildMarkTexture = GuildSystem::GetGuildSystemData().GetGuildMarkTexture();
#else
uiGuildMan * pGuildMan = (uiGuildMan *) g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD);
if( !pGuildMan)
return;
HANDLE hGuildMarkTexture = pGuildMan->GetGuildMarkTexture();
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
if( hGuildMarkTexture == INVALID_HANDLE_VALUE )
return;
Object * pObj = g_ObjectManager.GetObject(m_dwTargetKEY);
if( pObj && pObj->IsKindOfObject(PLAYER_OBJECT) )
{
Player * pPlayer = (Player *)pObj;
if( !pPlayer->IsExistGuild() )
return;
CCtrlButtonWZ * pButton = (CCtrlButtonWZ *)getControl(TARGET_PIC_GUILD_MARK);
if( pPlayer && pButton )
{
RECT rtSize = pButton->GetSizeRect();
float fWidth = (float) rtSize.right - rtSize.left;
float fHeight = (float) rtSize.bottom - rtSize.top;
BASE_GuildMarkInfo * pMarkInfo = NULL;
//길드마크가 없어도 관계 테두리는 그리자.
BASE_GuildMarkInfo* pMarkInfo_Relation = NULL;
switch(pPlayer->GetGuildRenderInfo().m_RelationType)
{
case eGUILD_RELATION_ALLIENCE:
{
//길드 등급만 체크 한다.(개인 직위는 체크 생략)
if (GuildRightInfoParser::Instance()->CheckGradeForRight(eGUILD_RIGHTS_RELATION,
pPlayer->GetGuildRenderInfo().m_GuildGrade))
{
//3레벨 이상일 경우 무조건 출력
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_BLUE);
}
else
{
//3레벨 이하일 경우 길드마크가 있을때만 출력
if( pPlayer->IsExistGuildMark() && g_pHero)
{
if((g_pHero->GetGuildRenderInfo().m_GuildGuid == pPlayer->GetGuildRenderInfo().m_GuildGuid)) //Hero와 같은 길드다
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_BLUE);
}
else
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_EMPTY);
}
}
}
}
break;
case eGUILD_RELATION_BOTH_HOSTILITY:
case eGUILD_RELATION_PROCLAIM_HOSTILITY:
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_RED);
}
break;
case eGUILD_RELATION_ONE_SIDE_HOSTILITY:
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_ORANGE);
}
break;
case eGUILD_RELATION_NONE:
default:
{
if (g_pHero)
{
//길드 등급만 체크 한다.(개인 직위는 체크 생략)
if (GuildRightInfoParser::Instance()->CheckGradeForRight(eGUILD_RIGHTS_RELATION,
pPlayer->GetGuildRenderInfo().m_GuildGrade))
{
if ((g_pHero->GetGuildRenderInfo().m_GuildGuid == pPlayer->GetGuildRenderInfo().m_GuildGuid)) //Hero와 같은 길드다
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_BLUE);
}
else
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_EMPTY);
}
}
else
{
if( pPlayer->IsExistGuildMark() )
{
if((g_pHero->GetGuildRenderInfo().m_GuildGuid == pPlayer->GetGuildRenderInfo().m_GuildGuid)) //Hero와 같은 길드다
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_BLUE);
}
else
{
pMarkInfo_Relation = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(eGUILD_MARK_RELATION_EMPTY);
}
}
}
}
}
break;
}
if(pMarkInfo_Relation)
{
g_pSunRenderer->RenderTexture(hGuildMarkTexture, (float)rtSize.left , (float)rtSize.top, fWidth , fHeight,
(float)pMarkInfo_Relation->iRow * 32.0f , (float) pMarkInfo_Relation->iColumn * 32.0f, 32.0f, 32.0f);
}
if( !pPlayer->IsExistGuildMark())
return;
//외곽선 드러나게
rtSize.left += 3;
rtSize.top += 3;
fWidth -= 6.f;
fHeight -= 6.f;
ENUM_ALPHABLEND eOldAlphaMode = g_pSunRenderer->GetAlphaBlendMode();
g_pSunRenderer->SetAlphaBlendMode(AB_ALPHA);
for(int i =0; i < 2; ++i)
{
if( i == 0)
pMarkInfo = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(pPlayer->GetGuildRenderInfo().m_BackGroundIndex);
else
pMarkInfo = GuildMarkInfoParser::Instance()->GetGuildMarkInfo(pPlayer->GetGuildRenderInfo().m_PatternIndex);
if( pMarkInfo )
{
g_pSunRenderer->RenderTexture(hGuildMarkTexture, (float)rtSize.left , (float)rtSize.top, fWidth , fHeight,
(float)pMarkInfo->iRow * 32.0f , (float) pMarkInfo->iColumn * 32.0f, 32.0f, 32.0f);
}
}
g_pSunRenderer->SetAlphaBlendMode(eOldAlphaMode);
}
}
}
void TargetDialog::ShowAggroDialog()
{
uiTargetAggro* target_aggro_dialog = GET_CAST_DIALOG(uiTargetAggro, IM_TARGET_MANAGER::TARGET_AGGRO);
if (is_show_aggro_)//켜기 상태
{
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == FALSE)
{
target_aggro_dialog->ShowInterface(TRUE);
}
}
else//끄기 상태
{
if (target_aggro_dialog && target_aggro_dialog->IsVisible() == TRUE)
{
target_aggro_dialog->ShowInterface(FALSE);
}
}
}
#ifdef _NA_000000_20130114_RENEWER_UI
void TargetDialog::MoveWindowForce( float addx, float addy )
{
float x = this->GetDialogWZ()->GetDlgX();
float y = this->GetDialogWZ()->GetDlgY();
x += addx;
y += addy;
this->GetDialogWZ()->MoveWindowWZ(x,y);
}
#endif
#ifdef _NA_000000_20130114_RENEWER_UI
int TargetDialog::GetTargetItemScore()
{
#ifdef _RU_0000_20120227_RUSSIA_BLOCK_ITEM_SCORE
return -1;
#endif //_RU_0000_20120227_RUSSIA_BLOCK_ITEM_SCORE
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
// 전장에선 점수 가림
return -1;
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
Object * target_object = g_ObjectManager.GetObject(m_dwTargetKEY);
if ((target_object == NULL) ||
(g_pHero == NULL))
{
return -1;
}
if (target_object->IsKindOfObject(PLAYER_OBJECT) == FALSE)
{
return -1;
}
if( Player* player = static_cast<Player*>(target_object) )
{
return player->GetItemScore();
}
return -1;
}
void TargetDialog::DrawItemScore()
{
int item_score = GetTargetItemScore();
if (item_score < 0)
{
return;
}
//창이 나타날 때 툴팁 출력
int mouse_pos_x = Mouse::Instance()->GetMouseX();
int mouse_pos_y = Mouse::Instance()->GetMouseY();
RECT control_rect;
bool is_draw_score_tooltip = false;
CCtrlStaticWZ* pstatic_control = static_cast<CCtrlStaticWZ*>(getControl(TARGET_SCORE_STRING_S001));
control_rect = pstatic_control->GetSizeRect();
if ( control_rect.left <= mouse_pos_x && control_rect.right >= mouse_pos_x )
{
if ( control_rect.top <= mouse_pos_y && control_rect.bottom >= mouse_pos_y )
{
is_draw_score_tooltip = true;
}
}
if (is_draw_score_tooltip == true)
{
uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if ( tooltip_manager != NULL )
{
// 11478 : 장비 평점
tooltip_manager->RegisterTooltipWithStringCode(11478);
tooltip_manager->SetTooltipDialogID(GetDialogKey());
}
}
}
void TargetDialog::UpdateItemScore()
{
CCtrlStaticWZ* pstatic_control = static_cast<CCtrlStaticWZ*>(getControl(TARGET_SCORE_STRING_S001));
int score_item = GetTargetItemScore();
if (score_item >= 0)
{
TCHAR string_score[256] = {0,};
sprintf(string_score,"%d",score_item);
pstatic_control->ShowWindowWZ(WZ_SHOW);
GlobalFunc::SetCaption(pstatic_control,string_score);
}
else
{
pstatic_control->ShowWindowWZ(WZ_HIDE);
//GlobalFunc::SetCaption(pStaticControl, m_szResultInfo);
}
}
void TargetDialog::MoveDefaultWindowPos()
{
uiBase::MoveDefaultWindowPos();
MoveWindowForce(0.0f,-6.0f);
}
#else
#ifdef _NA_002935_20110704_ITEM_SCORE
void TargetDialog::DrawItemScore()
{
int item_score = GetTargetItemScore();
if (item_score >= 0)
{
CControlWZ* number_control = getControl(TARGET_SCORE_NUMBER1);
if (number_control)
{
RECT first_position = number_control->GetSizeRect();
g_InterfaceManager.RenderDrawItemScore(first_position,item_score);
}
//창이 나타날 때 툴팁 출력
int mouse_pos_x = Mouse::Instance()->GetMouseX();
int mouse_pos_y = Mouse::Instance()->GetMouseY();
RECT control_rect;
bool is_draw_score_tooltip = false;
for (int index = TARGET_SCORE_START; index < TARGET_SCORE_END; ++index)
{
control_rect = getControl(index)->GetSizeRect();
if ( control_rect.left <= mouse_pos_x && control_rect.right >= mouse_pos_x )
{
if ( control_rect.top <= mouse_pos_y && control_rect.bottom >= mouse_pos_y )
{
is_draw_score_tooltip = true;
}
}
}
if (is_draw_score_tooltip == true)
{
uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if ( tooltip_manager != NULL )
{
// 11478 : 장비 평점
tooltip_manager->RegisterTooltipWithStringCode(11478);
tooltip_manager->SetTooltipDialogID(GetDialogKey());
}
}
}
}
void TargetDialog::UpdateItemScore()
{
CCtrlPictureWZ* picture_control;
if (GetTargetItemScore() >= 0)
{
for (int index = TARGET_SCORE_START; index < TARGET_SCORE_END; ++index)
{
picture_control = static_cast<CCtrlPictureWZ*>(getControl(index));
if (picture_control)
{
picture_control->ShowWindowWZ(WZ_SHOW);
}
}
}
else
{
for (int index = TARGET_SCORE_START; index < TARGET_SCORE_END; ++index)
{
picture_control = static_cast<CCtrlPictureWZ*>(getControl(index));
if (picture_control)
{
picture_control->ShowWindowWZ(WZ_HIDE);
}
}
}
}
int TargetDialog::GetTargetItemScore()
{
#ifdef _RU_0000_20120227_RUSSIA_BLOCK_ITEM_SCORE
return -1;
#endif //_RU_0000_20120227_RUSSIA_BLOCK_ITEM_SCORE
Object * target_object = g_ObjectManager.GetObject(m_dwTargetKEY);
if ((target_object == NULL) ||
(g_pHero == NULL))
{
return -1;
}
if (target_object->IsKindOfObject(PLAYER_OBJECT) == FALSE)
{
return -1;
}
if( Player* player = static_cast<Player*>(target_object) )
{
return player->GetItemScore();
}
return -1;
}
#endif //_NA_002935_20110704_ITEM_SCORE
#endif