#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(GetChild("kick_party_button")); m_inviteButton = dynamicCast(GetChild("invite_party_button")); m_takeOverButton = dynamicCast(GetChild("takeover_party_button")); m_kickButton->MovePos(m_inviteButton->GetRect().left, m_inviteButton->GetRect().top); /// 잠수 신고 m_challengeButton = dynamicCast(GetChild("challenge_button")); m_reportDiveButton = dynamicCast(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 = ""; 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(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(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(GetChild( TargetWndAddon::GetControl(TargetWndAddon::WHISPER_BUTTON))); (checker.m_whisper) ? button->Enable() : button->Disable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::ADD_FRIEND_BUTTON))); (0 == checker.m_friend) ? button->Disable() : button->Enable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::BLOCK_BUTTON))); (0 == checker.m_block) ? button->Disable() : button->Enable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::TRADE_BUTTON))); (checker.m_trade) ? button->Enable() : button->Disable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::CHALLENGE_BUTTON))); (checker.m_challenge) ? button->Enable() : button->Disable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::INVITE_PARTY_BUTTON))); (checker.m_invite) ? button->Enable() : button->Disable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::KICK_PARTY_BUTTON))); (checker.m_kick) ? button->Enable() : button->Disable(); button = dynamicCast(GetChild( TargetWndAddon::GetControl(TargetWndAddon::TAKEOVER_PARTY_BUTTON))); (checker.m_takeOver) ? button->Enable() : button->Disable(); button = dynamicCast(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(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(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(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(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 ) { } }