#include "StdAfx.h" #include "GroupManager.h" #include "User.h" #include "UserManager.h" #include "Struct.h" #include "WorldServer.h" #include "ServerSession.h" #include "ServerSessionManager.h" #include "PacketStruct_DW.h" #include "PacketStruct_AW.h" #include #include GroupManager::GroupManager(void) { m_pGroupPool = new util::CMemoryPoolFactory; m_pGroupPool->Initialize(50, 50); } GroupManager::~GroupManager(void) { delete m_pGroupPool; } bool GroupManager::CanAddGroupMember(User* request_user, User* dest_user, MSG_BASE* msg) { MSG_CW_GROUP_ADD_SYN *recv_msg = static_cast(msg); MSG_CW_GROUP_ADD_NAK nak_msg; if (request_user == NULL || dest_user == NULL) { nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ERR_DEFAULT; SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found user"); } else if (request_user->IsGroupTransaction() == TRUE) { //-- ÇØ´ç À¯Àú°¡ ´Ù¸¥ À¯Àú¿Í ±×·ì ½ÅûÀ» ½ÃµµÇÑ »óÅ nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ALREADY_GROUP_REQ; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Transaction error", recv_msg->ptszMemeberName); } else if (dest_user->GetAddBlockInfo() == TRUE) { //-- ±×·ì ¸É¹ö°¡ ±×·ì ¿äû °ÅºÎ Åä±ÛÀ» Ȱ¼ºÈ­ ½ÃÄ×´Ù. nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ON_TOGGLE_ADDBLOCK; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Ad request block user", recv_msg->ptszMemeberName); } else if (dest_user->IsGroupTransaction() == TRUE) { //-- »ó´ë¹æ¿¡°Ô ´©±º°¡ ÀÌ¹Ì ¿äûÁßÀÌ´Ù. nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ALREADY_GROUP_REQ; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Already group request", recv_msg->ptszMemeberName); } else if (!_tcsnicmp(request_user->GetCharName().c_str(), recv_msg->ptszMemeberName, MAX_CHARNAME_LENGTH)) { //-- Ãß°¡ÇÏ·Á´Â ±×·ì ¸É¹öÀÇ À̸§°ú ÀÚ½ÅÀÇ À̸§À» ºñ±³ nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::NOT_ADD_ME; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Not request to myself", recv_msg->ptszMemeberName); } else if (dest_user->GetCharLevel() >= request_user->GetCharLevel()) { //-- Ãß°¡ ÇÏ·Á´Â ±×·ì ¸É¹öÀÇ ·¹º§ÀÌ °°°Å³ª ³ôÀº °æ¿ì ½ÇÆÐ nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::NOT_MATCHING_LEVEL; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Not matching level", recv_msg->ptszMemeberName); } #if defined(_CHINA) else if (request_user->GetCharLevel() < HIGH_MEMBER_LEVEL || dest_user->GetCharLevel() < LOW_MEMBER_LEVEL) { //-- Áß±¹ ¿äûÀ¸·Î ·¹º§ÀÌ 80ÀÌ»ó »óÀ§ ¸É¹ö, 10ÀÌ»ó ÇÏÀ§ ¸É¹ö °¡´É nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::NOT_MATCHING_LEVEL; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Not matching level", recv_msg->ptszMemeberName); } #endif else if (GetGroupHighMember(dest_user) == GROUP_HAVE_ONLINE_HIGH || GetGroupHighMember(dest_user) == GROUP_HAVE_OFFLINE_HIGH) { //-- Ãß°¡ ÇÏ·Á´Â Äɸ¯ÅͰ¡ »óÀ§ ¸â¹ö¸¦ °¡Áö°í Àִ°¡? nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ALREADY_GROUP; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Already had high member", recv_msg->ptszMemeberName); } else if (FindGroupMember(request_user, recv_msg->ptszMemeberName)) { //-- ¸É¹ö°¡ ±×·ì¿¡ Á¸Àç ÇÒ¶§ nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::ALREADY_GROUP; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s Already Member", recv_msg->ptszMemeberName); } else if (GetLowMemberCount(request_user) >= MAX_GROUP_MEMBER_LOW_MAX) { //-- ÃÑ ±×·ì¿ø 6¸í ÇÏÀ§ ¸É¹ö´Â 5¸í±îÁö °¡´ÉÇÏ´Ù. nak_msg.m_byResult = MSG_CW_GROUP_ADD_NAK::GROUP_OVERFLOW; SUNLOG(eFULL_LOG, "["__FUNCTION__"]%s OverFlow member count", recv_msg->ptszMemeberName); } else { //-- ±×·ì ¸É¹ö µî·Ï °¡´É return true; } //-- ±×·ì ¸É¹ö µî·Ï ½ÇÆÐ ¸Þ¼¼Áö Send request_user->SendPacket((BYTE*)&nak_msg, sizeof(nak_msg)); return false; } //_NA_0_20100527_ADD_CHAR_RELATION_MEMO ÀÎÀÚ º¯°æ void GroupManager::SendGroupMemberInfo(User* pUser, const STRUCT_GROUP_MEMBER_INFO& stGroupMemberInfo, eGROUP_STAT stat) { MSG_CW_GROUP_ADD_ACK sendMsg; STRUCT_GROUP_MEMBER_PACKET_INFO& GroupMemberInfo = sendMsg.m_MemberInfo; const STRUCT_GROUP_MEMBER_PACKET_INFO& MemberPacketInfo = stGroupMemberInfo.GroupMemberInfo; GroupMemberInfo.bOnline = MemberPacketInfo.bOnline; GroupMemberInfo.byChannel = MemberPacketInfo.byChannel; GroupMemberInfo.byClass = MemberPacketInfo.byClass; GroupMemberInfo.Level = MemberPacketInfo.Level; _tcsncpy(GroupMemberInfo.ptszMemberName, MemberPacketInfo.ptszMemberName, _countof(GroupMemberInfo.ptszMemberName)); GroupMemberInfo.ptszMemberName[_countof(GroupMemberInfo.ptszMemberName) - 1] = '\0'; GroupMemberInfo.lastDate = MemberPacketInfo.lastDate; #ifdef _NA_0_20100527_ADD_CHAR_RELATION_MEMO sendMsg.charGUID = stGroupMemberInfo.charGUID; #endif sendMsg.m_GroupInfo = stat; pUser->SendPacket((BYTE*)&sendMsg, sizeof(sendMsg)); } //±×·ì ¸É¹ö ÀÚ·á ±¸Á¶¿¡¼­ Guid¸¦ ±â¹ÝÀ¸·Î Á¤º¸¸¦ °¡Á®¿Â´Ù. STRUCT_GROUP_MEMBER_INFO* GroupManager::FindGroupMember(User* user, DWORD char_guid) { if (user == NULL) { return NULL; } GROUP_MEMBER_MAP_ITER find_iterator = user->m_GroupMemberMap.find(char_guid); if (find_iterator == user->m_GroupMemberMap.end()) { return NULL; } return find_iterator->second; } //±×·ì ¸É¹ö ÀÚ·á ±¸Á¶¿¡¼­ À̸§À» ±â¹ÝÀ¸·Î ÇØ´ç Á¤º¸¸¦ ã´Â´Ù. STRUCT_GROUP_MEMBER_INFO* GroupManager::FindGroupMember(User* user, TCHAR* ptszMemberName) { if (user == NULL) { return NULL; } GROUP_MEMBER_MAP_ITER begin_iterator = user->m_GroupMemberMap.begin(), end_iterator = user->m_GroupMemberMap.end(); if (begin_iterator == end_iterator) { return NULL; } for (; begin_iterator != end_iterator; ++begin_iterator) { const STRUCT_GROUP_MEMBER_INFO& member_info = *(begin_iterator->second); if (!_tcsnicmp(member_info.GroupMemberInfo.ptszMemberName, ptszMemberName, MAX_CHARNAME_LENGTH)) { return begin_iterator->second; } } return NULL; } //À¯Àú°¡ °¡Áö°í ÀÖ´Â ¸â¹ö ¼ö ¸®ÅÏ int GroupManager::GetLowMemberCount( User* user ) { //MAX°ªÀ» ¸®ÅÏ °á°úÀûÀ¸·Î ¿äûÀÌ ½ÇÆÐÇÏ°Ô µÈ´Ù. if (user == NULL) return -1; GROUP_MEMBER_MAP_ITER begin_iterator = user->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER end_iterator = user->m_GroupMemberMap.end(); if (begin_iterator == end_iterator) { return 0; } int member_count = 0; for (;begin_iterator != end_iterator; ++begin_iterator) { const STRUCT_GROUP_MEMBER_INFO& member_Info = *(begin_iterator->second); if (member_Info.groupSTAT == GROUP_LEVEL_LOW) ++member_count; } return member_count; } void GroupManager::AddMemberInfo( User* pUser, const STRUCT_GROUP_MEMBER_INFO& Member ) { if (pUser == NULL) return; if (pUser->GetGroupMemberCount() >= MAX_GROUP_MEMBER) { SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"]OverFlow, User = %s, MemberGuid = %u" , pUser->GetCharName().c_str(), Member.charGUID ); return; } if (FindGroupMember(pUser, Member.charGUID) == NULL) { STRUCT_GROUP_MEMBER_INFO* pCurMember = AllocMemberInfo(); *pCurMember = Member; pUser->m_GroupMemberMap.insert(GROUP_MEMBER_MAP_PAIR(pCurMember->charGUID, pCurMember )); } else { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not Insert SameUser, User = %s, MemberGuid = %u" , pUser->GetCharName().c_str(), Member.charGUID); } } void GroupManager::SendMemberList(User* user) { if (user == NULL) return; int member_count = user->GetGroupMemberCount(); int low_member_count = GetLowMemberCount(user); //ÃÖ´ë ¸É¹ö¼öº¸´Ù ³ôÀ»¼ö´Â ¾øÁö¸¸ ³ô´Ù°í ÇØ¼­ ¼­ºñ½º¸¦ ¸ØÃâ¼ö´Â ¾ø´Ù. //ÇØ´ç ºÎºÐÆÄ¾ÇÀ» À§ÇØ ·Î±×¸¦ ³²±â¸ç ¸¹Àº ±×·ì¿øÀ» °¡Áö°í ÀÖÀ» °æ¿ì //±×·ì ÇýÅÃÀ» ¹ÞÁö ¸øÇÏ°Ô ÇÏ°í ¸Þ¼¼Áö¸¦ ³²±â´Â ¹æ¹ýÀ¸·Î ÇØ°áÇÑ´Ù. assert(member_count <= MAX_GROUP_MEMBER && member_count >= 0); if (member_count > MAX_GROUP_MEMBER || member_count < 0) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]User[%s]Groupmember count is incorrect = %d", user->GetCharName().c_str(), member_count); } assert(low_member_count <= MAX_GROUP_MEMBER_LOW_MAX && low_member_count >= 0); if (low_member_count > MAX_GROUP_MEMBER_LOW_MAX || low_member_count < 0) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]User[%s]Group Low Member Num Over = %d", user->GetCharName().c_str(), low_member_count); } GROUP_MEMBER_MAP_ITER begin_iterator = user->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER end_iterator = user->m_GroupMemberMap.end(); //¸É¹ö¼ö°¡ 0¸íÀ̶ó°í ÇØµµ ÀÀ´ä ÆÐŶÀ» Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸³½´Ù. MSG_CW_GROUP_GROUPLIST_ANS send_msg; for (int index = 0; begin_iterator != end_iterator; ++index, ++begin_iterator) { const STRUCT_GROUP_MEMBER_INFO& group_Info = *(begin_iterator->second); send_msg.sGroupMemberInfo[index] = group_Info; } send_msg.byGroupMemberNum = member_count; user->SendPacket((BYTE*)&send_msg, send_msg.GetSize()); SUNLOG(eFULL_LOG, "["__FUNCTION__"][%s][Guid:%u] Group List Send[Count:%d]", user->GetCharName().c_str(), user->GetGUID(), member_count); } STRUCT_GROUP_MEMBER_INFO* GroupManager::InsertMemberInfo( User* pUser, STRUCT_GROUP_MEMBER_INFO* pMember, eGROUP_STAT eMemberStat ) { if(!pUser) return NULL; pMember->accumEXP = 0; pMember->charGUID = pUser->GetCharGuid(); pMember->groupSTAT = eMemberStat; pMember->GroupMemberInfo.bOnline = TRUE; pMember->GroupMemberInfo.byChannel = (BYTE)pUser->GetChannelID(); pMember->GroupMemberInfo.byClass = pUser->GetCharClass(); pMember->GroupMemberInfo.Level = pUser->GetCharLevel(); memset( pMember->GroupMemberInfo.ptszMemberName, 0, sizeof(TCHAR)*(MAX_CHARNAME_LENGTH+1) ); _tcsncpy( pMember->GroupMemberInfo.ptszMemberName, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH ); pMember->GroupMemberInfo.ptszMemberName[MAX_CHARNAME_LENGTH] = '\0'; return pMember; } void GroupManager::RemoveMemberInfo( User* pUser, DWORD charGuid ) { if (pUser == NULL) return; GROUP_MEMBER_MAP_ITER iter; iter = pUser->m_GroupMemberMap.find(charGuid); if (iter == pUser->m_GroupMemberMap.end()) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"][%s] RemoveNewFriend Error[CharGuid:%u]", pUser->GetCharName().c_str() ); return; } pUser->m_GroupMemberMap.erase(iter); } //±×·ì ¸É¹öµé¿¡°Ô ·Î±×ÀÎÇÑ »ç½ÇÀ» ¾Ë¸°´Ù. ¸É¹öµéÀÇ ¿Â/¿ÀÇÁ¶óÀÎ µ¥ÀÌÅ͵µ ¹Ù²ãÁØ´Ù. void GroupManager::NotifyLoginState(User* pUser) { GROUP_MEMBER_MAP_ITER beginIT = pUser->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER endIT = pUser->m_GroupMemberMap.end(); if (beginIT == endIT) return; for (int i = 0; beginIT != endIT ; ++beginIT) { const STRUCT_GROUP_MEMBER_INFO& Info = *(beginIT->second); User* sendUser = UserManager::Instance()->FindUserByCharGuid(Info.charGUID); if (sendUser == NULL) continue; SetMemeberConnectStat(sendUser, pUser->GetCharGuid(), FALSE); UpdateGroupInfo(sendUser); MSG_CW_GROUP_LOGOUT_BRD Msg; _tcsncpy(Msg.ptszMemeberName, pUser->GetCharName().c_str(), _countof(Msg.ptszMemeberName)); Msg.ptszMemeberName[_countof(Msg.ptszMemeberName) - 1] = '\0'; sendUser->SendPacket((BYTE*)&Msg, sizeof(Msg)); } } //±×·ì ¸É¹öµé¿¡°Ô ·Î±×¾Æ¿ô ÇÑ »ç½ÇÀ» ¾Ë¸°´Ù. ¸É¹öµéÀÇ ¿Â/¿ÀÇÁ¶óÀÎ µ¥ÀÌÅ͵µ ¹Ù²ãÁØ´Ù. void GroupManager::NotifyLogOutState(User* pUser) { GROUP_MEMBER_MAP_ITER beginIT = pUser->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER endIT = pUser->m_GroupMemberMap.end(); if (beginIT == endIT) return; for (int i = 0; beginIT != endIT ; ++beginIT) { const STRUCT_GROUP_MEMBER_INFO& Info = *(beginIT->second); User* sendUser = UserManager::Instance()->FindUserByCharGuid(Info.charGUID); if (sendUser == NULL) continue; SetMemeberConnectStat(sendUser, pUser->GetCharGuid(), TRUE); UpdateGroupInfo(sendUser); MSG_CW_GROUP_LOGIN_BRD Msg; _tcsncpy(Msg.ptszMemeberName, pUser->GetCharName().c_str(), _countof(Msg.ptszMemeberName)); Msg.ptszMemeberName[_countof(Msg.ptszMemeberName) - 1] = '\0'; Msg.byChannel = static_cast(pUser->GetChannelID()); sendUser->SendPacket((BYTE*)&Msg, sizeof(Msg)); } } //»óÀ§ ¸É¹ö¿¡°Ô ÁöÁ¤µÈ °æÇèÄ¡¸¦ º¸³Ê½º·Î ÁØ´Ù. //»óÀ§ ¸É¹ö°¡ ·Î±×¾Æ¿ô »óÅÂ(Äɸ¯ÅÍ ¼±ÅÃâ Æ÷ÇÔ)¶ó¸é °æÇèÄ¡¸¦ ÀúÀåÇÏ°Ô µÈ´Ù. void GroupManager::NotifyEXPState(User* user) { if (user == NULL) { return; } GROUP_MEMBER_MAP_ITER begin_iterator = user->m_GroupMemberMap.begin(), end_iterator = user->m_GroupMemberMap.end(); if (begin_iterator == end_iterator) { //-- ¸É¹ö°¡ ¾ø´Ù. return; } for (; begin_iterator != end_iterator ; ++begin_iterator) { const STRUCT_GROUP_MEMBER_INFO& high_group_member_Info = *(begin_iterator->second); User* high_memeber_user = UserManager::Instance()->FindUserByCharGuid(high_group_member_Info.charGUID); #ifdef _NA_20101026_CHANGE_GROUP_BONUS_APPLY_WAY if ((high_group_member_Info.groupSTAT != GROUP_LEVEL_LOW) || (user->GetCharLevel() <= high_group_member_Info.GroupMemberInfo.Level)) { //-- »óÀ§ ¸â¹öÀ̰ųª ·¹º§ÀÌ ³ôÀ¸¸é continue; } #else if ((high_group_member_Info.groupSTAT != GROUP_LEVEL_HIGH) || (user->GetCharLevel() >= high_group_member_Info.GroupMemberInfo.Level)) { //-- »óÀ§ ¸â¹öÀ̰ųª ·¹º§ÀÌ ³ôÀ¸¸é continue; } #endif if((high_memeber_user == NULL) || (high_memeber_user->GetStatus() == eZONETYPE_CHARSELECT)) { //-- ¸â¹ö°¡ ¾ø°Å³ª Äɸ¯ÅÍ ¼±ÅÃâ À̸é SendAccumEXP(user->GetGUID(), high_group_member_Info.charGUID, user->GetCurBonusEXP()); continue; } ServerSession* agentserver = ServerSessionManager::Instance()->FindAgentServer(high_memeber_user->GetChannelID()); if (agentserver == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not found agentserver"); return; } MSG_AW_STATUS_GROUP_ADDEXP_CMD send_msg; { send_msg.m_CharGuid = high_group_member_Info.charGUID; send_msg.m_Amount = user->m_curBonusEXP; _tcsncpy(send_msg.m_szCharName, user->GetCharName().c_str(), _countof(send_msg.m_szCharName)); send_msg.m_szCharName[_countof(send_msg.m_szCharName) - 1] = '\0'; } agentserver->Send((BYTE*)&send_msg, sizeof(send_msg)); } } //ÇÏÀ§ ¸É¹ö¿¡°Ô º¸³Ê½º ±Ý¾×À» ÁØ´Ù.ÇÏÀ§ ¸É¹ö°¡ ¿ÀÇÁ¶óÀÎÀÌ¸é ¹«½ÃÇÑ´Ù. void GroupManager::NotifyMoneyState(User* user) { GROUP_MEMBER_MAP_ITER begin_iterator = user->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER end_iterator = user->m_GroupMemberMap.end(); if (begin_iterator == end_iterator) return; for (; begin_iterator != end_iterator ; ++begin_iterator) { const STRUCT_GROUP_MEMBER_INFO& low_group_member_Info = *(begin_iterator->second); User* low_member_user = \ UserManager::Instance()->FindUserByCharGuid(low_group_member_Info.charGUID); if (low_member_user == NULL) { continue; } #ifdef _NA_20101026_CHANGE_GROUP_BONUS_APPLY_WAY if ((low_group_member_Info.groupSTAT != GROUP_LEVEL_HIGH) || (user->GetCharLevel() >= low_member_user->GetCharLevel())) { continue; } #else if ((low_group_member_Info.groupSTAT != GROUP_LEVEL_LOW) || (user->GetCharLevel() <= low_member_user->GetCharLevel())) { continue; } #endif ServerSession* agentserver = ServerSessionManager::Instance()->FindAgentServer(low_member_user->GetChannelID()); if (agentserver != NULL) { MSG_AW_STATUS_GROUP_ADDMONEY_CMD send_msg; send_msg.m_CharGuid = low_group_member_Info.charGUID; send_msg.m_Amount = user->m_curBonusMoney; _tcsncpy(send_msg.m_szCharName, user->GetCharName().c_str(), _countof(send_msg.m_szCharName)); send_msg.m_szCharName[_countof(send_msg.m_szCharName) - 1] = '\0'; agentserver->Send((BYTE*)&send_msg, sizeof(send_msg)); } else { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not found AgentServer"); } } } //¸É¹öµé¿¡°Ô ·¹º§¾÷ »ç½ÇÀ» ¾Ë¸°´Ù. »óÀ§ ¸É¹ö¿Í ·¹º§ÀÌ °°¾ÆÁö¸é ´õÀÌ»ó ±×·ì È¿°ú°¡ Áö¼ÓµÉ ¼ö //¾øÀ½À» Ŭ¶óÀÌ¾ðÆ® Ãø¿¡¼­ ¾Ë·ÁÁØ´Ù. void GroupManager::NotifyLevelUpState(User* pUser) { GROUP_MEMBER_MAP_ITER beginIT = pUser->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER endIT = pUser->m_GroupMemberMap.end(); if(beginIT == endIT) return; for (int i = 0; beginIT != endIT ; ++beginIT) { const STRUCT_GROUP_MEMBER_INFO& Info = *(beginIT->second); User* sendUser = UserManager::Instance()->FindUserByCharGuid(Info.charGUID); if(sendUser == NULL) continue; MSG_CW_GROUP_LEVELUP_BRD Msg; _tcsncpy(Msg.ptszMemeberName, pUser->GetCharName().c_str(), _countof(Msg.ptszMemeberName)); Msg.ptszMemeberName[_countof(Msg.ptszMemeberName) - 1] = '\0'; Msg.charLevel = (BYTE)pUser->GetCharLevel(); sendUser->SendPacket((BYTE*)&Msg, sizeof(Msg)); } } void GroupManager::SendAroundMember( User* pUser, eSTAT_ALAM member_stat ) { if(pUser == NULL) return; int group_num = pUser->GetGroupMemberCount(); if( group_num <= 0) return; assert(group_num <= MAX_GROUP_MEMBER); if(group_num > MAX_GROUP_MEMBER) { //¸Å¿ì Ư¼öÇÑ »óȲÀ̳ª ÇØ´ç ·ÎÁ÷À» ¸ØÃâ¼ö´Â ¾ø´Ù. È®ÀÎÈÄ ÈÄó¸® SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"]%s Member count is Over[count:%d]", pUser->GetCharName().c_str(), group_num); } switch (member_stat) { case LOG_OUT: { NotifyLoginState(pUser); break; } case LOG_IN: { NotifyLogOutState(pUser); break; } case GET_MONEY: { NotifyMoneyState(pUser); break; } case GET_EXP: { NotifyEXPState(pUser); break; } case MEMBER_LEVELUP: { NotifyLevelUpState(pUser); break; } } } //À¯Àú°¡ °¡Áö°í ÀÖ´Â GroupMemberMap¿¡¼­ ÇØ´ç À¯ÀúÀÇ ¿Â¶óÀÎ ¿ÀÇÁ¶óÀÎ Á¤º¸¸¦ ¼¼ÆÃÇÑ´Ù. bool GroupManager::SetMemeberConnectStat( User* pUser, DWORD dwCharGuid, BOOL bConnectStat ) { if(!pUser) return FALSE; STRUCT_GROUP_MEMBER_INFO* pMemberInfo = FindGroupMember(pUser, dwCharGuid); if(!pMemberInfo) return FALSE; pMemberInfo->GroupMemberInfo.bOnline = bConnectStat; return TRUE; } //Çʵå ÀÔÀå½Ã Äɸ¯ÅÍÀÇ ±×·ì Á¤º¸¸¦ ¼¼ÆÃÇÑ´Ù. bool GroupManager::SetMemberInfo(User* pUser, const STRUCT_GROUP_MEMBER_INFO& Member) { if (pUser == NULL) return FALSE; if (pUser->GetGroupMemberCount() > MAX_GROUP_MEMBER) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]OverFlow, User = %s, MemberGuid = %u" , pUser->GetCharName().c_str(), Member.charGUID); } if (FindGroupMember(pUser, Member.charGUID) == NULL) { STRUCT_GROUP_MEMBER_INFO* pCurMember = AllocMemberInfo(); *pCurMember = Member; pUser->m_GroupMemberMap.insert(GROUP_MEMBER_MAP_PAIR(Member.charGUID, pCurMember)); return TRUE; } else { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Already Group, User[%s], MemberGuid = %u" , pUser->GetCharName().c_str(), Member.charGUID); return FALSE; } } STRUCT_GROUP_MEMBER_INFO* GroupManager::AllocMemberInfo() { return (STRUCT_GROUP_MEMBER_INFO*) m_pGroupPool->Alloc(); } //À¯ÀúÀÇ ±×·ì ¸É¹ö¸¦ ÃʱâÈ­ ÇÒ¶§( À¯Àú ÀçÁ¢¼Ó °°Àº °æ¿ì ) void GroupManager::RealeseMember( User *pUser ) { if(!pUser) return; GROUP_MEMBER_MAP_ITER iter; while( !pUser->m_GroupMemberMap.empty() ) { iter = pUser->m_GroupMemberMap.begin(); pUser->m_GroupMemberMap.erase(iter); } } //À¯ÀúÀÇ ÇöÀç ±×·ì Á¤º¸¸¦ °ÔÀÓ ¼­¹ö¿Í µ¿±âÈ­ ½ÃŲ´Ù void GroupManager::UpdateGroupInfo( User* pUser ) { if (pUser == NULL) return; pUser->m_eHighMember = GROUP_HAVE_NONE; pUser->m_eLowMember = GROUP_HAVE_NONE; GROUP_MEMBER_MAP_ITER beginIter = pUser->m_GroupMemberMap.begin(); GROUP_MEMBER_MAP_ITER endIter = pUser->m_GroupMemberMap.end(); //MAP¿¡ ÀúÀåµÈ ¸â¹ö Á¤º¸¸¦ ±â¹ÝÀ¸·Î ±×·ì Á¤º¸¸¦ ¼¼ÆÃÇÑ´Ù. //¸É¹ö»óÇÏÀ§Áß ÇѸíÀÌ¶óµµ ¿Â¶óÀÎÀÌ µÇ¾îÀÖÀ¸¸é °Ë»ç¸¦ ¸¶Ä£´Ù. while (beginIter != endIter) { const STRUCT_GROUP_MEMBER_INFO& CurMemberInfo = *(beginIter->second); const STRUCT_GROUP_MEMBER_PACKET_INFO& GroupMemberInfo = CurMemberInfo.GroupMemberInfo; if (CurMemberInfo.groupSTAT == GROUP_LEVEL_HIGH) { if (GroupMemberInfo.bOnline == TRUE) { pUser->m_eHighMember = GROUP_HAVE_ONLINE_HIGH; } else { pUser->m_eHighMember = GROUP_HAVE_OFFLINE_HIGH; } } else if (pUser->m_eLowMember != GROUP_HAVE_ONLINE_LOW && CurMemberInfo.groupSTAT == GROUP_LEVEL_LOW) { if (GroupMemberInfo.bOnline == TRUE) { pUser->m_eLowMember = GROUP_HAVE_ONLINE_LOW; } else { pUser->m_eLowMember = GROUP_HAVE_OFFLINE_LOW; } } //»óÇÏÀ§ ¸â¹ö°¡ ÀüºÎ ¿Â¶óÀÎÀ¸·Î¼¼ÆÃ µÇ¾îÀÖÀ¸¸é ´õÀÌ»ó »ìÆìº¼ ÇÊ¿ä ¾ø´Ù. if (pUser->m_eHighMember == GROUP_HAVE_ONLINE_HIGH && pUser->m_eLowMember == GROUP_HAVE_ONLINE_LOW) break; beginIter++; } SendGroupInfoSet( pUser, pUser->m_eHighMember, pUser->m_eLowMember ); } //À¯Àú »óÀ§ ¸â¹ö Á¤º¸¸¦ ¼¼ÆÃÇÑ´Ù( °ÔÀÓ ¼­¹ö ³»¿ë°ú µ¿±âÈ­ ) void GroupManager::SetGroupHighMember( User* pUser, eGROUP_STAT eHighMember ) { if(!pUser) return; pUser->m_eHighMember = eHighMember; } //À¯Àú ÇÏÀ§ ¸â¹ö Á¤º¸¸¦ ¼¼ÆÃÇÑ´Ù( °ÔÀÓ ¼­¹ö ³»¿ë°ú µ¿±âÈ­ ) void GroupManager::SetGroupLowMember( User* pUser, eGROUP_STAT eLowMember ) { if(!pUser) return; pUser->m_eLowMember = eLowMember; } //±×·ì ¸É¹ö Á¤º¸ µ¿±âÈ­¸¦ À§ÇÑ Á¤º¸¸¦ °ÔÀÓ ¼­¹ö·Î º¸³½´Ù. void GroupManager::SendGroupInfoSet(User* pUser, eGROUP_STAT eHighMember, eGROUP_STAT eLowMember) { if(pUser == NULL) return; ServerSession* pAgentServer = ServerSessionManager::Instance()->FindAgentServer( pUser->GetChannelID() ); if(pAgentServer == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not found AgentServer"); return; } ServerSession *pGameDBProxy = ServerSessionManager::Instance()->GetGameDBProxy(); if(pGameDBProxy == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not found DBProxy"); return; } MSG_AW_STATUS_GROUP_SET_MEMBERINFO_CMD agentMsg; agentMsg.m_CharGuid = pUser->GetCharGuid(); agentMsg.m_HighGroupinfo = pUser->m_eHighMember; agentMsg.m_LowGroupInfo = pUser->m_eLowMember; pAgentServer->Send((BYTE*)&agentMsg, sizeof(agentMsg)); MSG_DW_GROUP_SET_MEMBERINFO_CMD DBPMsg; DBPMsg.m_UserKey = pUser->GetGUID(); DBPMsg.m_HighGroupinfo = pUser->m_eHighMember; DBPMsg.m_LowGroupInfo = pUser->m_eLowMember; pGameDBProxy->Send((BYTE*)&DBPMsg, sizeof(DBPMsg)); return; } eGROUP_STAT GroupManager::GetGroupHighMember( User* pUser ) { if(!pUser) return GROUP_STAT_ERROR; return pUser->m_eHighMember; } eGROUP_STAT GroupManager::GetGroupLowMember( User* pUser ) { if(!pUser) return GROUP_STAT_ERROR; return pUser->m_eLowMember; } bool GroupManager::SendAccumEXP( DWORD userGuid, CHARGUID highGuid, EXPTYPE accumEXP ) { MSG_DW_GROUP_ACCUMEXP_CMD sendMsg; { sendMsg.m_UserKey = userGuid; sendMsg.m_HighCharGUID = highGuid; sendMsg.m_AccumEXP = (DWORD)accumEXP; } ServerSession *game_db_proxy = ServerSessionManager::Instance()->GetGameDBProxy(); if(game_db_proxy == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not found gamebdproxy"); return FALSE; } game_db_proxy->Send((BYTE*)&sendMsg, sizeof(sendMsg)); return TRUE; } //lastDate¿Í ÇöÀç ½Ã°£Â÷À̰¡ chDateº¸´Ù Å©¸é FALSE ¸®ÅÏ bool GroupManager::IsOverBonusDate( DWORD64 last_date, INT check_date ) { tm stLastDate; SYSTEMTIME LASTTIME; time_t t_LastTime, t_NowTime, t_AccumTime; int date; last_date = last_date * 100;//Ãʽð£À» ¸ÂÃß±â À§ÇØ 100À» °öÇØÁØ´Ù. util::YYYYMMDDHHMMSSToSYSTEMTIME(last_date, LASTTIME);//DWORD64¸¦ LASTTIMEÀ¸·Î º¯°æ stLastDate.tm_year = LASTTIME.wYear - 1900; stLastDate.tm_mon = LASTTIME.wMonth - 1; stLastDate.tm_mday = LASTTIME.wDay; stLastDate.tm_hour = LASTTIME.wHour; stLastDate.tm_min = LASTTIME.wMinute; stLastDate.tm_sec = LASTTIME.wSecond; //util::GetDateTime_YYMMDDHHMMSS() : time()À¸·Î ±¸ÇÑ ½Ã°£À» DWORD64·Î º¯°æ //util::GetDateTime_YYMMDDHHMM() t_LastTime = mktime(&stLastDate); util::TimeSync::time(&t_NowTime); t_AccumTime = t_NowTime - t_LastTime; date = (INT)t_AccumTime / (3600*24); if (date > check_date) return FALSE; return TRUE; } void GroupManager::SendAccumEXPMemo( User* pUser ) { TCHAR toCharName[MAX_CHARNAME_LENGTH + 1]; _tcsncpy(toCharName, pUser->GetCharName().c_str(), _countof(toCharName)); toCharName[_countof(toCharName) - 1] = '\0'; MSG_DW_MEMO_SEND_SYN sendMsg; sendMsg.m_dwKey = 0; // ½Ã½ºÅÛÀ¸·ÎºÎÅÍÀÇ ÂÊÁö sendMsg.m_SendGuid = 0; // ½Ã½ºÅÛÀ¸·ÎºÎÅÍÀÇ ÂÊÁö // added by _NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION = { sendMsg.m_typeSystemMemo = NORMAL_MEMO; sendMsg.m_recvItemCode = 0; sendMsg.m_amountCost = 0; sendMsg.m_recvGuid = 0; // } _tcsncpy(sendMsg.m_ptszRecvName, toCharName, _countof(sendMsg.m_ptszRecvName)); sendMsg.m_ptszRecvName[_countof(sendMsg.m_ptszRecvName) - 1] = '\0'; _sntprintf(sendMsg.m_ptszMemo, _countof(sendMsg.m_ptszMemo), "%d|%d", SYSMEMO_GROUP_MGR, pUser->GetCurAccumEXP()); sendMsg.m_ptszMemo[_countof(sendMsg.m_ptszMemo) - 1] = '\0'; ServerSession *pGameDBProxy = ServerSessionManager::Instance()->GetGameDBProxy(); if (pGameDBProxy == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]No GameDBProxy"); return ; } pGameDBProxy->Send((BYTE*)&sendMsg, sizeof(sendMsg)); }