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

601 lines
17 KiB
C++

#include "stdafx.h"
//#include "SUIWnd.h"
#include "SUIAddOnWnd.h"
#include "SGameManager.h"
#include "SGameMessage.h"
//#include "SGameMessageUI.h"
#include "SPlayerInfoMgr.h"
#include "SMessengerMgr.h"
#include "SStringDB.h"
#include "KUIControlButton.h"
#include "SDebug_Util.h"
#include "SGame.h"
#include "SGameAvatarEx.h"
#include "SGameSystem.h"
#include "SGameWorld.h" /// 2011.01.20 - prodongi
#include "SGameInterface.h"
#include "party\SUIPartyTypes.h"
#include "party\SUIAuthorityChecker.h"
#include "Arena\\ArenaSystem.h"
extern SGameSystem* g_pCurrentGameSystem;
SUIAddonWnd::SUIAddonWnd( SGameManager* pGameManager ) : SUIWnd( pGameManager )
{
}
SUIAddonWnd::~SUIAddonWnd()
{
}
bool SUIAddonWnd::InitControls( KPoint kPos )
{
return SUIWnd::InitControls( kPos );
}
void SUIAddonWnd::ProcMsgAtStatic( SGameMessage* pMsg )
{
SUIWnd::ProcMsgAtStatic( pMsg );
}
bool SUIAddonWnd::InitData( bool bReload )
{
return SUIWnd::InitData( bReload );
}
void SUIAddonWnd::Process(DWORD dwTime)
{
SUIWnd::Process( dwTime );
}
void SUIAddonWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
SUIWnd::OnNotifyUIWindowOpen( bOpen, bLimitWnd );
}
void SUIAddonWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
DWORD SUIAddonWnd::OnMouseMessage(DWORD dwMessage, int x, int y)
{
return SUIWnd::OnMouseMessage( dwMessage, x, y );
}
namespace AddOnWndControl
{
namespace TargetWndAddon
{
enum TARGET_ADDON_WINDOW
{
TRADE_BUTTON = 0,
ADD_FRIEND_BUTTON,
WHISPER_BUTTON,
BLOCK_BUTTON,
CHALLENGE_BUTTON,
FOLLOW_BUTTON, // sonador 1.8.5 자동 따라가기 구현
// LOOK_BUTTON,
INVITE_PARTY_BUTTON,
KICK_PARTY_BUTTON,
TAKEOVER_PARTY_BUTTON,
REPORT_DIVE, /// 잠수 신고
MAX_CONTROL,
};
const char* g_szTargetAddOn[MAX_CONTROL] =
{
"trade_button",
"add_friend_button",
"whisper_button",
"block_button",
"challenge_button", /// 대련신청/잠수신고
"follow_button", // sonador 1.8.5 자동 따라가기 구현
// "look_button",
"invite_party_button",
"kick_party_button",
"takeover_party_button",
"dive_button_01",
};
const char* GetControl( TARGET_ADDON_WINDOW type )
{
if( type >= TRADE_BUTTON && type < MAX_CONTROL )
return g_szTargetAddOn[type];
return "";
}
}
};
using namespace AddOnWndControl;
///////////////////////////////////////////////////////////////////////////////////
//
SUITargetWndAddon::SUITargetWndAddon( SGameManager* pGameManager ) : SUIAddonWnd( pGameManager )
, m_dwCheckingTime( 0 )
{
}
SUITargetWndAddon::~SUITargetWndAddon()
{
}
bool SUITargetWndAddon::InitControls( KPoint kPos )
{
// sonador 1.8.5 자동 따라가기 구현
KUIControlButton* pButton = 0;
//pButton = (KUIControlButton*)GetChild( "follow_button" );
//if( pButton ) pButton->Disable();
/// 2011.01.27 - prodongi
setButtonDisableColor();
/// 2011.11.18 - prodongi
m_pGameManager->GetGameInterface()->addPopupList(TOGGLE_WINDOW::UIWINDOW_TARGET_WND_ADDON);
/// 2011.12.16 추방 버튼을 초대 버튼 위치로 이동한다 - prodongi
m_kickButton = dynamicCast<KUIControlButton*>(GetChild("kick_party_button"));
m_inviteButton = dynamicCast<KUIControlButton*>(GetChild("invite_party_button"));
m_takeOverButton = dynamicCast<KUIControlButton*>(GetChild("takeover_party_button"));
m_kickButton->MovePos(m_inviteButton->GetRect().left, m_inviteButton->GetRect().top);
/// 잠수 신고
m_challengeButton = dynamicCast<KUIControlButton*>(GetChild("challenge_button"));
m_reportDiveButton = dynamicCast<KUIControlButton*>(GetChild("dive_button_01"));
m_reportDiveButton->MovePos(m_challengeButton->GetRect().left, m_challengeButton->GetRect().top);
return SUIAddonWnd::InitControls( kPos );
}
void SUITargetWndAddon::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch( nMessage )
{
case KUI_MESSAGE::KBUTTON_CLICK:
{
for( int x = 0; x < TargetWndAddon::MAX_CONTROL; ++x )
{
if( strcmp( lpszControlID, TargetWndAddon::GetControl( (TargetWndAddon::TARGET_ADDON_WINDOW)x ) ) == 0 )
{
Action( x );
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( (SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE)m_nWindowID, false ) );
break;
}
}
}
break;
}
}
/// 2011.11.18 - prodongi
void SUITargetWndAddon::ProcMsgAtStatic(SGameMessage* pMsg)
{
switch( pMsg->nType )
{
case IMSG_UI_SEND_DATA:
{
SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg;
if ( pData->m_strString == "popup_update")
{
updatePopup(pData->m_nNumber.getAmount(), pData->m_nNumber2.getAmount());
}
break;
}
}
}
void SUITargetWndAddon::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
if( bOpen )
{
CheckAddOnWindow();
}
else
{
m_hOldTarget = 0;
}
}
void SUITargetWndAddon::CheckAddOnWindow()
{
KUIControlButton* pButton = NULL;
//플레이어가 아니라면 close
if( m_PlayerInfoMgr.GetGameObjType() != TS_ENTER::GAME_PLAYER )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( (SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE)m_nWindowID, false ) );
return;
}
//로컬 플레이어냐
if( !m_PlayerInfoMgr.IsLocalPlayer( m_PlayerInfoMgr.GetTarget() ) )
{
if( m_PlayerInfoMgr.IsTargetPlayer( m_PlayerInfoMgr.GetTarget() ) )
{
SetButtonState( true );
{
char const* tag = "<font:font_01><size:8><hcenter><left>";
std::string strCaption = CStringUtil::StringFormat("%s%s", tag, S( 6577 )); //친구 추가 스트링 아이디
if( m_FriendMgr.IsExistMember( m_PlayerInfoMgr.GetTargetName() ) )
strCaption = CStringUtil::StringFormat("%s%s", tag, S( 6602 )); //친구 삭제 스트링 아이디
pButton = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl( TargetWndAddon::ADD_FRIEND_BUTTON ) ));
if( pButton ) pButton->SetCaption( strCaption.c_str() );
strCaption = CStringUtil::StringFormat("%s%s", tag, S( 6579 )); //차단 설정 스트링 아이디
if( m_CutMgr.IsExistMember( m_PlayerInfoMgr.GetTargetName() ) )
strCaption = CStringUtil::StringFormat("%s%s", tag, S( 6603 )); //차단 해제 스트링 아이디
pButton = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl( TargetWndAddon::BLOCK_BUTTON ) ));
if( pButton ) pButton->SetCaption( strCaption.c_str() );
}
sAuthorityList checker;
checkAuthority(checker, &m_PartyMgr, &m_RaidMgr, &m_FriendMgr, &m_CutMgr, &m_PlayerInfoMgr, true);
KUIControlButton* button;
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::WHISPER_BUTTON)));
(checker.m_whisper) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::ADD_FRIEND_BUTTON)));
(0 == checker.m_friend) ? button->Disable() : button->Enable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::BLOCK_BUTTON)));
(0 == checker.m_block) ? button->Disable() : button->Enable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::TRADE_BUTTON)));
(checker.m_trade) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::CHALLENGE_BUTTON)));
(checker.m_challenge) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::INVITE_PARTY_BUTTON)));
(checker.m_invite) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::KICK_PARTY_BUTTON)));
(checker.m_kick) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::TAKEOVER_PARTY_BUTTON)));
(checker.m_takeOver) ? button->Enable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::FOLLOW_BUTTON)));
// AziaMafia No Follow
//(checker.m_follow) ? button->Enable() : button->Disable();
(checker.m_follow) ? button->Disable() : button->Disable();
button = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl(TargetWndAddon::REPORT_DIVE)));
(checker.m_reportDive) ? button->Enable() : button->Disable();
}
}
else
SetButtonState( false );
m_hOldTarget = m_PlayerInfoMgr.GetTarget();
}
void SUITargetWndAddon::Process(DWORD dwTime)
{
static AR_HANDLE hOld = 0;
if( m_hOldTarget != m_PlayerInfoMgr.GetTarget() )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( (SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE)m_nWindowID, false ) );
m_hOldTarget = m_PlayerInfoMgr.GetTarget();
}
else
{
if( m_dwCheckingTime == 0 )
{
m_dwCheckingTime = dwTime;
}
if( (dwTime - m_dwCheckingTime) > 2000 )
{
CheckAddOnWindow();
m_dwCheckingTime = 0;
}
}
SUIAddonWnd::Process( dwTime );
}
void SUITargetWndAddon::SetButtonState( bool bEnable, bool isPartyMember )
{
KUIControlButton* pButton = NULL;
for( int x = 0; x < TargetWndAddon::MAX_CONTROL; ++x )
{
pButton = dynamicCast<KUIControlButton*>(GetChild( TargetWndAddon::GetControl( (TargetWndAddon::TARGET_ADDON_WINDOW)x ) ));
if( pButton )
{
bEnable ? pButton->Enable() : pButton->Disable();
}
}
showPartyButtons(isPartyMember);
showReportDive();
}
void SUITargetWndAddon::Action( int type )
{
switch( type )
{
//밑에 기능들을 한군데로 모아야 한다
case TargetWndAddon::TRADE_BUTTON:
{
if( !g_pCurrentGameSystem->GetPVPAcceptCheck() )
{
/// 2011.01.20 - prodongi
if (getIsTaming())
return ;
SMSG_TRADE* pMsg = new SMSG_TRADE;
pMsg->target_player = m_PlayerInfoMgr.GetTarget();
pMsg->mode = TS_TRADE::REQUEST_TRADE;
pMsg->rq_mode = true;
m_pGameManager->PostMsgAtDynamic( pMsg );
}
}
break;
case TargetWndAddon::ADD_FRIEND_BUTTON:
{
if( m_PlayerInfoMgr.GetTarget() )
{
SMSG_FRIEND_COMMAND* pMsg = NULL;
if( m_FriendMgr.IsExistMember( m_PlayerInfoMgr.GetTargetName() ) )
pMsg = new SMSG_FRIEND_COMMAND(SMSG_FRIEND_COMMAND::FRIEND_DELETE, "" );
else
pMsg = new SMSG_FRIEND_COMMAND(SMSG_FRIEND_COMMAND::FRIEND_ADD, "" );
pMsg->target = m_PlayerInfoMgr.GetTarget();
m_pGameManager->PostMsgAtDynamic( pMsg );
}
}
break;
case TargetWndAddon::WHISPER_BUTTON:
{
if( m_PlayerInfoMgr.GetTarget() )
{
// 2009.02.24 대련 수정
// SMSG_WHISPER_ADDONWND* pMsg = new SMSG_WHISPER_ADDONWND;
SMSG_COMMAND_BY_ADDONWND* pMsg = new SMSG_COMMAND_BY_ADDONWND( SMSG_COMMAND_BY_ADDONWND::COMMAND_WHISPER );
pMsg->target = m_PlayerInfoMgr.GetTarget();
m_pGameManager->PostMsgAtDynamic( pMsg );
}
}
break;
case TargetWndAddon::BLOCK_BUTTON:
{
if( m_PlayerInfoMgr.GetTarget() )
{
SMSG_FRIEND_COMMAND* pMsg = NULL;
if( m_CutMgr.IsExistMember( m_PlayerInfoMgr.GetTargetName() ) )
pMsg = new SMSG_FRIEND_COMMAND(SMSG_FRIEND_COMMAND::CUT_DELETE, "" );
else
pMsg = new SMSG_FRIEND_COMMAND(SMSG_FRIEND_COMMAND::CUT_ADD, "" );
pMsg->target = m_PlayerInfoMgr.GetTarget();
m_pGameManager->PostMsgAtDynamic( pMsg );
}
}
break;
case TargetWndAddon::CHALLENGE_BUTTON:
{
if( g_pCurrentGameSystem->GetDeathPVP() )
{
g_pCurrentGameSystem->OnChatRequestFailed();
return;
}
//타겟의 헨들을 구한다.
AR_HANDLE target = m_PlayerInfoMgr.GetTarget();
if (target)
{
// 개인 상점 모드 인지 검사한다.
SGame* pGame = m_pGameManager->GetActiveGame();
if( pGame )
{
// 타겟 아바타 정보 얻기
SGameAvatarEx* pTarget = (SGameAvatarEx*)(pGame->GetGameObject(target));
unsigned int targetStatus = pTarget->GetStatus();
// 타겟아바타가 상점개설 중이면 대전 신청 불가
if( targetStatus & TS_ENTER::PlayerInfo::FLAG_SELL_BOOTH || targetStatus & TS_ENTER::PlayerInfo::FLAG_BUY_BOOTH )
{
g_pCurrentGameSystem->OnChatRequestFailed();
return;
}
// 플레이어 정보 얻기
AR_HANDLE player = m_PlayerInfoMgr.GetPlayerHandle();
SGameAvatarEx* pPlayer = (SGameAvatarEx*)(pGame->GetGameObject(player));
unsigned int PlayerStatus = pPlayer->GetStatus();
// 플레이어가 상점개설 중이면 대전 신청 불가
if( PlayerStatus & TS_ENTER::PlayerInfo::FLAG_SELL_BOOTH || PlayerStatus & TS_ENTER::PlayerInfo::FLAG_BUY_BOOTH )
{
g_pCurrentGameSystem->OnChatRequestFailed();
return;
}
}
//SMSG_COMMAND_BY_ADDONWND* pMsg = new SMSG_COMMAND_BY_ADDONWND( SMSG_COMMAND_BY_ADDONWND::COMMAND_CHALLENGE );
//pMsg->target = m_PlayerInfoMgr.GetTarget();
//m_pGameManager->PostMsgAtDynamic( pMsg );
g_pCurrentGameSystem->SetPVPAcceptCheck( true );
SMSG_CS_COMPETE_REQUEST* pMsg = new SMSG_CS_COMPETE_REQUEST;
pMsg->compete_type = COMPETE_TYPE_VS_PLAYER;
strcpy(pMsg->requestee, m_PlayerInfoMgr.GetTargetName());
m_pGameManager->PostMsgAtDynamic( pMsg );
}
}
break;
// sonador 1.8.5 자동 따라가기 구현
case TargetWndAddon::FOLLOW_BUTTON:
{
if( m_PlayerInfoMgr.GetTarget() )
{
m_pGameManager->PostMsgAtDynamic( new SMSG_AUTO_FOLLOW() );
}
}
break;
case TargetWndAddon::REPORT_DIVE:
{
reportDive();
}
break;
case TargetWndAddon::INVITE_PARTY_BUTTON:
{
if( !g_pCurrentGameSystem->GetPVPAcceptCheck() )
{
//타겟이 있으므로 파티 초대 메세지 보낸다.
if( m_PlayerInfoMgr.GetTarget() )
{
SMSG_PARTY_COMMAND* pMsg = new SMSG_PARTY_COMMAND;
pMsg->mode = SMSG_PARTY_COMMAND::PARTY_INVITE;
m_pGameManager->PostMsgAtDynamic( pMsg );
}
else
{ //이름 입력 창 뜬다.
m_pGameManager->PostMsgAtDynamic( new SMSG_SEND_DATA( 0, "req_invite" ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTTEXT( SIMSG_UI_REQ_INPUTTEXT::USAGE_PARTY, SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY_MENU, S(6786), 6583, 1901 ) ); // [sonador][7.0.6] Mantis 0002624
}
}
}
break;
case TargetWndAddon::KICK_PARTY_BUTTON:
{
//타겟이 있으므로 파티 초대 메세지 보낸다.
if( m_PlayerInfoMgr.GetTarget() )
{
SMSG_PARTY_COMMAND* pMsg = new SMSG_PARTY_COMMAND;
pMsg->mode = SMSG_PARTY_COMMAND::PARTY_KICK;
m_pGameManager->PostMsgAtDynamic( pMsg );
}
else
{ //이름 입력 창 뜬다.
m_pGameManager->PostMsgAtDynamic( new SMSG_SEND_DATA( 0, "req_invite" ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTTEXT( SIMSG_UI_REQ_INPUTTEXT::USAGE_PARTY, SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY_MENU, S(6786), 6583, 1901 )); // [sonador][7.0.6] Mantis 0002624
}
}
break;
case TargetWndAddon::TAKEOVER_PARTY_BUTTON:
{
//타겟이 있으므로 파티 초대 메세지 보낸다.
if( m_PlayerInfoMgr.GetTarget() )
{
SMSG_PARTY_COMMAND* pMsg = new SMSG_PARTY_COMMAND;
pMsg->mode = SMSG_PARTY_COMMAND::PARTY_TRANSFER;
m_pGameManager->PostMsgAtDynamic( pMsg );
}
else
{ //이름 입력 창 뜬다.
m_pGameManager->PostMsgAtDynamic( new SMSG_SEND_DATA( 0, "req_invite" ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTTEXT( SIMSG_UI_REQ_INPUTTEXT::USAGE_PARTY, SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY_MENU, S(6786), 6583, 1901 ) ); // [sonador][7.0.6] Mantis 0002624
}
}
break;
}
}
/// 2011.01.20 - prodongi
bool SUITargetWndAddon::getIsTaming() const
{
SGameWorld* gameWorld = dynamicCast<SGameWorld*>(m_pGameManager->GetActiveGame());
if (gameWorld)
{
return gameWorld->getIsTaming();
}
return false;
}
/// 2011.01.27 - prodongi
void SUITargetWndAddon::setButtonDisableColor()
{
for (int i = 0; i < TargetWndAddon::MAX_CONTROL; ++i)
{
char const* controlName = TargetWndAddon::GetControl((TargetWndAddon::TARGET_ADDON_WINDOW)i);
KUIControl* control = dynamicCast<KUIControl*>(GetChild(controlName));
if (control)
{
control->SetDisableColor("<#4f4e4e>");
control->SetEnableColor("<#ffffff>");
}
}
}
/// 2011.11.18 - prodongi
void SUITargetWndAddon::updatePopup(int x, int y)
{
if (!IsShow())
return ;
if (!IsInRect(x, y))
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TARGET_WND_ADDON, false) );
}
}
void SUITargetWndAddon::showPartyButtons(bool isPartyMember)
{
if (isPartyMember)
{
m_inviteButton->SetShow(false);
m_kickButton->SetShow(true);
}
else
{
m_inviteButton->SetShow(true);
m_kickButton->SetShow(false);
}
}
void SUITargetWndAddon::reportDive()
{
/// 서버에 잠수 신고
TS_CS_BATTLE_ARENA_ABSENCE_CHECK_REQUEST msg;
msg.hCheckTarget = m_PlayerInfoMgr.GetTarget();
m_pGameManager->PendMessage(&msg);
sArenaSystem* arenaSystem = g_pCurrentGameSystem->getArenaSystem();
arenaSystem->setReportDrivePlayerName(m_PlayerInfoMgr.GetTargetName());
}
void SUITargetWndAddon::showReportDive()
{
if (g_pCurrentGameSystem->isInArena())
{
m_reportDiveButton->SetShow(true);
m_challengeButton->SetShow(false);
}
else
{
m_reportDiveButton->SetShow(false);
m_challengeButton->SetShow(true);
}
}
///////////////////////////////////////////////////////////////////////////////////
//
SUIInventoryWndAddon::SUIInventoryWndAddon( SGameManager* pGameManager ) : SUIAddonWnd( pGameManager )
{
}
SUIInventoryWndAddon::~SUIInventoryWndAddon()
{
}
void SUIInventoryWndAddon::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
if( bOpen )
{
}
}