#include "stdafx.h" #include "SGame.h" #include "SMessengerMgr.h" //#include "SGameMessageUI.h" #include "SStringDB.h" #include "SGameManager.h" #include "SGameSystem.h" #include "SGameAvatarFx.h" #include "Party/SUIPartyTypes.h" #include #include #include "KResourceManager.h" #include "KUITextureManager.h" #include "KResource.h" #include #include #include #include //웹서버 주소를 알기위해 추가한 것 -N4- #include #include "SDebug_Util.h" #include "SLog.h" #include "CInput.h" #include "Arena\\ArenaJoinSituationChecker.h" #include "Arena\\ArenaSystem.h" extern SGameSystem* g_pCurrentGameSystem; extern const char * g_pGuildDir; extern std::string g_strGuildFullDir; extern void MsgSplit( const char* szMsg, STR_LIST& vecText, const wchar_t* lpDelimiter, bool bProcSpecialCharacter=false ); extern void MsgSplit_Ex( const char* szMsg, std::vector& vecText, const wchar_t* lpDelimiter, bool bProcSpecialCharacter=false ); #define _GUILD_ICON_ENC_ CPartyListMgr* g_pPartyListMgr = NULL; // 2011.11.30 - servantes : 파티리스트 매니저 SRaidMgr* g_pRaidMgr = NULL; // 2011.12.06 - servantes : 레이드 정보 매니저 const int CONST_RAID_INFO_GAP = 5; // 레이드 정보 개수 const int CONST_RAID_INFO_COUNT = 6; // 레이드 정보 개수 const int CONST_PARTY_MEMBER_INFO_COUNT = 4; // 파티원 정보 개수 namespace { enum { DIVISION_PERSONAL = 0, DIVISION_SHARE, DIVISION_TURN, }; const int c_BufSize = 512; }; extern bool ilSaveAsType( char* c_szFileName, char* c_szSaveAsFileName ); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // SAllianceGuild ////////////////////////////////////////////////////////////////////////// // 연합길드정보 // int SAllianceGuild::nAllianceID; // 연합SID std::string SAllianceGuild::strAllianceName; // 연합명 int SAllianceGuild::nAllianceMemberCount; // 연합길드 맴버수. int SAllianceGuild::nAllianceMasterGuildSID; // 연합장 길드 SID std::string SAllianceGuild::strAllianceLeaderName; // 연합장 이름. ////////////////////////////////////////////////////////////////////////// // SMessengerMgr SMessengerMgr::~SMessengerMgr() { Free(); } void SMessengerMgr::Free() { if( m_vecMemberList.empty() ) return; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); SAFE_DELETE(pSlot); it = m_vecMemberList.erase(it); } m_vecMemberList.clear(); m_bCreate = FALSE; } void SMessengerMgr::Clear() { m_strMsg = m_strCommunityName; m_nPartyType = 0; // 2011.10.26 :servantes : 변수 초기화 m_bIsExist = false; m_nMaxLevel = 0; m_nMinLevel = 0; m_nCommunityID = 0; m_nCommunityPassword = 0; /*m_strSelectMember.clear(); m_strCommunityName.clear(); m_strLeaderName.clear();*/ m_strGuildName.clear(); m_strGulidLeaderName.clear(); m_strBattleCommanderName.clear(); // sonador 3.5.1 던전 시즈 레벨 제한 Free(); } void SMessengerMgr::SetPartyMemberHpBar( std::string &str ) { // 2012. 6. 19 - marine // 파티원이 로그인했을 때, EnterMsg 가 먼저오고 PINFO/M가 나중에 날라오는데 // EnterMsg 가 올때 게이지바를 셋팅을 할때, 파티원의 핸들을 알 수가 없기 때문에 // PINFO가 날라온 시점에 게이지바 생성 char * strstoper; AR_HANDLE handle = ::strtoul( str.c_str(), &strstoper, 10 ); m_pGame->GetGameManager()->PostMsgAtDynamic( new SIMSG_UI_NAMEPANEL_PARTY_HP( handle ) ); } //int SMessengerMgr::AddMessage( const char* szMsg ) int SMessengerMgr::AddMessage( const char* szMsg, bool & bSelf ) // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. { /// 2011.01.19 bool형을 int로 바꿈 - prodongi m_bParsing = false; STR_LIST vecText; MsgSplit( szMsg, vecText, L"|" ); size_t nTextSize = vecText.size(); if( nTextSize <= 0 ) return 0;//false; if( ::_stricmp( vecText[0].c_str(), "INVITE" ) == 0 || ::_stricmp(vecText[0].c_str(), "ARENA_MEMBER_INVITE") == 0 || ::_stricmp(vecText[0].c_str(), "ARENA_OPPONENT_INVITE") == 0) // INVITE|파티장이름|[파튀,길드]이름|파티ID|파티PW| { if( nTextSize < 5 ) { vecText.clear(); return 0;//false; } /// 2011.12.26 보통 서버에서 파티중인지 체크를 하나, 시간차로 체크가 안되는 경우가 있다, /// 원래는 초대 메세지 박스가 나오지 않아야 되는 상황이므로 특별하게 에러 메세지는 출력해 주지 않는다. - prodongi if (IsExist()) { return 0; } m_strMsg = vecText[1]; m_strCommunityName = vecText[2]; m_nCommunityID = ::atoi( vecText[3].c_str() ); m_nCommunityPassword = ::atoi( vecText[4].c_str() ); char const* token; if (::_stricmp(vecText[0].c_str(), "ARENA_OPPONENT_INVITE") == 0) token = "RequestPartyArenaOpponentJoinAccept"; else if (::_stricmp(vecText[0].c_str(), "ARENA_MEMBER_INVITE") == 0) token = "RequestPartyArenaMemberJoinAccept"; else token = "RequestPartyJoinAccept"; SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, token)); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "KICK" ) == 0 ) // KICK|[파튀,길드]이름|캐릭이름 { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } LeaveMember( vecText[2].c_str() ); vecText.clear(); return 1;//true; } //else if( ::_stricmp( vecText[0].c_str(), "LOGIN" ) == 0 ) // LOGIN|[파튀,길드]이름|캐릭이름 //{ // if( nTextSize < 3 ) // { // vecText.clear(); // return 0;//false; // } // LoginMember( vecText[2].c_str() ); // vecText.clear(); // return 1;//true; //} if( ::_stricmp( vecText[0].c_str(), "CREATE" ) == 0 ) // CREATE|[파튀,길드]이름|파튀장 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } CreateCommunity( vecText[1].c_str() ); vecText.clear(); return 100; //true; // 2011.10.20 : servantes : 부모 클래스에서 메세지 처리하기 위해 100을 리턴한다 } else if( ::_stricmp( vecText[0].c_str(), "JOIN" ) == 0 ) // JOIN|[파튀,길드]이름| // 새 멤버(=자기자신)에게 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } JoinMember( m_strLocalPlayerName.c_str(), vecText[1].c_str() ); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "NEW" ) == 0 ) // NEW|캐릭이름| // 기존 멤버에게만 { if( nTextSize < 2 ) { vecText.clear(); return 0;//return false; } JoinMember( vecText[1].c_str(), m_strCommunityName.c_str() ); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "LEAVE" ) == 0 ) // LEAVE|캐릭이름 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } LeaveMember( vecText[1].c_str() ); vecText.clear(); return 1;//true; } //else if( ::_stricmp( vecText[0].c_str(), "LOGOUT" ) == 0 ) // LOGOUT|캐릭이름 //{ // if( nTextSize < 2 ) // { // vecText.clear(); // return 0;//false; // } // LogoutMember( vecText[1].c_str() ); // vecText.clear(); // return 1;//true; //} else if( ::_stricmp( vecText[0].c_str(), "PROMOTE" ) == 0 ) // PROMOTE|캐릭이름 // 파튀장 변경 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } // "PROMOTE|파티ID|캐릭이름" 으로 변경됨 ChangeLeader( vecText[2].c_str() ); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "ASSIST" ) == 0 ) // ASSIST|handle| { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } char * strstoper; AR_HANDLE hassist = ::strtoul( vecText[1].c_str(), &strstoper, 10 ); if( m_pGame ) { m_pGame->AssistTarget( hassist ); } vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "MINFO" ) == 0 ) // MINFO|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|소환수플래그| { RefreshMember( vecText ); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "DESTROY" ) == 0 ) // DESTROY|[파튀,길드]이름 { int k=0; k=0; Clear(); vecText.clear(); return 1;//true; } vecText.clear(); return 0;//false; } //----------------------------------------------------------------------------------------------------------------- // 커뮤니티 생성 //----------------------------------------------------------------------------------------------------------------- bool SMessengerMgr::CreateCommunity( const char* szCommunityName ) { m_bIsExist = true; m_bParsing = true; m_strCommunityName = szCommunityName; m_strLeaderName = m_strLocalPlayerName; m_strGuildName = szCommunityName; m_strGulidLeaderName = m_strLocalPlayerName; return AddMember( m_strLeaderName.c_str() ); } //----------------------------------------------------------------------------------------------------------------- // 커뮤니티 생성 //----------------------------------------------------------------------------------------------------------------- bool SMessengerMgr::CreateCommunity( const char* szCommunityName, char const* leaderName ) { m_bIsExist = true; m_bParsing = true; m_strCommunityName = szCommunityName; m_strLeaderName = leaderName; m_strGuildName = szCommunityName; m_strGulidLeaderName = leaderName; return AddMember( m_strLeaderName.c_str() ); } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::RefreshMember( STR_LIST& vecText ) { size_t nTextSize = vecText.size(); if( nTextSize <= 9 ) return false; _oprint( "PARTY %s : %d\n", vecText[2].c_str(), ::atoi( vecText[5].c_str() ) ); // MINFO|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|소환수플래그| m_bParsing = true; if( !IsExistMember(vecText[2].c_str()) ) { SPlayerSlot* pSlot = new SPlayerSlot; char * strstoper; AR_HANDLE handle = ::strtoul( vecText[1].c_str(), &strstoper, 10 ); pSlot->SetHandle( handle ); pSlot->SetName( vecText[2].c_str() ); pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); pSlot->SetHP( ::atoi( vecText[5].c_str() ) ); pSlot->SetMP( ::atoi( vecText[6].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[7].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[8].c_str() ) ); pSlot->SetCreature( ::atoi( vecText[9].c_str() ), 0 ); if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); m_vecMemberList.push_back(pSlot); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); } else { SPlayerSlot* pSlot = FindMember( vecText[2].c_str() ); if( pSlot == NULL ) return false; char * strstoper; AR_HANDLE handle = ::strtoul( vecText[1].c_str(), &strstoper, 10 ); pSlot->SetHandle( handle ); pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); pSlot->SetHP( ::atoi( vecText[5].c_str() ) ); pSlot->SetMP( ::atoi( vecText[6].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[7].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[8].c_str() ) ); pSlot->SetCreature( ::atoi( vecText[9].c_str() ), 0 ); if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); } // 2012. 6. 19 - marine SetPartyMemberHpBar(vecText[1]); return true; } //// 수정. 2010.06.10 bintitle. //void SMessengerMgr::RefreshMember( STR_LIST& vecText ) //{ // size_t nTextSize = vecText.size(); // if( nTextSize < 11 ) return; // // // MINFO|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|온/오프라인| // char * strstoper; // AR_HANDLE nHandle = ::strtoul( vecText[1].c_str(), &strstoper, 10 ); // m_bParsing = true; // if( !IsExistMember( vecText[2].c_str() ) ) // { // SPlayerSlot* pSlot = new SPlayerSlot; // // pSlot->SetHandle( nHandle ); // pSlot->SetName( vecText[2].c_str() ); // pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[5].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[6].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[7].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[8].c_str() ) ); // pSlot->SetLogin( ::atoi( vecText[9].c_str() ) ); // //if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); // // m_vecMemberList.push_back(pSlot); // } // else // { // SPlayerSlot* pSlot = FindMember( vecText[2].c_str() ); // if( pSlot == NULL ) return; // // pSlot->SetHandle( nHandle ); // pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[5].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[6].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[7].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[8].c_str() ) ); // pSlot->SetLogin( ::atoi( vecText[9].c_str() ) ); // // //if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); // } //} // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::JoinMember( const char* szPlayerName, const char* szCommunityName ) { // JOIN|파티이름| // 새 멤버(=자기자신)에게 // NEW|캐릭이름| // 기존 멤버에게만 m_bParsing = true; // join if( ::_stricmp(szPlayerName, m_strLocalPlayerName.c_str()) == 0 ) { m_bIsExist = true; m_strCommunityName = szCommunityName; m_strGuildName = szCommunityName; m_strMsg = szCommunityName; } else m_strMsg = szPlayerName; return AddMember( szPlayerName ); } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::LeaveMember( const char* szPlayerName ) { m_bParsing = true; m_strMsg = szPlayerName; return DeleteMember( szPlayerName ); } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::LoginMember( const char* szPlayerName ) { m_bParsing = true; m_strMsg = szPlayerName; if( ::_stricmp( szPlayerName, m_strLocalPlayerName.c_str() ) == 0 ) m_bIsExist = true; SPlayerSlot* pSlot = FindMember( szPlayerName ); if( pSlot == NULL ) return false; pSlot->SetLogin( true ); pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); return true; } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::LogoutMember( const char* szPlayerName ) { m_bParsing = true; m_strMsg = szPlayerName; if( ::_stricmp(szPlayerName, m_strLocalPlayerName.c_str()) == 0 ) { Clear(); return false; } SPlayerSlot* pSlot = FindMember( szPlayerName ); if( pSlot == NULL ) return false; pSlot->SetHandle( 0 ); pSlot->SetLogin( false ); pSlot->SetNear( false ); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); return true; } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::ChangeLeader( const char* szPlayerName ) { m_bParsing = true; m_strMsg = szPlayerName; if( !m_bIsExist ) // 존재하지 않으면 return false; if( !_stricmp( m_strLeaderName.c_str(), szPlayerName ) ) // 리더가 아니면 return false; // 새멤버에게 권한준다 SPlayerSlot* pSlot = FindMember( szPlayerName ); if( pSlot ) pSlot->SetLeader( true ); // 이전 멤버에게 권한빼앗는다 pSlot = FindMember( m_strLeaderName.c_str() ); if( pSlot ) pSlot->SetLeader( false ); m_strLeaderName = szPlayerName; sArenaSystem* arenaSystem = g_pCurrentGameSystem->getArenaSystem(); if (arenaSystem->isExercise()) { ProcMsgAtStatic( &SMSG_BATTLE_ARENA_PROMOTE()); } return true; } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::AddMember( const char* szName ) { if( IsExistMember(szName) ) return false; SPlayerSlot* pSlot = new SPlayerSlot; pSlot->SetName(szName); if( ::_stricmp(pSlot->GetName(), m_strLeaderName.c_str() ) == 0 ) pSlot->SetLeader( true ); m_vecMemberList.push_back(pSlot); return true; } bool SMessengerMgr::AddMember( SPlayerSlot* pSlot ) { if(pSlot == NULL) return false; m_vecMemberList.push_back(pSlot); return true; } // 2011.11.23 - servantes : 리턴형 변경 bool SMessengerMgr::DeleteMember( const char* szName ) { if( ::_stricmp( szName, m_strLocalPlayerName.c_str() ) == 0 ) // 자기 자신이라면.. 파티 파괴후 리턴 { Clear(); return true; } std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( ::_stricmp(pSlot->GetName(), szName) == 0 ) { SAFE_DELETE(pSlot); m_vecMemberList.erase(it); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); return true; } it++; } return false; } SPlayerSlot* SMessengerMgr::FindMember( AR_HANDLE hPlayer ) { if( m_vecMemberList.empty() ) return NULL; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->GetHandle() == hPlayer ) return (*it); it++; } return NULL; } SPlayerSlot* SMessengerMgr::FindMember( const char* szName ) { if( m_vecMemberList.empty() ) return NULL; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( ::_stricmp(pSlot->GetName(), szName) == 0 ) return (*it); it++; } return NULL; } int SMessengerMgr::FindMemberIndex( AR_HANDLE hPlayer ) { if( m_vecMemberList.empty() ) return -1; int id=0; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->GetHandle() == hPlayer ) { return id; } it++; id++; } return -1; } SPlayerSlot* SMessengerMgr::FindMemberByID( int id ) { if( m_vecMemberList.empty() ) return NULL; int i=0; std::vector::iterator itE = m_vecMemberList.end(); std::vector::iterator itS = m_vecMemberList.begin(); for(; itS != itE; itS++, i++) { if(i == id) { SPlayerSlot* pSlot = (*itS); return pSlot; } } return NULL; } SPlayerSlot* SMessengerMgr::FindMemberHandle( AR_HANDLE hPlayer ) { if( m_vecMemberList.empty() ) return NULL; int i=0; std::vector::iterator itE = m_vecMemberList.end(); std::vector::iterator itS = m_vecMemberList.begin(); for(; itS != itE; itS++, i++) { SPlayerSlot* pSlot = (*itS); if(pSlot->GetHandle() == hPlayer) { return pSlot; } } return NULL; } SPlayerSlot* SMessengerMgr::FindMemberByCreature(AR_HANDLE hCreature) { int i = 0; std::vector::iterator itE = m_vecMemberList.end(); std::vector::iterator itS = m_vecMemberList.begin(); for(; itS != itE; itS++, i++) { SPlayerSlot* pSlot = (*itS); if(pSlot->GetMainCreatureHandle() == hCreature || pSlot->GetSubCreatureHandle() == hCreature) { return pSlot; } } return NULL; } SPlayerSlot* SMessengerMgr::GetLeaderInfo() { return FindMember( m_strLeaderName.c_str() ); } const AR_HANDLE SMessengerMgr::GetMemberHandle( const char* szName ) { SPlayerSlot* pSlot = FindMember( szName ); if( pSlot == NULL ) return NULL; return pSlot->GetHandle(); } const int SMessengerMgr::GetLoginMemberCount() { int nCount = 0; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->IsLogin() ) nCount++; it++; } return nCount; } const bool SMessengerMgr::IsFar( AR_HANDLE hPlayer ) const { if( m_pGame == NULL ) return false; return m_pGame->GetGameObject( hPlayer ) ? false : true; } const bool SMessengerMgr::IsExistMember( AR_HANDLE hPlayer ) const { if( m_vecMemberList.empty() ) return false; std::vector::const_iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->GetHandle() == hPlayer ) return true; it++; } return false; } // 2010.07.27 - prodongi const bool SMessengerMgr::IsExistLoginMember(AR_HANDLE hPlayer) const { if( m_vecMemberList.empty() ) return false; std::vector::const_iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->GetHandle() == hPlayer && pSlot->IsLogin() ) return true; it++; } return false; } const bool SMessengerMgr::IsExistMember( const char* szName ) const { if( m_vecMemberList.empty() ) return false; std::vector::const_iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( ::_stricmp(pSlot->GetName(), szName) == 0 ) return true; it++; } return false; } const int SMessengerMgr::GetMemberIndex( AR_HANDLE hPlayer ) const { if( m_vecMemberList.empty() ) return -1; //파티장이 멘위로 올라가는 문제 수정 //2009-07-09 : hunee /* int nIndex( GetLeaderIndex() ); for( int i(0); i<(int)m_vecMemberList.size(); ++i ) { if( m_vecMemberList[i]->GetHandle() == hPlayer ) { if( !m_vecMemberList[i]->IsLeader() ) { if( nIndex>i ) return i; else return i+1; } else return 0; } } */ for( int i(0); i<(int)m_vecMemberList.size(); ++i ) { if( m_vecMemberList[i]->GetHandle() == hPlayer ) return i; } return -1; } const int SMessengerMgr::GetLeaderIndex() const { if( m_vecMemberList.empty() ) return -1; for( int i(0); i<(int)m_vecMemberList.size(); ++i ) { if( m_vecMemberList[i]->IsLeader() ) return i; } return -1; } ////////////////////////////////////////////////////////////////////////// // SPartyMgr SPartyMgr::SPartyMgr() : SMessengerMgr() // 2011.03.29 - servantes { Clear(); m_bCreate = FALSE; } void SPartyMgr::Clear() { m_strSelectMember.clear(); m_strCommunityName.clear(); m_strLeaderName.clear(); m_nDivisionMode = 0; SMessengerMgr::Clear(); } void SPartyMgr::ResetInfo() { Clear(); } const bool SPartyMgr::IsPartyLeader() { return ( ::_stricmp(m_strLocalPlayerName.c_str(), GetPartyLeaderName()) == 0 ); } const char* SPartyMgr::GetPartyLeaderName() { SPlayerSlot* pLeader = GetLeaderInfo(); if( pLeader ) { return pLeader->GetName(); } return "NotFoundLeader"; } bool SPartyMgr::IsMyParty() { const char* pName = g_pCurrentGameSystem->getLocalPlayerName(); if( pName == NULL ) return false; SPlayerSlot * pPlayerSlot = FindMember( pName ); if( pPlayerSlot ) return true; return false; } //int SPartyMgr::AddMessage( const char* szMsg ) int SPartyMgr::AddMessage( const char* szMsg, bool & bSelf ) // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. { /// 2011.01.19 bool형을 int로 바꿈 - prodongi int bRet = SMessengerMgr::AddMessage(szMsg, m_bSelf); if( m_bParsing ) return bRet; STR_LIST vecText; MsgSplit( szMsg, vecText, L"|" ); size_t nTextSize = vecText.size(); if( nTextSize <= 0 ) return 0;//false; if( ::_stricmp( vecText[0].c_str(), "CHANGE_NAME" ) == 0 ) //CHANGE_NAME|old_name|new_name| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } #ifdef _DEBUG const char * pOldName = vecText[1].c_str(); const char * pNewName = vecText[2].c_str(); #endif SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetName( vecText[2].c_str() ); pPlayerSlot->GetHandle(); } } else if( ::_stricmp( vecText[0].c_str(), "CHANGE_LEVEL" ) == 0 ) //CHANGE_NAME|캐릭터이름|레벨| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetLevel( ::atoi( vecText[2].c_str() ) ); } } else if( ::_stricmp( vecText[0].c_str(), "CHANGE_JOB" ) == 0 ) //CHANGE_NAME|캐릭터이름|직업| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetJobID( ::atoi( vecText[2].c_str() ) ); } } else if( ::_stricmp( vecText[0].c_str(), "MODE" ) == 0 ) // MODE|모드 0:각자, 1:랜덤, 2:순차 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } ChangePartyDivision( vecText[1].c_str() ); vecText.clear(); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "PINFO" ) == 0 ) // PINFO|파티이름|파티장이름|분배방식|최고렙|최저렙|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|소환수플래그| { InfoMember( vecText ); SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); // 2011.12.21 - servantes : InfoMember에서 파티창으로 메세지 보내고 있음 그래서 주석처리 vecText.clear(); return 200;//true; // "PINFO" 밖에서 처리하기 위해 // 2011.10.24 : servantes } else if( ::_stricmp( vecText[0].c_str(), "LIST" ) == 0 ) // LIST|캐릭이름|분배방|최고렙|최저 { ChangePartyInfo( vecText ); return 1;//true; } // sonador 3.12.1 파티원 좌표 갱신 기능 추가 else if( ::_stricmp( vecText[0].c_str(), "PPOS" ) == 0 ) // PPOS|파티원1_핸들|X좌표|Y좌표|파티원2_핸들|X좌표|Y좌표|... { UpdatePartyPosition( vecText ); vecText.clear(); return 1;//true; } vecText.clear(); return bRet; } bool SPartyMgr::JoinMember( const char* szPlayerName, const char* szCommunityName ) { int k=0; k=0; k=1; // JOIN|파티이름| // 새 멤버(=자기자신)에게 // NEW|캐릭이름| // 기존 멤버에게만 m_bParsing = true; // join if (g_pCurrentGameSystem->isLocalPlayerName(szPlayerName)) { m_bIsExist = true; m_strCommunityName = szCommunityName; m_strGuildName = szCommunityName; m_strMsg = szCommunityName; } else m_strMsg = szPlayerName; return AddMember( szPlayerName ); } //----------------------------------------------------------------------------------------------------------------- // 파티 멤버 추가 //----------------------------------------------------------------------------------------------------------------- bool SPartyMgr::AddMember( const char* szName ) { if( IsExistMember( szName ) ) return true; if( m_vecMemberList.size() >= SLOT_MAXLINE ) { SLOG( "[SPartyMgr] 파티원의 수가 최대 파티원을 넘어섰습니다 - 파티추가 무시 [ %s ]", szName ); assert( NULL ); return false; } SPlayerSlot* pSlot( new SPlayerSlot ); if( pSlot ) { pSlot->SetName( szName ); if( ::_stricmp(pSlot->GetName(), m_strLeaderName.c_str() ) == 0 ) pSlot->SetLeader( true ); m_vecMemberList.push_back( pSlot ); g_pRaidMgr->setPartyCount( m_strCommunityName, m_vecMemberList.size() ); } return true; } //----------------------------------------------------------------------------------------------------------------- // 파티 멤버 추가 //----------------------------------------------------------------------------------------------------------------- bool SPartyMgr::AddMember( SPlayerSlot* pSlot ) { if( pSlot == NULL ) return false; if( m_vecMemberList.size() >= SLOT_MAXLINE ) { SLOG( "[SPartyMgr] 파티원의 수가 최대 파티원을 넘어섰습니다 - 파티추가 무시 [ %s ]", pSlot->GetName() ); assert( NULL ); return false; } m_vecMemberList.push_back( pSlot ); g_pRaidMgr->setPartyCount(m_strCommunityName, m_vecMemberList.size()); return true; } bool SPartyMgr::DeleteMember( const char* szPlayerName ) { if(szPlayerName == NULL) return false; if (g_pCurrentGameSystem->isLocalPlayerName(szPlayerName)) // 자기 자신이라면.. 파티 파괴후 리턴 { Clear(); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); // 2011.11.07 - servantes : 내가 추방 당함 /// 2012.07.13 메세지 처리는 모았다가 한꺼번에 하기 때문에, leave가 날라오고 create가 바로 날라오는 경우, leave 메세지 때문에 파티창이 안 보이는 경우가 있다. /// 그래서 PostMsgAtDynamic을 안 쓰고 ProcMsgAtStatic를 씀 - prodongi ProcMsgAtStatic(&SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "leave_party_me", m_strCommunityName.c_str())); return true; } std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( ::_stricmp(pSlot->GetName(), szPlayerName) == 0 ) { m_pGame->GetGameManager()->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY_STATE, "remove_player", pSlot->GetHandle())); SAFE_DELETE(pSlot); m_vecMemberList.erase(it); g_pRaidMgr->setPartyCount(m_strCommunityName,m_vecMemberList.size()); //2011. 12. 20 - marine 파티원수 레이드에 갱신 ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); return true; } it++; } return false; } // 2011.11.23 - servantes : 리턴형 변경 // sonador 3.12.1 파티원 좌표 갱신 기능 추가 bool SPartyMgr::UpdatePartyPosition( STR_LIST& data ) { int dataSize = data.size(); if( dataSize < 2 ) return false; // there is information for no one. if( ( ( dataSize - 1 ) % 3 ) != 0 ) return false; // wrong data!!! int infoSize = ( dataSize - 1 ) / 3; for( int index = 0; index < infoSize; ++index ) { const char* handleData = data[ 1 + index * 3 + 0 ].c_str(); const char* xPosData = data[ 1 + index * 3 + 1 ].c_str(); const char* yPosData = data[ 1 + index * 3 + 2 ].c_str(); char* strToOper; AR_HANDLE handle = ::strtoul( handleData, &strToOper, 10 ); int xPos = ::atoi( xPosData ); int yPos = ::atoi( yPosData ); SPlayerSlot* slot = FindMember( handle ); if( !slot ) continue; // not our party member slot->SetXPos( xPos ); slot->SetYPos( yPos ); slot->SetNear( !IsFar( handle ) ); } return true; } void SPartyMgr::InfoMember( STR_LIST& vecText, int nStartTap ) { int n=0; if(nStartTap != -1) n = nStartTap; m_bParsing = true; m_bIsExist = true; if( vecText.size() < 8 ) { assert(0); return; } m_nPartyType = ::atoi( vecText[7+n].c_str() ); // 2011.10.20 - servantes : 파티타입 if(m_bCreate == FALSE) { m_nCommunityID = ::atoi( vecText[1+n].c_str() ); m_strCommunityName = vecText[2+n]; m_strLeaderName = vecText[3+n]; m_nDivisionMode = ::atoi( vecText[4+n].c_str() ); m_nMaxLevel = ::atoi( vecText[5+n].c_str() ); m_nMinLevel = ::atoi( vecText[6+n].c_str() ); // 1 : 던전 레이드 // 2 : 공격대 if(m_nPartyType == PARTY_DUNGEON_RAID || m_nPartyType == PARTY_SIEGE || m_nPartyType == PARTY_ARENA) { char strCommunityName[256]={0}; std::string::size_type offset = 0; offset = m_strCommunityName.find( "_", offset ); if( std::string::npos != offset ) // '_'가 있으면 그 앞까지 이름만 넣는다 strncpy(strCommunityName, m_strCommunityName.c_str(), (int)offset); else strcpy(strCommunityName, m_strCommunityName.c_str()); g_pRaidMgr->setAttackUnitName(strCommunityName); // 2011.12.07 - servantes '_'가 없는 공격대 이름만 넣는다 } } bool bMyParty=false; // 2011.12.05 - servantes int nLine = static_cast(vecText.size()) - 8; int nCount = nLine / 9; int nPos = 0; for( int i = 0; i < nCount; i++ ) { if( i > 0 ) nPos = (9 * i); SPlayerSlot* pSlot = FindMember( vecText[9 +n+ nPos].c_str() ); if(pSlot == NULL) { pSlot = new SPlayerSlot; char * strstoper; AR_HANDLE handle = ::strtoul( vecText[8+n+nPos].c_str(), &strstoper, 10 ); pSlot->SetHandle( handle ); pSlot->SetName ( vecText[9 +n+ nPos].c_str() ); pSlot->SetLevel ( ::atoi( vecText[10 +n+ nPos].c_str() ) ); pSlot->SetJobID ( ::atoi( vecText[11 +n+ nPos].c_str() ) ); pSlot->SetHP ( ::atoi( vecText[12 +n+ nPos].c_str() ) ); pSlot->SetMP ( ::atoi( vecText[13 +n+ nPos].c_str() ) ); pSlot->SetXPos ( ::atoi( vecText[14 +n+ nPos].c_str() ) ); pSlot->SetYPos ( ::atoi( vecText[15 +n+ nPos].c_str() ) ); pSlot->SetCreature( ::atoi( vecText[16 +n+ nPos].c_str() ), 0 ); // 2011.10.11 - servantes : 가독성 높임 if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); m_vecMemberList.push_back(pSlot); } else { char * strstoper; AR_HANDLE handle = ::strtoul( vecText[8+n+nPos].c_str(), &strstoper, 10 ); pSlot->SetHandle( handle ); pSlot->SetLevel ( ::atoi( vecText[10 +n+ nPos].c_str() ) ); pSlot->SetJobID ( ::atoi( vecText[11 +n+ nPos].c_str() ) ); pSlot->SetHP ( ::atoi( vecText[12 +n+ nPos].c_str() ) ); pSlot->SetMP ( ::atoi( vecText[13 +n+ nPos].c_str() ) ); pSlot->SetXPos ( ::atoi( vecText[14 +n+ nPos].c_str() ) ); pSlot->SetYPos ( ::atoi( vecText[15 +n+ nPos].c_str() ) ); pSlot->SetCreature( ::atoi( vecText[16 +n+ nPos].c_str() ), 0 ); } // 2011.12.05 - servantes // 파티원 정보 중에 내가 있는지 검사 const char* pName = g_pCurrentGameSystem->getLocalPlayerName(); std::string strName = pSlot->GetName(); if( strName.compare( pName ) == 0 ) { bMyParty = true; } SetPartyMemberHpBar(vecText[8+n+nPos]); } if( static_cast(m_vecMemberList.size()) == 1 ) m_nMinLevel = m_nMaxLevel; // 1 : 던전 레이드 // 2 : 공격대 if(m_nPartyType == PARTY_DUNGEON_RAID || m_nPartyType == PARTY_SIEGE || m_nPartyType == PARTY_ARENA) { bool bExist = ( NULL != g_pRaidMgr->GetRaidInfo(m_strCommunityName.c_str()) ); // 레이드가 존재하는가? SPlayerSlot* pSlot = FindMember(m_strLeaderName.c_str()); // 멤버가 존재하는가? if(pSlot && bExist == false) { // 레이드 정보 SRaidInfo* pRaidInfo = new SRaidInfo; pRaidInfo->SetPartyID ( m_nCommunityID ); // party_id pRaidInfo->SetPartyName ( m_strCommunityName.c_str() ); // party_name 2011. 10. 18 - marine pRaidInfo->SetLeaderName ( m_strLeaderName.c_str() ); // leader_name pRaidInfo->SetLeaderLv ( pSlot->GetLevel() ); // leader_lv pRaidInfo->SetLeaderJob_id( pSlot->GetJobID() ); // leader_job_id pRaidInfo->SetMemberCount ( m_vecMemberList.size() ); // member_count pRaidInfo->SetGguildParty ( false ); // 현재 사용하지 않는 데이타 //g_pRaidMgr->GetRaidInfoList().push_back( pRaidInfo ); // 레이드 정보 리스트에 추가 g_pRaidMgr->pushRaidInfo(pRaidInfo); // 2011. 12. 21 - marine } } SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "set_party_type", m_strCommunityName.c_str(), unsigned int(m_nPartyType) ) ); m_bCreate = TRUE; } void SPartyMgr::ChangePartyInfo( STR_LIST& vecText ) { m_bParsing = true; if( !m_bIsExist ) return; m_nDivisionMode = ::atoi( vecText[2].c_str() ); m_nMaxLevel = ::atoi( vecText[3].c_str() ); m_nMinLevel = ::atoi( vecText[4].c_str() ); } void SPartyMgr::ChangePartyDivision( const char* szMode ) { m_nDivisionMode = ::atoi( szMode ); } void SPartyMgr::checkValidArenaJoinSituation() { sArenaJoinSituationCondition situationCondition; /// way situationCondition.m_notificationWays = cArenaJoinSituationChecker::WAY_NOTIFICATION_WND; /// situation situationCondition.add(cArenaJoinSituationChecker::SITUATION_ARENA_WAITING, S(2433)); situationCondition.add(cArenaJoinSituationChecker::SITUATION_ARENA_WAITING_COUNT, S(2433)); g_pCurrentGameSystem->isValidArenaJoinSituation(situationCondition); } //=============================================================================================================================================== // CPartyListMgr //=============================================================================================================================================== // 2011.10.18 : servantes : 파티정보 PINFO 에 파티 ID 추가 CPartyListMgr::CPartyListMgr() : SPartyMgr() { g_pPartyListMgr = this; m_bRecvJoinOrLogin = false; m_nMyPartyID = -1; m_isArenaParty = false; Clear(); // m_nMyPartyID = -1; // SPartyMgr* pPartyList = new SPartyMgr; // Add(pPartyList); } CPartyListMgr::~CPartyListMgr() { Clear(); } ///< 파티 찾기 SPartyMgr* CPartyListMgr::GetParty(std::string* pstrPartyName) { std::string strPartyName; if(pstrPartyName == NULL) { if(m_strCommunityName.size()) { std::map::iterator it = m_mapPartyInfoList.find(m_strCommunityName); if(it != m_mapPartyInfoList.end()) return it->second; return (SPartyMgr*)this; } else { return (SPartyMgr*)this; } } else strPartyName = *pstrPartyName; if(m_strCommunityName == strPartyName) return (SPartyMgr*)this; std::map::iterator it = m_mapPartyInfoList.find(strPartyName); if(it == m_mapPartyInfoList.end()) return NULL; return it->second; } bool CPartyListMgr::IsLeader(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::IsLeader(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::IsLeader(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return false; return pPartyList->IsLeader(); } bool CPartyListMgr::IsPartyLeader(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::IsPartyLeader(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::IsPartyLeader(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return false; return pPartyList->IsPartyLeader(); } bool CPartyListMgr::IsLocalPlayer( AR_HANDLE hPlayer, std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::IsLocalPlayer(hPlayer); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::IsLocalPlayer(hPlayer); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return false; return pPartyList->IsLocalPlayer(hPlayer); } bool CPartyListMgr::IsExist(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::IsExist(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::IsExist(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return false; return pPartyList->IsExist(); } void CPartyListMgr::SetPlayerInfo( AR_HANDLE hPlayer, const char* szName, std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::SetPlayerInfo(hPlayer, szName); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::SetPlayerInfo(hPlayer, szName); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ; return pPartyList->SetPlayerInfo(hPlayer, szName); } void CPartyListMgr::SetSelectMember( const char* szName, std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::SetSelectMember(szName); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::SetSelectMember(szName); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ; pPartyList->SetSelectMember( szName ); } ///< 선택 된 파티원 핸들 설정. void CPartyListMgr::SetSelectMemberHandle( AR_HANDLE hTarget, std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::SetSelectMemberHandle(hTarget); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::SetSelectMemberHandle(hTarget); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ; pPartyList->SetSelectMemberHandle( hTarget ); } void CPartyListMgr::ChangePartyInfo( STR_LIST& vecPartyText, std::string* pstrPartyName) // list { if(pstrPartyName == NULL) return SPartyMgr::ChangePartyInfo(vecPartyText); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::ChangePartyInfo(vecPartyText); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ; pPartyList->ChangePartyInfo(vecPartyText); } void CPartyListMgr::ChangePartyDivision( const char* szMode, std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::ChangePartyDivision(szMode); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::ChangePartyDivision(szMode); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ; pPartyList->ChangePartyDivision(szMode); } int CPartyListMgr::GetPartyType(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::GetPartyType(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::GetPartyType(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return -1; return pPartyList->GetPartyType(); } const char* CPartyListMgr::GetMessage(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::GetMessage(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::GetMessage(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return NULL; return pPartyList->GetMessage(); } int CPartyListMgr::GetPartyPass(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::GetPartyPass(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::GetPartyPass(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return 0; return pPartyList->GetPartyPass(); } const char* CPartyListMgr::GetPartyLeaderName(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::GetPartyLeaderName(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::GetPartyLeaderName(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return NULL; return pPartyList->GetPartyLeaderName(); } int CPartyListMgr::GetDivision(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::GetDivision(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::GetDivision(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return 0; return pPartyList->GetDivision(); } const char* CPartyListMgr::GetSelectMember(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::GetSelectMember(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::GetSelectMember(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return NULL; return pPartyList->GetSelectMember(); } int CPartyListMgr::GetPartyID(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::GetPartyID(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::GetPartyID(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return 0; return pPartyList->GetPartyID(); } std::vector& CPartyListMgr::GetMemberList(std::string* pstrPartyName) { static std::vector nullList; // 기존 구조가 벡터 주소값을 넘겨 주는 형태라 구조에 맞추느라 static으로 처리 한다 SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return nullList; return pPartyList->GetMemberList(); } int CPartyListMgr::GetMemberCount(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::GetMemberCount(); int nCount = SMessengerMgr::GetMemberCount(); if(nCount) return nCount; SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return 0; return pPartyList->GetMemberCount(); } const char* CPartyListMgr::GetPartyName(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SPartyMgr::GetPartyName(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SPartyMgr::GetPartyName(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return ""; return pPartyList->GetPartyName(); } ///< 선택 된 파티원 핸들 불러오기. AR_HANDLE CPartyListMgr::GetSelectMemberHandle(std::string* pstrPartyName) { if(pstrPartyName == NULL) return SMessengerMgr::GetSelectMemberHandle(); if(m_strCommunityName.compare( *pstrPartyName ) == 0) return SMessengerMgr::GetSelectMemberHandle(); SPartyMgr* pPartyList = GetParty(pstrPartyName); if(pPartyList == NULL) return 0; return pPartyList->GetSelectMemberHandle(); } void CPartyListMgr::Clear() { SPartyMgr::Clear(); std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* p = itS->second; SAFE_DELETE(p); } m_mapPartyInfoList.clear(); } // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. int CPartyListMgr::AddMessage( const char* szMsg, bool & bSelf ) { STR_LIST vecText; MsgSplit( szMsg, vecText, L"|" ); size_t nTextSize = vecText.size(); if( nTextSize <= 0 ) return 0;//false; int bRet = 0; // 내가 만든 파티일 때만 "CREATE" 가 온다 // 남이 만든 파티는 "PINFO" if( ::_stricmp( vecText[0].c_str(), "CREATE" ) == 0 ) // 2011.10.20 : servantes { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } /// 2012.01.16 함수로 뺌 - prodongi int partyType; if(vecText.size() > 3) partyType = ::atoi( vecText[3].c_str() ); // 파티 타입을 얻는다 else partyType = PARTY_NORMAL; createParty(vecText[1], vecText[2], partyType); vecText.clear(); return bRet; } else if( ::_stricmp( vecText[0].c_str(), "LOGIN" ) == 0 ) // LOGIN|[파튀,길드]이름|캐릭이름 { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } SPartyMgr* pParty = FindIncludeSlef(&vecText[1]); if(pParty == NULL) // 파티가 만들어지지 않았다면 만든다 { bool isLocalPlayer = g_pCurrentGameSystem->isLocalPlayerName(vecText[2].c_str()); if (isLocalPlayer) { SMessengerMgr::SetLocalPlayerName(vecText[2].c_str()); SMessengerMgr::CreateCommunity( vecText[1].c_str(), vecText[2].c_str() ); // 파티 이름 if (isLocalPlayer) SMessengerMgr::SetExist( true ); // 내 파티 이름으로 내 파티 아이디를 찾아 놓는다 std::string sPartyName( m_strCommunityName.c_str() ); size_t nPos = sPartyName.find_first_of("_") + 1; size_t nEndPos = sPartyName.size(); std::string strNumber = sPartyName.substr(nPos, nEndPos); m_nMyPartyID = atoi( strNumber.c_str() ) + 2; // 2011.12.21 - servantes : 내 파티이고 내가 로그인 했다면 파티창 보이라고 알림 m_bRecvJoinOrLogin = true; // ui refresh가 필요하므로.. SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", vecText[1].c_str(), number_t( -1 ), number_t( 0 ) ) ); } else { pParty = new SPartyMgr; pParty->SetLocalPlayerName(vecText[2].c_str()); pParty->CreateCommunity( vecText[1].c_str() ); // 파티 이름 pParty->SetGame(m_pGame); g_pPartyListMgr->Add(pParty); // 파티 매니저 리스트에 파티 매니저 추가 m_bRecvJoinOrLogin = true; // ui refresh가 필요하므로.. if( vecText[2].compare( pParty->GetLocalPlayerName() ) == 0 ) pParty->SetExist( true ); m_bRecvJoinOrLogin = true; // ui refresh가 필요하므로.. SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", vecText[1].c_str(), number_t( 0 ), number_t( 4 ) ) ); } } SPlayerSlot * pPlayerSlot = FindMember( vecText[2].c_str(), NULL ); if( pPlayerSlot ) { pPlayerSlot->SetLogin( true ); pPlayerSlot->SetNear( !(IsFar(pPlayerSlot->GetHandle())) ); } return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "LOGOUT" ) == 0 ) // LOGOUT|캐릭이름 // 2011.12.09 - servantes : logout { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } const char* pName = g_pCurrentGameSystem->getLocalPlayerName(); if( vecText[1].compare(pName) == 0 ) // 내 캐릭터 이름이면 { Clear(); return false; } SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str(), NULL ); if( pPlayerSlot ) { pPlayerSlot->SetHandle( 0 ); pPlayerSlot->SetLogin( false ); pPlayerSlot->SetNear( false ); } /// 2011.12.26 유효하지 않은 팝업 메뉴가 될 수 있으므로 hide 시켜 준다 - prodongi SendGameInterfaceMsg(&SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CHARACTER, false)); SendGameInterfaceMsg(&SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CREATURE, false)); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "deselect", m_strCommunityName.c_str() ) ); return 1;//true; } // 2011.10.24 : servantes : 자기 파티일 경우 else if( ::_stricmp( vecText[0].c_str(), "PINFO" ) == 0 ) // PINFO|파티이름|파티장이름|분배방식|최고렙|최저렙|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|소환수플래그| { /// 2012.01.16 CREATE가 날라오지 않고, PINFO가 날라왔을 경우는 우선 베어로드라고 생각한다..... CREATE이 날라오도록 서버에 요청해야 될 것 같음 - prodongi SPartyMgr* party = FindIncludeSlef(&vecText[2]); if (!party) createParty(vecText[2], vecText[3], atoi(vecText[7].c_str())); else { int nMyParty = -1; const char* pName = g_pCurrentGameSystem->getLocalPlayerName(); if(party->FindMember(pName) == NULL) { party->SetPartyType(PARTY_SIEGE_OTHER); nMyParty = 0; } SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", party->GetPartyName(), number_t( nMyParty ), number_t( party->GetPartyType() ) ) ); } InfoMember(vecText); // bRet = SPartyMgr::AddMessage(szMsg, m_bSelf); return 1;//true; } else if( ::_stricmp( vecText[0].c_str(), "RMINFO" ) == 0 ) // RMINFO | -2147483648 | 재봉짱1 | 200 | 1 | { InfoRaidMember(vecText); } else if( ::_stricmp( vecText[0].c_str(), "DESTROY" ) == 0 ) // DESTROY|[파튀,길드]이름 // 2011.10.20 : servantes { SPartyMgr* pParty = GetParty(&vecText[1]); if(pParty) { pParty->Clear(); // 파티창을 숨긴다 SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "delete_party_wnd", vecText[1].c_str() ) ); } if (1 == atoi(vecText[2].c_str())) { checkValidArenaJoinSituationByLeaveAtArena(); } } else if( ::_stricmp( vecText[0].c_str(), "JOIN" ) == 0 ) // JOIN|파티명|캐릭터명 { /// 2012.06.08 2021.06.08 " // JOIN|파티명|캐릭터명" 공대 파티와 일반 파티와 통일됨 - prodongi JoinMember(vecText[2].c_str(), &vecText[1]); } else if( ::_stricmp( vecText[0].c_str(), "LEAVE" ) == 0 ) // LEAVE|캐릭이름 { LeaveMember(vecText[1].c_str(), NULL, vecText[2].c_str()); } else if( ::_stricmp( vecText[0].c_str(), "KICK" ) == 0 ) // KICK|파티명|캐릭이름 { LeaveMember(vecText[2].c_str(), &vecText[1]); } else if( ::_stricmp( vecText[0].c_str(), "SINFO" ) == 0 ) // SINFO | 목록개수| (플레이어 핸들 | 주크리처 핸들 | 부 크리처 핸들) X 목록개수 { SummonInfo(vecText); } else if( ::_stricmp( vecText[0].c_str(), "MSINFO" ) == 0 ) // MSINFO | 플레이어 핸들 | 주크리처 핸들 | 부 크리처 핸들 { MemberSummonInfo(vecText); } else { bRet = SPartyMgr::AddMessage(szMsg, m_bSelf); } vecText.clear(); return bRet; } void CPartyListMgr::InfoMember( STR_LIST& vecText ) { if( vecText.size() < 7 ) { assert(0); return; } SPartyMgr* pParty = FindPartyByPartyName( &vecText[2] ); if(NULL == pParty) { return ; } /// 자신의 파티일 경우에는 파티 id를 설정해 준다 if (::_stricmp(GetPartyName(), vecText[2].c_str()) == 0) { SetPartyID(atoi(vecText[1].c_str())); } int nStartTap = 0; int partyType = ::atoi( vecText[7+nStartTap].c_str() ); m_isArenaParty = (PARTY_ARENA == partyType) ? true : false; pParty->InfoMember( vecText, nStartTap ); if(m_bRecvJoinOrLogin == true ) { SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "refresh_title", pParty->GetPartyName(), unsigned int(pParty->GetPartyType()) ) ); m_bRecvJoinOrLogin = false; } } void CPartyListMgr::InfoRaidMember( STR_LIST& vecText ) { if( vecText.size() < 5 ) { assert(0); return; } int nPos = 1; // int nCount = ( ((int)vecText.size()) - 1 ) / CONST_PARTY_MEMBER_INFO_COUNT; // for( int i = 0; i < nCount; i++ ) // { SPartyMgr* pPartyMgr = FindPartyByPlayerName( &vecText[1 + nPos] ); // SPlayerSlot* pSlot = FindMember( vecText[1 + nPos].c_str() ); if(pPartyMgr) { SPlayerSlot* pSlot = pPartyMgr->FindMember(vecText[1 + nPos].c_str()); if( pSlot == NULL ) { pSlot = new SPlayerSlot; char * strstoper; AR_HANDLE handle = ::strtoul( vecText[0 + nPos].c_str(), &strstoper, 10 ); pSlot->SetHandle ( handle ); pSlot->SetName ( vecText[1 + nPos].c_str() ); pSlot->SetJobID ( ::atoi( vecText[2 + nPos].c_str() ) ); if( ::atoi( vecText[3 + nPos].c_str() ) ) { pSlot->SetHP (100); // 정보가 없어서 기본 100으로 넣어준다 pSlot->SetMP (100); // 정보가 없어서 기본 100으로 넣어준다 } else { pSlot->SetHP (0); // 정보가 없어서 기본 100으로 넣어준다 pSlot->SetMP (0); // 정보가 없어서 기본 100으로 넣어준다 } pPartyMgr->AddMember(pSlot); g_pRaidMgr->setPartyCount( std::string( pPartyMgr->GetPartyName() ), pPartyMgr->GetMemberCount()); // 2011. 12. 20 - marine 파티원수 레이드 매니저에 갱신 } else { char * strstoper; AR_HANDLE handle = ::strtoul( vecText[0 + nPos].c_str(), &strstoper, 10 ); pSlot->SetHandle ( handle ); pSlot->SetName ( vecText[1 + nPos].c_str() ); pSlot->SetJobID ( ::atoi( vecText[2 + nPos].c_str() ) ); if( ::atoi( vecText[3 + nPos].c_str() ) ) { pSlot->SetHP (100); // 정보가 없어서 기본 100으로 넣어준다 pSlot->SetMP (100); // 정보가 없어서 기본 100으로 넣어준다 } else { pSlot->SetHP (0); // 정보가 없어서 기본 100으로 넣어준다 pSlot->SetMP (0); // 정보가 없어서 기본 100으로 넣어준다 } } /// 2011.12.20 효곤씨 확인요, 파티장일 때만 설정 - prodongi if (::strcmp(pPartyMgr->GetPartyLeaderName(), vecText[1+nPos].c_str()) == 0) { // 2011. 12. 15 - marine Rain_Mgr에는 파티이름만 들어가 있으므로 나머지 정보를 채워준다. STR_LIST str_raid; std::string strPartyName = pPartyMgr->GetPartyName(); str_raid.push_back(strPartyName); // 파티 이름 str_raid.push_back(vecText[1+nPos]); // 파티장 이름 str_raid.push_back(vecText[2+nPos]); // 파티장 레벨 g_pRaidMgr->setJoinPartyData(str_raid); } } SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "refresh_ui", vecText[1 + nPos].c_str() ) ); // nPos += CONST_PARTY_MEMBER_INFO_COUNT; // } if(g_pRaidMgr->GetPartyCount() != 0 ) m_pGame->SendGameInterfaceMsg( &SIMSG_UI_DUNGEONUNIT_UPDATE() ); } SPartyMgr* CPartyListMgr::FindPartyByID(int nPartyID) { if(nPartyID <= 0) return NULL; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; if( pParty->GetPartyID() == nPartyID ) return pParty; } if( GetPartyID() == nPartyID ) return (SPartyMgr*)this; return NULL; } void CPartyListMgr::SummonInfo( STR_LIST& vecText ) { if( vecText.size() < 4 ) { assert(0); return; } int nMsgCount = vecText.size(); int nMsgReadCount = 0; int nPos = 2; while( nMsgCount > nPos ) { SPartyMgr* pParty; std::string strMseeage = ""; std::string strCount = vecText[ nPos ]; int nCount = atoi(vecText[ nPos ].c_str()); if(nCount <= 0) { strMseeage = "empty"; strMseeage += "|"; strMseeage += strCount; strMseeage += "|"; ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "creature_info", strMseeage.c_str() ) ); return ; } nPos += 1; for(int i=0; iGetPartyName(); strMseeage += "|"; // 개수 추가 strMseeage += strCount; strMseeage += "|"; } SPlayerSlot* pPlayer = pParty->FindMemberHandle( hMaster ); if(pPlayer == NULL) continue ; pPlayer->SetMainCreatureHandle( hMain ); pPlayer->SetSubCreatureHandle( hSub ); // 핸들(주인, 주크리처, 부크리처) 추가 strMseeage += vecText[ nPos + 0 ]; strMseeage += "|"; strMseeage += vecText[ nPos + 1 ]; strMseeage += "|"; strMseeage += vecText[ nPos + 2 ]; strMseeage += "|"; } nPos += 1; // 파티 아이디를 사용하지 않기 위함 ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "creature_info", strMseeage.c_str() ) ); } } void CPartyListMgr::MemberSummonInfo( STR_LIST& vecText ) { if( vecText.size() < 3 ) { assert(0); return; } char * strstoper; AR_HANDLE hMaster = ::strtoul( vecText[ 2 ].c_str(), &strstoper, 10 ); AR_HANDLE hMain = ::strtoul( vecText[ 3 ].c_str(), &strstoper, 10 ); AR_HANDLE hSub = ::strtoul( vecText[ 4 ].c_str(), &strstoper, 10 ); SPartyMgr* pParty = FindPartyByPlayerHandle( hMaster ); if( pParty == NULL ) return ; SPlayerSlot* pPlayer = pParty->FindMemberHandle( hMaster ); if(pPlayer == NULL) return ; pPlayer->SetMainCreatureHandle( hMain ); pPlayer->SetSubCreatureHandle( hSub ); // 파티 이름 추가 std::string strMseeage = pParty->GetPartyName(); strMseeage += "|"; // 핸들(주인, 주크리처, 부크리처) 추가 strMseeage += vecText[ 2 ]; strMseeage += "|"; strMseeage += vecText[ 3 ]; strMseeage += "|"; strMseeage += vecText[ 4 ]; strMseeage += "|"; ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY, "member_creature_info", strMseeage.c_str() ) ); ProcMsgAtStatic (&SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_PARTY_STATE, "member_creature_info", strMseeage.c_str() ) ); } void CPartyListMgr::Add(SPartyMgr* pSPartyMgr) { if(NULL == pSPartyMgr) return ; std::string strPartyName = pSPartyMgr->GetPartyName(); m_mapPartyInfoList.insert(std::make_pair(strPartyName, pSPartyMgr)); } void CPartyListMgr::Delete(std::string* pstrPartyName) { if(NULL == pstrPartyName) return ; std::map::iterator it = m_mapPartyInfoList.find(*pstrPartyName); if(it == m_mapPartyInfoList.end()) return ; SPartyMgr* p = it->second; SAFE_DELETE(p); m_mapPartyInfoList.erase(it); } SPartyMgr* CPartyListMgr::Find(std::string* pstrPartyName) { if(pstrPartyName == NULL) return (SPartyMgr*)this; if(m_strCommunityName == *pstrPartyName) return (SPartyMgr*)this; std::map::iterator it = m_mapPartyInfoList.find(*pstrPartyName); if(it == m_mapPartyInfoList.end()) return NULL; return it->second; } SPartyMgr* CPartyListMgr::Find(int partyId) { if (m_nCommunityID == partyId) return this; std::map::iterator it = m_mapPartyInfoList.begin(); for (; it != m_mapPartyInfoList.end(); ++it) { if (it->second->GetPartyID() == partyId) return it->second; } return NULL; } SPartyMgr* CPartyListMgr::FindIncludeSlef(std::string* pstrPartyName) { std::map::iterator it = m_mapPartyInfoList.find(*pstrPartyName); if(it != m_mapPartyInfoList.end()) return it->second; if(m_strCommunityName == *pstrPartyName) return (SPartyMgr*)this; return NULL; } // 해당 이름의 캐릭터가 소속된 파티를 찾는다 SPartyMgr* CPartyListMgr::FindPartyByPlayerName(std::string* pstrPlayerName) { if(pstrPlayerName == NULL) return NULL; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; if( pParty->FindMember(pstrPlayerName->c_str()) ) return pParty; } if( FindMember(pstrPlayerName->c_str()) ) return (SPartyMgr*)this; return NULL; } SPartyMgr* CPartyListMgr::FindPartyByPlayerHandle(AR_HANDLE hPlayer) { if(hPlayer <= 0) return NULL; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; if( pParty->FindMemberIndex( hPlayer ) > -1 ) return pParty; } if( FindMemberIndex( hPlayer ) > -1 ) return (SPartyMgr*)this; return NULL; } SPlayerSlot* CPartyListMgr::FindMemberByCreature(AR_HANDLE hCreature, std::string& partyName) { /// 자기 파티 SPlayerSlot* slot = SMessengerMgr::FindMemberByCreature(hCreature); if (slot) { partyName = GetPartyName(); return slot; } std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; slot = pParty->FindMemberByCreature(hCreature); if (slot) { partyName = pParty->GetPartyName(); return slot; } } return NULL; } SPartyMgr* CPartyListMgr::FindPartyByPartyName(std::string* pstrPartyName) { if(pstrPartyName == NULL) return NULL; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; if(pstrPartyName->compare( pParty->GetPartyName() ) == 0) return pParty; } if(pstrPartyName->compare( GetPartyName() ) == 0) return (SPartyMgr*)this; return NULL; } SPartyMgr* CPartyListMgr::FindPartyByLeaderName(std::string* pstrLeaderName) { if(pstrLeaderName == NULL) return NULL; SPlayerSlot* pLeader = SMessengerMgr::GetLeaderInfo(); if(pLeader == NULL) return NULL; if(pstrLeaderName->compare( pLeader->GetName() ) == 0) return this; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; SPlayerSlot* pLeader2 = pParty->GetLeaderInfo(); if(pLeader2 == NULL) return NULL; if(pstrLeaderName->compare( pLeader2->GetName() ) == 0) return pParty; } return NULL; } int CPartyListMgr::FindPartyID(std::string* pPartyName) { if(pPartyName == NULL) return -1; if( pPartyName->compare( GetPartyName() ) == 0) return 0; // 0 번은 내 파티 else { size_t nPos = pPartyName->find_first_of("_") + 1; size_t nEndPos = pPartyName->size(); if(nPos < 2) return 1; std::string strNumber = pPartyName->substr(nPos, nEndPos); int reID = atoi( strNumber.c_str() ) + 2; // 내 파티의 이름으로 뽑은 아이디보다 크면 1을 빼준다. 아니면 그냥 아이디 리턴 if(m_nMyPartyID <= reID) return reID - 1; else return reID; } return -1; } // 2011.11.23 - servantes : 리턴형 변경 bool CPartyListMgr::UpdatePartyPosition( STR_LIST& data, std::string* pstrPartyName) ///< sonador 3.12.1 파티원 좌표 갱신 기능 추가 { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->UpdatePartyPosition(data); } else { bool bUpdate = SPartyMgr::UpdatePartyPosition(data); if(bUpdate == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bUpdate = pParty->UpdatePartyPosition(data); if(bUpdate) break ; } } } return true; } bool CPartyListMgr::CreateCommunity( const char* szCommunityName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->CreateCommunity(szCommunityName); } else { bool bCreate = SMessengerMgr::CreateCommunity(szCommunityName); if(bCreate == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bCreate = pParty->CreateCommunity(szCommunityName); if(bCreate) break ; } } } return true; } bool CPartyListMgr::RefreshMember( STR_LIST& vecText, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->RefreshMember(vecText); } else { bool bRefresh = SMessengerMgr::RefreshMember(vecText); if(bRefresh == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bRefresh = pParty->RefreshMember(vecText); if(bRefresh) break ; } } } return true; } bool CPartyListMgr::JoinMember( const char* szPlayerName, std::string* pszCommunityName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pszCommunityName == NULL) return false; /// 2012.07.10 초대 메세지를 받을 때, m_strCommunityName 이름(파티 이름)을 저장해 놓는데, 아레나 같은 경우에 초대 메세지를 안 받을 경우가 있다. /// 그런 경우를 대비해서 szPlayerName이 자신일 경우에는 m_strCommunityName을 설정한다. if (g_pCurrentGameSystem->isLocalPlayerName(szPlayerName)) m_strCommunityName = *pszCommunityName; /* SGameAvatarEx* localPlayer = g_pCurrentGameSystem->GetLocalPlayer(); if (::_stricmp(szPlayerName, localPlayer->GetName()) == 0) m_strCommunityName = *pszCommunityName; */ SPartyMgr* pParty = GetParty(pszCommunityName); if(pParty == NULL) return false; if( pParty->JoinMember(szPlayerName, pszCommunityName->c_str()) == false) return false; m_bRecvJoinOrLogin = true; if(pParty->FindMember( szPlayerName ) != NULL) { int nMyParty = 4; if (g_pCurrentGameSystem->isLocalPlayerName(szPlayerName)) nMyParty = -1; SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", pszCommunityName->c_str(), number_t( nMyParty ), number_t( pParty->GetPartyType() ) ) ); } return true; } bool CPartyListMgr::LeaveMember( const char* szPlayerName, std::string* pstrPartyName, char const* leaveType) { /// 2011.12.26 유효하지 않은 팝업 메뉴가 될 수 있으므로 hide 시켜 준다 - prodongi SendGameInterfaceMsg(&SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CHARACTER, false)); SendGameInterfaceMsg(&SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_POPUP_PARTY_MENU_CREATURE, false)); /// 2012.07.19 자기 자신이 파티에서 탈퇴할 때, 파티 이름이 삭제가 되어서, 탈퇴했다는 메세지가 출력될 때, /// 파티 이름이 나오지 않는다, 그래서 자신이 탈퇴했을 경우에는 파티 이름을 저장해 놓는다. if (g_pCurrentGameSystem->isLocalPlayerName(szPlayerName)) { m_oldCommunityName = m_strCommunityName; } // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->LeaveMember(szPlayerName); } else { bool bLeave = SMessengerMgr::LeaveMember(szPlayerName); if(bLeave == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bLeave = pParty->LeaveMember(szPlayerName); if(bLeave) break ; } } } if (leaveType) { if (1 == atoi(leaveType)) { checkValidArenaJoinSituationByLeaveAtArena(); } } return true; } bool CPartyListMgr::LoginMember( const char* szPlayerName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->LoginMember(szPlayerName); } else { bool bLogIn = SMessengerMgr::LoginMember(szPlayerName); if(bLogIn == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bLogIn = pParty->LoginMember(szPlayerName); if(bLogIn) break ; } } } return true; } bool CPartyListMgr::LogoutMember( const char* szPlayerName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->LogoutMember(szPlayerName); } else { bool bOut = SMessengerMgr::LogoutMember(szPlayerName); if(bOut == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bOut = pParty->LogoutMember(szPlayerName); if(bOut) break ; } } } return true; } bool CPartyListMgr::ChangeLeader( const char* szPlayerName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->ChangeLeader(szPlayerName); } else { bool bChange = SMessengerMgr::ChangeLeader(szPlayerName); if(bChange == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bChange = pParty->ChangeLeader(szPlayerName); if(bChange) break ; } } } return true; } bool CPartyListMgr::AddMember( SPlayerSlot* pSlot, std::string* pstrPartyName ) { if(pSlot == NULL) return false; if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->AddMember(pSlot); } else { bool bAdd = SPartyMgr::AddMember(pSlot); // lenahyang 12.11.27 - 위험한 코드라 주석 처리 //if(bAdd == false) //{ // std::map::iterator itE = m_mapPartyInfoList.end(); // std::map::iterator itS = m_mapPartyInfoList.begin(); // for(; itS != itE; itS++) // { // SPartyMgr* pParty = itS->second; // bAdd = pParty->AddMember(pSlot); // if(bAdd) // return true; // } //} } return false; } bool CPartyListMgr::AddMember( const char* szName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->AddMember(szName); } else { bool bAdd = SPartyMgr::AddMember(szName); // lenahyang 12.11.27 - 위험한 코드라 주석 처리 //if(bAdd == false) //{ // std::map::iterator itE = m_mapPartyInfoList.end(); // std::map::iterator itS = m_mapPartyInfoList.begin(); // for(; itS != itE; itS++) // { // SPartyMgr* pParty = itS->second; // bAdd = pParty->AddMember(szName); // if(bAdd) // break ; // } //} } return true; } bool CPartyListMgr::DeleteMember( const char* szName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return false; return pParty->DeleteMember(szName); } else { bool bDelete = SPartyMgr::DeleteMember(szName); if(bDelete == false) { std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bDelete = pParty->DeleteMember(szName); if(bDelete) break ; } } } return true; } SPlayerSlot* CPartyListMgr::FindMember( AR_HANDLE hPlayer, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->FindMember(hPlayer); } else { SPlayerSlot* pSlot = SMessengerMgr::FindMember(hPlayer); if(pSlot) return pSlot; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; SPlayerSlot* pSlot = pParty->FindMember(hPlayer); if(pSlot) return pSlot; } } return NULL; } SPlayerSlot* CPartyListMgr::FindMember( const char* szName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->FindMember(szName); } else { SPlayerSlot* pSlot = SMessengerMgr::FindMember(szName); if(pSlot) return pSlot; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; SPlayerSlot* pSlot = pParty->FindMember(szName); if(pSlot) return pSlot; } } return NULL; } SPlayerSlot* CPartyListMgr::GetLeaderInfo(std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->GetLeaderInfo(); } else { SPlayerSlot* pSlot = SMessengerMgr::GetLeaderInfo(); if(pSlot) return pSlot; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; SPlayerSlot* pSlot = pParty->GetLeaderInfo(); if(pSlot) return pSlot; } } return NULL; } AR_HANDLE CPartyListMgr::GetMemberHandle( const char* szName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->GetMemberHandle(szName); } else { AR_HANDLE hHandle = SMessengerMgr::GetMemberHandle(szName); if(hHandle) return hHandle; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; hHandle = pParty->GetMemberHandle(szName); if(hHandle) return hHandle; } } return NULL; } // 2011.11.11 - servantes : 파티 전체에서 캐릭터 이름으로 핸들을 찾는다 AR_HANDLE CPartyListMgr::GetMemberHandleSearchAllParty( const char* szName ) { AR_HANDLE hHandle = SMessengerMgr::GetMemberHandle(szName); if(hHandle) return hHandle; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; hHandle = pParty->GetMemberHandle(szName); if(hHandle) return hHandle; } return NULL; } int CPartyListMgr::GetLoginMemberCount(std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->GetLoginMemberCount(); } else { int nCount = SMessengerMgr::GetLoginMemberCount(); if(nCount) return nCount; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; int nCount = pParty->GetLoginMemberCount(); if(nCount) return nCount; } } return 0; } bool CPartyListMgr::IsFar( AR_HANDLE hPlayer, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->IsFar(hPlayer); } else { SPlayerSlot* pMember = SMessengerMgr::FindMember(hPlayer); if(pMember) return SMessengerMgr::IsFar(hPlayer); std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; SPlayerSlot* pMember = pParty->FindMember(hPlayer); if(pMember) return pParty->IsFar(hPlayer); } } return false; } bool CPartyListMgr::IsExistMember( AR_HANDLE hPlayer, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->IsExistMember(hPlayer); } else { bool bExist = SMessengerMgr::IsExistMember(hPlayer); if(bExist) return bExist; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bExist = pParty->IsExistMember(hPlayer); if(bExist) return bExist; } } return false; } bool CPartyListMgr::IsExistLoginMember(AR_HANDLE hPlayer, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->IsExistLoginMember(hPlayer); } else { bool bExist = SMessengerMgr::IsExistLoginMember(hPlayer); if(bExist) return bExist; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bExist = pParty->IsExistLoginMember(hPlayer); if(bExist) return bExist; } } return false; } bool CPartyListMgr::IsExistMember( const char* szName, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->IsExistMember(szName); } else { bool bExist = SMessengerMgr::IsExistMember(szName); if(bExist) return bExist; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; bExist = pParty->IsExistMember(szName); if(bExist) return bExist; } } return false; } int CPartyListMgr::GetMemberIndex( AR_HANDLE hPlayer, std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->GetMemberIndex(hPlayer); } else { int nIndex = SMessengerMgr::GetMemberIndex(hPlayer); if(nIndex > -1) return nIndex; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; nIndex = pParty->GetMemberIndex(hPlayer); if(nIndex > -1) return nIndex; } } return -1; } int CPartyListMgr::GetLeaderIndex(std::string* pstrPartyName) { // 2011.11.23 - servantes : 찾는 순서 변경 if(pstrPartyName) { SPartyMgr* pParty = GetParty(pstrPartyName); if(pParty == NULL) return NULL; return pParty->GetLeaderIndex(); } else { int nIndex = SMessengerMgr::GetLeaderIndex(); if(nIndex > -1) return nIndex; std::map::iterator itE = m_mapPartyInfoList.end(); std::map::iterator itS = m_mapPartyInfoList.begin(); for(; itS != itE; itS++) { SPartyMgr* pParty = itS->second; nIndex = pParty->GetLeaderIndex(); if(nIndex > -1) return nIndex; } } return -1; } void CPartyListMgr::createParty(std::string& partyName, std::string& partyLeaderName, int partyType) { m_nPartyType = partyType; m_isArenaParty = (PARTY_ARENA == partyType) ? true : false; // 파티원 정보 중에 내가 있는지 검사 bool bMyParty=false; if (g_pCurrentGameSystem->isLocalPlayerName(partyLeaderName.c_str())) bMyParty = true; if(bMyParty) // 내가 있다면 내 파티 { SPartyMgr* pParty = FindIncludeSlef(&partyName); if(pParty == NULL) // 파티가 만들어지지 않았다면 만든다 { // 1 : 던전레이드, 2 : 공격대 if(m_nPartyType == PARTY_DUNGEON_RAID || m_nPartyType == PARTY_SIEGE || m_nPartyType == PARTY_ARENA) { // 레이드 정보 SRaidInfo* pRaidInfo = new SRaidInfo; pRaidInfo->SetPartyName(partyName.c_str()); // party_name pRaidInfo->SetLeaderName(partyLeaderName.c_str()); // leader_name pRaidInfo->SetParytNum(1); // 지금 만들었으니까 파티원수는 1개.. 아래 CreateCommunity 안에 멤버 셋팅다시 해줌 g_pRaidMgr->pushRaidInfo( pRaidInfo ); // 2011. 12. 21 - marine 파티번호 부여하기 위해 함수로 뺌.. } SMessengerMgr::CreateCommunity(partyName.c_str(), partyLeaderName.c_str()); } // 내 파티 이름으로 내 파티 아이디를 찾아 놓는다 size_t nPos = partyName.find_first_of("_") + 1; size_t nEndPos = partyName.size(); std::string strNumber = partyName.substr(nPos, nEndPos); m_nMyPartyID = atoi( strNumber.c_str() ) + 2; // 내 파티를 보이라고 메세지를 보냄 // 명령어 : "show_party_wnd" // 파티이름 : vecText[2].c_str() // 내파티 : -1 // 파티타입 : vecText[7].c_str() SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", m_strCommunityName.c_str(), number_t( -1 ), number_t( m_nPartyType ) ) ); } else // 내가 없다면 다른 파티 { SPartyMgr* pParty = FindIncludeSlef(&partyName); if(pParty) // 파티가 있다면 지운다 { Delete(&partyName); g_pRaidMgr->DeleteParty(partyName.c_str()); } if(m_nPartyType == PARTY_DUNGEON_RAID || m_nPartyType == PARTY_SIEGE || m_nPartyType == PARTY_ARENA) { // 레이드 정보 SRaidInfo* pRaidInfo = new SRaidInfo; pRaidInfo->SetPartyName(partyName.c_str()); // party_name pRaidInfo->SetLeaderName(partyLeaderName.c_str()); // leader_name pRaidInfo->SetParytNum(1); // 지금 만들었으니까 파티원수는 1개.. 아래 CreateCommunity 안에 멤버 셋팅다시 해줌 g_pRaidMgr->pushRaidInfo( pRaidInfo ); // 2011. 12. 21 - marine 파티번호 부여하기 위해 함수로 뺌.. } else if(m_nPartyType == PARTY_BEARROAD) // 3 : PARTY_BEARROAD { SMessengerMgr::CreateCommunity(partyName.c_str()); } SPartyMgr* pPartyMgr = new SPartyMgr; int nPartyType = m_nPartyType; // 1 : PARTY_DUNGEON_RAID // 2 : PARTY_SIEGE if((m_nPartyType == PARTY_DUNGEON_RAID || m_nPartyType == PARTY_SIEGE || m_nPartyType == PARTY_ARENA) && g_pRaidMgr->GetPartyCount()) { nPartyType = PARTY_SIEGE_OTHER; pPartyMgr->SetPartyType(nPartyType); } else pPartyMgr->SetPartyType(nPartyType); pPartyMgr->SetLeaderName (partyLeaderName.c_str()); pPartyMgr->SetLocalPlayerName(partyLeaderName.c_str()); pPartyMgr->CreateCommunity (partyName.c_str()); pPartyMgr->SetGame(m_pGame); Add(pPartyMgr); // 남의 파티를 보이라고 메세지를 보냄 // 명령어 : "show_party_wnd" // 파티이름 : vecText[2].c_str() // 남의파티 : 0 // 파티타입 : m_nPartyType SendGameInterfaceMsg( &SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, true ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", partyName.c_str(), number_t( 0 ), number_t( nPartyType ) ) ); } /// 2012.06.21 - prodongi if (PARTY_NORMAL == m_nPartyType && bMyParty) checkValidArenaJoinSituation(); } void CPartyListMgr::checkValidArenaJoinSituationByLeaveAtArena() { sArenaJoinSituationCondition situationCondition; situationCondition.m_notificationWays = cArenaJoinSituationChecker::WAY_NOTIFICATION_WND; situationCondition.addNone(S(2436)); /// 일반 파티 중에 아레나 참여 g_pCurrentGameSystem->isValidArenaJoinSituation(situationCondition); } ////////////////////////////////////////////////////////////////////////// // SRaidMgr SRaidMgr::SRaidMgr() : SGameUIMgr(), m_nMainPartyID(0), m_nMaxGuildPartyNum(0), m_nMaxMercenaryPartyNum(0), nRaidPartyID(0) // 2011.03.29 - servantes , nRaidPartyPass(0), nMercenaryRaidPartyID(0), nMercenaryRaidPartyPass(0) { g_pRaidMgr = this; m_pRaidInfoList.clear(); } SRaidMgr::~SRaidMgr() { Clear(); } void SRaidMgr::ResetInfo() { Clear(); strPartyManagerName.clear(); strPartyName.clear(); nRaidPartyID = 0; nRaidPartyPass = 0; //Mercenary Invite strMercenaryPartyManagerName.clear(); strMercenaryPartyName.clear(); nMercenaryRaidPartyID = 0; nMercenaryRaidPartyPass = 0; } const char* SRaidMgr::getAttackUnitLeaderName() { size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { if(m_pRaidInfoList[i]->GetPartyID() == m_nMainPartyID) { return m_pRaidInfoList[i]->GetLeaderName(); } } return ""; } const std::string SRaidMgr::getAttackUnitPartyName(int nPartyID) { size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { if(m_pRaidInfoList[i]->GetPartyID() == nPartyID) { return S(12000+i+1); } } return ""; } // 2011. 12, 15 - marine // 원래 다른파티가 JOIN 할 때 Raid정보를 RAID_INFO 에서 가져왔는데 // RMINFO에서 오도록 변경되면서 추가된 함수.. void SRaidMgr::setJoinPartyData(STR_LIST &raid_inf ) { size_t nCount = m_pRaidInfoList.size(); assert(raid_inf.size() == 4 || "str_list size invalid"); if(raid_inf.size() != 4) return; std::string strName = raid_inf.at(0); for(size_t i(0) ; i< nCount ; ++i) { std::string strPartyName = m_pRaidInfoList[i]->GetPartyName(); if(strPartyName == strName) { m_pRaidInfoList[i]->SetLeaderName( raid_inf[1].c_str() ); m_pRaidInfoList[i]->SetLeaderJob_id( atoi(raid_inf[2].c_str()) ); m_pRaidInfoList[i]->SetLeaderLv(0); // 2011. 12. 15 - marine 쓰레기 값이 들어있는데 혹시 몰라서... 현재 사용은 안하는듯.. break; } } } void SRaidMgr::setPartyCount( std::string &strPartyName, int nMemberCount ) { size_t nCount= m_pRaidInfoList.size(); for(size_t i(0) ; iGetPartyName()) == 0 ) { m_pRaidInfoList[i]->SetMemberCount(nMemberCount); m_pGame->SendGameInterfaceMsg( &SIMSG_UI_DUNGEONUNIT_UPDATE() ); break; } } } // 2011.11.16 - servantes : 이름으로 레이드의 지정된 이름( 제1공대, 제2공대... 로 디비에 저장되어 있는 이름 ) 을 찾는다 const std::string SRaidMgr::getAttackUnitPartyName(const char* pPartyName) { if(pPartyName == NULL) return ""; int nPartyNum = 0; std::string strPartyName = pPartyName; size_t nPos = strPartyName.find_first_of("_") + 1; size_t nEndPos = strPartyName.size(); if(nPos == 0) nPartyNum = 0; else { std::string strSub = strPartyName.substr(nPos,nEndPos); nPartyNum = atoi(strSub.c_str())+1; } return S(12001 +nPartyNum); //size_t nCount = m_pRaidInfoList.size(); //for(size_t i(0) ; i< nCount ; ++i) //{ // if(strcmp(m_pRaidInfoList[i]->GetPartyName(), pPartyName) == 0) // { // return S(12000+i+1); // } //} //return ""; } bool SRaidMgr::isPartyLeaderPlayer(char const* playerName) { size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { if (::strcmp(m_pRaidInfoList[i]->GetLeaderName(), playerName) == 0) { return true; } } return false; } void SRaidMgr::Clear() { for( unsigned int i(0); m_pRaidInfoList.size()>i; i++ ) delete m_pRaidInfoList[i]; m_pRaidInfoList.clear(); m_nMainPartyID = 0; m_nMaxGuildPartyNum = 0; m_nMaxMercenaryPartyNum = 0; } int SRaidMgr::AddMessage( const char* szMsg ) { /// 2011.01.19 bool형을 int로 바꿈 - prodongi STR_LIST vecText; MsgSplit( szMsg, vecText, L"|" ); if( vecText.size() < 1 ) return 0;//false; if( ::_stricmp( vecText[0].c_str(), "RAID_INFO" ) == 0 ) // RAID_INFO|main_party_id|max_guild_party_num|max_mercenary_party_num| { // max_guild_party_num + max_mercenary_party_num 만큼 파티 정보 옴 InfoRaid( vecText ); // party_id|leader_name|leader_job_id|member_count|is_guild_party| vecText.clear(); return 1;//true; } /// 2012.06.08 - prodongi else if (::_stricmp(vecText[0].c_str(), "LPINFO") == 0) { InfoArena(vecText); vecText.clear(); return 1; } else if( ::_stricmp( vecText[0].c_str(), "RAID_GUILD_INVITE" ) == 0 )//RAID_GUILD_INVITE|raid_party_manager_name|raid_party_name|raid_party_id|raid_party_password|: 레이드 길드 파티장 초대 메시지 { if( vecText.size() < 5 ) { vecText.clear(); return 0;//false; } strPartyManagerName = vecText[1].c_str(); strPartyName = vecText[2].c_str(); nRaidPartyID = atoi(vecText[3].c_str()); nRaidPartyPass = atoi(vecText[4].c_str()); vecText.clear(); return 0;//false; } else if( ::_stricmp( vecText[0].c_str(), "RAID_MERCENARY_INVITE" ) == 0 )//RAID_MERCENARY_INVITE|raid_party_manager_name|raid_party_name|raid_party_id|raid_party_password|: 레이드 용병 파티장 초대 메시지 { if( vecText.size() < 5 ) { vecText.clear(); return 0;//false; } strMercenaryPartyManagerName = vecText[1].c_str(); strMercenaryPartyName = vecText[2].c_str();; nMercenaryRaidPartyID = atoi(vecText[3].c_str()); nMercenaryRaidPartyPass = atoi(vecText[4].c_str()); vecText.clear(); return 0;//false; } else if( ::_stricmp( vecText[0].c_str(), "RAID_CANCEL" ) == 0 ) // 2011. 10. 24 - marine { vecText.clear(); ResetInfo(); m_pGame->SendGameInterfaceMsg( &SIMSG_UI_DUNGEONUNIT_UPDATE() ); } /// 2011.10.18 - prodongi else if (::_stricmp(vecText[0].c_str(), "RAID_RESULT") == 0) { if (vecText[1] == "SUCC") { number_t h(atoi(vecText[2].c_str())); number_t m(atoi(vecText[3].c_str())); number_t s(atoi(vecText[4].c_str())); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "RAID_RESULT", vecText[1].c_str(), 0, h, m, s)); } else { number_t zero(0); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "RAID_RESULT", vecText[1].c_str(), 0, zero, zero, zero)); } } else if (::_stricmp(vecText[0].c_str(), "RAID_ENTER") == 0) { ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "RAID_ENTER", vecText[1].c_str())); } else if (::_stricmp(vecText[0].c_str(), "SIEGE_STATUS") == 0) { number_t defenseteHp(atoi(vecText[1].c_str())); number_t offenseHp(atoi(vecText[2].c_str())); number_t ownerType(atoi(vecText[3].c_str())); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "SIEGE_STATUS", "", 0, defenseteHp, offenseHp, ownerType)); } else if (::_stricmp(vecText[0].c_str(), "SIEGE_OPPONENT") == 0) { char const* opponentName = (vecText.size() >1) ? vecText[1].c_str() : ""; ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "SIEGE_OPPONENT", opponentName)); } else if (::stricmp(vecText[0].c_str(), "SIEGE_RESULT") == 0) { ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, "SIEGE_RESULT", szMsg)); } else if (::_stricmp(vecText[0].c_str(), "RAID_END") == 0 || ::_stricmp(vecText[0].c_str(), "SIEGE_END") == 0) { ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_RAID_SIEGE_STATUS, vecText[0].c_str())); } else if (::_stricmp(vecText[0].c_str(), "ERROR_IN_BATTLE_ARENA") == 0) { sArenaJoinSituationCondition situationCondition; situationCondition.m_notificationWays = cArenaJoinSituationChecker::WAY_NOTIFICATION_WND; situationCondition.addNone(S(2431)); g_pCurrentGameSystem->isValidArenaJoinSituation(situationCondition); } else if (::_stricmp(vecText[0].c_str(), "ERROR_TARGET_IN_BATTLE_ARENA") == 0) { g_pCurrentGameSystem->GetGame()->AddChatMessage(S(2432)); } vecText.clear(); return 0;//false; } // 2011.12.13 - servantes : 함수내용이 없어 구현 void SRaidMgr::DeleteParty( const char* lpPartyName ) { if (lpPartyName == NULL) return ; size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { if(strcmp(m_pRaidInfoList[i]->GetPartyName(), lpPartyName) != 0) continue; SRaidInfo* pRaidInfo = m_pRaidInfoList[i]; if(pRaidInfo) { SAFE_DELETE(pRaidInfo); m_pRaidInfoList.erase( m_pRaidInfoList.begin() + i ); return ; } } } void SRaidMgr::pushRaidInfo(SRaidInfo* pInfo) { if(!pInfo) return; // 파티이름으로 파티 번호를 결정하고.. int PartyNumber; std::string strPartyName = pInfo->GetPartyName(); size_t nPos = strPartyName.find_first_of("_") + 2; // +2를 하는 이유... 공대이름_0x 에서 x의 스트링만 얻기위해서 size_t nEndPos = strPartyName.size() - 1; if(nPos < 2) // 공대장파티 PartyNumber = 0; else { std::string strNumber = strPartyName.substr(nPos,nEndPos); PartyNumber = atoi(strNumber.c_str())+1; } pInfo->SetParytNum(PartyNumber); m_pRaidInfoList.push_back(pInfo); // 파티번호 순으로 소팅 if(m_pRaidInfoList.size() > 1) std::sort(m_pRaidInfoList.begin(),m_pRaidInfoList.end(),PartyNumCompare()); } int SRaidMgr::getNumUseAttackUnit(std::string &strPartyName) { //공대UI상에서의 순번을 리턴해준다. 0베이스 int partNum = 0; int curCount = m_pRaidInfoList.size(); for(int i=0 ; iGetPartyName()) == 0) { partNum = i; break; } } return partNum; } int SRaidMgr::getNumberAtPartyName(std::string partyName) { // 이름에서 번호를 뽑아내준다. // ex) 팔미르공대 -->0, 팔미르공대_00 ->1 .... 팔미르공대_06->7 int PartyNumber; std::string strPartyName = partyName; size_t nPos = strPartyName.find_first_of("_") + 2; // +2를 하는 이유... 공대이름_0x 에서 x의 스트링만 얻기위해서 size_t nEndPos = strPartyName.size() - 1; if(nPos < 2) // 공대장파티 PartyNumber = 0; else { std::string strNumber = strPartyName.substr(nPos,nEndPos); PartyNumber = atoi(strNumber.c_str())+1; } return PartyNumber; } void SRaidMgr::InfoRaid( STR_LIST& vecText ) { // 2011.12.06 - servantes if( vecText.size() < 6 ) // 처음 공격대 만들었을 경우 { m_nMainPartyID = atoi( vecText[1].c_str() ); m_nMaxGuildPartyNum = atoi( vecText[2].c_str() ); m_nAimDungeonID = atoi( vecText[3].c_str() ); /// 2012.06.08 4->3으로 바뀜 - prodongi return; } m_nMainPartyID = atoi( vecText[1].c_str() ); m_nMaxGuildPartyNum = atoi( vecText[2].c_str() ); m_nAimDungeonID = atoi( vecText[3].c_str() ); /// 2012.06.08 4->3으로 바뀜 - prodongi int nIsGuildParty = atoi( vecText[4].c_str()); // is_guild_party, 2012.06.08 파티마다 있는 정보였는데 최 상단으로 옮겨졌다 - prodongi int nPos = CONST_RAID_INFO_GAP; int totalCount = CONST_RAID_INFO_GAP; int textCount = (int)vecText.size(); while (totalCount < textCount) { if(g_pPartyListMgr->FindIncludeSlef( &vecText[1 + nPos] ) != NULL) continue ; std::string strLeaderName; // 2011.12.05 - servantes : 파티와 레이드 정보를 설정한다 SPartyMgr* pPartyMgr = new SPartyMgr; if(pPartyMgr) { pPartyMgr->SetPartyID( ::atoi(vecText[0 + nPos].c_str()) ); pPartyMgr->CreateCommunity( vecText[1 + nPos].c_str(), vecText[2 + nPos].c_str() ); pPartyMgr->SetLocalPlayerName( g_pCurrentGameSystem->getLocalPlayerName() ); pPartyMgr->SetGame( m_pGame ); g_pPartyListMgr->Add(pPartyMgr); // 파티 매니저 리스트에 파티 매니저 추가 // 레이드 정보 SRaidInfo* pRaidInfo = new SRaidInfo; pRaidInfo->SetPartyID ( atoi( vecText[0 + nPos].c_str() ) ); // party_id pRaidInfo->SetPartyName ( vecText[1 + nPos].c_str() ); // party_name 2011. 10. 18 - marine pRaidInfo->SetLeaderName ( vecText[2 + nPos].c_str() ); // leader_name pRaidInfo->SetLeaderLv ( atoi( vecText[3 + nPos].c_str() ) ); // leader_lv pRaidInfo->SetLeaderJob_id( atoi( vecText[4 + nPos].c_str() ) ); // leader_job_id pRaidInfo->SetMemberCount ( atoi( vecText[5 + nPos].c_str() ) ); // member_count pRaidInfo->SetGguildParty( nIsGuildParty > 0 ? true : false ); //PARTY_NORMAL : 0 PARTY_SIEGE_OTHER :4 (nIsGuildParty) ? pPartyMgr->SetPartyType(PARTY_SIEGE_OTHER) : pPartyMgr->SetPartyType(PARTY_NORMAL); strLeaderName = vecText[2 + nPos].c_str(); // leader_name int nRaidMemberCount = atoi( vecText[5 + nPos].c_str() ); //m_pRaidInfoList.push_back( pRaidInfo ); // 레이드 정보 리스트에 추가 pushRaidInfo( pRaidInfo ); // 2011. 12. 21 - marine 파티번호 부여하기 위해 함수로 뺌.. // 1 : 공격대 if(nIsGuildParty == 1) { std::string strCommunityName = vecText[1 + nPos]; std::string::size_type offset = 0; offset = strCommunityName.find( "_", offset ); if( std::string::npos == offset ) g_pRaidMgr->setAttackUnitName(strCommunityName.c_str()); // 2011.12.07 - servantes '_'가 없는 공격대 이름만 넣는다 } nPos += CONST_RAID_INFO_COUNT; // 레이드 정보 개수 totalCount += CONST_RAID_INFO_COUNT; // 파티원 정보들 for(int x=0; x < nRaidMemberCount; x++) { SPlayerSlot* pSlot = pPartyMgr->FindMember( vecText[1 + nPos].c_str() ); if(pSlot == NULL) { pSlot = new SPlayerSlot; pPartyMgr->AddMember( pSlot ); // 새로운 멤버 추가 } char * strstoper; AR_HANDLE handle = ::strtoul( vecText[0+nPos].c_str(), &strstoper, 10 ); pSlot->SetHandle ( handle ); pSlot->SetName ( vecText[1 + nPos].c_str() ); pSlot->SetJobID ( ::atoi( vecText[2 + nPos].c_str() ) ); if( ::atoi( vecText[3 + nPos].c_str() ) ) { pSlot->SetHP ( 100 ); pSlot->SetMP ( 100 ); } else { pSlot->SetHP ( 0 ); pSlot->SetMP ( 0 ); } if(strLeaderName.compare(vecText[1 + nPos].c_str()) == 0) // 리더인지 이름 비교 검사 pSlot->SetLeader(true); else pSlot->SetLeader(false); nPos += CONST_PARTY_MEMBER_INFO_COUNT; // 파티원 정보 개수 totalCount += CONST_PARTY_MEMBER_INFO_COUNT; } SDEBUGLOG( "-@파티 정보 출력(레이드)------------------------------------------------------------------------------------------" ); SDEBUGLOG( "[파티 아이디] - [%u]" , pPartyMgr->GetPartyID() ); SDEBUGLOG( "[파티 이름] - [%s]" , pPartyMgr->GetPartyName() ); SDEBUGLOG( "[파티 리더 이름] - [%s]" , pPartyMgr->GetPartyLeaderName() ); SDEBUGLOG( "[파티 멤버 수] - [%u]" , pPartyMgr->GetMemberCount() ); std::vector vecTempPartyMemberList = pPartyMgr->GetMemberList(); SDEBUGLOG( "################ 파티 멤버 정보 ######################" ); for( UINT nCount = 0 ; nCount < vecTempPartyMemberList.size(); nCount++ ) { SPlayerSlot* pMember( vecTempPartyMemberList[nCount] ); { SDEBUGLOG( "[파티 멤버 카운트] - [%u]", nCount ); SDEBUGLOG( "[파티 멤버 이름] - [%s]", pMember->GetName() ); SDEBUGLOG( "[파티 멤버 핸들] - [%u]", pMember->GetHandle() ); } } SDEBUGLOG( "################ 파티 멤버 정보 끝 ######################" ); SDEBUGLOG( "-@파티 정보 출력 끝(레이드)----------------------------------------------------------------------------------------" ); } SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", pPartyMgr->GetPartyName(), number_t( 0 ), number_t( pPartyMgr->GetPartyType() ) ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "refresh_all_ui", pPartyMgr->GetPartyName() ) ); } } //----------------------------------------------------------------------------------------------------------------- // 2012.06.08 InfoRaid함수를 변형함, // 상당이 안 좋은 함수다!!!!!, // 하지만 기존 코드를 바꿀 수가 없어서 비슷하게 함 -_- prodongi // // 2012.11.19 BattleArena에서 죽는다.. 버그 잡기 위해 코드 수정... 코드 보소 ㅠㅠ... - lenahyang //----------------------------------------------------------------------------------------------------------------- void SRaidMgr::InfoArena( STR_LIST& vecText ) { m_nMainPartyID = atoi( vecText[1].c_str() ); // 리드 파티 아이디 m_nMaxGuildPartyNum = atoi( vecText[2].c_str() ); // 최대 길드 파티 개수 m_arenaType = atoi( vecText[3].c_str() ); // 파티 타입 // 처음 공격대 만들었을 경우 : 누가 이런식으로 코딩하나... if( vecText.size() < 6 ) return ; int LPINFO_GAP( 4 ); int LPINFO_PARTY_TOKEN_COUNT( 6 ); int LPINFO_MEMBER_TOKEN_COUNT( 4 ); int nPos( LPINFO_GAP ); int totalCount( LPINFO_GAP ); int textCount( (int)vecText.size() ); while (totalCount < textCount) { int nIsGuildParty( 1 ); /// 고정? int nPartyID( atoi( vecText[0 + nPos].c_str() ) ); // 파티 아이디 std::string strPartyName( vecText[1 + nPos] ); // 파티 이름 std::string strLeaderName( vecText[2 + nPos] ); // 파티 리더 이름 int nLeaderLevel( atoi( vecText[3 + nPos].c_str() ) ); // 파티 리더 레벨 int nLeaderJobID( atoi( vecText[4 + nPos].c_str() ) ); // 파티 리더 직업 ID int nRaidMemberCount( atoi( vecText[5 + nPos].c_str() ) ); // 파티 맴버 수 if(g_pPartyListMgr->FindIncludeSlef( &strPartyName ) != NULL) continue ; SPartyMgr* pPartyMgr( new SPartyMgr ); if( NULL == pPartyMgr ) { SDEBUGLOG( "[SRaidMgr] Memory Alloc Failed. Critical Error "); assert( pPartyMgr ); return; } // 파티 정보 pPartyMgr->SetPartyID ( nPartyID ); pPartyMgr->CreateCommunity ( strPartyName.c_str(), strLeaderName.c_str() ); pPartyMgr->SetLocalPlayerName ( g_pCurrentGameSystem->getLocalPlayerName() ); pPartyMgr->SetGame( m_pGame ); g_pPartyListMgr->Add( pPartyMgr ); // 레이드 정보 SRaidInfo* pRaidInfo( new SRaidInfo ); if( pRaidInfo ) { pRaidInfo->SetPartyID ( nPartyID ); pRaidInfo->SetPartyName ( strPartyName.c_str() ); pRaidInfo->SetLeaderName ( strLeaderName.c_str() ); pRaidInfo->SetLeaderLv ( nLeaderLevel ); pRaidInfo->SetLeaderJob_id ( nLeaderJobID ); pRaidInfo->SetMemberCount ( nRaidMemberCount ); pRaidInfo->SetGguildParty ( nIsGuildParty > 0 ? true : false ); // 길드 파티 인가? } (nIsGuildParty) ? pPartyMgr->SetPartyType(PARTY_SIEGE_OTHER) : pPartyMgr->SetPartyType(PARTY_NORMAL); pushRaidInfo( pRaidInfo ); // 2011. 12. 21 - marine 파티번호 부여하기 위해 함수로 뺌.. // 1 : 공격대 if( nIsGuildParty == 1 ) { std::string strCommunityName = vecText[1 + nPos]; std::string::size_type offset = 0; offset = strCommunityName.find( "_", offset ); if( std::string::npos == offset ) g_pRaidMgr->setAttackUnitName(strCommunityName.c_str()); // 2011.12.07 - servantes '_'가 없는 공격대 이름만 넣는다 } nPos += LPINFO_PARTY_TOKEN_COUNT; totalCount += LPINFO_PARTY_TOKEN_COUNT; // 파티원 정보들 for(int x=0; x < nRaidMemberCount; x++) { std::string strPlayerName( vecText[1 + nPos] ); int nJobID( atoi( vecText[2 + nPos].c_str() ) ); if( g_pCurrentGameSystem->isLocalPlayerName( strPlayerName.c_str() ) ) strPlayerName = g_pCurrentGameSystem->getLocalPlayerName(); SPlayerSlot* pSlot = pPartyMgr->FindMember( strPlayerName.c_str() ); if( pSlot == NULL ) { pSlot = new SPlayerSlot; if( NULL == pSlot ) { SDEBUGLOG( "[SRaidMgr] Memory Alloc Failed. Critical Error "); assert( pSlot ); continue; } else pPartyMgr->AddMember( pSlot ); } char* strstoper( NULL ); AR_HANDLE handle( ::strtoul( vecText[0+nPos].c_str(), &strstoper, 10 ) ); pSlot->SetHandle ( handle ); pSlot->SetName ( strPlayerName.c_str() ); pSlot->SetJobID ( nJobID ); if( atoi( vecText[3 + nPos].c_str() ) ) { pSlot->SetHP ( 100 ); pSlot->SetMP ( 100 ); } else { pSlot->SetHP ( 0 ); pSlot->SetMP ( 0 ); } if( strLeaderName.compare(vecText[1 + nPos].c_str()) == NULL ) // 리더인지 이름 비교 검사 pSlot->SetLeader(true); else pSlot->SetLeader(false); nPos += LPINFO_MEMBER_TOKEN_COUNT; totalCount += LPINFO_MEMBER_TOKEN_COUNT; } SDEBUGLOG( "-@파티 정보 출력(아레나)------------------------------------------------------------------------------------------" ); SDEBUGLOG( "[파티 아이디] - [%u]" , pPartyMgr->GetPartyID() ); SDEBUGLOG( "[파티 이름] - [%s]" , pPartyMgr->GetPartyName() ); SDEBUGLOG( "[파티 리더 이름] - [%s]" , pPartyMgr->GetPartyLeaderName() ); SDEBUGLOG( "[파티 멤버 수] - [%u]" , pPartyMgr->GetMemberCount() ); std::vector vecTempPartyMemberList = pPartyMgr->GetMemberList(); SDEBUGLOG( "################ 파티 멤버 정보 ######################" ); for( UINT nCount = 0 ; nCount < vecTempPartyMemberList.size(); nCount++ ) { SPlayerSlot* pMember( vecTempPartyMemberList[nCount] ); { SDEBUGLOG( "[파티 멤버 카운트] - [%u]", nCount ); SDEBUGLOG( "[파티 멤버 이름] - [%s]", pMember->GetName() ); SDEBUGLOG( "[파티 멤버 핸들] - [%u]", pMember->GetHandle() ); } } SDEBUGLOG( "################ 파티 멤버 정보 끝 ######################" ); SDEBUGLOG( "-@파티 정보 출력 끝(아레나)----------------------------------------------------------------------------------------" ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd", pPartyMgr->GetPartyName(), number_t( 0 ), number_t( pPartyMgr->GetPartyType() ) ) ); SendGameInterfaceMsg( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "refresh_all_ui", pPartyMgr->GetPartyName() ) ); } } char const* SRaidMgr::getLeaderName(int index) { if (0 > index || index >= (int)m_pRaidInfoList.size()) return ""; return m_pRaidInfoList[index]->GetLeaderName(); } SRaidInfo* SRaidMgr::GetRaidInfo(int index) { if (0 > index || index >= (int)m_pRaidInfoList.size()) return NULL; return m_pRaidInfoList[index]; } SRaidInfo* SRaidMgr::GetTopRaidInfo() { size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { std::string strCommunityName = m_pRaidInfoList[i]->GetPartyName(); std::string::size_type offset = 0; offset = strCommunityName.find( "_", offset ); if( std::string::npos == offset ) // '_'가 없다 { return m_pRaidInfoList[i]; } } return NULL; } SRaidInfo* SRaidMgr::GetRaidInfo(const char* pPartyName) { if (pPartyName == NULL) return NULL; size_t nCount = m_pRaidInfoList.size(); for(size_t i(0) ; i< nCount ; ++i) { if(strcmp(m_pRaidInfoList[i]->GetPartyName(), pPartyName) == 0) { return m_pRaidInfoList[i]; } } return NULL; } ////////////////////////////////////////////////////////////////////////// // SGuildMgr //---------------------------------- // SRaidSiege // #include void SRaidSiege::SetInfo( int _nType, int _nTime, std::string & _strGuildName, std::string & _strGuildMaster, int _nGuildCount, int _nGuildDungeon ) { nType = _nType; strGuildName = _strGuildName; strGuildMaster = _strGuildMaster, nGuildCount = _nGuildCount; nGuildDungeon = _nGuildDungeon; //if( _nTime == 0 ) //{ // nTime_hour = 0; // 타임어택 시. // nTime_min = 0; // 분. // nTime_sec = 0; // 초. //} //else //{ // time_t lTime = _nTime; // struct tm * _time; // _time = localtime( &lTime ); // nTime_hour = _time->tm_hour; // 타임어택 시. // nTime_min = _time->tm_min; // 분. // nTime_sec = _time->tm_sec; // 초. //} if( _nTime == 0 ) { nTime_hour = 0; // 타임어택 시. nTime_min = 0; // 분. nTime_sec = 0; // 초. } else { int hour(0); int min(0); int sec(0); float f_Time = (float)_nTime * 0.01f; if( f_Time >= 3600 ) { hour = f_Time/3600; f_Time -= 3600*hour; } if( f_Time >= 60 ) { min = f_Time/60; f_Time = f_Time -= 60*min; } sec = f_Time; nTime_hour = hour; // 타임어택 시. nTime_min = min; // 분. nTime_sec = sec; // 초. } } //---------------------------------- int SGuildMgr::m_arrRank[11] = { 0, 5000, 10000, 20000, 40000, 80000, 160000, 320000, 640000, 1280000, -1 }; SGuildMgr::SGuildMgr() : SMessengerMgr() // 2011.03.29 - servantes { Clear(); } void SGuildMgr::Clear() { SMessengerMgr::Clear(); m_nMemberCount = 0; // bintitle. 2010.12.07. m_strMsg = m_strCommunityName; // bintitle. 2010.04.20 // 연합길드정보 제거. ClearAlliance(); // 길드 권한등급 비트플래그(권한세트). for( int i=0; iSetHandle( nHandle ); pSlot->SetName( vecText[2].c_str() ); pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); pSlot->SetAuthority( ::atoi( vecText[5].c_str() ) ); // 권한등급. pSlot->SetHP( ::atoi( vecText[6].c_str() ) ); pSlot->SetMP( ::atoi( vecText[7].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[8].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[9].c_str() ) ); pSlot->SetLogin( ::atoi( vecText[10].c_str() ) ); pSlot->SetPoint( ::atoi( vecText[11].c_str() ) ); pSlot->SetTotalPoint( ::atoi( vecText[12].c_str() ) ); //if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); m_vecMemberList.push_back(pSlot); } else { SPlayerSlot* pSlot = FindMember( vecText[2].c_str() ); if( pSlot == NULL ) return false; pSlot->SetHandle( nHandle ); pSlot->SetLevel( ::atoi( vecText[3].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[4].c_str() ) ); pSlot->SetAuthority( ::atoi( vecText[5].c_str() ) ); // 권한등급. pSlot->SetHP( ::atoi( vecText[6].c_str() ) ); pSlot->SetMP( ::atoi( vecText[7].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[8].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[9].c_str() ) ); pSlot->SetLogin( ::atoi( vecText[10].c_str() ) ); pSlot->SetPoint( ::atoi( vecText[11].c_str() ) ); pSlot->SetTotalPoint( ::atoi( vecText[12].c_str() ) ); //if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !(IsFar(pSlot->GetHandle())) ); } return true; } const int SGuildMgr::GetLoginMemberCount() { int nCount = 0; std::vector::iterator it = m_vecMemberList.begin(); while( it != m_vecMemberList.end() ) { SPlayerSlot* pSlot = (*it); if( pSlot->IsLogin() || pSlot->IsDenial() ) nCount++; it++; } return nCount; } void SGuildMgr::ResetInfo() { m_strMsg.clear(); m_strCommunityName.clear(); SMessengerMgr::Clear(); /////////////////////////// // bintitle. 2010.05.24 // 연합길드정보 제거. ClearAlliance(); // 길드 권한등급 비트플래그(권한세트). for( int i=0; i& vMemberlist ) { for( unsigned int i(0); m_vecMemberList.size()>i; i++ ) { vMemberlist.push_back( m_vecMemberList[i]->GetHandle() ); } } // 길드 던전 레이드/시즈 관련 정보설정. void SGuildMgr::SetRaidInfo( STR_LIST& vecRaid ) { m_RaidSiege.Reset(); m_RaidSiege.SetInfo( ::atoi( vecRaid[ 1 ].c_str() ), ::atoi( vecRaid[ 2 ].c_str() ), vecRaid[ 3 ], vecRaid[ 4 ], ::atoi( vecRaid[ 5 ].c_str() ), ::atoi( vecRaid[ 6 ].c_str() ) ); } // 길드원 이름으로 길드원 얻기. SPlayerSlot * SGuildMgr::GetPlayerByName( const char * strName ) { for( std::vector< SPlayerSlot * >::iterator it=m_vecMemberList.begin(); it!=m_vecMemberList.end(); ++it ) { if( !::_stricmp( (*it)->GetName(), strName ) ) { return (*it); } } return NULL; } // 수정 2010.04.14 bintitle. // token 변경. 길드 관련 추가( MEMO, AINFO ) //int SGuildMgr::AddMessage( const char* szMsg, int& nNewGuilID ) int SGuildMgr::AddMessage( const char* szMsg, int& nNewGuilID, bool & bSelf ) // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. { /// 2011.01.19 bool형을 int로 바꿈 - prodongi STR_LIST vecText; MsgSplit_Ex( szMsg, vecText, L"|" ); size_t nTextSize = vecText.size(); if( nTextSize < 1 ) return 0;//false; const char * pStrToken = vecText[0].c_str(); if( ::_stricmp( pStrToken, "CHANGE_PERMISSION_NAME" ) == 0 ) // 권한이름. CHANGE_PERMISSION_NAME|권한번호|변경 후 권한이름 { SetAuthorityClassName( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_NAME; } else if( ::_stricmp( pStrToken, "INVITE" ) == 0 ) // INVITE|파티장이름|[파튀,길드]이름|파티ID|파티PW| { if( nTextSize < 5 ) { vecText.clear(); return 0;//false; } m_strMsg = vecText[1]; m_strCommunityName = vecText[2]; m_nCommunityID = ::atoi( vecText[3].c_str() ); m_nCommunityPassword = ::atoi( vecText[4].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_INVITE; } else if( ::_stricmp( pStrToken, "KICK" ) == 0 ) // KICK|[파튀,길드]이름|캐릭이름 { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } LeaveMember( vecText[2].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_KICK; } else if( ::_stricmp( pStrToken, "LOGIN" ) == 0 ) // LOGIN|[파튀,길드]이름|캐릭이름 { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } LoginMember( vecText[2].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_LOGIN; } else if( ::_stricmp( pStrToken, "CHANGE_NAME" ) == 0 ) //CHANGE_NAME|old_name|new_name| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } #ifdef _DEBUG const char * pOldName = vecText[1].c_str(); const char * pNewName = vecText[2].c_str(); #endif SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetName( vecText[2].c_str() ); pPlayerSlot->GetHandle(); //지역 방송 되므로 따로 이름 바꿀 필요 없음 } vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_NAME; } else if( ::_stricmp( pStrToken, "CHANGE_GUILD_NAME" ) == 0 ) //CHANGE_GUILD_NAME|guild_id|guild_name| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } //길드 아이콘 메니저에서도 한번 더 처리 int nGuilID = atoi( vecText[1].c_str() ); if( m_nCommunityID == nGuilID ) { //내 길드 이면, 이름 변경 m_strCommunityName = vecText[2]; m_strGuildName = vecText[2]; } //UI 길드 이름 변경 SIMSG_UI_CHANGE_GUILD_NAME msg; msg.m_nGuildID = nGuilID; msg.m_strNewGuildName = vecText[2]; SendGameInterfaceMsg( &msg ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_GUILD_NAME; } else if( ::_stricmp( pStrToken, "CHANGE_LEVEL" ) == 0 ) //CHANGE_NAME|캐릭터이름|레벨| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetLevel( ::atoi( vecText[2].c_str() ) ); } vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_LEVEL; } else if( ::_stricmp( pStrToken, "CHANGE_JOB" ) == 0 ) //CHANGE_NAME|캐릭터이름|직업| { if( nTextSize < 3 ) { vecText.clear(); return 0;//false; } SPlayerSlot * pPlayerSlot = FindMember( vecText[1].c_str() ); if( pPlayerSlot ) { pPlayerSlot->SetJobID( ::atoi( vecText[2].c_str() ) ); } vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_JOB; } else if( ::_stricmp( pStrToken, "CREATE" ) == 0 ) // CREATE|[파튀,길드]이름|파튀장 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } CreateCommunity( vecText[1].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CREATE; } else if( ::_stricmp( pStrToken, "JOIN" ) == 0 ) // JOIN|[파튀,길드]이름| // 새 멤버(=자기자신)에게 { int k=0; if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } JoinMember( m_strLocalPlayerName.c_str(), vecText[1].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_JOIN; } else if( ::_stricmp( pStrToken, "NEW" ) == 0 ) // NEW|캐릭이름| // 기존 멤버에게만 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } JoinMember( vecText[1].c_str(), m_strCommunityName.c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_NEW; } else if( ::_stricmp( pStrToken, "LEAVE" ) == 0 ) // LEAVE|캐릭이름 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } SPlayerSlot* pPlayerSlot = FindMember( vecText[1].c_str() ); //캐릭터 창 길드 정보 숨긴다. if( pPlayerSlot ) { SendGameInterfaceMsg( &SIMSG_UI_GUILDICON_LEAVE(pPlayerSlot->GetHandle()) ); } LeaveMember( vecText[1].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_LEAVE; } else if( ::_stricmp( pStrToken, "LOGOUT" ) == 0 ) // LOGOUT|캐릭이름 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } LogoutMember( vecText[1].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_LOGOUT; } else if( ::_stricmp( pStrToken, "PROMOTE" ) == 0 ) // PROMOTE|캐릭이름 // 파티장 변경 { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } // "PROMOTE|파티ID|캐릭이름" 으로 변경됨 ChangeLeader( vecText[2].c_str() ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_PROMOTE; } else if( ::_stricmp( pStrToken, "GINFO" ) == 0 ) // GINFO , 길드SID, 길드명, 길마이름, 멤버수, 길드공지, 멤버모집 중 여부, 소유던전ID { if( nTextSize < 2 ) { vecText.clear(); return 0;//false; } nNewGuilID = atoi( vecText[1].c_str() ); InfoMember( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_GINFO; } else if( ::_stricmp( pStrToken, "MINFO" ) == 0 ) // MINFO|AR_HANDLE|이름|레벨|직업CODE|권한등급|HP%|MP%|X|Y|온/오프라인| { RefreshMember( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_MINFO; } else if( ::_stricmp( pStrToken, "DESTROY" ) == 0 ) // DESTROY|[파티,길드]이름 { SIMSG_UI_GUILDICON_REFRESH msg; msg.nGuild_id = m_nCommunityID; msg.strGuildName = "#@DELETEGUILD@#"; msg.strIconAniName = "#@DELETEGUILD@#"; GetMemberHandle( msg.vHandleList ); SendGameInterfaceMsg( &msg ); Clear(); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_DESTROY; } else if( ::_stricmp( pStrToken, "GMEMBER" ) == 0 ) // GMEMBER|AR_HANDLE|이름|레벨|직업CODE|권한등급|HP%|MP%|X|Y|온/오프라인| { AddMember( vecText, bSelf ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_GMEMBER; } else if( ::_stricmp( pStrToken, "LIST" ) == 0 ) // LIST|캐릭이름|분배방|최고렙|최저 { ChangeGuildInfo( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_LIST; } else if( ::_stricmp( pStrToken, "MEMO" ) == 0 ) // MEMO|유저명|메모 내용 { SetMemo( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_MEMO; } else if( ::_stricmp( pStrToken, "AINFO" ) == 0 ) // 연합길드 정보. // AINFO|연합SID|연합명|멤버수|연합장길드SID| <= 기본으로 들어오는 토큰. // 이후 연합길드 수 만큼 4개 단위 [ 길드SID|길드명|길마이름|맴버수 ] 토큰이 뒤에 붙어 온다. { SetAllianceGuild( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_AINFO; } else if( ::_stricmp( pStrToken, "CHANGE_PERMISSION" ) == 0 ) // 권한등급변경. 캐릭터명|권한등급 { ChangeAuthorityClass( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION; } else if( ::_stricmp( pStrToken, "CHANGE_PERMISSION_SET" ) == 0 )// 권한등급비트플래그(권한세트) 변경. 권한등급|권한_비트셋 { ChangeAuthorityClassBitSet( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_SET; } else if( ::_stricmp( pStrToken, "GPERMISSION" ) == 0 ) // 권한등급 권한이름1|권한셋1|권한이름2|권한셋2|권한이름3|권한셋3|권한이름4|권한셋4|권한이름5|권한셋5|권한이름6|권한셋6 { SetAuthorityClass( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_GPERMISSION; } else if( ::_stricmp( pStrToken, "NOTICE" ) == 0 ) // 길드공지 NOTICE|공지내용 { SetNotice( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_NOTICE; } else if( ::_stricmp( pStrToken, "URL" ) == 0 ) // 길드 URL. URL|%s { if( vecText.size() >= 2 ) { SetURL( vecText[ 1 ] ); } vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_URL; } else if( ::_stricmp( pStrToken, "GBUFF" ) == 0 || ::_stricmp( pStrToken, "GDONATE" ) == 0 || ::_stricmp( pStrToken, "GUPGRADE" ) == 0 ) { SetGuildMemberPoint( vecText ); SetGradePoint( vecText ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_DONATION; } else if( ::_stricmp( pStrToken, "GRAIDSIEGETIP" ) == 0 ) // 길드 던전 레이드/시즈. GRAIDSIEGETIP %d %d %s %s %d %d // GRAIDSIEGETIP | 정보 타입 | 타임 레코드 | 길드 이름 | 길마 이름 | 길드원 수 | 던전 ID { if( vecText.size() >= 7 ) { SetRaidInfo( vecText ); // 길드 던전 레이드/시즈 관련 정보설정. /// 2011.05.16 ProcMsgAtStatic는 정적 입력 변수이다 - prodongi //this->ProcMsgAtStatic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_GUILD_SUB_MANAGE, "GUILD_RAID" ) ); this->ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_GUILD_SUB_MANAGE, "GUILD_RAID" ) ); } vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_GRAIDSIEGETIP; } else if( ::_stricmp( pStrToken, "ERROR_PERMISSION" ) == 0 ) // 길드원 추방시 추방대상이 등급이 높은경우. // ERROR_PERMISSION { /// 2011.05.16 ProcMsgAtStatic는 정적 입력 변수이다 - prodongi //ProcMsgAtStatic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_GUILD_SUB_MANAGE_EXPULSION, "ERROR_PERMISSION" ) ); ProcMsgAtStatic( &SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE::UIWINDOW_GUILD_SUB_MANAGE_EXPULSION, "ERROR_PERMISSION" ) ); vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_ERROR_PERMISSION; } else if( ::_stricmp( pStrToken, "ERROR_NOT_EXIST" ) == 0 ) // 길드원 초대시 없는 캐릭터 인경우. { /// 2011.05.16 ProcMsgAtStatic는 정적 입력 변수이다 - prodongi //ProcMsgAtStatic( new SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID::MSGBOX_GUILD_YES, S( 1920 ) ) ); // stringDB 필요. ProcMsgAtStatic( &SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID::MSGBOX_GUILD_YES, S( 1920 ) ) ); // stringDB 필요. vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_ERROR_NOT_EXIST; } //else if( ::_stricmp( pStrToken, "ASSIST" ) == 0 ) // ASSIST|handle| //{ // char * strstoper; // AR_HANDLE hassist = ::strtoul( vecText[1].c_str(), &strstoper, 10 ); // if( m_pGame ) m_pGame->AssistTarget( hassist ); // return true; //} vecText.clear(); return GUILD_UPDATE::GUILD_UPDATE_NONE; } void SGuildMgr::InfoMember( STR_LIST& vecText ) { // GINFO , 길드SID, 길드명, 길마이름, 멤버수, 길드공지, 멤버모집 중 여부, 소유던전ID m_bParsing = true; m_bIsExist = true; size_t nTextSize = vecText.size(); if( nTextSize >= 10 ) { m_nCommunityID = atoi( vecText[1].c_str() ); // 길드 ID m_strCommunityName = vecText[2]; // 길드명 m_strLeaderName = vecText[3]; // 길마명 m_strGuildName = m_strCommunityName; m_strGulidLeaderName = m_strLeaderName; m_nMemberCount = ::atoi( vecText[4].c_str() ); // 맴버수 m_strNotice = vecText[5]; // 길드공지 m_bRecruitment = ::atoi( vecText[6].c_str() ); // 길드원 모집 여부. m_nDungeonID = ::atoi( vecText[7].c_str() ); // 소유던전ID m_URL = vecText[8]; // URL XStringUtil::Replace( m_URL, "http://", "" ); m_nGrade = ::atoi( vecText[9].c_str() ); m_nPoint = ::atoi( vecText[10].c_str() ); } } // //void SGuildMgr::InfoMember( STR_LIST& vecText ) //{ // // GINFO|길드ID|길드이름|장이름||전투대장이름|최고렙|최저렙|AR_HANDLE|이름|레벨|직업CODE|HP%|MP%|X|Y|소환수플래그| // m_bParsing = true; // m_bIsExist = true; // // size_t nTextSize = vecText.size(); // if( nTextSize > 5 ) // { // m_nCommunityID = atoi( vecText[1].c_str() ); // // m_strCommunityName = vecText[2]; // m_strLeaderName = vecText[3]; // // // sonador 3.5.1 던전 시즈 레벨 제한 // std::string& strBattleCommanderName = vecText[ 4 ]; // strBattleCommanderName.erase( std::remove( strBattleCommanderName.begin(), strBattleCommanderName.end(), ' ' ), strBattleCommanderName.end() ); // // m_strGuildName = m_strCommunityName; // m_strBattleCommanderName = strBattleCommanderName; // m_strGulidLeaderName = m_strLeaderName; // // m_nMaxLevel = ::atoi( vecText[4].c_str() ); // m_nMinLevel = ::atoi( vecText[5].c_str() ); // // //기존 멤버 리스트 초기화 // Free(); // } ///* // int nLine = static_cast(vecText.size()) - 6; // int nCount = nLine / 9; // // int nPos = 0; // for( int i = 0; i < nCount; i++ ) // { // if( i > 0 ) nPos = (9*i); // if( !IsExistMember(vecText[7+nPos].c_str()) ) // { // SPlayerSlot* pSlot = new SPlayerSlot; // // char * strstoper; // AR_HANDLE handle = ::strtoul( vecText[6+nPos].c_str(), &strstoper, 10 ); // pSlot->SetHandle( handle ); // // pSlot->SetName( vecText[7+nPos].c_str() ); // pSlot->SetLevel( ::atoi( vecText[8+nPos].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[9+nPos].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[10+nPos].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[11+nPos].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[12+nPos].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[13+nPos].c_str() ) ); // pSlot->SetCreature( ::atoi( vecText[14+nPos].c_str() ), 0 ); // // if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); // // m_vecMemberList.push_back(pSlot); // // //Test Code // //for( int t(0); 20>t; ++t ) // //{ // // SPlayerSlot* pSlot1 = new SPlayerSlot; // // pSlot1->SetName( CStringUtil::StringFormat("TEST_%d",t).c_str() ); // // // pSlot1->SetLevel( pSlot->GetLevel() ); // // pSlot1->SetJobID( pSlot->GetJobID() ); // // // m_vecMemberList.push_back(pSlot1); // //} // } // else // { // SPlayerSlot* pSlot = FindMember( vecText[7+nPos].c_str() ); // if( pSlot == NULL ) continue; // // char * strstoper; // AR_HANDLE handle = ::strtoul( vecText[6+nPos].c_str(), &strstoper, 10 ); // pSlot->SetHandle( handle ); // // pSlot->SetName( vecText[7+nPos].c_str() ); // pSlot->SetLevel( ::atoi( vecText[8+nPos].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[9+nPos].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[10+nPos].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[11+nPos].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[12+nPos].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[13+nPos].c_str() ) ); // pSlot->SetCreature( ::atoi( vecText[14+nPos].c_str() ), 0 ); // // if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); // } // } // //#ifdef _DEBUG // unsigned int nMemBerCount = (unsigned int)m_vecMemberList.size(); //#endif // // if( static_cast(m_vecMemberList.size()) == 1 ) // m_nMinLevel = m_nMaxLevel; //*/ //} // 연합정보. 2010.04.14 bintitle void SGuildMgr::SetAllianceInfo( int nAllianceID, std::string & strAllianceName, int nAllianceMemberCount, int nAllianceMasterGuildSID, std::string & strAllianceLeaderName ) { m_arrAllianceGuild[ 0 ]->SetAllianceGuild( nAllianceID, strAllianceName, nAllianceMemberCount, nAllianceMasterGuildSID, strAllianceLeaderName ); } // 연합길드정보 설정. 2010.04.14 bintitle void SGuildMgr::SetAllianceGuild( STR_LIST & vecText ) { // AINFO|연합SID|연합명|멤버수|연합장길드SID| 길드SID|길드명|길마이름|맴버수| 길드SID|길드명|길마이름|맴버수| ... int vSize = vecText.size(); // 연합정보(5) + 길드1정보(4) 는 최소한의 조건. if( vSize < 9 ) return; // 연합길드정보 제거. bintitle. 2010.11.02 ClearAlliance(); const int nGuildUnit = 4; // 개별 길드 토큰 단위. // // 연합정보. // const int nAID = 1; const int nAName = 2; const int nAMemberCnt = 3; const int nAGuildID = 4; int nAllianceID = ::atoi( vecText[ nAID ].c_str() ); // 연합SID std::string strAllianceName = vecText[ nAName ]; // 연합명 int nAllianceMemberCount = 0; //::atoi( vecText[ nAMemberCnt ].c_str() ); // 연합길드 맴버수. int nAllianceMasterGuildSID = ::atoi( vecText[ nAGuildID ].c_str() );// 연합장 길드 SID std::string strAllianceLeaderName; // 연합길드장명. // // 개별 길드정보. // int nTokenIndex = nAGuildID + 1; int allianceCount = ( vSize - nTokenIndex ) / nGuildUnit; // 연합길드 수. for( int i=0; i 1 ) { m_strNotice = vecText[ 1 ]; } } // 길드원 메모. 2010.04.14 bintitle void SGuildMgr::SetMemo( STR_LIST& vecText ) { /// 2012.07.20 메모가 있으면 서버로 부터 받은 메모가 있으면 설정하고 없으면 ""를 할려는 코드 같은데 /// 코드가 이상해서 수정함;; - prodongi int size = vecText.size(); if (size < 2) return ; SPlayerSlot* pSlot = FindMember( vecText[1].c_str() ); if (!pSlot) return ; if (size >= 3) { pSlot->SetGuildMemo( vecText[2] ); } else { pSlot->SetGuildMemo(std::string("")); } /* int size = vecText.size(); if( size > 3 ) { const int nName = 1; const int nMemo = 2; SPlayerSlot* pSlot = FindMember( vecText[ nName ].c_str() ); pSlot->SetGuildMemo( std::string("") ); if( pSlot ) { pSlot->SetGuildMemo( vecText[ nMemo ] ); } } */ } // 권한등급변경. 2010.04.14 bintitle void SGuildMgr::ChangeAuthorityClass( STR_LIST & vecText ) { /*const int nName = 1; const int nAuthorityClass = 2; SPlayerSlot* pSlot = FindMember( vecText[ nName ].c_str() ); if( pSlot ) { pSlot->SetAuthority( ::atoi( vecText[ nAuthorityClass ].c_str() ) ); }*/ const int nName = 1; const int nAuthorityClass = 2; SPlayerSlot* pSlot = FindMember( vecText[ nName ].c_str() ); if( pSlot ) { pSlot->SetAuthority( ::atoi( vecText[ nAuthorityClass ].c_str() ) ); } } // 권한등급비트플래그(권한세트) 변경. 2010.04.14 bintitle void SGuildMgr::ChangeAuthorityClassBitSet( STR_LIST & vecText ) { if( vecText.size() < 3 ) return; /*ChangeAuthorityClassBitSet( ( E_AUTHORITY )( ::atoi( vecText[ 1 ].c_str() - 1 ) ), ::atoi( vecText[ 2 ].c_str() ) ); */ int nClass = ::atoi( vecText[ 1 ].c_str() ) - 1; int bitSet = ::atoi( vecText[ 2 ].c_str() ); //#ifdef _DEV // // TEST. 권한설정 권한. // bitSet |= _PERMIT_REQUIRED_ACTION::PRA_CLASS_AUTHORITY_SET; //#endif m_arrAuthorityClass[ nClass ] = bitSet; } // 권한등급 설정. void SGuildMgr::SetAuthorityClass( STR_LIST & vecText ) { // 권한이름1|권한셋1|권한이름2|권한셋2|권한이름3|권한셋3|권한이름4|권한셋4|권한이름5|권한셋5|권한이름6|권한셋6 if( vecText.size() > 13 ) { int i = 1; int size = E_AUTHORITY::AUTHORITY_MAX - 1; for( int nIndex=0; nIndex tempArrClassName; //int i = 1; //int size = E_AUTHORITY::AUTHORITY_MAX - 1; //for( int nIndex=0; nIndex 2 ) { int nClass = ::atoi( vecText[ 1 ].c_str() ); std::string str = vecText[ 2 ]; ChangeAuthorityClassNameBitSet( --nClass, str ); // 권한비트셋 등급해당명 변경. } } void SGuildMgr::SetGradePoint( STR_LIST & vecText ) { if( vecText.size() > 5 ) { int nGrade = ::atoi( vecText[ 1 ].c_str() ); int nPoint = ::atoi( vecText[ 2 ].c_str() ); m_nGrade = nGrade; m_nPoint = nPoint; } } void SGuildMgr::SetGuildMemberPoint( STR_LIST & vecText ) { if( vecText.size() > 5 ) { SPlayerSlot* pSlot = FindMember( vecText[ 3 ].c_str() ); if (pSlot == NULL) return; int point = ::atoi( vecText[ 4 ].c_str() ); int total_point = ::atoi( vecText[ 5 ].c_str() ); pSlot->SetPoint( point ); pSlot->SetTotalPoint( total_point ); } } // // 권한등급 추가. 2010.04.13 bintitle // bool & bSelf 추가. 2010.11.29. bintitle. 해당 메세지가 자신에게만 해당되는 지 여부반환. // void SGuildMgr::AddMember( STR_LIST& vecText, bool & bSelf ) { if( vecText.size() < 13 ) return; static char c_nHandlePos = 1; static char c_nNamePos = 2; static char c_nLevelPos = 3; static char c_nJobPos = 4; static char c_nAuthority = 5; // 추가 - 권한등급 static char c_nHPPos = 6; static char c_nMPPos = 7; static char c_nXPos = 8; static char c_nYPos = 9; static char c_nLogin = 10; static char c_nPointPos = 11; static char c_nTotalPointPos = 12; char * strstoper; AR_HANDLE handle = ::strtoul( vecText[c_nHandlePos].c_str(), &strstoper, 10 ); if( IsExistMember( vecText[c_nNamePos].c_str() ) == false ) { SPlayerSlot* pSlot = new SPlayerSlot; pSlot->SetHandle( handle ); pSlot->SetName( vecText[c_nNamePos].c_str() ); pSlot->SetLevel( ::atoi( vecText[c_nLevelPos].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[c_nJobPos].c_str() ) ); pSlot->SetAuthority( ::atoi( vecText[ c_nAuthority ].c_str() ) ); // 권한등급 pSlot->SetHP( ::atoi( vecText[c_nHPPos].c_str() ) ); pSlot->SetMP( ::atoi( vecText[c_nMPPos].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[c_nXPos].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[c_nYPos].c_str() ) ); pSlot->SetLogin( ::atoi( vecText[c_nLogin].c_str() ) ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); pSlot->SetPoint( ::atoi( vecText[c_nPointPos].c_str() ) ); pSlot->SetTotalPoint( ::atoi( vecText[c_nTotalPointPos].c_str() ) ); m_vecMemberList.push_back(pSlot); } else { SPlayerSlot* pSlot = FindMember( vecText[c_nNamePos].c_str() ); if( pSlot == NULL ) return; pSlot->SetHandle( handle ); pSlot->SetName( vecText[c_nNamePos].c_str() ); pSlot->SetLevel( ::atoi( vecText[c_nLevelPos].c_str() ) ); pSlot->SetJobID( ::atoi( vecText[c_nJobPos].c_str() ) ); pSlot->SetAuthority( ::atoi( vecText[ c_nAuthority ].c_str() ) ); // 권한등급 pSlot->SetHP( ::atoi( vecText[c_nHPPos].c_str() ) ); pSlot->SetMP( ::atoi( vecText[c_nMPPos].c_str() ) ); pSlot->SetXPos( ::atoi( vecText[c_nXPos].c_str() ) ); pSlot->SetYPos( ::atoi( vecText[c_nYPos].c_str() ) ); pSlot->SetLogin( ::atoi( vecText[c_nLogin].c_str() ) ); if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); pSlot->SetPoint( ::atoi( vecText[c_nPointPos].c_str() ) ); pSlot->SetTotalPoint( ::atoi( vecText[c_nTotalPointPos].c_str() ) ); } bSelf = this->IsLocalPlayer( handle ); // 해당 메세지가 자신에게만 해당되는 지 여부반환. } //void SGuildMgr::AddMember( STR_LIST& vecText ) //{ // if( vecText.size() < 10 ) return; // // static char c_nHandlePos = 1; // static char c_nNamePos = 2; // static char c_nLevelPos = 3; // static char c_nJobPos = 4; // static char c_nHPPos = 5; // static char c_nMPPos = 6; // static char c_nXPos = 7; // static char c_nYPos = 8; // static char c_nSummonFlag = 9; // // if( IsExistMember( vecText[c_nNamePos].c_str() ) == false ) // { // SPlayerSlot* pSlot = new SPlayerSlot; // // char * strstoper; // AR_HANDLE handle = ::strtoul( vecText[c_nHandlePos].c_str(), &strstoper, 10 ); // pSlot->SetHandle( handle ); // // pSlot->SetName( vecText[c_nNamePos].c_str() ); // pSlot->SetLevel( ::atoi( vecText[c_nLevelPos].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[c_nJobPos].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[c_nHPPos].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[c_nMPPos].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[c_nXPos].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[c_nYPos].c_str() ) ); // pSlot->SetCreature( ::atoi( vecText[c_nSummonFlag].c_str() ), 0 ); // // if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // // pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); // // m_vecMemberList.push_back(pSlot); // } // else // { // SPlayerSlot* pSlot = FindMember( vecText[c_nNamePos].c_str() ); // if( pSlot == NULL ) return; // // char * strstoper; // AR_HANDLE handle = ::strtoul( vecText[c_nHandlePos].c_str(), &strstoper, 10 ); // pSlot->SetHandle( handle ); // // pSlot->SetName( vecText[c_nNamePos].c_str() ); // pSlot->SetLevel( ::atoi( vecText[c_nLevelPos].c_str() ) ); // pSlot->SetJobID( ::atoi( vecText[c_nJobPos].c_str() ) ); // pSlot->SetHP( ::atoi( vecText[c_nHPPos].c_str() ) ); // pSlot->SetMP( ::atoi( vecText[c_nMPPos].c_str() ) ); // pSlot->SetXPos( ::atoi( vecText[c_nXPos].c_str() ) ); // pSlot->SetYPos( ::atoi( vecText[c_nYPos].c_str() ) ); // pSlot->SetCreature( ::atoi( vecText[c_nSummonFlag].c_str() ), 0 ); // // if( pSlot->GetHandle() == NULL ) pSlot->SetLogin( false ); // // if( ::_stricmp( m_strLeaderName.c_str(), pSlot->GetName() ) == 0 ) pSlot->SetLeader( true ); // // pSlot->SetNear( !( IsFar(pSlot->GetHandle()) ) ); // } //} void SGuildMgr::ChangeGuildInfo( STR_LIST& vecText ) { m_bParsing = true; if( !m_bIsExist ) return; if( vecText.size() > 3 ) { m_nMaxLevel = ::atoi( vecText[2].c_str() ); m_nMinLevel = ::atoi( vecText[3].c_str() ); } } // 2011.11.23 - servantes : 리턴형 변경 bool SGuildMgr::ChangeLeader( const char* szPlayerName ) { if( m_strGulidLeaderName == szPlayerName ) return false; // 이전 길드장의 등급을 최하등급으로 강등. SPlayerSlot* pSlot = FindMember( m_strLeaderName.c_str() ); if( pSlot ) pSlot->SetAuthority( _PERMISSION::PERMISSION_MEMBER_LEAST ); SMessengerMgr::ChangeLeader(szPlayerName); m_strGulidLeaderName = szPlayerName; // 새 길드장 등급변경. pSlot = FindMember( szPlayerName ); if( pSlot ) pSlot->SetAuthority( _PERMISSION::PERMISSION_LEADER ); return true; } // 연합길드장 반환. const char * SGuildMgr::GetAllianceGuildMaster( int nGID ) { if( !m_arrAllianceGuild.empty() ) { return m_arrAllianceGuild[ 0 ]->strAllianceLeaderName.c_str(); } return NULL; } // 연합길드장 소속길드 반환. const char * SGuildMgr::GetAllianceMasterToGuild() { if( !m_arrAllianceGuild.empty() ) { int size = m_arrAllianceGuild.size(); for( int i=0; inID == m_arrAllianceGuild[ 0 ]->nAllianceMasterGuildSID ) return m_arrAllianceGuild[ i ]->strName.c_str(); } } return NULL; } // 연합에 속한 길드 반환. SAllianceGuild * SGuildMgr::GetAllianceGuildByGID( int nGID ) { for( std::vector< SAllianceGuild * >::iterator it=m_arrAllianceGuild.begin(); it!=m_arrAllianceGuild.end(); ++it ) { if( (*it)->nID == nGID ) return (*it); } return NULL; } // 연합소속 길드원 멤버수 변경. void SGuildMgr::ChangeAllianceMemberCount( int nGID, int memberCount ) { SAllianceGuild * pAGuild = GetAllianceGuildByGID( nGID ); if( pAGuild ) { int nPrevCount = pAGuild->nMemberCount; // 이전 맴버수. pAGuild->nMemberCount = memberCount; // 맴버수 변경. pAGuild->nAllianceMemberCount += ( nPrevCount - memberCount ); // 연합길드총 맴버수 변경. } } // 연합소속 길드장 변경. void SGuildMgr::ChangeAllianceMaster( int nGID, const std::string & strName ) { SAllianceGuild * pAGuild = GetAllianceGuildByGID( nGID ); if( pAGuild ) { // 이전 길드장이 연합길드장 인 경우에 연합길드장 변경. if( pAGuild->nAllianceMasterGuildSID == nGID ) { pAGuild->strAllianceLeaderName = strName; } pAGuild->strLeaderName = strName; // 길드장명 변경. } } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // SGuildDataMgr::SGuildDataMgr() : SGameUIMgr() // 2011.03.29 - servantes { m_nMode = MODE_NONE; } SGuildDataMgr::~SGuildDataMgr() { } void SGuildDataMgr::ResetInfo() { m_hLocalPlayer = 0; m_nMode = MODE_NONE; m_vGuildDataList.clear(); m_vDownGuildDataList.clear(); m_vWaitGuildDataList.clear(); } int SGuildDataMgr::AddMessage( const char * pMsg, int & nValue ) { /// 2011.01.19 bool형을 int로 바꿈 - prodongi STR_LIST strList; MsgSplit( pMsg, strList, L"|" ); size_t nTextSize = strList.size(); if( nTextSize <= 0 ) return 0;//false; if( ::_stricmp( strList[0].c_str(), "GCHANGE") == 0 ) //GCHANGE|player_handle|guild_id { if( nTextSize < 3 ) { strList.clear(); return 0;//false; } char * strstoper; AR_HANDLE handle = ::strtoul( strList[1].c_str(), &strstoper, 10 ); SIMSG_UI_GUILDICON_REFRESH msg; msg.nGuild_id = atoi( strList[2].c_str() ); const GUILD_ICON * pGdata = GetGuildData( msg.nGuild_id ); if( msg.nGuild_id == 0 ) { msg.strGuildName = "#@DELETEGUILD@#"; msg.strIconAniName = "#@DELETEGUILD@#"; } else { if( pGdata ) { msg.strGuildName = pGdata->strGuildName; msg.strIconAniName = pGdata->strIconAniName; } else { //아직 데이타 없음 msg.strGuildName = "NewGuild"; msg.strIconAniName = ""; } } msg.vHandleList.push_back( handle ); SendGameInterfaceMsg( &msg ); if( msg.nGuild_id !=0 && pGdata == NULL ) { nValue = msg.nGuild_id; strList.clear(); return REQ_GUILD_ICON; } strList.clear(); return REQ_NONE; } else if( ::_stricmp( strList[0].c_str(), "CHANGE_GUILD_NAME" ) == 0 ) //CHANGE_GUILD_NAME|guild_id|guild_name| { if( nTextSize < 3 ) { strList.clear(); return 0;//false; } int nGuilID = atoi( strList[1].c_str() ); ChangeGuildName( nGuilID, strList[2].c_str() ); } else if( ::_stricmp( strList[0].c_str(), "GDESTROY") == 0 ) //GDESTROY|guild_id { if( nTextSize < 2 ) { strList.clear(); return 0;//false; } int nGuildID = atoi( strList[1].c_str() ); SIMSG_UI_GUILDICON_DESTROY msg( nGuildID ); SendGameInterfaceMsg( &msg ); strList.clear(); return REQ_NONE; } else if( ::_stricmp( strList[0].c_str(), "GICON" ) == 0 ) //GICON|guild_id|guild_name|guild_icon_file_name|guild_icon_file_size { if( nTextSize < 2 ) { strList.clear(); return 0;//false; } if( !IsExistGuild( atoi( strList[1].c_str() ) ) ) { AddGuildData( strList ); } strList.clear(); return REQ_NONE; } else if( ::_stricmp( strList[0].c_str(), "GICON_UPDATE" ) == 0 ) //GICON_UPDATE|guild_id { if( nTextSize < 2 ) { strList.clear(); return 0;//false; } //정보 갱신 int nGuild_id = atoi( strList[1].c_str() ); nValue = nGuild_id; //삭제 if( IsExistGuild( atoi( strList[1].c_str() ) ) ) DelGuildData( nGuild_id ); strList.clear(); //길드 정보 다시 요청 return REQ_GUILD_ICON; } strList.clear(); return REQ_NONE; } void SGuildDataMgr::ChangeGuildName( int nGuild_id, const char * pNewName ) { for( unsigned int i(0); m_vGuildDataList.size()>i; i++ ) { if( m_vGuildDataList[i].nGuildID == nGuild_id ) { if( pNewName != NULL && strlen(pNewName)>0 ) m_vGuildDataList[i].strGuildName = pNewName; return; } } } void SGuildDataMgr::RegistGuildData( GUILD_ICON * pGuildData ) { std::string strNewName = g_pGuildDir; strNewName += pGuildData->strIconFileName.c_str(); GUILD_ICON GuildData; GuildData.nGuildID = pGuildData->nGuildID ; GuildData.strGuildName = pGuildData->strGuildName ; GuildData.strIconFileName = pGuildData->strIconFileName; GuildData.nIconFileSize = pGuildData->nIconFileSize ; GuildData.bLoaded = pGuildData->bLoaded ; bool bEncrypt = false; #ifdef _GUILD_ICON_ENC_ bEncrypt = true; #endif //저 사양은 TGA로 변환 if( KUITextureManager::GetHWType() == KUITextureManager::NOTPOW_SUPPORT ) { std::string strInFileName = strNewName; std::string strSaveName = strInFileName; nsl::replace( &strSaveName, ".jpg", ".tga" ); FILE* pFTGA = fopen( strSaveName.c_str(), "rb" ); if( pFTGA == NULL ) { if( bEncrypt ) { std::string strTemp = g_pGuildDir; strTemp += "xxxx.jpg"; FILE *fp = fopen( strInFileName.c_str(), "rb" ); if( fp ) { // 데이터 파일 크기 세팅 fseek( fp, 0, SEEK_END ); size_t fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); char *pBuf = new char[fsize]; fread( pBuf, sizeof(char)*fsize, 1, fp ); fclose( fp ); //XOR 풀고 for( size_t idx = 0; idx < fsize; idx++ ) pBuf[idx] ^= XOREn::GetEncodeKeyChar( idx ); //Temp 화일 생성 FILE *Outfp = fopen( strTemp.c_str(), "wb" ); if( Outfp ) { if( fwrite( pBuf, sizeof(char)*fsize, 1, Outfp ) != 1 ) { delete [] pBuf; fclose( Outfp ); return; } fclose( Outfp ); } delete [] pBuf; strInFileName = strTemp; } } //TGA 변환 if( ilSaveAsType( (char*)strInFileName.c_str(), (char*)strSaveName.c_str() ) ) { //변환 성공시 추가 //TGA는 압축 안됨. KSpriteManager::GetManager()->AddIconSprite( "ui_frame.spr", strSaveName.c_str(), false, true, KColor(255,0,255) ); } if( bEncrypt ) { DeleteFile( strInFileName.c_str() ); } } else //TGA 존재 함 { fclose( pFTGA ); KSpriteManager::GetManager()->AddIconSprite( "ui_frame.spr", strSaveName.c_str(), false, true, KColor(255,0,255) ); } } else { KSpriteManager::GetManager()->AddIconSprite( "ui_frame.spr", strNewName.c_str(), bEncrypt, true, KColor(255,0,255) ); } std::string strAniName; if( CStringUtil::GetIconAniName( strNewName.c_str(), strAniName ) ) { SIMSG_UI_GUILDICON msg; msg.nGuild_id = GuildData.nGuildID; msg.strGuildName = GuildData.strGuildName; msg.strIconAniName = strAniName.c_str(); SendGameInterfaceMsg( &msg ); GuildData.strIconAniName = strAniName; m_vGuildDataList.push_back( GuildData ); //KResSprite* pResSprite = KSpriteManager::GetManager()->GetResSprite( "ui_frame.spr", strAniName.c_str(), 0 ); //if( pResSprite ) //{ //} } } void SGuildDataMgr::SendGuildData( int nGuild_ID ) { const GUILD_ICON * pGdata = GetGuildData( nGuild_ID ); if( pGdata ) { SIMSG_UI_GUILDICON msg; msg.nGuild_id = nGuild_ID; msg.strGuildName = pGdata->strGuildName; msg.strIconAniName = pGdata->strIconAniName; SendGameInterfaceMsg( &msg ); } } void SGuildDataMgr::Process( DWORD dwTime ) { //5초에 한번 정도 시도 할까? if( m_nMode == MODE_NONE ) { if( !m_vDownGuildDataList.empty() ) { //다운로드가 완료 되었으므로, 길드 아이콘 UI 에 등록 for( unsigned int i(0); m_vDownGuildDataList.size()>i; i++ ) RegistGuildData( &m_vDownGuildDataList[i] ); //기존 URL 삭제 m_vDownGuildDataList.clear(); } //대기 리스트에 데이타 존재 할 경우 //대기 리스트 다운로드 if( !m_vWaitGuildDataList.empty() ) { for( unsigned int i(0); m_vWaitGuildDataList.size()>i; i++ ) { m_vDownGuildDataList.push_back( m_vWaitGuildDataList[i] ); } m_vWaitGuildDataList.clear(); GuildIconDownLoad(); } } else if (m_nMode == MODE_DOWNLOADERROR ) { if( !m_vDownGuildDataList.empty() ) { //다운로드가 완료 되었으므로, 길드 아이콘 UI 에 등록 for( unsigned int i(0); m_vDownGuildDataList.size()>i; i++ ) { SIMSG_UI_GUILDICON msg; msg.nGuild_id = m_vDownGuildDataList[i].nGuildID; msg.strGuildName = m_vDownGuildDataList[i].strGuildName; msg.strIconAniName = ""; SendGameInterfaceMsg( &msg ); } //기존 URL 삭제 m_vDownGuildDataList.clear(); } } } bool SGuildDataMgr::IsExistGuildIconFile( const char * pGuildIconFileName ) { const char *szJPG_Extension = ( pGuildIconFileName + strlen(pGuildIconFileName) - 4 ); const char *szJPEG_Extension = ( pGuildIconFileName + strlen(pGuildIconFileName) - 5 ); if( _stricmp( szJPG_Extension, ".jpg" ) != 0 && _stricmp( szJPEG_Extension, ".jpeg" ) != 0 ) { //화일 포맷이 다르므로, 로딩을 시도 하지 않는다. 사용 할 수 없기 때문... return true; } std::string strGuildIcon = g_strGuildFullDir + pGuildIconFileName; FILE* fp = fopen( strGuildIcon.c_str(), "rb" ); if(fp) { #ifdef _GUILD_ICON_ENC_ char szJPG[32]; fread( szJPG, sizeof(szJPG), 1, fp ); fclose( fp ); if( !strnicmp( &szJPG[6], "JFIF", 4 ) ) { DeleteFile( strGuildIcon.c_str() ); //삭제 return false; } return true; #else fclose( fp ); return true; #endif } return false; } //길드 아이콘 관련 수정할 부분 <함수 인자로 add할 길드아이콘 이름이 들어와야한다> void SGuildDataMgr::AddGuildData( std::vector< std::string > & strGuildData ) { if( strGuildData.size() < 4 ) { return; } if( strGuildData.size() == 4 ) { //길드 이름만 있는 경우 SIMSG_UI_GUILDICON msg; msg.nGuild_id = atoi( strGuildData[1].c_str() ); msg.strGuildName = strGuildData[2].c_str(); msg.strIconAniName = ""; SendGameInterfaceMsg( &msg ); return; } GUILD_ICON _guild_icon; _guild_icon.nGuildID = atoi( strGuildData[1].c_str() ); _guild_icon.strGuildName = strGuildData[2].c_str(); _guild_icon.nIconFileSize = atoi( strGuildData[4].c_str() ); //앞부분 제거 std::string strFileName = strGuildData[3].c_str(); std::string::size_type pos = strFileName.rfind( '/' ); if( pos != std::string::npos ) { //앞 부분 삭제, 화일 이름 생성 strFileName.erase( 0, pos+1 ); _guild_icon.strIconFileName = strFileName.c_str(); _guild_icon.bLoaded = IsExistGuildIconFile( _guild_icon.strIconFileName.c_str() ); } else { //거짓 로드 안함. _guild_icon.strIconFileName = "Invalid_FileName"; _guild_icon.bLoaded = true; } if( m_nMode == MODE_NONE ) { if( _guild_icon.bLoaded ) { //로드 안 함 RegistGuildData( &_guild_icon ); } else { m_vDownGuildDataList.push_back( _guild_icon ); GuildIconDownLoad(); } } else if( m_nMode == MODE_DOWNLOAD ) { if( _guild_icon.bLoaded ) RegistGuildData( &_guild_icon ); else m_vWaitGuildDataList.push_back( _guild_icon ); } } void SGuildDataMgr::DelGuildData( int nGuild_id ) { for( unsigned int i(0); m_vGuildDataList.size()>i; i++ ) { if( m_vGuildDataList[i].nGuildID == nGuild_id ) { m_vGuildDataList.erase( m_vGuildDataList.begin()+i ); return; } } } const GUILD_ICON * SGuildDataMgr::GetGuildData( int nGuild_id ) const { for( unsigned int i(0); m_vGuildDataList.size()>i; i++ ) { if( m_vGuildDataList[i].nGuildID == nGuild_id ) return &m_vGuildDataList[i]; } return NULL; } bool SGuildDataMgr::IsLoadedGuild( int nGuild_id ) { for( unsigned int i(0); m_vGuildDataList.size()>i; i++ ) { if( m_vGuildDataList[i].nGuildID == nGuild_id ) { #ifndef NDEBUG bool bLoaded = m_vGuildDataList[i].bLoaded; #endif return m_vGuildDataList[i].bLoaded; } } return false; } bool SGuildDataMgr::IsExistGuild( int nGuild_id ) { for( unsigned int i(0); m_vGuildDataList.size()>i; i++ ) { if( m_vGuildDataList[i].nGuildID == nGuild_id ) return true; } return false; } //쓰레드로 빠져야 한다. void SGuildDataMgr::GuildIconDownLoad() { m_nMode = MODE_DOWNLOAD; unsigned tmp = 0; HANDLE hThread = reinterpret_cast< HANDLE >( _beginthreadex( NULL, 0, download_file, this, 0, &tmp ) ); CloseHandle( hThread ); } //#include "SLog.h" unsigned __stdcall SGuildDataMgr::download_file( void* pArg ) { SGuildDataMgr* pParent = reinterpret_cast< SGuildDataMgr* >( pArg ); struct myInternetFileWriter : XInternetFileWriter { myInternetFileWriter( std::string & _fn ) : checksum( 0 ), strFileName( _fn ) { size = 0; pQueue = IQueue::MakeQueue( 2*1024 ); } virtual ~myInternetFileWriter() { delete pQueue; } bool Write( const char* pData, unsigned nSize ) { unsigned char *p = reinterpret_cast< unsigned char * >( const_cast< char* >( pData ) ); for( unsigned i = 0; i < nSize; ++i ) { checksum += *p; p++; } size += nSize; pQueue->Write( pData, nSize ); return true; } std::string getCheckSum() { char buf[9]; sprintf( buf, "%08X", checksum ); return buf; } IQueue *pQueue; int size; unsigned checksum; std::string strFileName; std::string strDirectory; }; //쓰레드 빼고, 화일 저장 부분 정리 XInternetSession session; // Fraun cleared galalab asscans //session.SetServer( ENV().GetString( "web_download", "www.rappelz.com" ).c_str() , ENV().GetInt( "web_download_port", 0 ) ); session.SetServer( ENV().GetString( "web_download", "127.0.0.1" ).c_str() , ENV().GetInt( "web_download_port", 0 ) ); session.OpenSession(); std::vector::iterator it = pParent->m_vDownGuildDataList.begin(); std::string strURL; if( ENV().IsExist( "guild_test_download.url" ) ) strURL = ENV().GetString( "guild_test_download.url", "upload/client/guild/" ); else strURL = ENV().GetString( "guild_download.url", "upload/client/guild/" ); for( ; it != pParent->m_vDownGuildDataList.end(); ++it ) { //DownLoad URL std::string strDownURL = strURL; strDownURL += (*it).strIconFileName; //Local File std::string strLocal = g_strGuildFullDir; strLocal += (*it).strIconFileName; myInternetFileWriter _fo( strLocal ); // 파일 읽다가 오류라면.. if( session.HttpQuery( strDownURL.c_str(), &_fo, NULL ) < 1 ) { pParent->m_nMode = MODE_DOWNLOADERROR; return 0; } else { if( _fo.pQueue->Size() != (*it).nIconFileSize ) { assert(0 && "Error: Guild icon size is different" ); } FILE *fp = fopen( strLocal.c_str(), "wb" ); if( fp ) { #ifdef _GUILD_ICON_ENC_ char * pEnBuf = new char[_fo.pQueue->Size()]; memcpy( pEnBuf, _fo.pQueue->GetBuf(), _fo.pQueue->Size() ); //XOR for( size_t idx = 0; idx < _fo.pQueue->Size(); idx++ ) pEnBuf[idx] ^= XOREn::GetEncodeKeyChar( idx ); if( fwrite( pEnBuf, _fo.pQueue->Size(), 1, fp ) != 1 ) #else if( fwrite( _fo.pQueue->GetBuf(), _fo.pQueue->Size(), 1, fp ) != 1 ) #endif { #ifdef _GUILD_ICON_ENC_ delete [] pEnBuf; #endif fclose( fp ); continue; //다른 아이콘 다운 받자~ } #ifdef _GUILD_ICON_ENC_ delete [] pEnBuf; #endif fclose( fp ); DWORD dwAttrs; dwAttrs = GetFileAttributes(strLocal.c_str()); if (!(dwAttrs & FILE_ATTRIBUTE_HIDDEN)) SetFileAttributes(strLocal.c_str(), dwAttrs | FILE_ATTRIBUTE_HIDDEN); } } } pParent->m_nMode = MODE_NONE; return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////// //class CHttpQuery //{ //public: // LPCSTR m_html; // bool GetServerName( LPCSTR *p, LPCSTR lpStart, LPCSTR lpEnd, LPCSTR lpGet, int maxcch ); // void Query( LPCSTR serverName, UINT CodePage, LPCSTR lpUrl, LPVOID lpOptional, DWORD dwOptionalLength ); // //public: // CHttpQuery( LPCSTR _serverName, LPCSTR lpUrl , LPVOID lpOptional = NULL , DWORD dwOptionalLength = 0 ); // CHttpQuery( LPCSTR _serverName, UINT CodePage, LPCSTR lpUrl , LPVOID lpOptional = NULL , DWORD dwOptionalLength = 0 ); // // ~CHttpQuery(); // // // operator LPWSTR(); // //operator bool(); //}; // //CHttpQuery::CHttpQuery( LPCSTR _serverName, LPCSTR lpUrl , LPVOID lpOptional , DWORD dwOptionalLength ) //{ // Query( _serverName, CP_UTF8, lpUrl, lpOptional, dwOptionalLength ); //} //CHttpQuery::CHttpQuery( LPCSTR _serverName, UINT CodePage, LPCSTR lpUrl , LPVOID lpOptional , DWORD dwOptionalLength ) //{ // Query( _serverName, CodePage, lpUrl, lpOptional, dwOptionalLength ); //} //void CHttpQuery::Query( LPCSTR _serverName, UINT CodePage, LPCSTR lpUrl, LPVOID lpOptional, DWORD dwOptionalLength ) //{ // m_html = NULL; // // CHAR ServerName[1024]={NULL,}; // strcpy( ServerName, _serverName ); // /* if( !GetServerName( &lpUrl , "HTTP://", "/", ServerName, 1024 ) ) // { // GetServerName( &lpUrl , "HTTPS://", "/", ServerName, 1024 ); // }*/ // // // DWORD_PTR dwContext = 0; // if ( lpOptional && dwOptionalLength )dwContext = 1; // // HINTERNET hInternet = InternetOpen( "HTTP", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); // // HINTERNET hConnect = InternetConnect( hInternet, ServerName, INTERNET_DEFAULT_HTTP_PORT, // NULL, NULL, INTERNET_SERVICE_HTTP, 0, dwContext ); // // LPCTSTR accept[2]={ "*/*", NULL }; // HINTERNET hRequest = HttpOpenRequest( hConnect, "POST",lpUrl, NULL, NULL, accept, // INTERNET_FLAG_DONT_CACHE, dwContext ); // // if ( dwContext ) // { // CHAR hdrs[1024] = "Content-Type: application/x-www-form-urlencoded"; // sprintf( hdrs, "Content-Type: application/x-www-form-urlencoded\r\nContent-length: %d \r\n", dwOptionalLength); // HttpSendRequest( hRequest, hdrs, strlen(hdrs), lpOptional, dwOptionalLength ); // } // else // { // HttpSendRequest( hRequest, NULL, 0, NULL, 0 ); // } // // DWORD dwSize = 0; // BOOL bQuery = InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ); // if ( bQuery && dwSize > 0 ) // { // DWORD dwTotal = 0; // char* pData = (char*)malloc( dwTotal + dwSize + 1 ); // while ( pData && dwSize ) // { // DWORD dwRead = 0; // InternetReadFile( hRequest, pData+dwTotal, dwSize, &dwRead ); // dwTotal += dwRead; // pData[dwTotal] = NULL; // // InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ); // if ( dwSize > 0 ) // { // pData = (char*)realloc( pData, dwTotal + dwSize+1 ); // } // } // if ( pData ) // { // /* int len = MultiByteToWideChar( CodePage, 0, pData, dwTotal, NULL, NULL ); // m_html = (LPWSTR)calloc( len+1, sizeof(WCHAR) ); // if ( m_html ) // { // MultiByteToWideChar( CodePage, 0, pData, dwTotal, m_html, len+1 ); // }*/ // free(pData); // } // ::MessageBox( NULL, pData, "pData", MB_OK ); // ::MessageBox( NULL, m_html, "m_html", MB_OK ); // } // InternetCloseHandle( hRequest ); // InternetCloseHandle( hConnect ); // InternetCloseHandle( hInternet ); //} // //// 문자열을 비교 값을 얻어 낸다. //bool CHttpQuery::GetServerName( LPCSTR *p, LPCSTR lpStart, LPCSTR lpEnd, LPCSTR lpstr3, int maxcch ) //{ // //int len = strlen( lpStart ); // //if ( wcsnicmp( *p, lpStart, len ) != 0 ) return FALSE; // // //*p += len ; // // //LPTSTR lpstr = wcsstr( (LPWSTR)*p, lpEnd ); // //if ( lpstr ) // //{ // // wcsncpy( (LPWSTR)lpstr3, *p, min( maxcch, (lpstr-*p) ) ); // // *p = lpstr + wcslen( lpEnd ); // //} // //else // //{ // // wcsncpy( (LPWSTR)lpstr3, *p, maxcch ); // // *p += wcslen(*p); // //} // // // // // return TRUE; //} // //CHttpQuery::~CHttpQuery() //{ // if ( m_html ) // free( (void *)m_html ); // m_html = NULL; //} ////CHttpQuery::operator LPWSTR() ////{ //// return m_html; ////} ////CHttpQuery::operator bool() ////{ //// return ( m_html != NULL ); ////} // #include #include "atlexcept.h" #include "atlconv.h" class CHttpQuery { public: LPWSTR m_html; bool GetServerName( LPCWSTR *p, LPCWSTR lpStart, LPCWSTR lpEnd, LPCWSTR lpGet, int maxcch ); void Query( LPCWSTR serverName, UINT CodePage, LPCWSTR lpUrl, LPVOID lpOptional, DWORD dwOptionalLength ); public: CHttpQuery( LPCWSTR serverName, LPCWSTR lpUrl , LPVOID lpOptional = NULL , DWORD dwOptionalLength = 0 ); CHttpQuery( LPCWSTR serverName, UINT CodePage, LPCWSTR lpUrl , LPVOID lpOptional = NULL , DWORD dwOptionalLength = 0 ); ~CHttpQuery(); operator LPWSTR(); operator bool(); }; CHttpQuery::CHttpQuery( LPCWSTR serverName, LPCWSTR lpUrl , LPVOID lpOptional , DWORD dwOptionalLength ) { Query( serverName, CP_UTF8, lpUrl, lpOptional, dwOptionalLength ); } CHttpQuery::CHttpQuery( LPCWSTR serverName, UINT CodePage, LPCWSTR lpUrl , LPVOID lpOptional , DWORD dwOptionalLength ) { Query( serverName, CodePage, lpUrl, lpOptional, dwOptionalLength ); } void CHttpQuery::Query( LPCWSTR _serverName, UINT CodePage, LPCWSTR lpUrl, LPVOID lpOptional, DWORD dwOptionalLength ) { m_html = NULL; //WCHAR ServerName[1024]={0}; LPCWSTR ServerName = _serverName; /*if( !GetServerName( &lpUrl , ATL::CA2W( "HTTP://" ), ATL::CA2W("/"), ServerName, 1024 ) ) { GetServerName( &lpUrl , ATL::CA2W("HTTPS://"), ATL::CA2W("/"), ServerName, 1024 ); }*/ DWORD_PTR dwContext = 0; if ( lpOptional && dwOptionalLength )dwContext = 1; HINTERNET hInternet = InternetOpenW( ATL::CA2W("HTTP"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); HINTERNET hConnect = InternetConnectW( hInternet, ServerName, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, dwContext ); LPCWSTR accept[2]={ ATL::CA2W("*/*"), NULL }; HINTERNET hRequest = HttpOpenRequestW( hConnect, ATL::CA2W("POST"),lpUrl, NULL, NULL, accept, INTERNET_FLAG_DONT_CACHE, dwContext ); if ( dwContext ) { WCHAR hdrs[1024]={NULL,};// = ATL::CA2W("Content-Type: application/x-www-form-urlencoded"); //std::wstring hdrs( "Content-Type: application/x-www-form-urlencoded" ); wsprintfW( hdrs, ATL::CA2W("Content-Type: application/x-www-form-urlencoded\r\nContent-length: %d \r\n"), dwOptionalLength); HttpSendRequestW( hRequest, hdrs, wcslen(hdrs), lpOptional, dwOptionalLength ); } else { HttpSendRequest( hRequest, NULL, 0, NULL, 0 ); } DWORD dwSize = 0; BOOL bQuery = InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ); if ( bQuery && dwSize > 0 ) { DWORD dwTotal = 0; char* pData = (char*)malloc( dwTotal + dwSize + 1 ); while ( pData && dwSize ) { DWORD dwRead = 0; InternetReadFile( hRequest, pData+dwTotal, dwSize, &dwRead ); dwTotal += dwRead; pData[dwTotal] = NULL; InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ); if ( dwSize > 0 ) { pData = (char*)realloc( pData, dwTotal + dwSize+1 ); } } if ( pData ) { // AziaMafia CP_UTF8 //int len = MultiByteToWideChar( CodePage, 0, pData, dwTotal, NULL, NULL ); int len = MultiByteToWideChar(CodePage, 0, pData, dwTotal, NULL, NULL ); m_html = (LPWSTR)calloc( len+1, sizeof(WCHAR) ); if ( m_html ) { // AziaMafia CP_UTF8 //MultiByteToWideChar( CodePage, 0, pData, dwTotal, m_html, len+1 ); MultiByteToWideChar(CodePage, 0, pData, dwTotal, m_html, len+1 ); } free(pData); } } InternetCloseHandle( hRequest ); InternetCloseHandle( hConnect ); InternetCloseHandle( hInternet ); } // 문자열을 비교 값을 얻어 낸다. bool CHttpQuery::GetServerName( LPCWSTR *p, LPCWSTR lpStart, LPCWSTR lpEnd, LPCWSTR lpstr3, int maxcch ) { std::wstring wstr( lpStart ); int len = wstr.size(); //int len = _tcslen( lpStart ); if ( wcsnicmp( *p, lpStart, len ) != 0 ) return FALSE; *p += len ; LPWSTR lpstr = wcsstr( (LPWSTR)*p, lpEnd ); if ( lpstr ) { wcsncpy( (LPWSTR)lpstr3, *p, min( maxcch, (lpstr-*p) ) ); *p = lpstr + wcslen( lpEnd ); } else { wcsncpy( (LPWSTR)lpstr3, *p, maxcch ); *p += wcslen(*p); } return TRUE; } CHttpQuery::~CHttpQuery() { if ( m_html ) free( m_html ); m_html = NULL; } CHttpQuery::operator LPWSTR() { return m_html; } CHttpQuery::operator bool() { return ( m_html != NULL ); } extern HWND g_hWnd; ////////////////////////////////////////////////////////////////////////// // SFriendMgr SFriendMgr::SFriendMgr() : SMessengerMgr() // 2011.03.29 - servantes { Clear(); } void SFriendMgr::Clear() { SMessengerMgr::Clear(); m_strMsg = m_strCommunityName; } void SFriendMgr::ResetInfo() { m_strMsg.clear(); m_strCommunityName.clear(); SMessengerMgr::Clear(); } //int SFriendMgr::AddMessage( const char* szMsg ) int SFriendMgr::AddMessage( const char* szMsg, bool & bSelf ) // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. { /// 2011.01.19 bool형을 int로 바꿈 - prodongi STR_LIST strList; MsgSplit( szMsg, strList, L"|" ); if( strList.size() < 1 ) return 0;//false; if( ::_stricmp( strList[0].c_str(), "FLIST") == 0 ) //FLIST|name|online|name|online|..... { strList.erase( strList.begin() ); InfoMember(strList); strList.clear(); return 1;//true; } else if( ::_stricmp( strList[0].c_str(), "FSTATUS") == 0 ) //FSTATUS|name|online { strList.erase( strList.begin() ); ChangeMemberStatus(strList); strList.clear(); return 1;//true; } strList.clear(); return 0;//false; } void SFriendMgr::InfoMember( STR_LIST& vecText ) { // 이름|online // m_bParsing = true; // m_bIsExist = true; // m_nCommunityID = 0; Free(); if( vecText.size() <= 0 ) return; // m_strCommunityName = ""; // m_strLeaderName = ""; // m_strGuildName = ""; // m_strGulidLeaderName = ""; // m_nMaxLevel = 0; // m_nMinLevel = 0; int nLine = static_cast(vecText.size()); int nCount = nLine / 2; int nPos = 0; for( int i = 0; i < nCount; i++ ) { if( i > 0 ) nPos = (2*i); //4은 친구를 알려주는 정보에서 |를 기준으로 있는 개수(미정) SPlayerSlot* pSlot(NULL); if( !IsExistMember(vecText[0+nPos].c_str()) ) //아직 등록안된 플레이어니 new로 생성해서 push { pSlot = new SPlayerSlot; m_vecMemberList.push_back(pSlot); } else pSlot = FindMember( vecText[0+nPos].c_str() ); //이미 등록된 플레이어니 Find if( pSlot ) { pSlot->SetName( vecText[0+nPos].c_str() ); pSlot->SetLogin( ::atoi( vecText[1+nPos].c_str() ) ); } } // if( static_cast(m_vecMemberList.size()) == 1 ) // m_nMinLevel = m_nMaxLevel; } void SFriendMgr::ChangeMemberStatus( STR_LIST& vecText ) { if( vecText.size() < 2 ) return; SPlayerSlot* pSlot = FindMember( vecText[0].c_str() ); if( pSlot ) { pSlot->SetLogin( ::atoi( vecText[1].c_str() ) ); SIMSG_UI_FRIEND_UPDATE msg( vecText[0].c_str() ); SendGameInterfaceMsg( &msg ); } } ////////////////////////////////////////////////////////////////////////// // SCutMgr SCutMgr::SCutMgr() : SMessengerMgr() // 2011.03.29 - servantes { Clear(); } void SCutMgr::Clear() { SMessengerMgr::Clear(); m_strMsg = m_strCommunityName; } void SCutMgr::ResetInfo() { m_strMsg.clear(); m_strCommunityName.clear(); SMessengerMgr::Clear(); } //int SCutMgr::AddMessage( const char* szMsg ) int SCutMgr::AddMessage( const char* szMsg, bool & bSelf ) // 2010.11.29. bintitle. 메세지가 자신에게만 해당되는지 여부 반환. { /// 2011.01.19 bool형을 int로 바꿈 - prodongi STR_LIST strList; MsgSplit( szMsg, strList, L"|" ); if( strList.size() < 1 ) return 0;//false; if( ::_stricmp( strList[0].c_str(), "DLIST") == 0 ) //DLIST|name|name|..... { strList.erase( strList.begin() ); InfoMember(strList); strList.clear(); return 1;//true; } strList.clear(); return 0;//false; } void SCutMgr::InfoMember( STR_LIST& vecText ) { // 이름|이름|이름|... // m_bParsing = true; // m_bIsExist = true; // m_nCommunityID = 0; Free(); if( vecText.size() <= 0 ) return; // m_strCommunityName = ""; // m_strLeaderName = ""; // m_strGuildName = ""; // m_strGulidLeaderName = ""; // m_nMaxLevel = 0; // m_nMinLevel = 0; int nCount = static_cast(vecText.size()); int nPos = 0; for( int nPos = 0; nPos < nCount; nPos++ ) { SPlayerSlot* pSlot(NULL); if( !IsExistMember(vecText[nPos].c_str()) ) //아직 등록안된 플레이어니 new로 생성해서 push { pSlot = new SPlayerSlot; m_vecMemberList.push_back(pSlot); } else return; if( pSlot ) pSlot->SetName( vecText[nPos].c_str() ); } // if( static_cast(m_vecMemberList.size()) == 1 ) // m_nMinLevel = m_nMaxLevel; }