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

476 lines
18 KiB
C++

#include "stdafx.h"
#include "SUIPopupPartyMenuCharacterWnd.h"
#include "SUIPartyTypes.h"
#include "SGameManager.h"
#include "SGameInterface.h"
#include "SPlayerInfoMgr.h"
#include "KUIControlButton.h"
#include "SGameAvatarEx.h"
#include "SGameSystem.h"
#include "SMessengerMgr.h"
#include "SStringDB.h"
#include "SGameOption.h"
#include "SUIAuthorityChecker.h"
extern SGameSystem * g_pCurrentGameSystem;
namespace
{
const char* STR_BTN_WHISPER = "whisper_button"; // 귓말하기
const char* STR_BTN_ADD_FRIEND = "add_friend_button"; // 친구추가
const char* STR_BTN_BLOCK = "block_button"; // 차단설정
const char* STR_BTN_TRADE = "trade_button"; // 거래요청
const char* STR_BTN_REPORT_DIVE = "dive_button_01"; // 2012.05.22 잠수신고 - prodongi
const char* STR_BTN_CHALLENGE = "challenge_button"; // 대련신청
const char* STR_BTN_KICK_PARTY = "kick_party_button"; // 파티추방
const char* STR_BTN_TAKEOVER_PARTY = "takeover_party_button"; // 파티장인계
const char* STR_BTN_BUFF_ON = "buff_on_button"; // 버프 보이기
const char* STR_BTN_CREATURE_ON = "creature_on_button"; // 크리처 보이기
const char* STR_BTN_SHOW_UI_SMALL = "ui_small_view_button"; // UI 작게 보기
const char* STR_BTN_BUFF_OFF = "buff_off_button"; // 버프 안보이기
const char* STR_BTN_CREATURE_OFF = "creature_off_button"; // 크리처 안보이기
const char* STR_BTN_SHOW_UI_BIG = "ui_default_view_button"; // UI 크게 보기
const char* STR_BTN_FOLLOW = "follow_button"; // 따라가기
const int WIDTH_SMALL = 97;
const int WIDTH_BIG = 138;
};
/// 우클릭 메뉴1 : 2011.09.16 - servantes
bool SUIPopupPartyMenuCharacterWnd::InitControls( KPoint kPos )
{
m_pBtnWhisper = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_WHISPER));
m_pBtnAddFriend = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_ADD_FRIEND));
m_pBtnBlock = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_BLOCK));
m_pBtnRequestDeal = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_TRADE));
m_pBtnRequestFight = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_CHALLENGE));
m_pBtnKickOut = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_KICK_PARTY));
m_pBtnChangeLeader = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_TAKEOVER_PARTY));
m_pBtnShowBuf = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_BUFF_ON));
m_pBtnShowCreature = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_CREATURE_ON));
m_pBtnShowSmallUI = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_SHOW_UI_SMALL));
m_pBtnHideBuf = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_BUFF_OFF));
m_pBtnHideCreature = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_CREATURE_OFF));
m_pBtnShowBigUI = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_SHOW_UI_BIG));
m_pBtnFollow = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_FOLLOW));
m_pBtnReportDive = dynamicCast<KUIControlButton*>(GetChild(STR_BTN_REPORT_DIVE));
m_pBtnWhisper->SetEnableColor("<#ffffff>");
m_pBtnAddFriend->SetEnableColor("<#ffffff>");
m_pBtnBlock->SetEnableColor("<#ffffff>");
m_pBtnRequestDeal->SetEnableColor("<#ffffff>");
m_pBtnRequestFight->SetEnableColor("<#ffffff>");
m_pBtnKickOut->SetEnableColor("<#ffffff>");
m_pBtnChangeLeader->SetEnableColor("<#ffffff>");
m_pBtnShowBuf->SetEnableColor("<#ffffff>");
m_pBtnShowCreature->SetEnableColor("<#ffffff>");
m_pBtnShowSmallUI->SetEnableColor("<#ffffff>");
m_pBtnHideBuf->SetEnableColor("<#ffffff>");
m_pBtnHideCreature->SetEnableColor("<#ffffff>");
m_pBtnShowBigUI->SetEnableColor("<#ffffff>");
m_pBtnFollow->SetEnableColor("<#ffffff>");
m_pBtnReportDive->SetEnableColor("<#ffffff>");
KRect rt;
/// creature
rt = m_pBtnShowCreature->GetRect();
m_pBtnHideCreature->MovePos(rt.left, rt.top);
/// buff
rt = m_pBtnShowBuf->GetRect();
m_pBtnHideBuf->MovePos(rt.left, rt.top);
/// ui
rt = m_pBtnShowSmallUI->GetRect();
m_pBtnShowBigUI->MovePos(rt.left, rt.top);
///
rt = m_pBtnRequestFight->GetRect();
m_pBtnReportDive->MovePos(rt.left, rt.top);
/// 2011.11.17 우선 기능 비활성화 한다 - prodongi
//m_pBtnShowCreature->Disable();
//m_pBtnHideCreature->Disable();
return SUIWnd::InitControls( kPos );
}
bool SUIPopupPartyMenuCharacterWnd::InitData( bool bReload )
{
// 2011.11.09 - prodongi
m_pGameManager->GetGameInterface()->addPopupList(TOGGLE_WINDOW::UIWINDOW_POPUP_PARTY_MENU_CHARACTER);
return SUIWnd::InitData(bReload);
}
/// 2011.11.17 안쓰임 - prodongi
/*
void SUIPopupPartyMenuCharacterWnd::ArrangeMenuByUISizeState(int nState)
{
int startx = 6, starty = 84, W = 114, H = 19;
if (nState == PARTY_UI_SIZE_SMALL) // 작게 보이는 상태일 경우
{
KRect rt = m_pBtnShowSmallUI->GetRect();
m_pBtnShowBig->SetShow(true);
m_pBtnShowSmallUI->SetShow(false);
m_pBtnShowBig->MovePos(rt.left, rt.top);
}
else if(nState == PARTY_UI_SIZE_BIG) // 크게 보이는 상태일 경우
{
KRect rt = m_pBtnShowSmallUI->GetRect();
m_pBtnShowBig->SetShow(false);
m_pBtnShowSmallUI->SetShow(true);
m_pBtnShowSmallUI->MovePos(rt.left, rt.top);
}
}
*/
void SUIPopupPartyMenuCharacterWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch(nMessage)
{
case KUI_MESSAGE::KBUTTON_CLICK:
{
BOOL bPushButton = FALSE;
if ( ::_stricmp( lpszControlID, STR_BTN_WHISPER ) == 0 ) // 귓말하기
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "whisper_chatting", m_strSelectPartyWnd.c_str() ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_ADD_FRIEND ) == 0 ) // 친구추가
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "add_friend", m_strSelectPartyWnd.c_str(), unsigned int(m_nSelectIndex) ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_BLOCK ) == 0 ) // 차단설정
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "block_friend", m_strSelectPartyWnd.c_str(), unsigned int(m_nSelectIndex) ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_TRADE ) == 0 ) // 거래요청
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "select_member_request_trade", m_strSelectPartyWnd.c_str() ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_CHALLENGE ) == 0 ) // 대련신청
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "request_compete", m_strSelectPartyWnd.c_str() ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_REPORT_DIVE ) == 0 ) // 잠수 신고
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "report_dive", m_strSelectPartyWnd.c_str() ) );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_KICK_PARTY ) == 0 ) // 파티추방
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "kick_out_party", m_strSelectPartyWnd.c_str(), unsigned int(m_nSelectIndex) ) );
// m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "kick_out_party", m_strSelectPartyWnd.c_str() );
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_TAKEOVER_PARTY ) == 0 ) // 파티장인계
{
/// 2011.11.16 파티장 인계는 일반 파티만 된다 - prodongi
if(m_nSelectPartyType == PARTY_NORMAL/* || m_nSelectPartyType == PARTY_BEARROAD*/)
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "take_over_party", m_strSelectPartyWnd.c_str() ) );
bPushButton = TRUE;
}
}
else if( ::_stricmp( lpszControlID, STR_BTN_BUFF_ON ) == 0 ) // 버프 보이기
{
number_t type(TS_ENTER::GAME_PLAYER);
number_t index(m_nSelectIndex);
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "one_state_on", m_strSelectPartyWnd.c_str(), type, index));
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID,STR_BTN_BUFF_OFF ) == 0 ) // 버프 안보이기
{
number_t type(TS_ENTER::GAME_PLAYER);
number_t index(m_nSelectIndex);
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "one_state_off", m_strSelectPartyWnd.c_str(), type, index));
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID, STR_BTN_CREATURE_ON ) == 0 ) // 크리처 보이기
{
number_t index(m_nSelectIndex);
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_one_creature", m_strSelectPartyWnd.c_str(), index, number_t(0)));
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID,STR_BTN_CREATURE_OFF ) == 0 ) // 크리처 안보이기
{
number_t index(m_nSelectIndex);
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "hide_one_creature", m_strSelectPartyWnd.c_str(), index, number_t(0)));
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID,STR_BTN_SHOW_UI_SMALL ) == 0 ) // UI 작게 보기
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_small_ui", m_strSelectPartyWnd.c_str() ) );
/// 2011.11.17 안 쓰임 - prodongi
//ArrangeMenuByUISizeState(PARTY_UI_SIZE_SMALL);
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID,STR_BTN_SHOW_UI_BIG ) == 0 ) // UI 크게 보기
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_big_ui", m_strSelectPartyWnd.c_str() ) );
/// 2011.11.17 안 쓰임 - prodongi
//ArrangeMenuByUISizeState(PARTY_UI_SIZE_BIG);
bPushButton = TRUE;
}
else if( ::_stricmp( lpszControlID,STR_BTN_FOLLOW ) == 0 ) // 따라가기
{
if( m_PlayerInfoMgr.GetTarget() )
{
m_pGameManager->PostMsgAtDynamic( new SMSG_AUTO_FOLLOW() );
}
bPushButton = TRUE;
}
if(bPushButton)
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CHARACTER, false ) );
}
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
void SUIPopupPartyMenuCharacterWnd::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch( pMsg->nType )
{
case IMSG_UI_MOVE:
{
SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg;
MovePos( pMoveMsg->m_nX, pMoveMsg->m_nY );
pMsg->bUse = true;
}
break;
case IMSG_UI_SEND_DATA:
{
SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg;
if ( pData->m_strString == "select_party" ) // to small
{
m_strSelectPartyWnd = pData->m_strText; // select party wnd name
m_nSelectPartyType = (int)pData->m_nNumber.getAmount(); // select party type
m_nSelectIndex = (int)pData->m_nNumber2.getAmount(); // select index
/*
if(m_nSelectPartyType == PARTY_NORMAL || m_nSelectPartyType == PARTY_BEARROAD)
m_pBtnChangeLeader->Disable();
else
m_pBtnChangeLeader->Enable();
*/
/// 2011.11.16 파티장 인계는 일반 파티만 된다 - prodongi
// if(m_nSelectPartyType == PARTY_NORMAL)
// m_pBtnChangeLeader->Enable();
// else
// m_pBtnChangeLeader->Disable();
}
else if( pData->m_strString == "position" ) // ui position
{
int w=WIDTH_SMALL;
if((int)pData->m_nNumber3.getAmount() == PARTY_UI_ID_BIG)
w = WIDTH_BIG;
int x = pData->m_nNumber.getAmount();
int y = pData->m_nNumber2.getAmount();
if( GetGameOption().GetResolution_Width() < x + GetRect().GetWidth() )
x -= (w + GetRect().GetWidth());
if( GetGameOption().GetResolution_Height() < y + GetRect().GetHeight() )
y -= ( (y + GetRect().GetHeight()) - GetGameOption().GetResolution_Height() );
MovePos( x, y );
}
/*
else if( pData->m_strString == "off_show_creature_button" ) // 크리처 보이기 버튼 비활성
{
KRect rt = m_pBtnHideCreature->GetRect();
m_pBtnHideCreature->SetShow(false);
m_pBtnShowCreature->MovePos(rt.left, rt.top);
m_pBtnShowCreature->SetShow(true);
}
*/
else if( pData->m_strString == "leader" ) // 2011.11.09 - servantes : 리더이면
{
setActivityButton(true, pData->m_strText, (bool)pData->m_dwData, m_nSelectPartyType, pData->m_nNumber3.getAmount() > 0 );
}
else if( pData->m_strString == "not_leader" ) // 2011.11.09 - servantes : 리더가 아니면
{
setActivityButton(false, pData->m_strText, (bool)pData->m_dwData, m_nSelectPartyType, pData->m_nNumber3.getAmount() > 0 );
}
/// 2011.11.09 - prodongi
else if ( pData->m_strString == "popup_update")
{
updatePopup(pData->m_nNumber.getAmount(), pData->m_nNumber2.getAmount());
}
/// 2011.11.17 - prodongi
else if (pData->m_strString == "set_status")
{
setActivityButton(m_pBtnShowBuf, m_pBtnHideBuf, pData->m_nNumber.getAmount() == 0 ? false : true);
setActivityButton(m_pBtnShowCreature, m_pBtnHideCreature, pData->m_nNumber2.getAmount() == 0 ? false : true);
setActivityButton(m_pBtnShowBigUI, m_pBtnShowSmallUI, pData->m_nNumber3.getAmount() == 0 ? PARTY_UI_ID_SMALL : PARTY_UI_ID_BIG);
setActivityButton(m_pBtnReportDive, m_pBtnRequestFight, g_pCurrentGameSystem->isInArena() ? true : false);
}
}
break;
}
}
void SUIPopupPartyMenuCharacterWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
int k=0;
k=0;
SUIWnd::OnNotifyUIWindowOpen(bOpen);
}
void SUIPopupPartyMenuCharacterWnd::updatePopup(int x, int y)
{
if (!IsShow())
return ;
if (!IsInRect(x, y))
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CHARACTER, false) );
}
}
void SUIPopupPartyMenuCharacterWnd::setActivityButton(bool isLeader, std::string const& playerName, bool isLogin, int nPartyType, bool isMeLeader)
{
sAuthorityList checker;
checkAuthority(checker, &m_PartyMgr, &m_RaidMgr, &m_FriendMgr, &m_CutMgr, &m_PlayerInfoMgr, playerName.c_str(), isLogin);
(checker.m_whisper) ? m_pBtnWhisper->Enable() : m_pBtnWhisper->Disable();
(0 == checker.m_friend) ? m_pBtnAddFriend->Disable() : m_pBtnAddFriend->Enable();
(0 == checker.m_block) ? m_pBtnBlock->Disable() : m_pBtnBlock->Enable();
(checker.m_trade) ? m_pBtnRequestDeal->Enable() : m_pBtnRequestDeal->Disable();
(checker.m_challenge) ? m_pBtnRequestFight->Enable() : m_pBtnRequestFight->Disable();
(checker.m_kick) ? m_pBtnKickOut->Enable() : m_pBtnKickOut->Disable();
(checker.m_takeOver) ? m_pBtnChangeLeader->Enable() : m_pBtnChangeLeader->Disable();
// AziaMafia No Follow
//(checker.m_follow) ? m_pBtnFollow->Enable() : m_pBtnFollow->Disable();
(checker.m_follow) ? m_pBtnFollow->Disable() : m_pBtnFollow->Disable();
(checker.m_reportDive) ? m_pBtnReportDive->Enable() : m_pBtnReportDive->Disable();
/*
bool isSelectedLocal = false;
SGameAvatarEx* localPlayer = g_pCurrentGameSystem->GetLocalPlayer();
if (playerName == localPlayer->GetName())
isSelectedLocal = true;
*/
if(isLogin == false) // 로그인하지 않은 상태면
{
/*
m_pBtnWhisper ->Disable();
m_pBtnAddFriend ->Disable();
m_pBtnBlock ->Disable();
m_pBtnRequestDeal ->Disable();
m_pBtnRequestFight->Disable();
m_pBtnFollow ->Disable();
m_pBtnKickOut ->Enable();
m_pBtnChangeLeader->Disable();
*/
m_pBtnShowBuf->Disable();
m_pBtnHideBuf->Disable();
}
else // 로그인한 상태일 때
{
m_pBtnShowBuf->Enable();
m_pBtnHideBuf->Enable();
/*
if (isSelectedLocal)
{
m_pBtnWhisper->Disable();
m_pBtnAddFriend->Disable();
m_pBtnBlock->Disable();
m_pBtnRequestDeal->Disable();
m_pBtnRequestFight->Disable();
m_pBtnFollow->Disable();
m_pBtnKickOut->Disable();
m_pBtnChangeLeader->Disable();
}
else if(isMeLeader == true) // 내가 리더일 때
{
m_pBtnWhisper ->Enable();
m_pBtnAddFriend ->Enable();
m_pBtnBlock ->Enable();
m_pBtnRequestDeal ->Enable();
m_pBtnRequestFight->Enable();
m_pBtnFollow ->Enable();
if(isLeader == true) // 선택한 캐릭터가 리더일 경우 - 나 다
{
m_pBtnKickOut ->Disable();
m_pBtnChangeLeader->Disable();
}
else // 선택한 캐릭터가 리더가 아닐 경우
{
if(nPartyType == PARTY_NORMAL)
m_pBtnChangeLeader->Enable();
else
m_pBtnChangeLeader->Disable();
m_pBtnKickOut->Enable();
}
}
else // 내가 리더가 아닐 때
{
m_pBtnWhisper ->Enable();
m_pBtnAddFriend ->Enable();
m_pBtnBlock ->Enable();
m_pBtnRequestDeal ->Enable();
m_pBtnRequestFight->Enable();
m_pBtnFollow ->Enable();
m_pBtnKickOut ->Disable();
m_pBtnChangeLeader->Disable();
}
*/
}
/// 파티장 인계는 select_party에서 설정함, 같은 곳에서 하면 좋을 텐데,, - prodongi
std::string str;
// 차단 스트링
if (m_CutMgr.IsExistMember(playerName.c_str()))
{
str = CStringUtil::StringFormat("<font:font_01><size:8><hcenter><left>%s", S( 6603 )); //차단 해제 스트링 아이디
}
else
{
str = CStringUtil::StringFormat("<font:font_01><size:8><hcenter><left>%s", S( 6579 )); //차단 설정 스트링 아이디
}
m_pBtnBlock->SetCaption(str.c_str());
// 친구 스트링
if( m_FriendMgr.IsExistMember( playerName.c_str()))
{
str = CStringUtil::StringFormat("<font:font_01><size:8><hcenter><left>%s", S( 6602 )); //친구 삭제 스트링 아이디
}
else
{
str = CStringUtil::StringFormat("<font:font_01><size:8><hcenter><left>%s", S( 6577 )); //친구 추가 스트링 아이디
}
m_pBtnAddFriend->SetCaption(str.c_str());
}
void SUIPopupPartyMenuCharacterWnd::setActivityButton(KUIControlButton* buttonShow, KUIControlButton* buttonHide, bool show)
{
buttonShow->SetShow(false);
buttonHide->SetShow(false);
if (show)
{
buttonShow->SetShow(true);
}
else
{
buttonHide->SetShow(true);
}
}