#include "WorldServerPch.hxx" #include "./Handler_CW.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/Lotto/Lotto.h" #include "Services/Group/GroupManager.h" #include "Services/Guild/WorldGuildManager.h" //================================================================================================== namespace ns_world { namespace handlers { ; BOOST_STATIC_ASSERT(RC::RC_GUILD_RESULT_COUNTS <= UCHAR_MAX); }}; //end of namespace //================================================================================================== //================================================================================================== //================================================================================================== #undef HANDLER_NODE_INFO #define HANDLER_NODE_INFO(_category_, _protocol_, _phase_) \ void ns_world::handlers::Handler_CW::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_cw", \ __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(CW_GUILD, CW_GUILD_CHAT_SYN, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); ns_world::WorldUser* const user = FIND_USER_FROM_AGENT_MSG(msg_base); if (user == NULL) { return; }; // WARNING: f110826.1L, the client message has not null terminated string const MSG_CW_GUILD_CHAT_SYN* recv_msg = static_cast(msg_base); // if (CheckEnabledChattingState(user, server_session) == false) { return; }; util::StrArrayForGenericChattingMsg chatting_msg; BOOST_STATIC_ASSERT(_countof(recv_msg->m_ptszCharMsg) == _countof(chatting_msg)); const size_t chat_msg_length = \ min(_countof(recv_msg->m_ptszCharMsg) - 1, recv_msg->m_byMsgLen); if (chat_msg_length == 0 || chat_msg_length != recv_msg->m_byMsgLen || recv_msg->GetSize() != msg_size) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=received invalid message, ") _T("expected=%d, received=%d, msg_len=%d"), recv_msg->GetSize(), msg_size, recv_msg->m_byMsgLen); return; }; // rebuild chatting message, chat_msg_length does not contain null character strncpy(chatting_msg, recv_msg->m_ptszCharMsg, chat_msg_length); chatting_msg[chat_msg_length] = '\0'; chatting_msg[_countof(chatting_msg) - 1] = '\0'; // const ns_world::ConnectedCharInfo& char_info = user->GetConnectedCharInfo(); if (char_info.guild_guid == 0) // ±æµå ¼Ò¼ÓÀÌ ¾Æ´Ï¶ó°í ³ª¿Â´Ù¸é? { // ±æµå Á¤º¸¸¦ ¿äÃ»ÇØ¾ß ÇÑ´Ù MSG_CW_GUILD_CHAT_NAK msg_nak; msg_nak.byResult = msg_nak.ERR_WAIT_INFO; // Àá½Ã ÈÄ¿¡ ´Ù½Ã ½ÃµµÇϽʽÿÀ user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("[%s] Guild Chat Error - No Guild %u"), char_info.char_name, char_info.guild_guid); return; // ±æµå ¸â¹ö º¹±¸ ÄÚµå´Â ÀüºÎ Á¢¼Ó ºÎºÐÀ¸·Î ¿Å°Ü°¬´Ù /* // ±æµå ¸â¹ö º¹±¸ ¿äû MSG_WZ_GUILD_SELECT_SYN ToGuildMsg; ToGuildMsg.m_dwKey = user->GetGUID(); ToGuildMsg.m_GuildGuid = recv_msg->m_GuildGuid; ToGuildMsg.m_CharGuid = user->GetCharGuid(); ServerSession *pGuildServer = ServerSessionManager::Instance()->GetGuildServer(); if (!pGuildServer) { SUNLOG(eCRITICAL_LOG, "GUILD_MEMBER_SYN ±æµå¼­¹ö ¾ø¾î º¹±¸ ¿äû ºÒ°¡!"); return; } pGuildServer->SendPacket(&ToGuildMsg, sizeof(MSG_WZ_GUILD_SELECT_SYN)); SUNLOG(eFULL_LOG, "GUILD_CHAT_SYN ±æµåÁ¤º¸[%u] ¾ø¾î¼­ ¿äû[%s]", recv_msg->m_GuildGuid, user->GetCharName().c_str()); */ //---------------------------------------------------------------------------------------------- }; // end 'if' //---------------------------------------------------------------------------------------------- assert(char_info.guild_guid != 0); ns_world::WorldGuild* const guild = \ ns_world::WorldGuildManager::Instance()->FindGuild(char_info.guild_guid); if (guild == NULL) { MSG_CW_GUILD_CHAT_NAK msg_nak; msg_nak.byResult = msg_nak.ERR_NOT_GUILD; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("[%s] Guild Chat Error - No Guild %u"), char_info.char_name, char_info.guild_guid); return; } if (ProhibitionWordParser::Instance()->CheckFilter(chatting_msg) == false) { MSG_CW_CHAT_NORMAL_NAK msg_nak; msg_nak.m_wErrorCode = RC::RC_CHAT_USE_BAN_WORD; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("Guild Chat Error - USE BAN WORD[%s][CharGuid:%u]"), char_info.char_name, char_info.guild_guid); return; } // ±æµå¿ø Àüü¿¡°Ô ¸Þ½ÃÁö Àü¼Û - À̰ŠUserManager¿¡¼­ ó¸®ÇØ¾ß µÇÁö ¾ÊÀ»¶ó³ª ½Í³×? MSG_CW_GUILD_CHAT_BRD msg_brd; _tcsncpy(msg_brd.ptszCharName, char_info.char_name, _countof(msg_brd.ptszCharName)); msg_brd.ptszCharName[_countof(msg_brd.ptszCharName) - 1] = _T('\0'); BOOST_STATIC_ASSERT(_countof(chatting_msg) == _countof(msg_brd.ptszChatMsg)); msg_brd.byMsgLen = static_cast(::strlen(chatting_msg)); strncpy(msg_brd.ptszChatMsg, chatting_msg, _countof(msg_brd.ptszChatMsg)); // guild->SendAllMember(&msg_brd, msg_brd.GetSize()); const ns_world::UserAccountInfo& user_info = user->GetUserAccountInfo(); GAMELOG->WriteGuildChat(user, server_session->GetChannelID(), guild, chatting_msg, msg_brd._MAX_CHATMSG_SIZE); SUNLOG(eFULL_LOG, _T("[%s] Send Guild Chat[%u]"), char_info.char_name, char_info.guild_guid); } HANDLER_NODE_INFO(CW_GUILD, CW_GUILD_CHANGE_NOTICE_SYN, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); ns_world::WorldUser* const user = FIND_USER_FROM_AGENT_MSG(msg_base); if (user == NULL) { return; }; const MSG_CW_GUILD_CHANGE_NOTICE_SYN* recv_msg = \ static_cast(msg_base); // if (CheckEnabledChattingState(user, server_session) == false) { return; }; // NOTE: f110826.1L, the guild server same with the dbproxy server since version 1003 ns_world::ServerSessionInWorld* const dbproxy = \ ns_world::WorldServer::Instance()->GetGameDBProxy(); if (dbproxy == NULL) { return; }; ns_world::WorldGuildManager* const guild_manager = ns_world::WorldGuildManager::Instance(); const ns_world::ConnectedCharInfo& char_info = user->GetConnectedCharInfo(); // size_t guild_notice_length_with_null = 0; // NOTE: f110826.1L, fixed string length problem from the custom version RC::eGUILD_RESULT notic_change_result = guild_manager->CanChangeNotice(\ char_info.guild_guid, char_info.char_guid, recv_msg->m_tszGuildNotice, guild_notice_length_with_null); if (notic_change_result != RC::RC_GUILD_SUCCESS) { MSG_CW_GUILD_CHANGE_NOTICE_NAK msg_nak; msg_nak.m_byErrorCode = static_cast(notic_change_result); user->SendPacket(&msg_nak, sizeof(msg_nak)); return; }; // ±ÇÇÑ Ã¼Å©·Î ÀÎÇØ ±æµå¼­¹ö¸¦ ÅëÇØ¾ß ÇÔ MSG_WZ_GUILD_CHANGE_NOTICE_SYN msg_syn; msg_syn.m_GuildGuid = char_info.guild_guid; msg_syn.m_OperCharGuid = char_info.char_guid; msg_syn.m_wNoticeLen = static_cast(guild_notice_length_with_null); _tcsncpy(msg_syn.m_szGuildNotice, recv_msg->m_tszGuildNotice, _countof(msg_syn.m_szGuildNotice)); msg_syn.m_szGuildNotice[_countof(msg_syn.m_szGuildNotice) - 1] = _T('\0'); // dbproxy->SendPacket(&msg_syn, msg_syn.GetSize()); } HANDLER_NODE_INFO(CW_GUILD, CW_GUILD_SELECT_NOTICE_SYN, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); ns_world::WorldUser* const user = FIND_USER_FROM_AGENT_MSG(msg_base); if (user == NULL) { return; }; const MSG_CW_GUILD_SELECT_NOTICE_SYN* recv_msg = \ static_cast(msg_base); // if (CheckEnabledChattingState(user, server_session) == false) { return; }; // NOTE: f110826.1L, the guild server same with the dbproxy server since version 1003 ns_world::ServerSessionInWorld* const dbproxy = \ ns_world::WorldServer::Instance()->GetGameDBProxy(); if (dbproxy == NULL) { return; }; const ns_world::ConnectedCharInfo& char_info = user->GetConnectedCharInfo(); if (FlowControl::FCAssert(char_info.char_guid != 0) == false) { return; }; ns_world::WorldGuildManager* const guild_manager = ns_world::WorldGuildManager::Instance(); // CHANGES: f110923.1L, fixed the invalid usage case using the garbage guild guild. // WARNING: data fields that are extracted from the received message are unset. ns_world::WorldGuild* const guild = guild_manager->FindGuild(char_info.guild_guid); if (guild != NULL) { MSG_CW_GUILD_SELECT_NOTICE_ACK msg_ack; const util::StrArrayForGuildNotice& notice = guild->GetGuildNotice(); msg_ack.m_wNoticeLen = static_cast(::strlen(notice)); BOOST_STATIC_ASSERT(_countof(msg_ack.m_ptszNotice) == _countof(notice)); strncpy(msg_ack.m_ptszNotice, notice, _countof(msg_ack.m_ptszNotice)); msg_ack.m_ptszNotice[_countof(msg_ack.m_ptszNotice) - 1] = _T('\0'); user->SendPacket(&msg_ack, sizeof(msg_ack)); return; }; MSG_DW_GUILD_SELECT_NOTICE_SYN msg_dw_syn; msg_dw_syn.m_GuildGuid = char_info.guild_guid; msg_dw_syn.m_OperCharGuid = char_info.char_guid; msg_dw_syn.m_NoticeType = 0; dbproxy->SendPacket(&msg_dw_syn, sizeof(msg_dw_syn)); // ¿äû ½ÇÆÐ, ... waverix, thinking... MSG_CW_GUILD_SELECT_NOTICE_NAK msg_nak; msg_nak.m_dwErrorCode = RC::RC_GUILD_INVALID_STATE; user->SendPacket(&msg_nak, sizeof(msg_nak)); } HANDLER_NODE_INFO(CW_GUILD, CW_GUILD_WAREHOUSE_LOGLIST_REQ, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); ns_world::WorldUser* const user = FIND_USER_FROM_AGENT_MSG(msg_base); if (user == NULL) { return; }; const MSG_CW_GUILD_WAREHOUSE_LOGLIST_REQ* recv_msg = \ static_cast(msg_base); __TOUCHED(recv_msg); // if (CheckEnabledChattingState(user, server_session) == false) { return; }; // NOTE: f110826.1L, the guild server same with the dbproxy server since version 1003 ns_world::ServerSessionInWorld* const dbproxy = \ ns_world::WorldServer::Instance()->GetGameDBProxy(); if (dbproxy == NULL) { MSG_CW_GUILD_WAREHOUSE_LOGLIST_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_MEMO_FAILED; user->SendPacket(&msg_nak, sizeof(msg_nak)); // return; }; const ns_world::ConnectedCharInfo& char_info = user->GetConnectedCharInfo(); MSG_DW_GUILD_WAREHOUSE_LOGLIST_REQ msg_syn; msg_syn.m_GuildGuid = char_info.guild_guid; msg_syn.m_ReqCharGuid = char_info.char_guid; dbproxy->SendPacket(&msg_syn, sizeof(msg_syn)); } //À¯Àú°¡ Áö¿ª Á¡·ÉÀü ÂÊÁö¸¦ È®ÀÎÇÏ¿´´Ù. DB¿¡ ÇØ´ç ³»¿ëÀÌ ÀÖ´ÂÁö È®ÀÎÇØº»´Ù. HANDLER_NODE_INFO(CW_GUILD, CW_DOMINATION_RETURN_HEIM_CMD, PHASE_SERVICE) { __TOUCHED((server_session, msg_base, msg_size));WAVERIX_WORLD_HANDLER_DEBUGGING(); ns_world::WorldUser* const user = FIND_USER_FROM_AGENT_MSG(msg_base); if (user == NULL) { return; }; const MSG_CW_DOMINATION_RETURN_HEIM_CMD* recv_msg = \ static_cast(msg_base); // ns_world::ServerSessionInWorld* const dbproxy = \ ns_world::WorldServer::Instance()->GetGameDBProxy(); if (dbproxy == NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]No GameDBProxy"); return; }; ns_world::WorldGuildManager* const guild_manager = ns_world::WorldGuildManager::Instance(); eSYSTEM_MEMO_TYPE cur_system_memo_type; MAPCODE map_code; if (guild_manager->GetValueInMemo(\ recv_msg->m_ptszMemo, cur_system_memo_type, map_code) == false) { return; }; if (bool skipped = !((cur_system_memo_type == SYSMEMO_DOMINATION_RETURN_MONEY) || (cur_system_memo_type == SYSMEMO_DOMINATION_REWARD_MONEY))) { return; }; MSG_DW_DOMINATION_FINDMONEY_SYN msg_syn; msg_syn.m_MapCode = map_code; msg_syn.m_RecvCharGuid = user->GetCharGuid(); msg_syn.m_CostType = cur_system_memo_type; dbproxy->SendPacket(&msg_syn, sizeof(msg_syn)); }