#include "stdafx.h" #include #include "KUIWndManager.h" #include "./Controls/KUIControlStatic.h" #include "./Controls/KUIControlGauge.h" #include "./Controls/KUIControlDamage.h" #include "./Controls/KUIControlButton.h" #include "./Controls/KUIControlSkillCastGauge.h" #include "./Controls/KUIControlEffectText.h" #include "SUICharacterWnd.h" #include "SUIDisplayInfo.h" #include "SGameManager.h" #include "SGameMessage.h" #include "SPlayerInfoMgr.h" #include "SItemDB.h" #include "SStringDB.h" #include //#include "SGameMessageUI.h" //-N4- PumpUpMessageHP에서 게이지 클릭해도 타겟되게 하는 부분 메세지 보내기 위해 추가 //-N4- Booth가 판매인지 구매인지 알아보기 위해서 추가된 부분 #include "SGameAvatarEx.h" #include "SNetMessage.h" #include "SGame.h" #include "SDebug_Util.h" #include "SGameOption.h" /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "SGameSystem.h" //#include "SUIUtil.h" /// 2010.11.24 - prodongi #include "SQuestMgr.h" /// 2011.08.05 - prodongi #include "SGameWorld.h" #include "SGameMob.h" #include "SGameNpc.h" #include "SFieldPropResourceDB.h" #include "SGameFieldQuestProp.h" #include "KResourceManager.h" #include "STitleMgr.h" //#include extern SGameSystem* g_pCurrentGameSystem; namespace { const DWORD c_dwGaugeFillTime = 1000; const int CHAT_MAX_WIDTH = 200; const int CHAT_OFFSET_Y = -38 + 65; const int CHAT_HEIGHT = 18; const int CHAT_MARGIN_WIDTH = 12; // [ 챗 메시지 ] 에서 쳇 메시지 와 프레임간의 공백 const int BOOTH_OFFSET_Y = -65 + 65; const int BOOTH_HEIGHT = 40; const int BOOTH_TYPE_HEIGHT = 30; // sonador 3.9.3 개인상점 [사기/팔기] 비주얼 강화(텍스트 추가) const int NAME_OFFSET_Y = -18 + 65; // 2010.07.29 폰트별로 다르게 해줘야 될거 같으나, 처음 설정이 상수로 되어있어서, 추가 height값을 주기로 한다- prodongi //const int NAME_HEIGHT = 18; const int NAME_HEIGHT = 20; const int ICON_WIDTH = 16; const int GAUGE_OFFSET_X = 40; const int GAUGE_WIDTH = 104; const int GAGUE_HEIGHT = 3; const int SKILL_GAUGE_WIDTH = 195; const int SKILL_GAUGE_HEIGHT = 9; const int BOW_GAUGE_WIDTH = 195; const int BOW_GAUGE_HEIGHT = 9; const int GAUGE_OFFSET_Y = 4 + 65; const int DAMAGE_OFFSET_X = 80; const int DAMAGE_OFFSET_Y = -35 + 65; const int TITLE_HEIGHT = 20; const int BOOTH_ADJUST = 2; const int VS_ICON_WIDTH = 23; // pk, pvp 아이콘 크기 const int VS_ICON_ADJUST_Y = 3; // 위아래 조정 const int CHARWND_POS_Y = 50;//c_nCharWindowPos const int EMBLEM_OFFSET_X = 40; // original = 40 /Edited = 160 const int EMBLEM_OFFSET_Y = 26; // original = 26 /Edited = 52 // 태그 변경시 해당 태그의 스트링으로 SGameInterface에서도 검색하여 수정해야 한다. const char* c_szChatTag = ""; // 채팅 태그 const char* c_szGuildNameTag = "<#ffffff>"; // 길드 이름 태그 const char* c_szMonsterNameTag = "<#ffcfb5><@5a4435>"; // 몬스터 이름 태그 const char* c_szAttaMonNameTag = "<#e54c4c><@401717>"; // 선공몹 이름 태그 const char* c_szNPCNameTag = "<#ff8400><@3f2115>"; // NPC 이름 태그 const char* c_szPropItemNameTag = "<#ffffff><@313246>"; // 필드 획득용 아이템 이름 태그 const char* c_szCreatureNameTag = c_szMonsterNameTag; // 크리쳐 이름 태그 const char* c_szTitleNameTag = "<#05c5d1><@1b1717>"; // 호칭 이름 태그 //<<다른 유저 캐릭터용 태그>> const char* c_szCharNameTag = "<@313246>"; // 캐릭터 이름 태그 const char* c_szCharPKOnNameTag = "<#f49595><@970000>"; // 캐릭터 PK_ON 태그 const char* c_szCharPKBloodyTag = "<#ee4444><@820000>"; // 캐릭터 PK_Bloody 태그 const char* c_szCharPKDemonicTag = "<#fe0101><@220000>"; // 캐릭터 PK_Demonic 태그 // !!!!!!!!!!!!!!!!위아래는 세트고 폰트 사이즈만 다르므로 같이 수정해야한다.!!!!!!!!!!!!!!!!!! //<<내 캐릭터용 태그>> const char* c_szCharNameTag_ME = "<@313246>"; // 캐릭터 이름 태그 const char* c_szCahrPKOnNameTag_ME = "<#f49595><@970000>"; // 캐릭터 PK_ON 태그 const char* c_szCharPKBloodyTag_ME = "<#ee4444><@820000>"; // 캐릭터 PK_Bloody 태그 const char* c_szCharPKDemonicTag_ME = "<#fe0101><@220000>"; // 캐릭터 PK_Demonic 태그 const char* c_szDefaultTooltipAniName = "static_fulldown_outframe"; }; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //SUIDropItemWnd SUIDropItemWnd::SUIDropItemWnd( class SGameManager* pGameManager, AR_HANDLE handle, int nItemID, count_t nCnt ) : SUIWnd( pGameManager ) { m_hItemHandle = handle; m_nItemID = nItemID; m_nCnt = nCnt; m_pControl = NULL; } SUIDropItemWnd::~SUIDropItemWnd() { } void SUIDropItemWnd::Create(KUIWND_CREATE_ARG& CREATE_ARG) { KUIWnd::Create( CREATE_ARG ) ; //아이템 이름 if( m_nItemID ) m_sTip = GetStringDB().GetString( GetItemDB().GetTextID(m_nItemID) ); else { m_sTip = CStringUtil::StringFormat( "%I64d %s", m_nCnt.getAmount(), GetStringDB().GetString(67) ).c_str(); //RP } // Chat control KUIWND_CREATE_ARG arg; arg.lpszAniName = c_szDefaultTooltipAniName; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = m_sTip.c_str(); arg.lpszID = "tool_tip"; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS;; arg.dwStyle = 0; DWORD dwMessageWidth = KTextPhrase::GetOneLineStringSize( m_sTip.c_str() ); KRect rcNewrect = m_rcRegion; rcNewrect.left = rcNewrect.left + ((m_rcRegion.right-m_rcRegion.left)*0.39f) - (dwMessageWidth/2) - CHAT_MARGIN_WIDTH; rcNewrect.right = rcNewrect.left + dwMessageWidth + CHAT_MARGIN_WIDTH; arg.rcRect = rcNewrect; arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS;; m_pControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pControl->SetCaptionAlign( KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER ); ////Debug 용 //#ifndef NDEBUG //arg.lpszAniName = "static_talk_outframe00"; //arg.lpszSprName = m_sSprName.c_str(); //arg.lpszClassName = "static"; //arg.lpszID = "_char_back_ground"; //arg.dwFlag = KFLAG_GET_PASS_MESSAGE; //arg.dwStyle = 0; //arg.rcRect = m_rcRegion; //arg.pParent = this; //arg.dwFlag = KFLAG_GET_PASS_MESSAGE; //m_pManager->CreateControl(arg); //#endif } void SUIDropItemWnd::Process(DWORD dwTime) { } void SUIDropItemWnd::Render( KViewportObject *pViewport, bool isFront ) { KUIGenWnd::Render(pViewport, isFront); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //SUIGaugeWnd SUIGaugeWnd::SUIGaugeWnd( class SGameManager* pGameManager, class SUIDisplayInfo* pDisplayInfo ) : SUIWnd( pGameManager ), m_pDisplayInfo(pDisplayInfo) { m_dwTime = 0; m_dwActivateTime = 0; m_dwActivateContinueTime = 0; m_dwBowActivateTime = 0; m_dwBowActivateContinueTime = 0; m_pBowGauge = NULL; m_pSkillGauge = NULL; m_pSkillGaugeBack = NULL; m_bDeactiveBow = false; m_bBowEnd = false; } SUIGaugeWnd::~SUIGaugeWnd() { } void SUIGaugeWnd::Create(KUIWND_CREATE_ARG& CREATE_ARG) { KUIWnd::Create( CREATE_ARG) ; // //Debug 용 //#ifndef NDEBUG //KUIWND_CREATE_ARG arg; //arg.lpszAniName = "static_talk_outframe00"; //arg.lpszSprName = m_sSprName.c_str(); //arg.lpszClassName = "static"; //arg.lpszID = "_char_back_ground"; //arg.dwFlag = KFLAG_GET_PASS_MESSAGE; //arg.dwStyle = 0; //arg.rcRect = m_rcRegion; //arg.pParent = this; //arg.dwFlag = KFLAG_GET_PASS_MESSAGE; //m_pManager->CreateControl(arg); //#endif } void SUIGaugeWnd::Process(DWORD dwTime) { m_dwTime = dwTime; //Bow Gauge 상태 if(NULL != m_pBowGauge && m_pBowGauge->IsActivate() ) { m_pBowGauge->Process( m_dwTime ); if( m_bDeactiveBow ) { if( !( m_dwBowActivateTime + m_dwBowActivateContinueTime < m_dwTime ) ) m_pBowGauge->SetGauge( m_dwBowActivateContinueTime - (m_dwTime - m_dwBowActivateTime), 1 ); else { m_pBowGauge->SetGauge( 0, 1 ); if( m_bBowEnd ) { //휴지기 처리 SetBowActivate( false ); m_bBowEnd = false; } } } else { if( !( m_dwBowActivateTime + m_dwBowActivateContinueTime < m_dwTime ) ) m_pBowGauge->SetGauge( m_dwTime - m_dwBowActivateTime, 1 ); //else // m_pBowGauge->SetGauge( m_dwBowActivateContinueTime, 1 ); if( m_bBowEnd ) { //휴지기 처리 SetBowActivate( false ); m_bBowEnd = false; } } } if( NULL != m_pSkillGauge ) { m_pSkillGauge->Process( m_dwTime ); } } void SUIGaugeWnd::Render( KViewportObject *pViewport, bool isFront/* = false*/ ) { KUIGenWnd::Render(pViewport, isFront); } void SUIGaugeWnd::ActivateBowGauge(DWORD dwContinueTime) { if(NULL == m_pBowGauge) return; m_bDeactiveBow = false; m_bBowEnd = false; /// 2011.07.22 - prodongi m_pBowGauge->SetBack( c_szDEF_SPR_NAME, "common_gauge_titanium_bow_cast" ); m_pBowGauge->SetShow( true ); m_pBowGauge->SetActivate( true ); /// 2011.08.16 SetBack을 하면 m_rcRect가 바뀌기 때문에 다시 설정해 줘야 된다 - prodongi KRect r = m_pBowGauge->GetRect(); r.bottom = r.top + BOW_GAUGE_HEIGHT; m_pBowGauge->Resize(r); m_pBowGauge->SetMax( dwContinueTime ); m_pBowGauge->SetGauge(0, 1); m_dwBowActivateTime = m_dwTime; m_dwBowActivateContinueTime = dwContinueTime; } void SUIGaugeWnd::DeActivateBowGauge(DWORD dwContinueTime) { if(NULL == m_pBowGauge) return; m_bDeactiveBow = true; m_bBowEnd = false; // m_pBowGauge->SetShow( true ); // m_pBowGauge->SetActivate( true ); /// 2011.07.22 - prodongi m_pBowGauge->SetBack( c_szDEF_SPR_NAME, "common_gauge_titanium_bow_cast_cool" ); m_pBowGauge->SetMax( dwContinueTime ); /// 2011.08.16 SetBack을 하면 m_rcRect가 바뀌기 때문에 다시 설정해 줘야 된다 - prodongi KRect r = m_pBowGauge->GetRect(); r.bottom = r.top + BOW_GAUGE_HEIGHT; m_pBowGauge->Resize(r); m_dwBowActivateTime = m_dwTime; m_dwBowActivateContinueTime = dwContinueTime; } void SUIGaugeWnd::SetBowGaugeBack() { if( NULL != m_pBowGauge) RemoveChild(m_pBowGauge); KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = "common_gauge_titanium_bow_cast"; arg.lpszClassName = "gauge"; arg.lpszID = "_bow_gauge"; arg.pParent = this; arg.rcRect = m_rcRegion; //가운데 정렬 int nWidth = 38; arg.rcRect.left = arg.rcRect.left + nWidth; arg.rcRect.right = arg.rcRect.left + BOW_GAUGE_WIDTH; arg.rcRect.top = GAGUE_HEIGHT + GAGUE_HEIGHT; arg.rcRect.bottom = arg.rcRect.top + BOW_GAUGE_HEIGHT; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS | KFLAG_NO_GET_MESSAGE; m_pBowGauge = dynamicCast( m_pManager->CreateControl( arg ) ); m_pBowGauge->SetShow( false ); m_pBowGauge->SetActivate( false ); SetChildAsTop( "_bow_gauge" ); } void SUIGaugeWnd::SetSkillGaugeBack(bool bLocalCraeture) { if( NULL != m_pSkillGauge ) RemoveChild(m_pSkillGauge ); if( NULL != m_pSkillGaugeBack) RemoveChild(m_pSkillGaugeBack); KUIWND_CREATE_ARG arg; char const* bgAniName; /// 2011.07.22 - prodongi if( bLocalCraeture ) //플레이어의 크리처이면 크리처용 캐스팅 개이지 .tag를 쎄팅 -N4- { arg.lpszAniName = "common_gauge_titanium_creature_skill_cast"; bgAniName = "common_gauge_titanium_creature_skill_cast_bg"; } else { arg.lpszAniName = "common_gauge_titanium_player_skill_cast"; bgAniName = "common_gauge_titanium_player_skill_cast_bg"; } arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "skill_cast_gauge"; arg.lpszID = "_skill_gauge"; arg.pParent = this; arg.rcRect = m_rcRegion; //가운데 정렬 int nWidth = 15; arg.rcRect.left = arg.rcRect.left + nWidth; arg.rcRect.right = arg.rcRect.left + SKILL_GAUGE_WIDTH; arg.rcRect.top += ( 20 + GAGUE_HEIGHT + GAGUE_HEIGHT ); arg.rcRect.bottom = arg.rcRect.top + SKILL_GAUGE_HEIGHT; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS | KFLAG_NO_GET_MESSAGE; m_pSkillGauge = dynamicCast( m_pManager->CreateControl( arg ) ); m_pSkillGauge->SetShow( false ); m_pSkillGauge->SetActivate( false); //Gauge Back arg.lpszAniName = bgAniName; arg.lpszClassName = "static"; arg.lpszID = "_skill_back"; arg.pParent = this; m_pSkillGaugeBack = dynamicCast( m_pManager->CreateControl( arg ) ); m_pSkillGaugeBack->SetShow( false ); m_pSkillGaugeBack->SetActivate( false ); SetChildAsTop( "_skill_gauge" ); } void SUIGaugeWnd::SetActivate( bool bActivate ) { if( !m_pSkillGauge ) return; m_pSkillGauge->SetShow( bActivate ); m_pSkillGauge->SetActivate( bActivate ); if( m_pSkillGaugeBack ) { m_pSkillGaugeBack->SetShow( bActivate ); m_pSkillGaugeBack->SetActivate( bActivate ); } ////진행중에 Fire가 들어왔으면 완료된 진행률을 표시한다 //if( !( m_dwActivateTime + m_dwActivateContinueTime < m_dwTime ) ) // m_pSkillGauge->DelayCast( m_dwActivateContinueTime ); } void SUIGaugeWnd::ActivateGauge(DWORD dwContinueTime, const char * pSkillName) { if( NULL == m_pSkillGauge) return; m_dwActivateTime = m_dwTime; m_dwActivateContinueTime = dwContinueTime; m_pSkillGauge->SetShow( true ); m_pSkillGauge->SetActivate( true ); if( m_pSkillGaugeBack ) { m_pSkillGaugeBack->SetShow( true ); m_pSkillGaugeBack->SetActivate( true ); } m_pSkillGauge->Cast( pSkillName, (dwContinueTime) ); } //캐스팅중 공격이나 마법을 맞았을경우 게이지에 딜레이가 생긴다 void SUIGaugeWnd::DelayGauge(DWORD dwDelayTime ) { if(NULL != m_pSkillGauge && m_pSkillGauge->IsActivate() ) { m_dwActivateContinueTime = dwDelayTime; //진행중이여야 딜레이가 적용된다 if( !( m_dwActivateTime + m_dwActivateContinueTime < m_dwTime ) ) m_pSkillGauge->DelayCast( dwDelayTime ); } } void SUIGaugeWnd::ChangeMaxGauge( DWORD dwMaxOffsetTime ) { if( m_pSkillGauge == NULL ) return; DWORD dwContinueTime = m_pSkillGauge->GetCastTime() + dwMaxOffsetTime; m_pSkillGauge->DelayCast( dwContinueTime ); //m_dwActivateTime = m_dwTime; m_dwActivateContinueTime = dwContinueTime; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //SUICharacterWnd SUICharacterWnd::SUICharacterWnd( class SGameManager* pGameManager, AR_HANDLE handle, bool bUseBooth, SUIDisplayInfo* pDisplayInfo, bool bIsMain ) : SUIWnd( pGameManager ), m_hOwner( handle ), m_bUseBooth( bUseBooth ), m_pDisplayInfo(pDisplayInfo), m_bMain( bIsMain ) { m_dwStartTime = 0; m_dwTime = 0; m_dwChatRemoveTime = 5000; m_dwChatLastRemoveTime = 0; m_hTargetHandle = NULL; m_pNameControl = NULL; m_pNameBackControl = NULL; m_pBoothTitleControl = NULL; m_pBoothBackControl = NULL; m_pChatControl = NULL; m_pHPGauge = NULL; // m_pHPGaugeBack = NULL; m_pDotControl = NULL; m_pLocalNameControl = NULL; m_pLocalNameBackControl = NULL; m_dwLocalNameDisplayTime = 5000; m_dwLocalNameStartTime = 0; m_nGuild_id = 0; m_nDamageCnt01 = 0; m_nDamageCnt02 = 0; m_nAlarmCount = 0; m_dwAlarmTime = 0; m_sPK_Color = c_szCharPKOnNameTag; m_dwBeforeRefrshTime = 0; m_bIcon = false; m_bIsExistGuild = false; m_pGuildIconControl = NULL; m_pGuildNameControl = NULL; m_questIconControl = NULL; /// 2011.08.05 - prodongi m_nObjType = 0; m_bNowMutate = false; m_pPVPIconControl = NULL; m_pIconControl = NULL; m_pEmblemControl = NULL; /// 2011.01.17 - prodongi m_markStatus = 0; m_strTitleName = ""; m_pTitleName = NULL; m_UpAndDownState = -1; m_curHP = 1; m_maxHP = 1; m_IsEnemyUnit = false; m_vMoveControl.push_back( stMovingCTL("_guild_name") ); // 길드 이름 m_vMoveControl.push_back( stMovingCTL("_guild_icon_back") ); // 길드 아이콘 m_vMoveControl.push_back( stMovingCTL("_character_chat") ); // 채팅 // 채팅은 채팅 생성시에 조절 되도록 한다. //m_vMoveControl.push_back("_effect_text_group"); // 이펙트 그룹? // 이건.. 뭔지 잘... m_vMoveControl.push_back( stMovingCTL("_booth_title", BOOTH_ADJUST) ); // 노점(삽니다/팝니다) m_vMoveControl.push_back( stMovingCTL("_booth_name_back", BOOTH_ADJUST) ); // 노점 이름 } SUICharacterWnd::~SUICharacterWnd() { m_vMoveControl.clear(); } void SUICharacterWnd::Create(KUIWND_CREATE_ARG& CREATE_ARG) { KUIWnd::Create( CREATE_ARG) ; // Chat control KUIWND_CREATE_ARG arg; arg.lpszAniName = "static_talk_outframe00"; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = m_sChatMessage.c_str(); arg.lpszID = "_character_chat"; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; arg.dwStyle = 0; KRect rcChat = CREATE_ARG.rcRect; rcChat.left -= CHAT_MAX_WIDTH / 2; rcChat.top += CHAT_OFFSET_Y + CHARWND_POS_Y; rcChat.right = rcChat.left + CHAT_MAX_WIDTH; rcChat.bottom = rcChat.top + CHAT_HEIGHT + CHARWND_POS_Y; CalcTitleHeight(rcChat); arg.rcRect = rcChat; arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pChatControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pChatControl->SetShow( false ); m_pChatControl->SetCaptionAlign( KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER ); // 채팅창 표시되는 이모티콘 표시 비활성화. 유럽 m_pChatControl->UseEmoticonFilter(false); //상태이상 데미지 rcChat = m_rcRegion; //rcChat.top = rcChat.top + m_rcRegion.GetHeight(); //rcChat.bottom = rcChat.top + 10; //rcChat.left = rcChat.left + (m_rcRegion.GetWidth() * 0.5f); //rcChat.right = rcChat.left + 10; arg.rcRect = rcChat; arg.pParent = this; arg.lpszAniName = ""; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "effect_text_group"; arg.lpszCaption = ""; arg.lpszID = "_effect_text_group"; m_pDotControl = dynamicCast( m_pManager->CreateControl(arg) ); // //Debug 용 #ifndef NDEBUG //arg.lpszAniName = "static_talk_outframe00"; //arg.lpszSprName = m_sSprName.c_str(); //arg.lpszClassName = "static"; //arg.lpszID = "_char_back_ground"; //arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; //arg.dwStyle = 0; //arg.rcRect = m_rcRegion; //arg.pParent = this; //m_pManager->CreateControl(arg); #endif } void SUICharacterWnd::PositionUpper( int nAdd ) { std::list::iterator it = m_DamageList.begin(); while( it != m_DamageList.end() ) { KUIWnd* pWnd = (*it); //위치 수정 const KRect rect = pWnd->GetRect(); int nPosition = rect.top - nAdd; pWnd->MovePos(rect.left,nPosition); it++; } } void SUICharacterWnd::ForcedProcess(DWORD dwTime) { //데미지 처리 std::list::iterator itDamage = m_DamageList.begin(); while( itDamage != m_DamageList.end() ) { KUIWnd* pWnd = (*itDamage); if( pWnd->IsDestroy() == false ) pWnd->Process(dwTime); ++itDamage; } } void SUICharacterWnd::Process(DWORD dwTime) { std::list::iterator it = m_listChild.begin(); while( it != m_listChild.end() ) { KUIWnd* pWnd = (*it); pWnd->Process(dwTime); if( pWnd->IsDestroy() ) { it = m_listChild.erase(it); } else { it++; } } // Damage handling std::list::iterator itDamage = m_DamageList.begin(); while( itDamage != m_DamageList.end() ) { KUIWnd* pWnd = (*itDamage); if( pWnd->IsDestroy() ) { #ifdef _KUI_INVALIDATION this->RemovePopupControl( reinterpret_cast< KUIControl* >( pWnd ) ); #endif SAFE_DELETE(pWnd); itDamage = m_DamageList.erase(itDamage); } else { ++itDamage; } } #ifdef _KUI_INVALIDATION //상태이상 효과 메시지 윈도우 std::list::iterator itState = m_StateEffectTextList.begin(); while( itState != m_StateEffectTextList.end() ) { KUIWnd* pWnd = (*itState); if( pWnd->IsDestroy() ) { this->RemovePopupControl( reinterpret_cast< KUIControl* >( pWnd ) ); SAFE_DELETE(pWnd); itState = m_StateEffectTextList.erase(itState); } else { ++itState; } } #endif m_dwTime = dwTime; if( m_dwStartTime == 0 ) m_dwStartTime = m_dwTime; // 채팅을 지워주자. if(m_dwChatLastRemoveTime + m_dwChatRemoveTime < m_dwTime && NULL != m_pChatControl && m_pChatControl->IsShow()) { m_pChatControl->SetShow(false); } if( m_pLocalNameControl && m_pLocalNameBackControl && m_pLocalNameControl->IsShow() && m_pLocalNameBackControl->IsShow() ) { if(dwTime - m_dwLocalNameStartTime < m_dwLocalNameDisplayTime) { float fAlpha = 1.0f - (float)(m_dwTime - m_dwLocalNameStartTime) / m_dwLocalNameDisplayTime; m_pLocalNameControl->ChangeAlpha(fAlpha); m_pLocalNameBackControl->ChangeAlpha(fAlpha); } else { m_pLocalNameControl->SetShow(false); m_pLocalNameBackControl->SetShow(false); RemoveChild(m_pLocalNameControl); RemoveChild(m_pLocalNameBackControl); m_pLocalNameControl = NULL; m_pLocalNameBackControl = NULL; } } //Alarm if( m_nAlarmCount ) { if( (m_dwTime - m_dwAlarmTime) > 500 ) { if( (m_nAlarmCount % 2) ? true : false ) m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", c_szCharNameTag_ME, m_sName.c_str() ).c_str(), false ); else m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", c_szCahrPKOnNameTag_ME, m_sName.c_str() ).c_str(), false ); --m_nAlarmCount; m_dwAlarmTime = m_dwTime; } } procQuestIcon(); /// 2011.08.05 - prodongi if( (m_nAlarmCount <= 0) && (m_bMain==false) ) // 내가 아니고, pk알람이 꺼져있을 때 리프레시 ReFreshCheck(dwTime); } /// 2010.11.10 - prodongi //#ifdef _DEV //extern bool g_bDebugMode; //#endif void SUICharacterWnd::Render( KViewportObject *pViewport, bool isFront ) { const _OPT_DATA& data = GetGameOption().GetOptData(); unsigned char Type; int AvatarType = m_pDisplayInfo->IsFriend(m_hOwner, Type); /// field prop은 다은 함수에서 체크해 준다 - prodongi if (TS_ENTER::GAME_FIELD_PROP == Type) { KUIGenWnd::Render(pViewport, isFront); return ; } bool bShow(false); if( data.nName ) { if( Type == TS_ENTER::GAME_PLAYER ) bShow = data.nPlayerName; if( Type == TS_ENTER::GAME_NPC ) bShow = data.nNPCName; if( Type == TS_ENTER::GAME_SUMMON ) bShow = data.nCreatureName; if( Type == TS_ENTER::GAME_MOB ) bShow = data.nMobName; if( Type == TS_ENTER::GAME_PET ) bShow = data.nCreatureName; } else bShow = false; if( m_pNameControl ) m_pNameControl->SetShow( bShow ); if( data.nHPGage ) { if( AvatarType == SUIDisplayInfo::LocalPlayer ) bShow = data.nPlayerGage; if( AvatarType == SUIDisplayInfo::Party ) bShow = data.nPlayerGage; if( AvatarType == SUIDisplayInfo::enemy ) bShow = data.nMobGage; bool bShowMobHPMP = true; if( Type == TS_ENTER::GAME_MOB ) { bShow = data.nMobGage; if( m_pDisplayInfo->ShowMobHPMP( m_hOwner ) == false ) bShowMobHPMP = false; if( bShowMobHPMP == false ) { bShow = false; } } if( Type == TS_ENTER::GAME_SUMMON ) bShow = true; if( Type != TS_ENTER::GAME_PLAYER && g_pCurrentGameSystem->IsTarget(m_hOwner) ) { if( bShowMobHPMP ) bShow = data.nTargetGage; } } else bShow = false; if( m_pHPGauge ) m_pHPGauge->SetShow( bShow ); // SetChildShow("_hp_gauge", bShow); KUIGenWnd::Render(pViewport, isFront); } void SUICharacterWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD dwMessage, DWORD lParam, DWORD wParam ) { if( KUI_MESSAGE::KBUTTON_CLICK == dwMessage && !_stricmp( lpszControlID, "_booth_name_back" ) ) { // 노점 열자~ if( m_hTargetHandle != this->m_pDisplayInfo->GetPlayerInfoManager()->GetPlayerHandle() ) { if( !m_pGameManager->IsUIWindowOpened( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SHOP ) && !m_pGameManager->IsUIWindowOpened( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TRADE ) && !m_pGameManager->IsUIWindowOpened( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_STORAGE ) && !m_pGameManager->IsUIWindowOpened( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_STORE_HOST ) ) { SMSG_WATCH_BOOTH msg( m_hTargetHandle, true ); m_pGameManager->ProcMsgAtStatic( &msg ); } } } if( KUI_MESSAGE::KFOCUS_ACTIVATED == dwMessage ) //-N4- HP게이지 클릭해도 타겟되게 하는 부분 { KUIWnd* pHpWnd = GetChild("_hp_gauge"); if( pHpWnd && pHpWnd->IsShow() && pHpWnd->IsInRect(lParam, wParam) ) //보이지도 않는데 타겟이 되게 할 필요없다. { SIMSG_UI_ACT_TARGET* pMsg = new SIMSG_UI_ACT_TARGET; pMsg->m_nTargetHandle = m_hOwner; m_pGameManager->PostMsgAtDynamic( pMsg ); } } } DWORD SUICharacterWnd::OnMouseMessage(DWORD dwMessage, int x, int y) { return KUIGenWnd::OnMouseMessage(dwMessage, x, y); // return KMR_NO_GET;; } DWORD SUICharacterWnd::OnKeyMessage(DWORD dwMessage, DWORD dwKeyCode) { return KUIWnd::OnKeyMessage(dwMessage, dwKeyCode); } void SUICharacterWnd::OnPosChangeNofity(int XOffset, int YOffset) { KUIWnd::OnPosChangeNofity( XOffset, YOffset); } void SUICharacterWnd::SetEmblem(int nID) { // AziaMafia Fix Emblem //m_nBackBoard = nID - ItemBase::CODE_BASE_BACKBOARD; m_nBackBoard = nID ; if(m_nBackBoard > 0) { if(m_pEmblemControl) { if (m_nBackBoard <= 603115 ) m_pEmblemControl->SetIcon("05_ui.spr", GetItemDB().GetAdditionalTexture(m_nBackBoard) ); m_pEmblemControl->SetShow( true ); } } else { if (m_pEmblemControl) m_pEmblemControl->SetShow( false ); } } void SUICharacterWnd::SetNameAlarm( int nAlarmCount ) { m_nAlarmCount = nAlarmCount; m_dwAlarmTime = m_dwTime; } void SUICharacterWnd::SetPKNameColor( unsigned status ) { m_nAlarmCount = 0; m_dwAlarmTime = 0; m_status = status; std::string strPK_Color = "<@000000FF>"; if( m_bNowMutate == false ) { //새로 프로토콜을 만들어야 될 것 같음 if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) { if( m_pIconControl ) ShowPKIcon( true ); } else { if( m_pIconControl ) ShowPKIcon( false ); } } //1:1 대련 #kappamind //2009-02-26: if( m_status & TS_ENTER::PlayerInfo::FLAG_COMPETING ) { if( m_pPVPIconControl ) ShowPVPIcon( true ); } else { if( m_pPVPIconControl ) ShowPVPIcon( false ); } if( m_pPVPIconControl ) m_pPVPIconControl->SetBack( m_sSprName.c_str(), "common_mark_state_pvp_normal" ); if( m_status & TS_ENTER::PlayerInfo::FLAG_BLOODY ) { if( m_bMain ) strPK_Color = c_szCharPKBloodyTag_ME; else strPK_Color = c_szCharPKBloodyTag; if( m_pIconControl ) m_pIconControl->SetBack( m_sSprName.c_str(), "common_mark_state_pk_demoniac" ); } else if( m_status & TS_ENTER::PlayerInfo::FLAG_DEMONIAC ) { if( m_bMain ) strPK_Color = c_szCharPKDemonicTag_ME; else strPK_Color = c_szCharPKDemonicTag; if( m_pIconControl ) m_pIconControl->SetBack( m_sSprName.c_str(), "common_mark_state_pk_demoniac" ); } else { if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) { if( m_bMain ) strPK_Color = c_szCahrPKOnNameTag_ME; else strPK_Color = c_szCharPKOnNameTag; } else { strPK_Color = m_sNameEffect.c_str(); } if( m_pIconControl ) m_pIconControl->SetBack( m_sSprName.c_str(), "common_mark_state_pk_normal" ); } // if( stricmp( m_sPK_Color.c_str(), strPK_Color.c_str() ) != 0 ) //그냥 갱신시키자 { m_sPK_Color = (m_IsEnemyUnit)? c_szAttaMonNameTag : strPK_Color ; if( m_bNowMutate == false ) { m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", m_sPK_Color.c_str(), m_sName.c_str() ).c_str(), false ); } } // 2012. 6. 5 - marine 타 유저일 경우 pvp이면 이름 태그 변경 if( IsThisLocalPlayer() == false ) { if(m_pPVPIconControl->IsShow()) { std::string str = c_szAttaMonNameTag; str += m_sName; m_pNameControl->SetCaption(str.c_str()); } } /// 2011.01.17 - prodongi bool isPKStatus, isPVPStatus, isPKNormalStatus; if( m_bNowMutate == false ) { if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) isPKStatus = true; else isPKStatus = false; } if( m_status & TS_ENTER::PlayerInfo::FLAG_COMPETING ) isPVPStatus = true; else isPVPStatus = false; if( m_status & TS_ENTER::PlayerInfo::FLAG_BLOODY ) isPKNormalStatus = false; else if( m_status & TS_ENTER::PlayerInfo::FLAG_DEMONIAC ) isPKNormalStatus = false; else isPKNormalStatus = true; unsigned int markStatus = 0; if (isPVPStatus) markStatus |= SMSG_MARK_STATUS_CHANGE::PVP; if (isPKStatus) markStatus |= (isPKNormalStatus) ? SMSG_MARK_STATUS_CHANGE::PK_NORMAL : SMSG_MARK_STATUS_CHANGE::PK_DEMONIAC; if (markStatus != m_markStatus) { if (g_pCurrentGameSystem->IsLocalPlayer(m_hOwner) || g_pCurrentGameSystem->IsTarget(m_hOwner)) { SMSG_MARK_STATUS_CHANGE msg(m_hOwner, markStatus); m_pGameManager->ProcMsgAtStatic(&msg); } m_markStatus = markStatus; } } void SUICharacterWnd::SetName(LPCSTR lpszName, LPCSTR lpszNameEffect, int objType) { m_sName = lpszName; m_sNameEffect = lpszNameEffect; if(NULL != m_pNameControl ) RemoveChild( m_pNameControl ); if(NULL != m_pNameBackControl) RemoveChild( m_pNameBackControl ); if( NULL != m_pIconControl ) RemoveChild( m_pIconControl ); //1:1 대련 if( NULL != m_pPVPIconControl ) RemoveChild( m_pPVPIconControl ); KUIWND_CREATE_ARG arg; if (TS_ENTER::GAME_FIELD_PROP != objType) { // Background arg = KUIWND_CREATE_ARG(); arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszID = "_character_name_back"; arg.rcRect = _GetNameBackRect(); if( m_bMain ) { arg.rcRect.top += 2; //아래 이동 arg.rcRect.bottom += 2; } else { arg.rcRect.top += 1; //아래 이동 arg.rcRect.bottom += 1; } arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pNameBackControl = dynamicCast( m_pManager->CreateControl(arg) ); //m_rcRegion.right == -1 영향 받지 않음 m_pNameBackControl->SetUsePosEnable( false ); } // 이름 글자 arg.lpszAniName = ""; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str(); arg.lpszID = "_character_name"; arg.dwFlag = 0; arg.dwStyle = 0; arg.rcRect = _GetNameBackRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE| KFLAG_NO_GET_FOCUS; m_pNameControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pNameControl->SetCaptionAlign(KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER); if (TS_ENTER::GAME_FIELD_PROP != objType) { //아이콘 arg.lpszAniName = "common_mark_state_pk_normal"; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "iconstatic"; arg.lpszCaption = ""; arg.rcRect = _GetIconRect(); arg.lpszID = "_pk_icon"; arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE| KFLAG_NO_GET_FOCUS; m_pIconControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pIconControl->SetShow( false ); //1:1대련 arg.lpszAniName = "common_mark_state_pvp_normal"; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "iconstatic"; arg.lpszCaption = ""; arg.rcRect = _GetPVPIconRect(); arg.lpszID = "_PVP_icon"; arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE| KFLAG_NO_GET_FOCUS; m_pPVPIconControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pPVPIconControl->SetShow( false ); #ifndef NDEBUG //길드 아이콘 관련 수정할 부분 <여기서 길드아이콘 add하게 하던가 하믄 안된다> //서버에서 길드아이콘에 관한 메세지가 왔을때 하게끔 위치 설정 //함수 바로위에 include한거 삭제할 것 // SMSG_CHATTING_REQUEST msg; // msg.strText = "/guildicon"; // m_pGameManager->GetActiveGame()->ProcMsgAtStatic(&msg); // std::string hh; // if( m_pGuildMgr ) // hh = m_GuildMgr.GetGuildName(); // SetGuildInfo( hh.c_str(), "test001_0000000000_060519_030321" ); // SetGuildInfo( "guild_test", "test001_0000000000_060519_030321" ); SetGuildInfo( "guild_test", NULL ); #endif } } void SUICharacterWnd::SetBoothName(AR_HANDLE hTargetHandle, LPCSTR lpszName) { if( !m_bUseBooth ) return; m_hTargetHandle = hTargetHandle; m_sBoothName = lpszName; bool bIsSellBooth(false); SGame* pGame = m_pGameManager->GetActiveGame(); if( pGame ) { SGameAvatarEx* pPlayer = (SGameAvatarEx*)(pGame->GetGameObject(m_hTargetHandle)); unsigned int PlayerStatus(0); if( pPlayer ) PlayerStatus = pPlayer->GetStatus(); if( PlayerStatus & TS_ENTER::PlayerInfo::FLAG_SELL_BOOTH ) bIsSellBooth = true; else if( PlayerStatus & TS_ENTER::PlayerInfo::FLAG_BUY_BOOTH ) bIsSellBooth = false; } // { m_sBoothName 길이 제한 std::wstring wname = nsl::uni::conv( m_sBoothName ); if( wname.size() > 12 ) { wname.resize( 12 ); wname.push_back( '.' ); wname.push_back( '.' ); wname.push_back( '.' ); } m_sBoothName = nsl::uni::conv( wname ); // } if( NULL != m_pBoothBackControl) { RemoveChild( m_pBoothBackControl ); m_pBoothBackControl = NULL; } if( NULL != m_pBoothTitleControl) { RemoveChild( m_pBoothTitleControl ); m_pBoothTitleControl = NULL; } if( m_sBoothName.empty() ) { m_hTargetHandle = NULL; return; } // Background KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "simplebutton"; arg.lpszID = "_booth_name_back"; arg.rcRect = _GetBoothBackRect(); if( m_bIsExistGuild ) { arg.rcRect.top -= 13;//10; arg.rcRect.bottom -= 13;//10; } CalcTitleHeight(arg.rcRect); arg.rcRect.top += 14; arg.rcRect.bottom += 14; arg.pParent = this; std::string strBoothName; if( bIsSellBooth ) { arg.lpszAniName = "button_booth_buy"; strBoothName = "<#7EBFFC>"; } else { arg.lpszAniName = "button_booth_sell"; strBoothName = "<#FFEA00>"; } strBoothName += m_sBoothName; arg.lpszCaption = strBoothName.c_str(); m_pBoothBackControl = dynamicCast( m_pManager->CreateControl(arg) ); SetChildAsTop("_booth_name_back"); // sonador 3.9.3 개인상점 [사기/팔기] 비주얼 강화(텍스트 추가) { KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszID = "_booth_title"; arg.lpszAniName = ""; arg.rcRect = _GetBoothBackRect(); arg.rcRect.top -= BOOTH_TYPE_HEIGHT + 3; arg.rcRect.bottom -= BOOTH_TYPE_HEIGHT + 3; CalcTitleHeight(arg.rcRect); arg.pParent = this; arg.dwFlag = KUI_FLAG::KFLAG_NO_GET_FOCUS | KUI_FLAG::KFLAG_NO_GET_MESSAGE; arg.lpszCaption = bIsSellBooth ? S( 3355 ) : S( 3356 ); m_pBoothTitleControl = dynamicCast( m_pManager->CreateControl(arg) ); SetChildAsTop("_booth_title"); } } void SUICharacterWnd::SetLocalName(LPCSTR lpszLocalName, bool bShow) { if(NULL != m_pLocalNameControl ) { RemoveChild( m_pLocalNameControl ); m_pLocalNameControl = NULL; } if(NULL != m_pLocalNameBackControl) { RemoveChild( m_pLocalNameBackControl ); m_pLocalNameBackControl = NULL; } if( bShow == false ) return; // Background KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszID = "_local_name_back"; arg.rcRect = _GetLocalNameBackRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pLocalNameBackControl = dynamicCast( m_pManager->CreateControl(arg) ); // 이름 글자 arg.lpszAniName = ""; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = lpszLocalName; arg.lpszID = "_local_name"; arg.dwFlag = 0; arg.dwStyle = 0; arg.rcRect = _GetLocalNameBackRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pLocalNameControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pLocalNameControl->SetCaptionAlign(KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER); m_dwLocalNameStartTime = m_dwTime; } /* void SUICharacterWnd::SetBoothTitle( bool bIsSellBooth ) { if( !m_bUseBooth ) return; if( !m_pBoothTitleControl ) return; if( bIsSellBooth ) m_pBoothTitleControl->SetBack( "", ); else m_pBoothTitleControl->SetBack( "", "static_streetstall_buytitle" ); // Background가 없으면 Size가 이상해 지므로 Move를 해주지 않음. if( NULL == lpszBackAni) return; DWORD dwBackWidth = m_pBoothBackControl->GetRect().GetWidth(); int nXPos = m_rcRegion.left - (dwBackWidth + 1) / 2; DWORD dwBackHeight = m_pBoothBackControl->GetRect().GetHeight(); int nYPos = m_rcRegion.top + BOOTH_OFFSET_Y / 2 - (dwBackHeight + 1) / 2; m_pBoothBackControl->MovePos(nXPos,nYPos); }*/ void SUICharacterWnd::SetNameBackAni(LPCSTR lpszBackAni, int nIndex) { if(NULL == m_pNameBackControl) return; m_pNameBackControl->SetBack( c_szDEF_SPR_NAME, lpszBackAni ); } void SUICharacterWnd::SetChatMessage(LPCSTR lpszMesasge) { // 노점 중에는 머리위에 채팅 표시 안함 if( !m_sBoothName.empty() ) return; if(NULL == lpszMesasge ||strlen(lpszMesasge) == 0) { m_pChatControl->SetShow( false); return; } m_sChatMessage = lpszMesasge; DWORD dwMessageWidth = KTextPhrase::GetOneLineStringSize( lpszMesasge ); KRect rcNewrect = m_rcRegion; rcNewrect.left = rcNewrect.left + ((m_rcRegion.right-m_rcRegion.left)*0.39f) - (dwMessageWidth/2) - CHAT_MARGIN_WIDTH; rcNewrect.right = rcNewrect.left + dwMessageWidth + CHAT_MARGIN_WIDTH; if( !m_bIsExistGuild ) rcNewrect.top += CHAT_OFFSET_Y + CHARWND_POS_Y; else rcNewrect.top += (CHAT_OFFSET_Y - 25 + CHARWND_POS_Y ); rcNewrect.bottom = rcNewrect.top + CHAT_HEIGHT; CalcTitleHeight(rcNewrect); // 채팅 메세지는 항상 위에 오도록... SetChildAsTop( "_character_chat" ); m_pChatControl->Resize( rcNewrect); /// 2012.07.30 디폴트 폰트외의 폰트 태그를 설정 했을 때, lpszMesasge가 일정 길이 이상 ‰瑛?때, /// 출력이 되지 않고 있다. 왜 그런지는 확인을 해봐야 되지만 우선은 기존처럼 폰트 태그를 삭제함 - prodongi /* std::string strChat = c_szChatTag; strChat += lpszMesasge; m_pChatControl->SetCaption( strChat.c_str(), false ); */ m_pChatControl->SetCaption( lpszMesasge, false); m_pChatControl->SetShow( true); m_dwChatLastRemoveTime = m_dwTime; } void SUICharacterWnd::ChangeGuildName() { ChangeGuildName(m_sGuildName.c_str()); } void SUICharacterWnd::ChangeGuildName( LPCSTR lpszGuildName ) { if( lpszGuildName == NULL ) return; //길드 이름 { if(NULL != m_pGuildNameControl ) { RemoveChild( m_pGuildNameControl ); m_pGuildNameControl = NULL; } m_sGuildName = lpszGuildName; // 이름 글자 KUIWND_CREATE_ARG arg; arg.lpszAniName = "";//static_talk_outframe00"; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = CStringUtil::StringFormat( "%s%s", c_szGuildNameTag ,m_sGuildName.c_str() ).c_str(); arg.lpszID = "_guild_name"; arg.dwFlag = 0; arg.dwStyle = 0; arg.rcRect = _GetGuildNameRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pGuildNameControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pGuildNameControl->SetCaptionAlign(KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER); } } void SUICharacterWnd::SetGuildInfo( LPCSTR lpszGuildName, LPCSTR lpszIconAniName ) { if( lpszGuildName == NULL ) return; if( lpszIconAniName == NULL ) return; if( !_strnicmp( lpszGuildName, "#@DELETEGUILD@#", _countof("#@DELETEGUILD@#") ) ) { if(NULL != m_pGuildIconControl ) { RemoveChild( m_pGuildIconControl ); m_pGuildIconControl = NULL; } if(NULL != m_pGuildNameControl ) { RemoveChild( m_pGuildNameControl ); m_pGuildNameControl = NULL; } m_bIsExistGuild = false; m_sGuildName = "#@DELETEGUILD@#"; m_sGuildAniName = "#@DELETEGUILD@#"; return; } m_bIsExistGuild = true; //길드 이름 if( stricmp( m_sGuildName.c_str(), lpszGuildName ) != 0 ) { if(NULL != m_pGuildNameControl ) { RemoveChild( m_pGuildNameControl ); m_pGuildNameControl = NULL; } m_sGuildName = lpszGuildName; // 이름 글자 KUIWND_CREATE_ARG arg; arg.lpszAniName = "";//static_talk_outframe00"; arg.lpszSprName = m_sSprName.c_str(); arg.lpszClassName = "static"; arg.lpszCaption = CStringUtil::StringFormat( "%s%s",c_szGuildNameTag, m_sGuildName.c_str() ).c_str(); arg.lpszID = "_guild_name"; arg.dwFlag = 0; arg.dwStyle = 0; arg.rcRect = _GetGuildNameRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pGuildNameControl = dynamicCast( m_pManager->CreateControl(arg) ); m_pGuildNameControl->SetCaptionAlign(KTextRender::KTALIGN_HCENTER | KTextRender::KTALIGN_VCENTER); if( m_bNowMutate ) m_pGuildNameControl->SetShow( false ); } //길드 아이콘 if( stricmp( m_sGuildAniName.c_str(), lpszIconAniName ) != 0 ) { if(NULL != m_pGuildIconControl ) { RemoveChild( m_pGuildIconControl ); m_pGuildIconControl = NULL; } // Icon KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = lpszIconAniName ? lpszIconAniName : "static_job_unknownicon"; arg.lpszClassName = "iconstatic"; arg.lpszID = "_guild_icon_back"; arg.rcRect = _GetGuildIconRect(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pGuildIconControl = dynamicCast( m_pManager->CreateControl(arg) ); m_sGuildAniName = arg.lpszAniName; if( m_bNowMutate ) m_pGuildIconControl->SetShow( false ); } } void SUICharacterWnd::SetProperty(DWORD dwChatRemoveTime) { m_dwChatRemoveTime = dwChatRemoveTime; } void SUICharacterWnd::MoveDotControl( int nX, int nY ) { if( m_pDotControl ) m_pDotControl->MovePos( nX, nY ); if( m_pHPGauge ) { if( m_pHPGauge->IsShow() ) m_pHPGauge->ReSizeBackGround(); } } void SUICharacterWnd::RefreshHP( int nCur, int nMax ) { m_curHP = nCur; m_maxHP = nMax; if( !m_pHPGauge ) return; bool bFriend(false); unsigned char Type; bFriend = m_pDisplayInfo->IsFriend(m_hOwner, Type); bool bEnemy(false); // 2012. 6. 5 - marine 적군으로 게이지 표시를 해야 할 때가 있다. // pvp 상대, 던전시즈, 아레나 적 캐릭터 나 크리쳐 if( IsPvpUnit(Type) || m_IsEnemyUnit ) { bEnemy = true; bFriend = false; } if( bFriend ) //동료들은 게이지를 표시해준다 -N4- { if( Type != TS_ENTER::GAME_NPC ) //NPC는 적은 아니지만 머리위의 게이지가 없다 { int nPer = static_cast(m_pDisplayInfo->GetPercent( nCur, nMax )); m_pDisplayInfo->RefreshGaugeAndStatic( m_pHPGauge, nCur, nMax, nPer, c_dwGaugeFillTime ); // 게이지 남은 양에 따라 텍스처 바꿔줌 // 2012.02.03 - servantes setHPGaugeTexture( nPer, m_pHPGauge, 5 ); m_pHPGauge->ReSizeBackGround(); } } else //동료가 아니지만 몬스터들은 다른 리소스를 이용해서 표시해준다 { if( Type == TS_ENTER::GAME_MOB || bEnemy ) { int nPer = static_cast(m_pDisplayInfo->GetPercent( nCur, nMax )); m_pDisplayInfo->RefreshGaugeAndStatic( m_pHPGauge, nCur, nMax, nPer, c_dwGaugeFillTime ); /// 2010.11.24 - prodongi m_pHPGauge->SetBack( c_szDEF_SPR_NAME, "common_gauge_titanium_monster_mini" ); m_pHPGauge->ReSizeBackGround(); } } } bool SUICharacterWnd::IsPvpUnit(unsigned char Type) { if( Type == TS_ENTER::GAME_PLAYER && (IsThisLocalPlayer() == false) ) // 내가 아니여여 한다. { if(m_pPVPIconControl->IsShow()) // pvp상황 return true; } return false; } void SUICharacterWnd::RemoveHpGuage() { if( NULL != m_pHPGauge) { RemoveChild(m_pHPGauge); m_pHPGauge= NULL; }; } bool SUICharacterWnd::IsShowHpGuage() { if( NULL != m_pHPGauge) return m_pHPGauge->IsShow(); return false; } void SUICharacterWnd::SetHPGaugeBack(LPCSTR lpszBack) { if( NULL != m_pHPGauge) RemoveChild(m_pHPGauge); // if( NULL != m_pHPGaugeBack) // RemoveChild(m_pHPGaugeBack); KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = lpszBack; arg.lpszClassName = "gauge"; arg.lpszID = "_hp_gauge"; arg.pParent = this; arg.rcRect = m_rcRegion; //가운데 정렬 int nWidth = 26; arg.rcRect.left = arg.rcRect.left + nWidth + 8; arg.rcRect.right = arg.rcRect.left + GAUGE_WIDTH; arg.rcRect.top = arg.rcRect.top + GAUGE_OFFSET_Y + CHARWND_POS_Y; arg.rcRect.bottom = arg.rcRect.top + 4; arg.dwFlag = KFLAG_NO_GET_FOCUS; m_pHPGauge = dynamicCast( m_pManager->CreateControl( arg ) ); bool bFlag = true; //m_rcRegion.right == -1 영향 받지 않음 m_pHPGauge->SetUsePosEnable( false ); m_pHPGauge->SetShow( bFlag ); m_pHPGauge->SetActivate( bFlag ); m_pHPGauge->ReSizeBackGround(); SetChildAsTop( "_hp_gauge" ); } KPoint SUICharacterWnd::GetDamageCenterPoint() const { return KPoint( m_rcRegion.left + DAMAGE_OFFSET_X, m_rcRegion.top + DAMAGE_OFFSET_Y ); } //KUIControlDamage* SUICharacterWnd::AddDamageOptionAni( const char* szAniName, bool bMoveDefaultPos/* = true*/ ) //{ // ++m_nDamageCnt01; // // return NULL; // // //TODO // KUIWND_CREATE_ARG arg; // arg.lpszSprName = m_sSprName.c_str(); // arg.lpszClassName = "damage"; //// arg.lpszAniName = // // arg.lpszID = CStringUtil::StringFormat( "_add_damage_option%d", m_nDamageCnt01 ).c_str(); // arg.pParent = this; // arg.rcRect = m_rcRegion; // arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS;; // // KUIControlDamage* pDamageOption = static_cast( m_pManager->CreateControl( arg ) ); //// pDamageOption->SetDamageOptionAni( szAniName ); // // m_DamageList.push_back( pDamageOption ); // // if( bMoveDefaultPos ) // { // KPoint ptDamageCenter = GetDamageCenterPoint(); // pDamageOption->MovePos // ( ptDamageCenter.x - ((pDamageOption->GetRect().GetWidth()) / 2) // , ptDamageCenter.y ); // } // return pDamageOption; //} //KUIControlNumberEffectBase* SUICharacterWnd::AddMsg( const char* pMsg, bool bMoveDefaultPos/* = true*/ ) //{ // ++m_nDamageCnt01; // // KUIWND_CREATE_ARG arg; // arg.lpszSprName = m_sSprName.c_str(); // arg.lpszAniName = "font_number_white_195"; //font_number_white_195// szFontAniName; // arg.lpszClassName = "damage_critical"; // arg.lpszID = CStringUtil::StringFormat( "_add_msg%d", m_nDamageCnt01 ).c_str(); //// arg.lpszCaption = CStringUtil::StringFormat( " // arg.pParent = this; // arg.rcRect = m_rcRegion; // arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS;; // // // 데미지 // KUIControlDamageCritical* pDamage = static_cast( m_pManager->CreateControl( arg ) ); // pDamage->SetCaption( pMsg ); // // m_DamageList.push_back( pDamage ); // // if( bMoveDefaultPos ) // { // KPoint ptDamageCenter = GetDamageCenterPoint(); // pDamage->MovePos // ( ptDamageCenter.x - ((pDamage->GetRect().GetWidth()) / 2) // , ptDamageCenter.y ); // } // return pDamage; //} void SUICharacterWnd::AddState( const char * pString, KUIControlEffectText::EFFECT_TYPE nType, bool bScaleDown ) { if( !m_pDotControl ) return; #ifdef _KUI_INVALIDATION if( m_dwTime && m_dwStartTime ) { if( (m_dwTime - m_dwStartTime) >= c_dwGaugeFillTime*20 ) { KUIControl* pEffectText = m_pDotControl->AddEffectControl( this, pString, nType, bScaleDown ); if( pEffectText ) { m_StateEffectTextList.push_back( pEffectText ); this->AddPopupControl( pEffectText ); } } } #else if( m_dwTime && m_dwStartTime ) { if( (m_dwTime - m_dwStartTime) >= c_dwGaugeFillTime*20 ) m_pDotControl->AddEffectControl( pString, nType, bScaleDown ); } #endif } KUIControl* SUICharacterWnd::AddDamage( int nDamageflag, ADD_DAMAGE_INFO * pAddDamageInfo, bool bMoveDefaultPos/* = true*/ ) { ++m_nDamageCnt02; KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = pAddDamageInfo->strAniName00.c_str(); switch( nDamageflag ) { case FONT_DEFAULT : arg.lpszClassName = "damage"; arg.lpszCaption = CStringUtil::StringFormat( "%d", pAddDamageInfo->nDamage00 ).c_str(); arg.rcRect = m_rcRegion; break; case FONT_HEAL : arg.lpszClassName = "healing"; arg.lpszCaption = CStringUtil::StringFormat( "%d", pAddDamageInfo->nDamage00 ).c_str(); arg.rcRect = m_rcRegion; break; case FONT_CRITICAL: arg.lpszClassName = "damage"; // AziaMafia FixSkill "damage"; arg.lpszCaption = CStringUtil::StringFormat( "%d", pAddDamageInfo->nDamage00 ).c_str(); arg.rcRect = m_rcRegion; break; case FONT_ETC : arg.lpszClassName = "damage_etc"; arg.rcRect = m_rcRegion; arg.rcRect.left += 45; arg.rcRect.right = -1; arg.rcRect.top += 30; arg.rcRect.bottom = -1; break; case FONT_MAX_HEAL : arg.lpszClassName = "healing_maximize"; arg.rcRect = m_rcRegion; break; } arg.lpszID = CStringUtil::StringFormat( "_add_damage%d", m_nDamageCnt02 ).c_str(); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; // 데미지 KUIControl* pDamage = NULL; int nWidth = 0; switch( nDamageflag ) { case FONT_DEFAULT : { KUIControlDamage* pDamageFont = dynamicCast( m_pManager->CreateControl( arg ) ); pDamage = pDamageFont; if( !pAddDamageInfo->strAniName01.empty() ) pDamageFont->AddDamageEtcText( pAddDamageInfo->strAniName01.c_str(), pAddDamageInfo->strAniName02.c_str() ); if( pAddDamageInfo->nDamage01 > 0 ) pDamageFont->AddExtraDamage( pAddDamageInfo->strAniName03.c_str(), pAddDamageInfo->strAniName04.c_str(), CStringUtil::StringFormat( "%d", pAddDamageInfo->nDamage01 ).c_str() ); } break; case FONT_HEAL : { KUIControlHealing* pDamageFont = dynamicCast( m_pManager->CreateControl( arg ) ); pDamage = pDamageFont; } break; case FONT_CRITICAL: { KUIControlDamageCritical* pDamageFont = dynamicCast( m_pManager->CreateControl( arg ) ); pDamage = pDamageFont; //Azia FixSkill decommentaire //if( !pAddDamageInfo->strAniName01.empty() ) //pDamageFont->AddCriticalText( pAddDamageInfo->strAniName01.c_str() ); // 2010.09.06 - prodongi if( pAddDamageInfo->nDamage01 > 0 ) pDamageFont->AddExtraDamage( pAddDamageInfo->strAniName03.c_str(), pAddDamageInfo->strAniName04.c_str(), CStringUtil::StringFormat( "%d", pAddDamageInfo->nDamage01 ).c_str() ); } break; case FONT_ETC : { KUIControlDamageEtc* pDamageFont = dynamicCast( m_pManager->CreateControl( arg ) ); pDamage = pDamageFont; if( !pAddDamageInfo->strAniName01.empty() ) pDamageFont->AddPerfectText( pAddDamageInfo->strAniName01.c_str() ); } break; case FONT_MAX_HEAL : { KUIControlHealingMaximize* pDamageFont = dynamicCast( m_pManager->CreateControl( arg ) ); pDamage = pDamageFont; if( !pAddDamageInfo->strAniName01.empty() ) pDamageFont->AddMaxHealText( pAddDamageInfo->strAniName01.c_str() ); } break; } m_DamageList.push_back( pDamage ); #ifdef _KUI_INVALIDATION // { [sonador] this->AddPopupControl( pDamage ); // } #endif if( bMoveDefaultPos ) { KPoint ptDamageCenter = GetDamageCenterPoint(); pDamage->MovePos ( ptDamageCenter.x - ((pDamage->GetRect().GetWidth()) / 2) , ptDamageCenter.y ); } return pDamage; } KRect SUICharacterWnd::_GetGuildIconRect() { KRect rect = m_pGuildNameControl->GetRect(); DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "<#ffffff>%s", m_sGuildName.c_str() ).c_str() ); int nWidth = rect.right-rect.left; nWidth = std::max( 133, (int)dwNameWidth ); KRect rcName; rcName.left = rect.left+(nWidth - dwNameWidth)/2 - 5 - 20; //5pixel 옆에 아이콘은 20짜리 rcName.right = rcName.left + 20; rcName.top = m_rcRegion.top + NAME_OFFSET_Y + 2 - 5 - 20 + CHARWND_POS_Y; rcName.bottom = rcName.top + NAME_HEIGHT; CalcTitleHeight(rcName); return rcName; } KRect SUICharacterWnd::_GetGuildNameRect() { KRect rcName; DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "<#ffffff>%s", m_sGuildName.c_str() ).c_str() ); dwNameWidth = std::max( (int)dwNameWidth, 133 ); //가운데 정렬 int nWidth = 25; rcName.left = m_rcRegion.left + nWidth ; // + (dwNameWidth + 1) / 2; rcName.right = rcName.left + dwNameWidth;// m_pNameBackControl->GetRect().GetWidth(); //(dwNameWidth + 1); // / 2; rcName.top = m_rcRegion.top + NAME_OFFSET_Y - 5 - 20 + CHARWND_POS_Y; rcName.bottom = rcName.top + NAME_HEIGHT + (m_bMain ? 4 : 0 ); CalcTitleHeight(rcName); return rcName; } KRect SUICharacterWnd::_GetIconRect() { KRect rcNameBack = _GetNameBackRect(); KRect rcName; // DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( m_sName.c_str()); // 2009.03.09 #kappamind 캐릭터 이름 길이 구해 오는 것 수정. DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); rcName.left = GetVsIconPos(); rcName.right = m_rcRegion.left + VS_ICON_WIDTH; rcName.top = m_rcRegion.top + NAME_OFFSET_Y + 2 - 5 -VS_ICON_ADJUST_Y + CHARWND_POS_Y; rcName.bottom = rcName.top + NAME_HEIGHT -VS_ICON_ADJUST_Y; return rcName; } KRect SUICharacterWnd::getQuestMobIconRect(char const* aniName) { KRect rcNameBack = _GetNameBackRect(); DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); KSize offset(0, 0); KResSprite* res = _getSpriteSet()->GetSpriteRes(aniName, 0); if (res) { offset.cx = res->GetSizeX(); } else { offset.cx = 13; } /// 여유분 offset.cx += 7; offset.cy += 2; KSize pos; pos.cx = rcNameBack.left + (rcNameBack.GetWidth() >> 1); pos.cx -= (dwNameWidth >> 1); pos.cy = rcNameBack.top; pos.cx -= offset.cx; pos.cy -= offset.cy; KRect r; r.left = pos.cx; r.top = pos.cy; r.right = r.left + rcNameBack.GetWidth(); r.bottom = rcNameBack.bottom; return r; } KRect SUICharacterWnd::_GetPVPIconRect() { KRect rcNameBack = _GetNameBackRect(); KRect rcName; // 캐릭터 이름 길이에 맞춰 아이콘 출력 위치 변경, kappamind. // DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( m_sName.c_str()); DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); rcName.left = GetVsIconPos(); rcName.right = m_rcRegion.left + VS_ICON_WIDTH; rcName.top = m_rcRegion.top + NAME_OFFSET_Y + 2 - 5 -VS_ICON_ADJUST_Y + CHARWND_POS_Y; rcName.bottom = rcName.top + NAME_HEIGHT -VS_ICON_ADJUST_Y ; return rcName; } KRect SUICharacterWnd::_GetNameBackRect() { KRect rcName; DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); rcName.left = m_rcRegion.left; // + (dwNameWidth + 1) / 2; if( dwNameWidth > 180 ) rcName.right = m_rcRegion.left + dwNameWidth+1;// m_pNameBackControl->GetRect().GetWidth(); //(dwNameWidth + 1); // / 2; else rcName.right = m_rcRegion.left + 180; rcName.top = m_rcRegion.top + NAME_OFFSET_Y - 5 + CHARWND_POS_Y; rcName.bottom = rcName.top + NAME_HEIGHT + (m_bMain ? 4 : 0 ); return rcName; } KRect SUICharacterWnd::_GetBoothBackRect() { KRect rcBooth; DWORD dwNameWidth = 160; rcBooth.left = m_rcRegion.left + 30; // - (dwNameWidth + 1) / 2; rcBooth.right = m_rcRegion.left + (dwNameWidth + 1); // / 2; rcBooth.top = m_rcRegion.top + BOOTH_OFFSET_Y + CHARWND_POS_Y; rcBooth.bottom = rcBooth.top + BOOTH_HEIGHT; return rcBooth; } KRect SUICharacterWnd::_GetLocalNameBackRect() { KRect rcLCName; DWORD dwNameWidth = 500; rcLCName.left = m_rcRegion.left; rcLCName.right = m_rcRegion.left + dwNameWidth; rcLCName.top = m_rcRegion.top + CHARWND_POS_Y; rcLCName.bottom = m_rcRegion.bottom + CHARWND_POS_Y; return rcLCName; } void SUICharacterWnd::ChangeDisplayName( SIMSG_UI_CHANGE_DISPLAY_NAME* pMsg ) { if( pMsg == NULL ) return; if( pMsg->bRestory ) //복구 { if( m_bNowMutate == false ) return; m_bNowMutate = false; m_sName = m_sBackUpName; m_sBackUpName.clear(); m_sNameEffect = m_sBackUpNameEffect; m_sBackUpNameEffect.clear(); if( m_pNameControl ) { if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", m_sPK_Color.c_str(), m_sName.c_str() ).c_str() ); else m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); } if( m_pIconControl ) { if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) ShowPKIcon( true ); else ShowPKIcon( false ); } //1:1대련 if( m_pPVPIconControl ) { if( m_status & TS_ENTER::PlayerInfo::FLAG_COMPETING ) ShowPVPIcon( true ); else ShowPVPIcon( false ); } if( m_sGuildName.empty() == false ) { if( m_pGuildNameControl ) m_pGuildNameControl->SetShow( true ); if( m_pGuildIconControl ) m_pGuildIconControl->SetShow( true ); } } else { m_bNowMutate = true; if( m_pNameControl && pMsg->pChangeName ) { if( m_sBackUpName.empty() ) m_sBackUpName = m_sName; if( m_sBackUpNameEffect.empty() ) m_sBackUpNameEffect = m_sNameEffect; m_sName = pMsg->pChangeName; m_sNameEffect = c_szCreatureNameTag; // 크리쳐 색 m_pNameControl->SetCaption( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), pMsg->pChangeName ).c_str() ); } if( m_pIconControl ) ShowPKIcon( false ); //1:1대련 if( m_pPVPIconControl ) ShowPVPIcon( false ); if( m_pGuildNameControl ) m_pGuildNameControl->SetShow( false ); if( m_pGuildIconControl ) m_pGuildIconControl->SetShow( false ); } } void SUICharacterWnd::createEmblemIcon(int objType) { if (TS_ENTER::GAME_PLAYER != objType) return; KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = ""; arg.lpszClassName = "iconstatic"; arg.lpszID = "_emblem_icon"; arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; KRect rect = _GetNameBackRect(); rect.top -= EMBLEM_OFFSET_Y; rect.left -= EMBLEM_OFFSET_X; arg.rcRect = rect; m_pEmblemControl = dynamicCast(m_pManager->CreateControl(arg)); m_pEmblemControl->SetShow(false); } /// 2011.08.05 - prodongi void SUICharacterWnd::createQuestIcon(int objType) { if (TS_ENTER::GAME_MOB != objType && TS_ENTER::GAME_FIELD_PROP != objType && TS_ENTER::GAME_NPC != objType) return ; if (m_questIconControl) RemoveChild(m_questIconControl); KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = "common_mark_titanium_quest_target"; arg.lpszClassName = "iconstatic"; arg.lpszID = "quest_mob_icon"; arg.rcRect = getQuestMobIconRect(arg.lpszAniName.c_str()); arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_questIconControl = dynamicCast( m_pManager->CreateControl(arg) ); m_questIconControl->SetShow(false); } void SUICharacterWnd::createTitleStatic(int objType) { if( TS_ENTER::GAME_PLAYER != objType ) return; KUIWND_CREATE_ARG arg; arg.lpszSprName = m_sSprName.c_str(); arg.lpszAniName = ""; arg.lpszClassName = "static"; arg.lpszID = "static_title_name"; KRect rect = _GetNameBackRect(); rect.top -= (TITLE_HEIGHT+1); rect.bottom -= (TITLE_HEIGHT+1); arg.rcRect = rect;//KRect(0,60,180,80); // 위치 설정 다시 해줘야함.. arg.pParent = this; arg.dwFlag = KFLAG_GET_PASS_MESSAGE | KFLAG_NO_GET_FOCUS; m_pTitleName = dynamicCast( m_pManager->CreateControl(arg) ); m_pTitleName->SetShow(false); } void SUICharacterWnd::setTitleName(std::string &strName) { m_strTitleName = strName; m_pTitleName->SetCaption( CStringUtil::StringFormat("%s%s", c_szTitleNameTag ,strName.c_str()).c_str()); NotifyTitleNameUsingState(); } void SUICharacterWnd::setTitleName( int nID ) { if( nID == 0 ) m_strTitleName = ""; else m_strTitleName = S( m_TitleMgr.GetTitleStringID(nID) ); setTitleName(m_strTitleName); } void SUICharacterWnd::NotifyTitleNameUsingState() { bool bUsingTitle = IsTitleUsing(); if( (int)bUsingTitle == m_UpAndDownState ) // 같은 상태로 넘어올 경우에는 리턴 return; else m_UpAndDownState = (int)bUsingTitle; SetMovingControl( IsTitleUsing() ); } void SUICharacterWnd::SetMovingControl(bool isTitleUsing) { int deltaY = (isTitleUsing)? -NAME_HEIGHT : NAME_HEIGHT; m_pTitleName->SetShow(isTitleUsing); std::vector::iterator it = m_vMoveControl.begin(); std::string str; KRect rect; for( ; it != m_vMoveControl.end() ; ++it ) { str = it->str; KUIWnd* wnd = GetChild( str.c_str() ); if(wnd) { rect = wnd->GetRect(); wnd->MovePos( rect.left, rect.top + deltaY + ( (isTitleUsing)? -(it->adjustSize) : it->adjustSize ) ); } } } void SUICharacterWnd::CalcTitleHeight( KRect &rc ) { if(IsTitleUsing()) { rc.top -= TITLE_HEIGHT; rc.bottom -= TITLE_HEIGHT; } } int SUICharacterWnd::GetVsIconPos() { KRect rcNameBack = _GetNameBackRect(); DWORD dwNameWidth = KTextPhrase::GetOneLineStringSize( CStringUtil::StringFormat( "%s%s", m_sNameEffect.c_str(), m_sName.c_str() ).c_str() ); return rcNameBack.left + rcNameBack.GetWidth()/2 - dwNameWidth/2 - 30;//네임스트링 보다 -50 } void SUICharacterWnd::ShowPVPIcon(bool bShow) { if(m_pPVPIconControl->IsShow() == bShow) return; SetChildAsTop("_PVP_icon"); // pk 아이콘이 켜져있는 경우에 show/hide 상태에 따라 pk아이콘을 이동시킨다. int delta = (bShow)? -14 : 14; if(m_pIconControl->IsShow()) // pk가 show경우 { KRect rect = m_pIconControl->GetRect(); m_pPVPIconControl->MovePos( GetVsIconPos() + delta, rect.top); } m_pPVPIconControl->SetShow(bShow); if( IsThisLocalPlayer() == false ) // 내가 아니라면 게이지바 와 이름색 변경 { if(bShow) SetEnemyGuage(); else RemoveHpGuage(); } } void SUICharacterWnd::SetEnemyGuage() { if(m_pHPGauge == NULL) SetHPGaugeBack("_hp_monster_gauge"); m_pHPGauge->SetShow(true); RefreshHP(m_curHP,m_maxHP); } void SUICharacterWnd::setEnemyUnit(bool bEnemyUnit, unsigned char type) { bool bChange = m_IsEnemyUnit^bEnemyUnit; m_IsEnemyUnit = bEnemyUnit; SGame* pGame(NULL); pGame = m_pGameManager->GetActiveGame(); if(pGame == NULL) return; ////////////////////////// 게이지바 설정/////////////////////////////// if(m_IsEnemyUnit) SetEnemyGuage(); else { if(bChange) // 적군에서 아군으로 변경된 경우는 무조건 리프레시.. { SetHPGaugeBack("_hp_gauge"); RefreshHP(m_curHP,m_maxHP); } else { if( pGame && pGame->IsFriend(m_hOwner, type) ) { if( m_pHPGauge == NULL ) { SetHPGaugeBack("_hp_gauge"); RefreshHP(m_curHP,m_maxHP); } else { if(m_pHPGauge->IsShow() == false ) SetHPGaugeBack("_hp_gauge"); } } } } //////////////////////////// 이름 설정/////////////////////////// std::string str; if( type == TS_ENTER::GAME_PLAYER ) { if( g_pCurrentGameSystem->isInArena() ) // 아레나 안에서는 적 아니면 아군 의 식별 이외의 표식은 없다. { str = (bEnemyUnit)? c_szAttaMonNameTag : c_szCharNameTag; } else // 아레나 이외의 로컬에서는 { // 1. 적 - 아군 str = (bEnemyUnit)? c_szAttaMonNameTag : c_szCharNameTag; // 2. PK( pk, bloody, demoniac ) //if( bEnemyUnit == false ) { if( m_status & TS_ENTER::PlayerInfo::FLAG_PK_ON ) str = c_szCharPKOnNameTag; else if( m_status & TS_ENTER::PlayerInfo::FLAG_DEMONIAC ) str = c_szCharPKDemonicTag; else if( m_status & TS_ENTER::PlayerInfo::FLAG_BLOODY ) str = c_szCharPKBloodyTag; } } } else if( type == TS_ENTER::GAME_SUMMON ) str = (bEnemyUnit)? c_szAttaMonNameTag : c_szCreatureNameTag; str += m_sName; m_pNameControl->SetCaption(str.c_str()); } void SUICharacterWnd::setCreatureState(unsigned int type) { bool isEnemy = false; if(type & TS_ENTER::PlayerInfo::FLAG_COMPETING) isEnemy = true; setEnemyUnit( isEnemy, TS_ENTER::GAME_SUMMON ); } void SUICharacterWnd::ReFreshWnd() { if( GetObjType() != TS_ENTER::GAME_PLAYER && GetObjType() != TS_ENTER::GAME_SUMMON ) return; SGame* pGame(NULL); pGame = m_pGameManager->GetActiveGame(); if(pGame == NULL) return; SGameAvatarEx* pAvatar(NULL); pAvatar = (SGameAvatarEx*)( pGame->GetGameObject(m_hOwner) ); if( pAvatar ) { if( pGame->IsAttack(pAvatar) ) setEnemyUnit( true, GetObjType() ); else setEnemyUnit( false, GetObjType() ); } } void SUICharacterWnd::ReFreshCheck(DWORD dwTime) { if( m_dwBeforeRefrshTime == 0 ) m_dwBeforeRefrshTime = dwTime; else { if( (dwTime - m_dwBeforeRefrshTime) > 1000 ) // 1초 { m_dwBeforeRefrshTime = dwTime; ReFreshWnd(); } } } bool SUICharacterWnd::IsThisLocalPlayer() { SGameAvatarEx* localPlayer = g_pCurrentGameSystem->GetLocalPlayer(); if( localPlayer ) return localPlayer->GetArID() == m_hOwner; return false; } void SUICharacterWnd::ShowPKIcon(bool bShow) { if(m_pIconControl->IsShow() == bShow) return; int delta = (bShow)? -14 : 0; if(m_pPVPIconControl->IsShow()) // vs가 show일 경우 { KRect rect = m_pIconControl->GetRect(); m_pPVPIconControl->MovePos( GetVsIconPos() + delta, rect.top); } m_pIconControl->SetShow(bShow); } void SUICharacterWnd::RefreshHP() { RefreshHP(m_curHP,m_maxHP); }; /// 2011.08.15 - prodongi void SUICharacterWnd::procQuestIcon() { if (!m_questIconControl) return ; SGameWorld* gameWorld = dynamicCast(m_pGameManager->GetActiveGame()); if (!gameWorld) return ; bool show = false; int objType = GetObjType(); SGameAvatarEx* obj = dynamicCast(gameWorld->GetGameObject(m_hOwner)); if (!obj) return ; int enc_id_value = obj->GetContentID().value(); if (TS_ENTER::GAME_MOB == objType) { SGameMob* mob = dynamicCast(obj); if (!mob) return ; if (SQuestMgr::GetInstance().isQuestMarkMob(enc_id_value, true)) show = true; } else if (TS_ENTER::GAME_FIELD_PROP == objType) { SGameFieldQuestProp* prop = dynamicCast(obj); if (!prop) return ; FieldPropResource* res = GetFieldPropResourceDB().GetFieldPropResource(prop->GetQuestPropDBID()); if (!res) return ; if (SQuestMgr::GetInstance().isQuestMarkDropItem(res->drop_item_id_00, true)) { show = true; } else { if (SQuestMgr::GetInstance().isQuestMarkProp(prop->GetQuestPropDBID(), true)) show = true; } if (m_pNameControl) m_pNameControl->SetShow(show); } else if (TS_ENTER::GAME_NPC == objType) { SGameNpc* npc = dynamicCast(obj); if (!npc) return ; if (SQuestMgr::GetInstance().isQuestMarkNpc(enc_id_value, false)) show = true; } m_questIconControl->SetShow(show); } bool SUICharacterWnd::IsTitleUsing() { if( GetGameOption().GetTitleNameShow() == 0 ) // 호칭 사용 옵션 체크 return false; if( m_strTitleName.compare("") == false ) // 호칭 이름 체크 return false; return true; }