#include "StdAfx.h" #include ".\wfriendinvitationcontroller.h" #include "ServerSession.h" #include "ServerSessionManager.h" #include "UserManager.h" #include "PacketStruct_DW.h" #include "PacketStruct_AW.h" #include "Handler_DW.h" #include "Handler_CW.h" WFriendInvitationController::WFriendInvitationController(void) { } WFriendInvitationController::~WFriendInvitationController(void) { } VOID WFriendInvitationController::OnAddInvitatedFriendCMD(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize) { MSG_AW_FRIEND_INVITATIONR_INSERT_CMD* msg = (MSG_AW_FRIEND_INVITATIONR_INSERT_CMD*)pMsg; SUNLOG(eDEV_LOG, "******************************************"); SUNLOG(eDEV_LOG, "OnFriendInvitationInsert Recv (%u)", msg->InvitateInfo.dwGuid); SUNLOG(eDEV_LOG, "******************************************"); User* pUser = UserManager::Instance()->FindUserByCharGuid( msg->InvitateInfo.dwGuid ); if( pUser )// ³»°¡ ¿Â¶óÀÎ »óŶó¸é { //³ª¿¡°Ô Ä£±¸°¡ Ãß°¡µÆ´Ù°í ¾Ë·ÁÁØ´Ù. MSG_DW_FRIEND_ADD_ACK MsgAdd; MsgAdd.m_CharGuidFrom = msg->InvitateInfo.dwGuid; MsgAdd.m_ToFriendInfo.dwFriendGuid = msg->InvitateInfo.dwFriendGuid; MsgAdd.m_ToFriendInfo.sPacketInfo.bOnline = FALSE; MsgAdd.m_ToFriendInfo.sPacketInfo.byChannel = 0; MsgAdd.m_ToFriendInfo.sPacketInfo.byClass = msg->InvitateInfo.byClass; MsgAdd.m_ToFriendInfo.sPacketInfo.Level = 1; ZeroMemory(MsgAdd.m_ToFriendInfo.sPacketInfo.ptszFriendName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH); memcpy( MsgAdd.m_ToFriendInfo.sPacketInfo.ptszFriendName, msg->InvitateInfo.ptszFriendName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH ); ServerSession *pGameDBProxy = ServerSessionManager::Instance()->GetGameDBProxy(); Handler_DW::OnDW_FRIEND_ADD_ACK( (GameDBProxySession*)pGameDBProxy, (MSG_BASE*)&MsgAdd, sizeof(MsgAdd)); pUser->GetFriendMap(User::FRIEND_INVIATE)->AddFriendInfo(&MsgAdd.m_ToFriendInfo); //Ä£±¸ Ãß°¡ »óÅÂÀÎÁö ¾Ë·ÁÁØ´Ù. INVITATEFRIENDLIST_INFO InvitateFriendList; ListProc.GetInvitateFriendList(User::FRIEND_INVIATE, pUser, InvitateFriendList, msg->InvitateInfo.dwFriendGuid); ListProc.SendInvitateFriendList(pUser, InvitateFriendList, INVITATEFRIENDLIST_INFO::FRIENDLIST_ADD, SEND_BOTH); //ÂÊÁö°¡¿Ô´Ù°í ¾Ë·ÁÁØ´Ù. (´Ù½Ã ¿äûÇÑ´Ù.) MSG_CW_MEMO_LIST_REQ msgMemo; Handler_CW::OnCW_MEMO_LIST_REQ(pUser, (MSG_BASE*)&msgMemo, sizeof(msgMemo)); } } VOID WFriendInvitationController::OnCharacterLevelUp(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize) { if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent()) { //SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!"); return; } MSG_AW_USER_LEVELUP_CMD* pRecvMsg = (MSG_AW_USER_LEVELUP_CMD*)pMsg; User *pUser = UserManager::Instance()->FindUserByCharGuid( pRecvMsg->m_CharGuid ); if( !pUser ) { SUNLOG( eCRITICAL_LOG, "CMD_AW_USER_LEVELUP_CMD Error - No Levelup User[CharGuid:%u]", pRecvMsg->m_CharGuid ); return; } switch(pRecvMsg->m_Level) //·¹º§ 20, 40, 60, 80 ´Þ¼º½Ã ¼±¹° ÁõÁ¤ { case eINVITATION_REWARDSECTION_1: case eINVITATION_REWARDSECTION_2: case eINVITATION_REWARDSECTION_3: case eINVITATION_REWARDSECTION_4: LevelChangedProc.ChangedEventLevel(pUser, pRecvMsg->m_Level); break; } } VOID WFriendInvitationController::OnFriendRemove(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize) { if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent()) { SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!"); return; } MSG_DW_FRIEND_DEL_ACK* pRecvMsg = (MSG_DW_FRIEND_DEL_ACK*)pMsg; InviateFriendRemove(pRecvMsg->m_CharGuidFrom, pRecvMsg->m_CharGuidTo); /* User* pUser = UserManager::Instance()->FindUserByCharGuid( pRecvMsg->m_CharGuidFrom ); if( !pUser ) { SUNLOG( eFULL_LOG, "[CharGuid:%u] FRIEND_DEL_ACK - Already Logout", pRecvMsg->m_CharGuidFrom ); return; } STRUCT_FRIEND_INFO* pFriendInfo = pUser->GetFriendMap()->FindFriend( pRecvMsg->m_CharGuidTo ); if( !pFriendInfo ) { SUNLOG( eCRITICAL_LOG, "[%s/%u] FRIEND_DEL Error - Friend Already Deleted", pUser->GetCharName().c_str(), pRecvMsg->m_CharGuidTo ); return; } ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pUser, pFriendInfo->dwFriendGuid); ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pUser, pFriendInfo->dwFriendGuid); User *pFriendUser = UserManager::Instance()->FindUserByCharGuid( pFriendInfo->dwFriendGuid ); if( pFriendUser ) { ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pFriendUser, pUser->GetCharGuid()); ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pFriendUser, pUser->GetCharGuid()); } */ } VOID WFriendInvitationController::OnFriendBlock(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize) { if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent()) { SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!"); return; } MSG_DW_FRIEND_BLOCK_ACK* pRecvMsg = (MSG_DW_FRIEND_BLOCK_ACK*)pMsg; InviateFriendRemove(pRecvMsg->m_CharGuidFrom, pRecvMsg->m_BlockInfo.dwBlockGuid); } VOID WFriendInvitationController::InviateFriendRemove(CHARGUID CharacterGUIDFrom, CHARGUID CharacterGUIDTo) { User* pUser = UserManager::Instance()->FindUserByCharGuid( CharacterGUIDFrom ); if( !pUser ) { SUNLOG( eFULL_LOG, "[CharGuid:%u] InviateFriendRemove - Already Logout", CharacterGUIDFrom ); return; } STRUCT_FRIEND_INFO* pFriendInfo = pUser->GetFriendMap()->FindFriend( CharacterGUIDTo ); if( !pFriendInfo ) { SUNLOG( eCRITICAL_LOG, "[%s/%u] InviateFriendRemove Error - Friend Already Deleted", pUser->GetCharName().c_str(), CharacterGUIDTo ); return; } ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pUser, pFriendInfo->dwFriendGuid); ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pUser, pFriendInfo->dwFriendGuid); User *pFriendUser = UserManager::Instance()->FindUserByCharGuid( pFriendInfo->dwFriendGuid ); if( pFriendUser ) { ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pFriendUser, pUser->GetCharGuid()); ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pFriendUser, pUser->GetCharGuid()); } } //µðºñ¿¡¼­ Ä£±¸ ¸ñ·Ï ¹Þ±â ¼º°ø void WFriendInvitationController::OnAddFriend(STRUCT_FRIEND_INFO& sFriendInfo, STRUCT_FRIEND_DB_INFO& sFriendDBInfo, User* pUser) { CHECK_FRIENDINVITATION_EVENT_RETRUN; if(sFriendDBInfo.Sts == STRUCT_FRIEND_DB_INFO::INFO_INVIAT) { //³»°¡ ÃßõÇÑ Ä£±¸°¡ À̺¥Æ® Á¾·á ·¹º§ ÀÌ»óÀ̾ú´Âµ¥µµ ÀÏ¹Ý Ä£±¸°¡ ¾Æ´Ï¸é µðºñ Á¤º¸°¡ À߸øµÈ°Å¾ß if(sFriendDBInfo.Level >= GetEventMaxLevel()) { SUNLOG( eFULL_LOG, "DW_FRIEND_GETLIST_ACK Error - Friend Invitation Reletion Code fail[InviatCharGuid:%u, BeInviatedCharGuid:%u]", pUser->GetCharGuid(), sFriendDBInfo.dwFriendGuid); } else { pUser->GetFriendMap(User::FRIEND_INVIATE)->AddFriendInfo(&sFriendInfo); } } else if(sFriendDBInfo.Sts == STRUCT_FRIEND_DB_INFO::INFO_BEINVIATED) { //³»°¡ Ä£±¸ ÃßõÀ» ¹Þ¾Ò´Âµ¥ ³»°¡ À̺¥Æ® Á¾·á ·¹º§ ÀÌ»óÀ̾ú´Âµ¥µµ ÀÏ¹Ý Ä£±¸°¡ ¾Æ´Ï¸é µðºñ Á¤º¸°¡ À߸øµÈ°Å¾ß if(pUser->GetCharLevel() >= GetEventMaxLevel()) { SUNLOG( eFULL_LOG, "DW_FRIEND_GETLIST_ACK Error - Friend Invitation Reletion Code fail[InviatCharGuid:%u, BeInviatedCharGuid:%u]", sFriendDBInfo.dwFriendGuid, pUser->GetCharGuid()); } else { pUser->GetFriendMap(User::FRIEND_BEINVIATED)->AddFriendInfo(&sFriendInfo); } } } BYTE WFriendInvitationController::GetFriendSts(User* pUser, DWORD FriendGUID) { if(NULL != pUser->GetFriendMap(User::FRIEND_INVIATE)->FindFriend(FriendGUID)) return STRUCT_FRIEND_DB_INFO::INFO_INVIAT; else if(NULL != pUser->GetFriendMap(User::FRIEND_BEINVIATED)->FindFriend(FriendGUID)) return STRUCT_FRIEND_DB_INFO::INFO_BEINVIATED; return STRUCT_FRIEND_DB_INFO::INFO_FRIEND; } void WFriendInvitationController::SendInvitateFriendList(User* pUser, DWORD ServerType) { CHECK_FRIENDINVITATION_EVENT_RETRUN; ListProc.SendInvitateFriendList(User::FRIEND_INVIATE, pUser, INVITATEFRIENDLIST_INFO::FRIENDLIST_INIT, ServerType); ListProc.SendInvitateFriendList(User::FRIEND_BEINVIATED, pUser, INVITATEFRIENDLIST_INFO::FRIENDLIST_INIT, ServerType); }