#include "WorldServerPch.hxx" #include "./Handler_DW.h" #include #include #include "./PacketHandler.h" #include "WorldServer.h" #include "Sessions/ServerSessionInWorld.h" #include "Channel/WorldChannelManager.h" #include "Channel/WorldChannel.h" #include "Objects/WorldUserManager.h" #include "Objects/WorldUser.h" #include "Services/ChattingService.h" #include "Services/Friends/FriendMap.h" #include "Services/Friends/FriendInvitation.h" #include "Services/Group/GroupManager.h" #include "Services/Lotto/Lotto.h" #include "Services/Memo/WorldSystemMemo.h" #include "Services/Guild/WorldGuildManager.h" #include "Services/Guild/WorldGuild.h" //================================================================================================== namespace ns_world { namespace handlers { ; }}; //end of namespace const ns_world::PacketHandlerInfo ns_world::handlers::Handler_DW::GetPacketHandlerNodes() { #undef HANDLER_NODE_INFO #undef HANDLER_NODE_INFO_EOR #define HANDLER_NODE_INFO(_category_, _protocol_, _phase_) \ { MAKEWORD(_category_, _protocol_), _phase_, &ns_world::handlers::Handler_DW::On##_protocol_ } #define HANDLER_NODE_INFO_EOR() { 0, static_cast(0), NULL } static const ns_world::PacketHandlerNode handlers_static_[] = { HANDLER_NODE_INFO(DW_CONNECTION, DW_CONNECTION_SERVER_INFO_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_GETLIST_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_GETLIST_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_ADD_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_ADD_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DEL_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DEL_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_FREE_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_FREE_NAK, PHASE_SERVICE), //_NA_0_20100527_ADD_CHAR_RELATION_MEMO HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DETAIL_INFO_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DETAIL_INFO_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_MEMO_UPDATE_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_MEMO_UPDATE_NAK, PHASE_SERVICE), //äÆÃ±ÝÁö/Çã¿ë HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATALLOW_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATALLOW_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_UPDATE_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCKTIME_ANS, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCKTIME_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_ADD_REVENGE_CHAR_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_ADD_REVENGE_CHAR_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_REMOVE_REVENGE_CHAR_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_REMOVE_REVENGE_CHAR_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_PK_REVENGE_CHAR_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_PK_REVENGE_CHAR_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_SEND_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_SEND_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_LIST_ANS, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_LIST_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_VIEW_ANS, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_VIEW_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_DELETE_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_DELETE_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_STATUS, DW_STATUS_INTERCEPTION_ANS, PHASE_SERVICE), HANDLER_NODE_INFO(DW_STATUS, DW_STATUS_INTERCEPTION_NAK, PHASE_SERVICE), //__NA001254_20090109_RTTG_FUNC_ADD HANDLER_NODE_INFO(DW_MEMO, DW_MULTIMEMO_SEND_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_ADD_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_ADD_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_DEL_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_DEL_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_LIST_ACK, PHASE_SERVICE), //__NA_001359_20090619_HEIM_LOTTO_SYSTEM = { HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_LOAD_ENTRY_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_LOAD_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_WINNER_LIST_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_SAVE_ENTRY_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_ROLLOVER_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_ADD_TICKET_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_REWARD_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_NOTICE_LIST_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_NOTICE_DEL_ACK, PHASE_SERVICE), //} HANDLER_NODE_INFO(DW_GUILD, DW_DOMINATION_FINDMONEY_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GUILD, DW_GUILD_WAREHOUSE_LOGLIST_ANS, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GUILD, DW_GUILD_WAREHOUSE_LOGLIST_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(DW_GUILD, DW_GUILD_SELECT_NOTICE_ACK, PHASE_SERVICE), //HANDLER_NODE_INFO(DW_GUILD, DW_GUILD_SELECT_NOTICE_NAK, PHASE_SERVICE), //------------------------------------------------------------------------------------------ HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_DESTROY_GUILD_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_JOIN_GUILD_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_WITHDRAW_GUILD_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_NOTICE_CMD, PHASE_SERVICE), #ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHUNTING_PVP_RESULT_CMD, PHASE_SERVICE), #endif HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_DUTY_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_MASTER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_COMMANDER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_CORPS_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CREATE_REAR_CAMP_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_DESTROY_REAR_CAMP_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CREATE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_RESTORE_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_LOGIN_CHAR_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_LOGOUT_CHAR_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_KICK_PLAYER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_MEMBER_INFO_REQ_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_RECOVERY_GUILD_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_DESTROY_WAIT_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_GUILDMARK_REGISTER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_GUILDMARK_DELETE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_NOTICE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHANGE_NOTICE_NAK, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_NAME_CHANGE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_DOMINATION_RETURNHIME_CMD, PHASE_SERVICE), //_NA_0_20100527_ADD_CHAR_RELATION_MEMO HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHECK_CONDITION_ACCESS_DETAIL_INFO_ACK, PHASE_SERVICE), HANDLER_NODE_INFO(WZ_GUILD, WZ_GUILD_CHECK_CONDITION_ACCESS_DETAIL_INFO_NAK, PHASE_SERVICE), //------------------------------------------------------------------------------------------ // HANDLER_NODE_INFO_EOR() // end of records }; // BOOST_STATIC_ASSERT(_countof(handlers_static_) >= 1); ns_world::PacketHandlerInfo return_value = { handlers_static_, _countof(handlers_static_) - 1 }; // return return_value; }; //================================================================================================== //================================================================================================== //================================================================================================== #undef HANDLER_NODE_INFO #define HANDLER_NODE_INFO(_category_, _protocol_, _phase_) \ void ns_world::handlers::Handler_DW::On##_protocol_(\ ns_world::ServerSessionInWorld* const server_session, \ const MSG_BASE* const msg_base, const uint16_t msg_size) #define WAVERIX_WORLD_HANDLER_DEBUGGING() \ WAVERIX_WRAPPER((WAVERIX_LC_CALL4("waverix_log_trace_dw", \ __FUNCTION__, server_session, msg_base, msg_size))) #if SUN_CODE_SAMPLE // to support visual assistx intelli-sense ns_world::ServerSessionInWorld* server_session; MSG_BASE* msg_base; uint16_t msg_size; #endif //================================================================================================== HANDLER_NODE_INFO(DW_CONNECTION, DW_CONNECTION_SERVER_INFO_CMD, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); SUNLOG(eCRITICAL_LOG, "|["__FUNCTION__"]|"); } // Ä£±¸ ¸ñ·Ï ¼ö½Å HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_GETLIST_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_GETLIST_ACK* const recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); ns_world::WorldUser* user = user_manager->FindUserByCharGuid(recv_msg->m_CharGuid); if (bool cant_found = (user == NULL)) { SUNLOG(eCRITICAL_LOG, _T("|[%s]|Msg=can't found user(CharGuid=%d)|"), __FUNCTION__, recv_msg->m_CharGuid); return; }; const DWORD char_guid = recv_msg->m_CharGuid; if (bool mismatched = (user->GetConnectedCharInfo().char_guid != char_guid)) { SUNLOG(eCRITICAL_LOG, _T("|[%s]|Msg=can't found user's character(current:reply=%d:%d)|"), __FUNCTION__, user->GetConnectedCharInfo().char_guid, char_guid); return; }; if (_countof(recv_msg->m_sFriendInfo) < recv_msg->number_of_friends) { assert(!"index out of ranges"); SUNLOG(eCRITICAL_LOG, _T("|[%s]|Msg=index out of ranges (max:num=%d:%d)|"), __FUNCTION__, _countof(recv_msg->m_sFriendInfo), recv_msg->number_of_friends); return; }; ns_world::FriendMap* const friend_map = ns_world::FriendMap::Instance(); friend_map->StoreTotalFriendContentsList(user, \ recv_msg->m_sFriendInfo, recv_msg->number_of_friends); if (user->EnabledSendMessage() == false) { SUNLOG(eCRITICAL_LOG, _T("|[%s]|Msg=target user unlinked, channel=%d|"), __FUNCTION__, user->GetUserAccountInfo().channel->GetChannelID()); return; }; MSG_AW_CHAO_REQUEST_REVENGEINFO_ACK msg_ack; msg_ack.m_dwCharGuid = char_guid; friend_map->LoadRevengeList(user, \ msg_ack.m_sRevengeUserInfo, &msg_ack.m_byRevengeStatNum, &msg_ack.m_byRevengePoint); // user->SendPacket(&msg_ack, msg_ack.GetSize()); // SUNLOG(eCRITICAL_LOG, _T("|[%s]|Msg=send to the agent server the '%s''s revenge list, numbers=%d, point=%d|"), __FUNCTION__, user->GetCharName(), msg_ack.m_byRevengeStatNum, msg_ack.m_byRevengePoint); //_KR_0_20091021_FIRENDINVITATION_EXTEND //¿¡ÀÌÀüÆ® ¼­¹ö¿¡ Ä£±¸Ãßõ ¸ñ·ÏÀ» Àü´ÞÇÑ´Ù. (W->A->G) if (ns_world::FriendInvitationInWorld* event = ns_world::FriendInvitationInWorld::Instance()) { event->NotifyTotalFriendInvitationList(user, event->eMsgForward_ToAgent); }; } // Ä£±¸ ¸ñ·Ï ¼ö½Å ½ÇÆÐ HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_GETLIST_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_GETLIST_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUser* user = \ ns_world::WorldUserManager::Instance()->FindUserByCharGuid(recv_msg->m_CharGuid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), recv_msg->m_CharGuid); return; }; MSG_CW_FRIEND_NEWLIST_NAK msg_nak; msg_nak.dwResult = recv_msg->m_byResult; user->SendPacket(&msg_nak, sizeof(msg_nak)); // SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=char_name = '%s', user_guid=%d, char_guid=%d, fail_result=%d|"), user->GetCharName(), user->GetUserGuid(), user->GetCharGuid(), recv_msg->m_byResult); } // Ä£±¸ Ãß°¡ ¼º°ø HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_ADD_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_ADD_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); STRUCT_FRIEND_INFO friend_info = recv_msg->m_ToFriendInfo; STRUCT_FRIEND_PACKET_INFO* const sub_data = &friend_info.sPacketInfo; sub_data->ptszFriendName[_countof(sub_data->ptszFriendName) - 1] = _T('\0'); ns_world::WorldUser* const friend_user = \ user_manager->FindUserByCharGuid(friend_info.dwFriendGuid); // NOTE: Ä£±¸°¡ ³ª¸¦ Â÷´Ü ÇßÀ»¶§ °æ¿ì Ãß°¡ 2009-11-09 youngmoon ¹ö±×¹øÈ£:5315 const bool online = (friend_user != NULL) && (ns_world::FriendMap::FindBlockChar(friend_user, requester_char_guid) == NULL); sub_data->bOnline = online; sub_data->byChannel = 0; if (online) { sub_data->byChannel = static_cast(\ friend_user->GetUserAccountInfo().channel->GetChannelID()); #if WORLD_CONTENTS_BLOCK // ½ÇÁ¦ Ä£±¸ µ¥ÀÌÅÍ¿Í ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î ¾÷µ¥ÀÌÆ® friend_user->CheckOnlineLevel(recv_msg->m_ToFriendInfo.sPacketInfo.Level); friend_user->AddOnlineFriend(user, false); // ¾ÆÁ÷ ½ÇÁ¦ Á¢¼Ó »óȲÀÌ ¾Æ´Ï¹Ç·Î 2¹øÂ° ¸Å°³º¯¼ö false ¼¼ÆÃ #endif }; ns_world::FriendMap* const friend_map = ns_world::FriendMap::Instance(); if (friend_map->InsertNewFriend(user, friend_info) == false) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't add to friend list, char_name='%s',%d, friend='%s',%d|"), user->GetCharName(), requester_char_guid, sub_data->ptszFriendName, friend_info.dwFriendGuid); return; }; // Ä£±¸ Ãß°¡µÆÀ½À» ¾Ë·ÁÁØ´Ù MSG_CW_FRIEND_ADD_ACK msg_ack; msg_ack.sFriendStat = friend_info; // NOTE: ´ë»ó À¯Àú°¡ Gm Àϰæ¿ì ÀÚ½ÅÀÌ GmÀÌ ¾Æ´Ï¸é Á¤º¸¸¦ ÁÖÁö ¾Ê´Â´Ù. if ((friend_user != NULL) && (friend_user->IsGMUser()) && (user->IsGMUser() == false)) { STRUCT_FRIEND_PACKET_INFO* const sub_data = &msg_ack.sFriendStat.sPacketInfo; sub_data->bOnline = false; sub_data->byChannel = 0; }; user->SendPacket(&msg_ack, sizeof(msg_ack)); // #if WORLD_CONTENTS_BLOCK ns_world::WorldUserManager::Instance()->AddNewFriend(sFriendInfo.dwFriendGuid, user); SUNLOG(eFULL_LOG, "[%s->%s] Friend ADD", user->GetCharName(), sFriendInfo.sPacketInfo.ptszFriendName); #endif } // Ä£±¸ ¿äû ½ÇÆÐ HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_ADD_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_ADD_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_CW_FRIEND_ADD_NAK msg_nak; msg_nak.m_byResult = recv_msg->m_byResult; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s] FRIEND_ADD_NAK", user->GetCharName()); } // Ä£±¸ »èÁ¦ ¼º°ø HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DEL_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_DEL_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); // MSG_CW_FRIEND_DEL_ACK msg_ack; ZeroMemory(msg_ack.ptszDeletedName, sizeof(msg_ack.ptszDeletedName)); // //ns_world::FriendMap* const friend_map = ns_world::FriendMap::Instance(); const STRUCT_FRIEND_INFO* found_info = \ ns_world::FriendMap::FindFriend(user, recv_msg->m_CharGuidTo); if (found_info == NULL) { user->SendPacket(&msg_ack, sizeof(msg_ack)); // SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found friend. ") _T("owner=('%s', %d), target=(%d)|"), user->GetCharName(), requester_char_guid, recv_msg->m_CharGuidTo); return; }; //_KR_0_20091021_FIRENDINVITATION_EXTEND //Ä£±¸ »èÁ¦ ¼º°ø //¼­·Î Ä£±¸ Ãßõ°ü°èÀ϶§ Ä£±¸¸¦ ÇÑÂÊ¿¡¼­ »èÁ¦Çϸé Ä£±¸ Ãßõ°ü°è°¡ Á¾·áµÈ´Ù. ns_world::FriendInvitationInWorld::Instance()->OnFriendRemove(\ server_session, recv_msg, msg_size); ns_world::FriendMap::RemoveFriend(user, found_info->dwFriendGuid); // _tcsncpy(msg_ack.ptszDeletedName, found_info->sPacketInfo.ptszFriendName, _countof(msg_ack.ptszDeletedName)); msg_ack.ptszDeletedName[_countof(msg_ack.ptszDeletedName) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=owner=('%s', %d), target=('%s', %d)||"), user->GetCharName(), requester_char_guid, msg_ack.ptszDeletedName, recv_msg->m_CharGuidTo); } // Ä£±¸ »èÁ¦ ½ÇÆÐ HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DEL_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_DEL_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); // ¾Ë·ÁÁØ´Ù MSG_CW_FRIEND_DEL_NAK msg_nak; msg_nak.m_byResult = recv_msg->m_byResult; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s][CharGuid:%u] FRIEND_DEL_NAK", user->GetCharName(), recv_msg->m_CharGuidFrom); } // Â÷´Ü ¼º°ø HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_BLOCK_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|") _T("addin=blocking char_name='%s'|"), requester_char_guid, recv_msg->m_BlockInfo.ptszBlockName); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); STRUCT_BLOCK_INFO block_info = recv_msg->m_BlockInfo; block_info.ptszBlockName[_countof(block_info.ptszBlockName) - 1] = _T('\0'); ns_world::FriendMap* const friend_map = ns_world::FriendMap::Instance(); if (friend_map->InsertNewBlockChar(user, block_info) == false) { MSG_CW_FRIEND_BLOCK_NAK msg_nak; msg_nak.m_byResult = msg_nak.ERR_DEFAULT; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=('%s') can't add blocking char ('%s')|"), user->GetCharName(), block_info.ptszBlockName); return; }; // NOTE: ºí·ÏµÈ ³ðÀÌ È¤½Ã³ª ¿Â¶óÀο¡ ÀÖÀ¸¸é ³» Á¤º¸¸¦ ¼û±ä´Ù! #if WORLD_CONTENTS_BLOCK ns_world::WorldUser* const blocked_user = \ user_manager->FindUserByCharGuid(block_info.dwBlockGuid); if (blocked_user != NULL) { user->RemoveOnlineFriend(blocked_user); }; #endif MSG_CW_FRIEND_BLOCK_ACK msg_ack; _tcsncpy(msg_ack.ptszBlockedName, block_info.ptszBlockName, _countof(msg_ack.ptszBlockedName)); msg_ack.ptszBlockedName[_countof(msg_ack.ptszBlockedName) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); //_KR_0_20091021_FIRENDINVITATION_EXTEND //Ä£±¸ »èÁ¦ ¼º°ø //¼­·Î Ä£±¸ Ãßõ°ü°èÀ϶§ Ä£±¸¸¦ ÇÑÂÊ¿¡¼­ Â÷´ÜÇϸé Ä£±¸ Ãßõ°ü°è°¡ Á¾·áµÈ´Ù. ns_world::FriendInvitationInWorld::Instance()->OnFriendBlock(\ server_session, recv_msg, msg_size); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=Msg=('%s') added the blocking char ('%s')"), user->GetCharName(), block_info.ptszBlockName); } // Â÷´Ü ½ÇÆÐ HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_BLOCK_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_CW_FRIEND_BLOCK_NAK msg_nak; msg_nak.m_byResult = recv_msg->m_byResult; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s] FRIEND_BLOCK_NAK", user->GetCharName()); } // Â÷´Ü ÇØÁ¦ ¼º°ø HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_FREE_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_BLOCK_FREE_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); const STRUCT_BLOCK_INFO* block_info = \ ns_world::FriendMap::FindBlockChar(user, recv_msg->m_CharGuidTo); // Â÷´Ü Á¤º¸°¡ ¾øÀ¸¸é if (block_info == NULL) { MSG_CW_FRIEND_BLOCK_FREE_NAK msg_nak; msg_nak.m_byResult = msg_nak.NOT_BLOCKED; user->SendPacket(&msg_nak, sizeof(msg_nak)); return; }; MSG_CW_FRIEND_BLOCK_FREE_ACK msg_ack; ;{ _tcsncpy(msg_ack.ptszBlockedName, block_info->ptszBlockName, _countof(msg_ack.ptszBlockedName)); msg_ack.ptszBlockedName[_countof(msg_ack.ptszBlockedName) - 1] = _T('\0'); }; // Ȥ½Ã À̳ðÀÌ ¿Â¶óÀÎÀÌ°í ³ª¸¦ Ä£±¸·Î Ãß°¡Çß¾ú´Ù¸é ·Î±×ÀÎ »óÅ·Π¹Ù²ãÁØ´Ù ns_world::WorldUser* blocked_user = user_manager->FindUserByCharGuid(recv_msg->m_CharGuidTo); if (bool changed_online_state = \ (blocked_user && ns_world::FriendMap::FindFriend(blocked_user, requester_char_guid))) { #if WORLD_CONTENTS_BLOCK // ·Î±×ÀÎ »óÅ·Πº¯½Å!! user->AddOnlineFriend(blocked_user); #endif }; user->SendPacket(&msg_ack, sizeof(msg_ack)); // ns_world::FriendMap::RemoveBlockChar(user, block_info->dwBlockGuid); // state: corrupted = { block_info } SUNLOG(eFULL_LOG, _T("[%s->%s] FRIEND_BLOCK_FREE_ACK"), user->GetCharName(), msg_ack.ptszBlockedName); } // Â÷´Ü ÇØÁ¦ ½ÇÆÐ HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_BLOCK_FREE_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_BLOCK_FREE_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_CW_FRIEND_BLOCK_FREE_NAK msg_nak; msg_nak.m_byResult = recv_msg->m_byResult; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s] MSG_DW_FRIEND_BLOCK_FREE_NAK", user->GetCharName()); } //_NA_0_20100527_ADD_CHAR_RELATION_MEMO HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DETAIL_INFO_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_DETAIL_INFO_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; MSG_CW_FRIEND_STATUS_ANS msg_ack; ns_world::WorldUser* to_user = user_manager->FindUserByCharGuid(recv_msg->m_dwToCharGuid); if (to_user != NULL) { msg_ack.m_byChannel = static_cast(\ user->GetUserAccountInfo().channel->GetChannelID()); const ns_world::ConnectedCharInfo& char_info = user->GetConnectedCharInfo(); msg_ack.m_byZoneType = char_info.zone_type; msg_ack.m_dwZoneKey = char_info.zone_key; msg_ack.m_MapCode = char_info.map_code; } else { msg_ack.m_byChannel = 0; msg_ack.m_byZoneType = eZONETYPE_MAX; msg_ack.m_dwZoneKey = 0; msg_ack.m_MapCode = 0; }; _tcsncpy(msg_ack.m_ptszCharName, recv_msg->m_ptszToCharName, _countof(msg_ack.m_ptszCharName)); msg_ack.m_ptszCharName[_countof(msg_ack.m_ptszCharName) - 1] = _T('\0'); _tcsncpy(msg_ack.m_tszGuildName, recv_msg->m_ptszToCharGuildName, _countof(msg_ack.m_tszGuildName)); msg_ack.m_tszGuildName[_countof(msg_ack.m_tszGuildName) - 1] = _T('\0'); #ifdef _NA_0_20100527_ADD_CHAR_RELATION_MEMO _tcsncpy(msg_ack.m_ptszMemo, recv_msg->m_ptszMemo, _countof(msg_ack.m_ptszMemo)); msg_ack.m_ptszMemo[_countof(msg_ack.m_ptszMemo) - 1] = _T('\0'); #endif msg_ack.m_byDuty = recv_msg->m_byToCharGuildDuty; user->SendPacket(&msg_ack, sizeof(msg_ack)); } //_NA_0_20100527_ADD_CHAR_RELATION_MEMO HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_DETAIL_INFO_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_DETAIL_INFO_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; #if SUN_CODE_BACKUP // WARNING: f110818.1L, sending to user need 'CW' protocol not 'DW' protocol MSG_DW_FRIEND_DETAIL_INFO_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_FRIEND_NOTFRIEND; user->SendPacket((BYTE*)&msg_nak, sizeof(msg_nak)); #endif SUNLOG(eFULL_LOG, "[%s][%d] OnDW_FRIEND_DETAIL_INFO_NAK", user->GetCharName(), recv_msg->m_byErrorCode); } HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_MEMO_UPDATE_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_MEMO_UPDATE_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; MSG_CW_FRIEND_MEMO_UPDATE_ACK msg_ack; msg_ack.m_dwToCharGuid = recv_msg->m_dwToCharGuid; user->SendPacket(&msg_ack, sizeof(msg_ack)); } HANDLER_NODE_INFO(DW_FRIEND, DW_FRIEND_MEMO_UPDATE_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_FRIEND_MEMO_UPDATE_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; MSG_CW_FRIEND_MEMO_UPDATE_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_FRIEND_NOTFRIEND; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s][%d] OnDW_FRIEND_MEMO_UPDATE_NAK", user->GetCharName(), recv_msg->m_byErrorCode); } // äÆÃ±ÝÁö HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATBLOCK_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; const DWORD blocked_char_guid = recv_msg->m_CharGuid; const DWORD blocking_timeout = recv_msg->m_dwBlockTime; // MSG_CW_GM_USERCHAT_BLOCK_ACK msg_ack; msg_ack.m_dwKey = requester_char_guid; msg_ack.m_CharGuid = blocked_char_guid; msg_ack.m_bBlock = true; msg_ack.m_dwBlockTime = blocking_timeout; user->SendPacket(&msg_ack, sizeof(msg_ack)); ns_world::WorldUser* blocked_user = user_manager->FindUserByCharGuid(blocked_char_guid); if (blocked_user) { // ½ÇÁ¦ ±ÝÁö ¼¼ÆÃ ns_world::ChattingService::BlockChatting(blocked_user, blocking_timeout); //_WHATTHEHELL_BLOCKED_20060517 // äÆÃ±ÝÁö Å뺸 ±â´É Å×½ºÆ®Áß // ±ÝÁö »ç½ÇÀ» ¾Ë·ÁÁØ´Ù MSG_CW_CHAT_BLOCKED_CMD msg_block; msg_block.m_dwRemainTime = blocking_timeout; blocked_user->SendPacket(&msg_block, sizeof(msg_block)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|") _T("Msg=chatting blocked, gm:{name, char_guid} = {'%s', %d} ") _T("blocked char: {name, char_guid} = {'%s', %d}, blocking_time(%d)|"), user->GetCharName(), requester_char_guid, blocked_user->GetCharName(), blocked_char_guid, blocking_timeout); }; // äÆÃ ±ÝÁö ¼º°ø SUNLOG(eFULL_LOG, "[%u] ChatBlock Success[%u]", recv_msg->m_CharGuid, recv_msg->m_dwBlockTime); } HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATBLOCK_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; MSG_CW_GM_USERCHAT_BLOCK_NAK msg_nak; // TODO: f110818.1L, check the auto alignment user guid in the user->SendPacket method msg_nak.m_dwKey = user->GetUserGuid(); msg_nak.m_wErrorCode = msg_nak._ERR_DEFAULT; user->SendPacket(&msg_nak, sizeof(msg_nak)); // äÆÃ ±ÝÁö ½ÇÆÐ SUNLOG(eCRITICAL_LOG, "[%u] ChatBlock Fail[%u]", recv_msg->m_dwKey, recv_msg->m_wErrorCode); } // äÆÃÇã¿ë HANDLER_NODE_INFO(DW_GM, DW_GM_CHATALLOW_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATALLOW_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD allowed_char_guid = recv_msg->m_CharGuid; ns_world::WorldUser* allowed_user = user_manager->FindUserByCharGuid(allowed_char_guid); if (allowed_user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), allowed_char_guid); return; }; ns_world::ChattingService::BlockChatting(allowed_user, 0); // MSG_CW_GM_USERCHAT_BLOCK_ACK msg_ack; //msg_ack.m_dwKey = allowed_user->GetUserGuid();//recv_msg->m_dwKey; msg_ack.m_CharGuid = allowed_char_guid; // chat allowed character msg_ack.m_bBlock = false; msg_ack.m_dwBlockTime = 0; allowed_user->SendPacket(&msg_ack, sizeof(msg_ack)); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=chatting allowed, ") _T("blocked char: {name, char_guid} = {'%s', %d}|"), allowed_user->GetCharName(), allowed_char_guid); } HANDLER_NODE_INFO(DW_GM, DW_GM_CHATALLOW_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATALLOW_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; MSG_CW_GM_USERCHAT_BLOCK_NAK msg_nak; msg_nak.m_dwKey = user->GetUserGuid(); msg_nak.m_wErrorCode = msg_nak._ERR_DEFAULT; user->SendPacket(&msg_nak, sizeof(msg_nak)); // äÆÃ Çã¿ë ½ÇÆÐ SUNLOG(eCRITICAL_LOG, "[%u] ChatAllow Fail[%u]", recv_msg->m_dwKey, recv_msg->m_wErrorCode); } // Â÷°¨½Ã°£ ¾÷µ¥ÀÌÆ® HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCK_UPDATE_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATBLOCK_UPDATE_NAK* recv_msg = \ static_cast(msg_base); SUNLOG(eFULL_LOG, "[%u]ChatBlock_Update Fail[%u]", recv_msg->m_dwKey, recv_msg->m_wErrorCode); } // äÆÃ±ÝÁö ½Ã°£ ¿äû(óÀ½ Á¢¼ÓÇÒ ¶§) HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCKTIME_ANS, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATBLOCKTIME_ANS* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), char_guid); return; }; // if the m_dwRemainTime is 0, the user will enables chatting. ns_world::ChattingService::BlockChatting(user, recv_msg->m_dwRemainTime); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|[CharGuid:%u] WorldUser ChatBlock Status Recv[%u]"), char_guid, recv_msg->m_dwRemainTime); } HANDLER_NODE_INFO(DW_GM, DW_GM_CHATBLOCKTIME_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GM_CHATBLOCKTIME_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD char_guid = recv_msg->m_dwKey; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), char_guid); return; }; // if the m_dwRemainTime is 0, the user will enables chatting. ns_world::ChattingService::BlockChatting(user, 0); // SUNLOG(eCRITICAL_LOG, "[CharGuid:%u] User ChatBlock Status Recv Failed", char_guid); } //////////////////////////// // ¸®º¥Áö °ü·Ã Çڵ鷯 HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_ADD_REVENGE_CHAR_ACK, PHASE_SERVICE) { // ¸®º¥Áö Ãß°¡ ¿Ï·á __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_ADD_REVENGE_CHAR_ACK* recv_msg = \ static_cast(msg_base); // m_dwKey : channel id ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); STRUCT_REVENGE_INFO revenge_info = recv_msg->m_sRevengeUserInfo; revenge_info.sPacketInfo.bOnline = false; // const DWORD revenge_char_guid = revenge_info.dwRevengeCharGuid; ns_world::WorldUser* revenge_user = user_manager->FindUserByCharGuid(revenge_char_guid); if (revenge_user) { revenge_info.sPacketInfo.bOnline = true; #if WORLD_CONTENTS_BLOCK revenge_user->CheckOnlineLevel(revenge_info.sPacketInfo.Level); revenge_user->AddOnlineRevenge(user, false); #endif }; // ¸®º¥Áö Æ÷ÀÎÆ® °¨¼Ò ns_world::FriendMap::DecreaseRevengePoint(user); ns_world::FriendMap* const friend_map = ns_world::FriendMap::Instance(); if (friend_map->InsertNewRevengeChar(user, revenge_info) == false) { MSG_AW_CHAO_ADD_REVENGE_CHAR_NAK msg_nak; msg_nak.m_dwCharGuid = requester_char_guid; msg_nak.m_byErrorCode = RC::RC_REVENGE_FAILED; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't add revenge info.|") _T("requester:target={'%s',%d:%d}"), user->GetCharName(), requester_char_guid, revenge_char_guid); return; }; // º¹¼ö ´ë»ó Ãß°¡µÆÀ½À» ¾Ë·ÁÁØ´Ù MSG_CW_REVENGE_ADD_CMD msg_cmd; msg_cmd.m_byRevengePoint = ns_world::FriendMap::GetRevengePoint(user); msg_cmd.m_sRevengeStat = revenge_info; STRUCT_REVENGE_PACKET_INFO* const sub_info = &msg_cmd.m_sRevengeStat.sPacketInfo; // ´ë»ó À¯Àú°¡ Gm Àϰæ¿ì ÀÚ½ÅÀÌ GmÀÌ ¾Æ´Ï¸é Á¤º¸¸¦ ÁÖÁö ¾Ê´Â´Ù./ if ((revenge_user != NULL) && (revenge_user->IsGMUser() != false) && (user->IsGMUser() == false)) { sub_info->bOnline = false; sub_info->byChannelID = 0; }; user->SendPacket(&msg_cmd, sizeof(msg_cmd)); #if WORLD_CONTENTS_BLOCK ns_world::WorldUserManager::Instance()->AddNewRevenge(revenge_info.dwRevengeCharGuid, user); #endif ;{ // Agent¿¡ °á°ú Àü¼Û MSG_AW_CHAO_ADD_REVENGE_CHAR_ACK msg_ack; msg_ack.m_dwCharGuid = requester_char_guid; msg_ack.m_dwRevengeCharGuid = revenge_char_guid; BOOST_STATIC_ASSERT( sizeof(msg_ack.m_ptszRevengeName) == sizeof(sub_info->ptszRevengeName) && _countof(msg_ack.m_ptszRevengeName) == _countof(sub_info->ptszRevengeName)); CopyMemory(msg_ack.m_ptszRevengeName, sub_info->ptszRevengeName, sizeof(msg_ack.m_ptszRevengeName)); user->SendPacket(&msg_ack, sizeof(msg_ack)); }; SUNLOG(eFULL_LOG, _T("[%s(%u)->%s(%u)] Revenge ADD"), user->GetCharName(), requester_char_guid, sub_info->ptszRevengeName, revenge_char_guid); } HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_ADD_REVENGE_CHAR_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_ADD_REVENGE_CHAR_NAK* recv_msg = \ static_cast(msg_base); //m_dwKey: Agent Server Session... ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_AW_CHAO_ADD_REVENGE_CHAR_NAK msg_nak; msg_nak.m_dwCharGuid = recv_msg->m_CharGuidFrom; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%u] Revenge ADD NAK[Error:%u]", recv_msg->m_CharGuidFrom, recv_msg->m_byErrorCode); } // À¯Àú°¡ ¸®º¥Áö ¸®½ºÆ®¿¡¼­ »èÁ¦ HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_REMOVE_REVENGE_CHAR_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_REMOVE_REVENGE_CHAR_ACK* recv_msg = \ static_cast(msg_base); // m_dwKey : channel id ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; #if SUN_CODE_BACKUP // agent and worldserver will have been the closly coupled. ns_world::WorldChannelManager* const channel_manager = \ ns_world::WorldChannelManager::Instance(); ns_world::community::WorldChannel* const channel = \ channel_manager->GetChannel(recv_msg->m_dwKey); if (channel == NULL) { SUNLOG(eCRITICAL_LOG, _T("|"__FUNCTION__"|Msg=can't found targeted channel(%d)|"), recv_msg->m_dwKey); return; }; #endif ;{ // Agent¿¡ ¸ÕÀú Àü¼Û - ¸®½ºÆ®¿¡¼­ »èÁ¦ÇØ¾ß Çϱ⠶§¹® MSG_AW_CHAO_REMOVE_REVENGE_CHAR_ACK msg_ack; msg_ack.m_dwCharGuid = requester_char_guid; msg_ack.m_dwRevengeCharGuid = recv_msg->m_RevengeGuidTo; user->SendPacket(&msg_ack, sizeof(msg_ack)); }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_CW_REVENGE_DEL_ACK msg_ack; ZeroMemory(msg_ack.m_ptszCharName, sizeof(msg_ack.m_ptszCharName)); // ¿Â¶óÀÎ ¸®½ºÆ®¿¡¼­ Áö¿ì°í const STRUCT_REVENGE_INFO* revenge_info = \ ns_world::FriendMap::FindRevengeChar(user, recv_msg->m_RevengeGuidTo); if (revenge_info == NULL) { // ÀÌ·± °æ¿ìµµ ÀÖÀ»±î? ¾Æ¸¶µµ Áߺ¹ Äõ¸®°¡ ³¯¾Æ°¡´Â Á¤µµÀÇ °æ¿ì¿¡¸¸ ¹ß»ýÇÒ °ÍÀÌ´Ù // ÀÌ·± »óȲÀ̶ó°í ÇØµµ DB¿¡¼­´Â È®½ÇÈ÷ Áö¿öÁø °ÍÀ̹ǷΠACK Áà¾ß ÇÑ´Ù user->SendPacket(&msg_ack, sizeof(msg_ack)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found targeted revenge chaacter, ") _T("requester:target={'%s',%d:%d}|"), user->GetCharName(), requester_char_guid, recv_msg->m_RevengeGuidTo); return; }; #if WORLD_CONTENTS_BLOCK ns_world::WorldUserManager::Instance()->RemoveNewRevenge(pRevengeInfo->dwRevengeCharGuid, user); #endif _tcsncpy(msg_ack.m_ptszCharName, revenge_info->sPacketInfo.ptszRevengeName, _countof(msg_ack.m_ptszCharName)); msg_ack.m_ptszCharName[_countof(msg_ack.m_ptszCharName) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); // ns_world::FriendMap::RemoveRevengeChar(user, recv_msg->m_RevengeGuidTo); // SUNLOG(eFULL_LOG, "[%s/%u->%s] REVENGE_DEL_ACK", user->GetCharName(), recv_msg->m_CharGuidFrom, revenge_info->sPacketInfo.ptszRevengeName); } HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_REMOVE_REVENGE_CHAR_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_REMOVE_REVENGE_CHAR_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); MSG_CW_REVENGE_DEL_NAK msg_nak; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "[%s][CharGuid:%u] REVENGE_DEL_NAK", user->GetCharName(), recv_msg->m_CharGuidFrom); } // PK¸¦ ÅëÇØ Agent¿¡¼­ ¸®½ºÆ® »èÁ¦ ¿äû HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_PK_REVENGE_CHAR_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_PK_REVENGE_CHAR_ACK* recv_msg = \ static_cast(msg_base); // m_dwKey == agent channel index ns_world::WorldChannelManager* const channel_manager = \ ns_world::WorldChannelManager::Instance(); ns_world::community::WorldChannel* const channel = \ channel_manager->FindChannel(recv_msg->m_dwKey); if (channel == NULL) { SUNLOG(eCRITICAL_LOG, _T("|"__FUNCTION__"|Msg=can't found targeted channel(%d)|"), recv_msg->m_dwKey); return; }; MSG_AW_CHAO_REMOVE_REVENGE_CHAR_NAK msg_nak; ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { msg_nak.m_dwCharGuid = requester_char_guid; msg_nak.m_byErrorCode = RC::RC_REVENGE_NO_CHAR; channel->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u), #%d|"), requester_char_guid, 1); return; }; if (!FlowControl::FCAssert(user->EnabledSendMessage())) { return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); const STRUCT_REVENGE_INFO* revenge_info = \ ns_world::FriendMap::FindRevengeChar(user, recv_msg->m_RevengeGuidTo); if (revenge_info == NULL) { msg_nak.m_dwCharGuid = requester_char_guid; msg_nak.m_byErrorCode = RC::RC_REVENGE_INVALID_CHAR; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found target character(CharGuid=%u), #%d|"), recv_msg->m_RevengeGuidTo, 2); return; }; ;{ MSG_AW_CHAO_REMOVE_REVENGE_CHAR_ACK msg_ack; msg_ack.m_dwCharGuid = requester_char_guid; msg_ack.m_dwRevengeCharGuid = recv_msg->m_RevengeGuidTo; user->SendPacket(&msg_ack, sizeof(msg_ack)); }; ;{ // À¯Àú¿¡°Ôµµ ¾Ë·ÁÁØ´Ù(¸®½ºÆ®¿¡¼­ Áö¿ö¾ß Çϱ⠶§¹®) MSG_CW_REVENGE_DEL_ACK msg_ack; _tcsncpy(msg_ack.m_ptszCharName, revenge_info->sPacketInfo.ptszRevengeName, _countof(msg_ack.m_ptszCharName)); msg_ack.m_ptszCharName[_countof(msg_ack.m_ptszCharName) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); }; SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=WorldChannel:%u, CharGuid:%u, Target:%u]|"), recv_msg->m_dwKey, requester_char_guid, recv_msg->m_RevengeGuidTo); } // NOTE: f110818.1L, same 'MSG_DW_CHAO_PK_REVENGE_CHAR_NAK' and 'MSG_DW_CHAO_REMOVE_REVENGE_CHAR_NAK' HANDLER_NODE_INFO(DW_CHAO, DW_CHAO_PK_REVENGE_CHAR_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_CHAO_PK_REVENGE_CHAR_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuidFrom; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; FlowControl::FCAssert(ns_world::FriendMap::EndFriendTransaction(user)); // NOTE: f110818.1L, think about the not found user and reply to agent... MSG_AW_CHAO_REMOVE_REVENGE_CHAR_NAK msg_nak; msg_nak.m_dwCharGuid = recv_msg->m_CharGuidFrom; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); // SUNLOG(eFULL_LOG, "|["__FUNCTION__"]|[channel:%u][CharGuid:%u][Error:%u]", recv_msg->m_dwKey, recv_msg->m_CharGuidFrom, recv_msg->m_byErrorCode); } // ÂÊÁö °ü·Ã HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_SEND_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_SEND_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; const TCHAR* sender_name = _T("System"); // ½Ã½ºÅÛ ÂÊÁöÀÇ µðÆúÆ® ¼Û½ÅÀÚ À̸§ TCHAR receiver_name[_countof(recv_msg->m_ptszRecvName)]; _tcsncpy(receiver_name, recv_msg->m_ptszRecvName, _countof(receiver_name)); receiver_name[_countof(receiver_name) - 1] = _T('\0'); // ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); // if (recv_msg->m_SendGuid != 0) { // ½Ã½ºÅÛ ÂÊÁö°¡ ¾Æ´Ï¸é ns_world::WorldUser* sender = user_manager->FindUserByCharGuid(recv_msg->m_SendGuid); if (sender == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u), #%d|"), recv_msg->m_SendGuid, 1); return; }; sender_name = sender->GetCharName(); FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(sender)); MSG_CW_MEMO_SEND_ACK msg_ack; _tcsncpy(msg_ack.m_ptszRecvName, receiver_name, _countof(msg_ack.m_ptszRecvName)); msg_ack.m_ptszRecvName[_countof(msg_ack.m_ptszRecvName) - 1] = _T('\0'); sender->SendPacket(&msg_ack, sizeof(msg_ack)); } else { // ½Ã½ºÅÛ ÂÊÁöÀ̸é ŸÀÔ¿¡ µû¶ó ¼Û½ÅÀÚ À̸§À» ´Ù¸£°Ô ¼³Á¤ÇÒ ¼ö ÀÖ´Ù std::string s; s.assign(recv_msg->m_Subject.m_ptszSubject); std::string::size_type pos = s.find('|'); if (pos != std::string::npos) { std::string t = s.substr(0, pos); eSYSTEM_MEMO_TYPE type = static_cast(atoi(t.c_str())); sender_name = ns_world::WorldSystemMemo::GetSystemMemoStringByType(type); // changed logic to support _NA_1798_20110114_SYSTEM_MEMO_ADDITIONAL_LOGGING // ½Ã½ºÅÛ ÂÊÁö ¹ß¼Û ·Î±× WorldUser* recipient = user_manager->FindUserByCharGuid(recv_msg->m_RecvGuid); TCHAR additional_info[MAX_ADDINFO_SIZE + 1]; _sntprintf(additional_info, _countof(additional_info), _T("%I64u %s"), recv_msg->m_Subject.m_MemoGuid, recv_msg->m_Subject.m_ptszSubject); additional_info[_countof(additional_info) - 1] = _T('\0'); GAMELOG->LogAction(ACT_SYSTEM_MEMO_RECEIVE, recipient, receiver_name, additional_info); SUNLOG(eMIDDLE_LOG, "[Memo] Sent system memo to character '%s' : %s", receiver_name, additional_info); } } WorldUser* receiver = user_manager->FindUserByCharGuid(recv_msg->m_RecvGuid); if (receiver) { MSG_CW_MEMO_NEWMEMO_BRD msg_brd; // CHANGES: f110819.4L, fixed the received message modification not sending message. msg_brd.m_Subject = recv_msg->m_Subject; _tcsncpy(msg_brd.m_Subject.m_SendName, sender_name, _countof(msg_brd.m_Subject.m_SendName)); msg_brd.m_Subject.m_SendName[_countof(msg_brd.m_Subject.m_SendName) - 1] = _T('\0'); receiver->SendPacket(&msg_brd, sizeof(msg_brd)); } SUNLOG(eFULL_LOG, _T("DW_MEMO_SEND_ACK[%s][%u]->[%s]"), sender_name, recv_msg->m_SendGuid, receiver_name); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_SEND_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_SEND_NAK* recv_msg = \ static_cast(msg_base); // if the 'm_SendGuid' is 0, the requested message is the system memo if (recv_msg->m_SendGuid == 0) { return; }; ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD sender_char_guid = recv_msg->m_SendGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(sender_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), sender_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_CW_MEMO_SEND_NAK msg_nak; // 20061124_YARU_ÂÊÁö ¿¡·¯ÄÚµå Ãß°¡¿¡ µû¸¥ ¼öÁ¤ if (recv_msg->m_byErrorCode == 2) { msg_nak.m_byErrorCode = RC::RC_MEMO_NOUSER; } else { msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; }; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "DW_MEMO_SEND_NAK[%s][%u][Error:%u]", user->GetCharName(), user->GetCharGuid(), msg_nak.m_byErrorCode); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_LIST_ANS, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_LIST_ANS* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; MSG_CW_MEMO_LIST_ANS msg_ack; msg_ack.m_byMemoCnt = recv_msg->m_byMemoCnt; msg_ack.m_byMemoPage = recv_msg->m_byMemoPage; msg_ack.m_byMemoPageCnt = recv_msg->m_byMemoPageCnt; if (FlowControl::FCAssert(_countof(msg_ack.m_Subject) >= msg_ack.m_byMemoCnt) == false) { msg_ack.m_byMemoCnt = _countof(msg_ack.m_Subject); }; // TODO: f110818.1L, type check BOOST_STATIC_ASSERT(sizeof(msg_ack.m_Subject) == sizeof(recv_msg->m_Memo) && _countof(msg_ack.m_Subject) == _countof(recv_msg->m_Memo) && sizeof(msg_ack.m_Subject[0]) == sizeof(recv_msg->m_Memo[0])); CopyMemory(msg_ack.m_Subject, recv_msg->m_Memo, sizeof(msg_ack.m_Subject[0]) * msg_ack.m_byMemoCnt); user->SendPacket(&msg_ack, msg_ack.GetSize()); if (msg_ack.m_byMemoPage >= msg_ack.m_byMemoPageCnt) { FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); } SUNLOG(eFULL_LOG, "DW_MEMO_LIST_ANS[%s][%u][Memo:%u][Page:%u/%u]", user->GetCharName(), user->GetCharGuid(), msg_ack.m_byMemoCnt, msg_ack.m_byMemoPage, msg_ack.m_byMemoPageCnt); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_LIST_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_LIST_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_CW_MEMO_LIST_NAK msg_nak; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "DW_MEMO_LIST_NAK[%s][%u]", user->GetCharName(), user->GetCharGuid()); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_VIEW_ANS, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_VIEW_ANS* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_CW_MEMO_VIEW_ANS msg_ack; msg_ack.m_MemoGuid = recv_msg->m_MemoGuid; //_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION = { msg_ack.m_typeSystemMemo = recv_msg->m_typeSystemMemo; msg_ack.m_recvItemCode = recv_msg->m_recvItemCode; msg_ack.m_amountCost = recv_msg->m_amountCost; //} _tcsncpy(msg_ack.m_ptszMemo, recv_msg->m_ptszMemo, _countof(msg_ack.m_ptszMemo)); // CHANGES: f110818.1L, changed to null terminated string msg_ack.m_ptszMemo[_countof(msg_ack.m_ptszMemo) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); // TODO: f110818.1L, think the 'GetSize' usage //_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION = { if (recv_msg->m_typeSystemMemo != NORMAL_MEMO) { SUNLOG(eMIDDLE_LOG, _T("[Memo] Read system memo %I64u of character '%s' : ") _T("Code=%d Amount=%I64u"), recv_msg->m_MemoGuid, user->GetCharName(), msg_ack.m_recvItemCode, msg_ack.m_amountCost); }; //} SUNLOG(eFULL_LOG, "DW_MEMO_VIEW_ANS[%s][%u][Memo:%u]", user->GetCharName(), user->GetCharGuid(), msg_ack.m_MemoGuid); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_VIEW_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_VIEW_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_DW_MEMO_VIEW_NAK msg_nak; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "DW_MEMO_VIEW_NAK[%s][%u]", user->GetCharName(), user->GetCharGuid()); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_DELETE_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_DELETE_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); // added by _NA_1798_20110114_SYSTEM_MEMO_ADDITIONAL_LOGGING int log_type = 0; if (recv_msg->m_MemoGuid == 0) { log_type = ACT_ALL_MEMO_DELETE; // Àüü ÂÊÁö Àϰý »èÁ¦ SUNLOG(eMIDDLE_LOG, _T("[Memo] Deleted all memo of character %d"), recv_msg->m_RecvGuid); } else if (recv_msg->m_MemoType == STRUCT_SUBJECT_PACKETINFO::SYSTEM_MEMO) { log_type = ACT_SYSTEM_MEMO_DELETE; // ½Ã½ºÅÛ ÂÊÁö »èÁ¦ SUNLOG(eMIDDLE_LOG, _T("[Memo] Deleted system memo %I64u of character %d"), recv_msg->m_MemoGuid, recv_msg->m_RecvGuid); } if (log_type != 0 && user) { // ÂÊÁö »èÁ¦ ·Î±× TCHAR additional_info[MAX_ADDINFO_SIZE + 1]; _sntprintf(additional_info, _countof(additional_info), _T("%I64u CharID:%d"), recv_msg->m_MemoGuid, recv_msg->m_RecvGuid); additional_info[_countof(additional_info) - 1] = _T('\0'); GAMELOG->LogAction(log_type, user, NULL, additional_info); }; if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_CW_MEMO_DELETE_ACK msg_ack; msg_ack.m_MemoGuid = recv_msg->m_MemoGuid; user->SendPacket(&msg_ack, sizeof(msg_ack)); SUNLOG(eFULL_LOG, _T("DW_MEMO_DELETE_ACK[%s][%u][Memo:%u]"), user->GetCharName(), user->GetCharGuid(), msg_ack.m_MemoGuid); } HANDLER_NODE_INFO(DW_MEMO, DW_MEMO_DELETE_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MEMO_DELETE_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD receiver_char_guid = recv_msg->m_RecvGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(receiver_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), receiver_char_guid); return; }; FlowControl::FCAssert(ns_world::WorldSystemMemo::EndMemoTransaction(user)); MSG_CW_MEMO_DELETE_NAK msg_nak; msg_nak.m_byErrorCode = recv_msg->m_byErrorCode; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, "DW_MEMO_DELETE_NAK[%s][%u][Error:%u]", user->GetCharName(), user->GetCharGuid(), msg_nak.m_byErrorCode); } HANDLER_NODE_INFO(DW_STATUS, DW_STATUS_INTERCEPTION_ANS, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_STATUS_INTERCEPTION_ANS* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; // NOTE: gameserver¿Í ¿¬°á ÈÄ À̰÷¿¡¼­ gameserverÀÇ Á¤º¸¸¦ ¿äûÇÏÀÚ ns_world::ChattingService::EnableWhisperingIntercepted(user, (recv_msg->m_bWhisperFlag != 0)); } HANDLER_NODE_INFO(DW_STATUS, DW_STATUS_INTERCEPTION_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_STATUS_INTERCEPTION_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGuid; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; SUNLOG(eFULL_LOG, "DW_STATUS_INTERCEPTION_NAK_[CHARGUID:%u]", recv_msg->m_CharGuid); } //{__NA001254_20090109_RTTG_FUNC_ADD // ¸ÖƼ ÂÊÁö HANDLER_NODE_INFO(DW_MEMO, DW_MULTIMEMO_SEND_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_MULTIMEMO_SEND_ACK* recv_msg = \ static_cast(msg_base); ns_world::ServerSessionInWorld* master_server = \ ns_world::WorldServer::Instance()->GetMasterServer(); const int upperbound = min(_countof(recv_msg->m_arrResultInfoList), recv_msg->m_dwCount); ASSERT(upperbound == recv_msg->m_dwCount); if (master_server != NULL) { MSG_MW_MULTIMEMO_SEND_ACK msg_ack; msg_ack.m_dwKey = recv_msg->m_dwKey; msg_ack.m_dwCount = recv_msg->m_dwCount; BOOST_STATIC_ASSERT(_countof(msg_ack.m_arrResultInfoList) == _countof(recv_msg->m_arrResultInfoList)); for (int index = 0; index < upperbound; ++index) { msg_ack.m_arrResultInfoList[index] = \ recv_msg->m_arrResultInfoList[index].m_ErrResult; }; master_server->SendPacket(&msg_ack, sizeof(msg_ack)); }; ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); for (int index = 0; index < upperbound; ++index) { const MMEMO_RESULT& multi_memo_result = recv_msg->m_arrResultInfoList[index]; ns_world::WorldUser* target_user = \ user_manager->FindUserByCharGuid(multi_memo_result.m_RecvGuid); if (target_user == NULL) { continue; }; MSG_CW_MEMO_NEWMEMO_BRD msg_brd; STRUCT_SUBJECT_PACKETINFO* const sub_info = &msg_brd.m_Subject; sub_info->m_byRead = 0; sub_info->m_MemoGuid = multi_memo_result.m_MemoGuid; sub_info->m_MemoType = sub_info->NORMAL_MEMO; _tcsncpy(sub_info->m_SendName, recv_msg->m_SendName, _countof(sub_info->m_SendName)); sub_info->m_SendName[_countof(sub_info->m_SendName) - 1] = _T('\0'); _tcsncpy(sub_info->m_tszCreateDate, multi_memo_result.m_tszCreateDate, _countof(sub_info->m_tszCreateDate)); sub_info->m_tszCreateDate[_countof(sub_info->m_tszCreateDate) - 1] = _T('\0'); _tcsncpy(sub_info->m_ptszSubject, multi_memo_result.m_ptszSubject, _countof(sub_info->m_ptszSubject)); sub_info->m_ptszSubject[_countof(sub_info->m_ptszSubject) - 1] = _T('\0'); target_user->SendPacket(&msg_brd, sizeof(msg_brd)); }; } //}__NA001254_20090109_RTTG_FUNC_ADD ////////////////////////////////////////////////////////////////////////// //±×·ì ¸Î±â ½Ã½ºÅÛ ////////////////////////////////////////////////////////////////////////// //±×·ì ¸É¹ö Ãß°¡ ¼º°ø ÆÐŶ ó¸® : »óÀ§ ¸â¹öÀÇ ±×·ì Á¤º¸¿¡ ÇÏÀ§ ¸É¹ö¸¦ Ãß°¡ÇÏ°í »óÇÏÀ§ ¸â¹ö¿¡°Ô Á¤º¸¸¦ ¾Ë¸°´Ù. HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_ADD_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GROUP_ADD_ACK* recv_msg = \ static_cast(msg_base); // NOTE: old comments, (»óÀ§ ¸â¹ö¿¡°Ô ÇÏÀ§ ¸â¹öÀÇ Á¤º¸¸¦), (ÇÏÀ§ ¸â¹ö¿¡°Ô »óÀ§ ¸â¹öÀÇ Á¤º¸¸¦) ¾Ë·ÁÁØ´Ù. // (¸É¹ö Ãß°¡ ¿äû½Ã ÀúÀåÇß´ø m_tempMemberInfo »ç¿ë) // [2010.02.26]gameluluWorking : m_tempMemberInfo³»¿ë¿¡ ´ëÇÑ ½Å·Úµµ¿¡ ´ëÇÑ ¹®Á¦ ÇØ°á °­±¸ ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD from_char_guid = recv_msg->m_fromCharGUID; ns_world::WorldUser* from_user = user_manager->FindUserByCharGuid(from_char_guid); const DWORD to_char_guid = recv_msg->m_toCharGUID; ns_world::WorldUser* to_user = user_manager->FindUserByCharGuid(to_char_guid); ns_world::GroupManager* const group_manager = ns_world::GroupManager::Instance(); if (from_user != NULL) { FlowControl::FCAssert(group_manager->EndGroupMemberAdditionTransaction(\ from_user, true, (to_user != NULL), GROUP_LEVEL_LOW)); }; if (to_user != NULL) { FlowControl::FCAssert(group_manager->EndGroupMemberAdditionTransaction(\ to_user, true, (from_user != NULL), GROUP_LEVEL_HIGH)); }; } //±×·ì ¸É¹ö Ãß°¡ ½ÇÆÐ ÆÐŶ ó¸® HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_ADD_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GROUP_ADD_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD from_char_guid = recv_msg->m_fromCharGUID; ns_world::WorldUser* from_user = user_manager->FindUserByCharGuid(from_char_guid); const DWORD to_char_guid = recv_msg->m_toCharGUID; ns_world::WorldUser* to_user = user_manager->FindUserByCharGuid(to_char_guid); ns_world::GroupManager* const group_manager = ns_world::GroupManager::Instance(); if (from_user != NULL) { FlowControl::FCAssert(group_manager->EndGroupMemberAdditionTransaction(\ from_user, false, (to_user != NULL), GROUP_LEVEL_LOW)); }; if (to_user != NULL) { FlowControl::FCAssert(group_manager->EndGroupMemberAdditionTransaction(\ to_user, false, (from_user != NULL), GROUP_LEVEL_HIGH)); }; MSG_CW_GROUP_ADD_NAK msg_nak; msg_nak.m_byResult = msg_nak.ERR_DEFAULT; from_user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"][%d]DB InsertFail", from_char_guid); } //±×·ì ¸É¹ö »èÁ¦ ¼º°ø ÆÐŶ ó¸® HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_DEL_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GROUP_DEL_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD from_char_guid = recv_msg->m_fromCharGUID; const DWORD to_char_guid = recv_msg->m_toCharGUID; ns_world::WorldUser* from_user = user_manager->FindUserByCharGuid(from_char_guid); ns_world::WorldUser* to_user = user_manager->FindUserByCharGuid(to_char_guid); // ns_world::GroupManager* const group_manager = ns_world::GroupManager::Instance(); // if (from_user) { // NOTE: ¿äû À¯Àú¿¡°Ô »èÁ¦ °á°ú¸¦ ¾Ë¸², // »èÁ¦Çϱâ Àü¿¡ ¸É¹ö Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© ¿äû À¯Àú¿¡°Ô »èÁ¦°á°ú¸¦ ¾Ë¸² const STRUCT_GROUP_MEMBER_INFO* member_info = \ group_manager->FindGroupMember(from_user, to_char_guid); if (member_info != NULL) { MSG_CW_GROUP_DEL_ACK msg_ack; _tcsncpy(msg_ack.ptszMemeberName, member_info->GroupMemberInfo.ptszMemberName, _countof(msg_ack.ptszMemeberName)); msg_ack.ptszMemeberName[_countof(msg_ack.ptszMemeberName) - 1] = _T('\0'); from_user->SendPacket(&msg_ack, sizeof(msg_ack)); group_manager->RemoveMemberInfo(from_user, to_char_guid); } else { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found 'to' member (from=%d, to=%d)"), from_char_guid, to_char_guid); }; group_manager->UpdateGroupInfo(from_user); }; // if (to_user) { // NOTE: »èÁ¦µÈ À¯Àú¿¡°Ô »èÁ¦ »ç½ÇÀ» ¾Ë¸² const STRUCT_GROUP_MEMBER_INFO* member_info = \ group_manager->FindGroupMember(to_user, from_char_guid); if (member_info != NULL) { MSG_CW_GROUP_DEL_BRD msg_brd; _tcsncpy(msg_brd.ptszMemeberName, member_info->GroupMemberInfo.ptszMemberName, _countof(msg_brd.ptszMemeberName)); msg_brd.ptszMemeberName[_countof(msg_brd.ptszMemeberName) - 1] = _T('\0'); to_user->SendPacket(&msg_brd, sizeof(msg_brd)); group_manager->RemoveMemberInfo(to_user, from_char_guid); } else { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found 'from member (from=%d, to=%d)"), from_char_guid, to_char_guid); }; group_manager->UpdateGroupInfo(to_user); }; } //±×·ì ¸É¹ö »èÁ¦ ½ÇÆÐ ÆÐŶ ó¸® HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_DEL_NAK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GROUP_DEL_NAK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD from_char_guid = recv_msg->m_fromCharGUID; const DWORD to_char_guid = recv_msg->m_toCharGUID; ns_world::WorldUser* from_user = user_manager->FindUserByCharGuid(from_char_guid); ns_world::WorldUser* to_user = user_manager->FindUserByCharGuid(to_char_guid); if (from_user) { FlowControl::FCAssert(ns_world::GroupManager::EndGroupTransaction(from_user)); }; if (to_user) { // TODO: check whether this control is valid. FlowControl::FCAssert(ns_world::GroupManager::EndGroupTransaction(to_user)); }; if (from_user == NULL) { return; }; MSG_CW_GROUP_DEL_NAK msg_nak; ;{ msg_nak.m_byResult = recv_msg->m_byResult; // ¿äûÇÑ Äɸ¯ÅÍ À̸§ (...why?) _tcsncpy(msg_nak.ptszMemeberName, from_user->GetCharName(), _countof(msg_nak.ptszMemeberName)); msg_nak.ptszMemeberName[_countof(msg_nak.ptszMemeberName) - 1] = _T('\0'); }; from_user->SendPacket(&msg_nak, sizeof(msg_nak)); } //±×·ì ¸É¹ö ¸®½ºÆ® ¿äû ¼º°ø ÆÐŶ ó¸® HANDLER_NODE_INFO(DW_GROUP, DW_GROUP_LIST_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_GROUP_LIST_ACK* recv_msg = \ static_cast(msg_base); ns_world::WorldUserManager* const user_manager = ns_world::WorldUserManager::Instance(); const DWORD requester_char_guid = recv_msg->m_CharGUID; ns_world::WorldUser* user = user_manager->FindUserByCharGuid(requester_char_guid); if (user == NULL) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=can't found character(CharGuid=%u)|"), requester_char_guid); return; }; if (recv_msg->GetSize() != msg_size) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=invalid message specification, ") _T("char_guid=%d, number_of_nodes=%d, size comparision(%d:%d)|"), requester_char_guid, recv_msg->m_DataNum, recv_msg->GetSize(), msg_size); return; }; // DONE: f110923.1L, CHANGES: f100425.3L, waverix, prevent buffer overrun process BOOST_STATIC_ASSERT(_countof(recv_msg->m_GroupInfo) == MAX_GROUP_MEMBER); const bool failed__number_of_node_has_index_out_of_range = \ (recv_msg->m_DataNum > MAX_GROUP_MEMBER); assert(failed__number_of_node_has_index_out_of_range == false); const int number_of_node = min(_countof(recv_msg->m_GroupInfo), recv_msg->m_DataNum); if (failed__number_of_node_has_index_out_of_range) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=index out of range, char_guid=%d, number_of_nodes=%d|"), requester_char_guid, recv_msg->m_DataNum); }; //-- ¸É¹ö Á¤º¸ ¼ÂÆÃ ns_world::GroupManager* const group_manager = ns_world::GroupManager::Instance(); //group_manager->InitializeGroupMemberTable(user); // const STRUCT_GROUP_MEMBER_INFO* member_it = recv_msg->m_GroupInfo, * const member_end = &recv_msg->m_GroupInfo[number_of_node]; for (; member_it != member_end; ++member_it) { STRUCT_GROUP_MEMBER_INFO member_info = *member_it; ns_world::WorldUser* group_member = user_manager->FindUserByCharGuid(member_it->charGUID); STRUCT_GROUP_MEMBER_PACKET_INFO* const sub_data = &member_info.GroupMemberInfo; if (group_member != NULL) { sub_data->bOnline = true; sub_data->byChannel = static_cast(\ group_member->GetUserAccountInfo().channel->GetChannelID()); } else { sub_data->bOnline = false; sub_data->byChannel = 0; }; if (group_manager->IsOverBonusDate(member_info.lastDate, MAX_DATE_GROUPBONUS)) { group_manager->AddAccumulatedExp(user, member_info.accumEXP); SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not apply accumexp because date is over"); }; group_manager->AddMemberInfo(user, member_info); }; group_manager->UpdateGroupInfo(user); if (user->EnabledSendMessage() == NULL) { SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=Can not found agentserver")); return; }; group_manager->SendAroundMember(user, GroupManager::LOG_IN); // if (const EXPTYPE accumulated_exp = group_manager->GetAccumulatedExp(user)) { // ÃàÀû °æÇèÄ¡ ȹµæÀ» ¾Ë¸² MSG_AW_STATUS_GROUP_ADDEXP_CMD msg_cmd; ;{ msg_cmd.m_CharGuid = requester_char_guid; msg_cmd.m_Amount = accumulated_exp; }; user->SendPacket(&msg_cmd, sizeof(msg_cmd)); group_manager->SendAccumEXPMemo(user); }; ;{ // ÃàÀû °æÇèÄ¡¸¦ ÃʱâÈ­ ½ÃŲ´Ù. MSG_DW_GROUP_INIT_ACCUMEXP_CMD msg_cmd; msg_cmd.m_CharGUID = requester_char_guid; server_session->SendPacket(&msg_cmd, sizeof(msg_cmd)); }; } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_LOAD_ENTRY_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_LOAD_ENTRY_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(recv_msg->GetSize() == msg_size) == false) { return; }; Lotto::GetInstance().OnEntryLoad(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_LOAD_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_LOAD_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnLoad(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_WINNER_LIST_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_WINNER_LIST_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnWinnerList(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_SAVE_ENTRY_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_SAVE_ENTRY_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnEntrySave(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_ROLLOVER_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_ROLLOVER_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnRollOver(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_ADD_TICKET_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_ADD_TICKET_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnTicketAcquisition(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_REWARD_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_REWARD_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnReward(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_NOTICE_LIST_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_NOTICE_LIST_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnNoticeList(recv_msg); } HANDLER_NODE_INFO(DW_LOTTO, DW_LOTTO_NOTICE_DEL_ACK, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); const MSG_DW_LOTTO_NOTICE_DEL_ACK* recv_msg = \ static_cast(msg_base); if (FlowControl::FCAssert(sizeof(*recv_msg) == msg_size) == false) { return; }; Lotto::GetInstance().OnNoticeDelete(recv_msg); }