#include "WorldServerPch.hxx" #include "./WorldChannelManager.h" #include #include "./WorldChannel.h" #include "./FieldInfo.h" // #include "WorldServer.h" #include "Objects/WorldUserManager.h" #include "Objects/WorldUser.h" #include "Channel/ChatRoomCommunity.h" //#include "Services/pms/PMSManagerInWorld.h" //================================================================================================== ns_world::WorldChannelManager* ns_world::WorldChannelManager::instance_static_ = NULL; ns_world::WorldChannelManager* ns_world::WorldChannelManager::CreateInstance() { // if the old util::Singleton support interface don't exist, the below code need implements static struct AutoClosure { AutoClosure(ns_world::WorldChannelManager** static_table) : static_table_(static_table) { } ~AutoClosure() { if (*static_table_) { TAllocDelete(ns_world::WorldChannelManager, *static_table_); }; *static_table_ = NULL; } ns_world::WorldChannelManager** static_table_; } auto_closure(&instance_static_); // if (instance_static_ != NULL) { return instance_static_; } // ns_world::WorldChannelManager* provider = TAllocNew(ns_world::WorldChannelManager); // initialization... instance_static_ = provider; // return instance_static_; } //================================================================================================== //================================================================================================== //================================================================================================== ns_world::WorldChannelManager::WorldChannelManager() : shutdown_process_(false) { } ns_world::WorldChannelManager::~WorldChannelManager() { } void ns_world::WorldChannelManager::Init() { if (const ns_world::WorldServer::Options* options = &ns_world::WorldServer::Instance()->GetOptions()) { statistics_timer_.SetTimer(options->statistics_interval); }; community_key_generator_.Create(10000, 10300); // #if !defined(__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__) if (this->LoadFieldInfo() == false) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=Critical! can't load field info.")); }; #endif } void ns_world::WorldChannelManager::Release() { // nothing to do. }; void ns_world::WorldChannelManager::Shutdown() { shutdown_process_ = true; ;{ CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { const ChannelPair& channel_pair = *it; TAllocDelete(ns_world::community::WorldChannel, channel_pair.channel); }; channel_list_.clear(); }; ;{ FieldInfoTable::const_iterator it = field_info_table_.begin(); const FieldInfoTable::const_iterator end = field_info_table_.end(); for (; it != end; ++it) { ns_world::community::FieldInfo* field_info = it->second; TAllocDelete(ns_world::community::FieldInfo, field_info); }; field_info_table_.clear(); }; ;{ ChatRoomTable::const_iterator it = chat_room_table_.begin(); const ChatRoomTable::const_iterator end = chat_room_table_.end(); for (; it != end; ++it) { ns_world::community::ChatRoomCommunity* chat_room = it->second; TAllocDelete(ns_world::community::ChatRoomCommunity, chat_room); }; }; }; BOOL ns_world::WorldChannelManager::LoadScript(eSCRIPT_CODE script_code, BOOL reloaded) { switch (script_code) { case SCRIPT_SHOUTRANGE: return _LoadLinkedZoneFile(reloaded != false); } return false; } bool ns_world::WorldChannelManager::_LoadLinkedZoneFile(bool reloaded) { __UNUSED(reloaded); shout_range_table_.clear(); ns_world::community::ShoutRange shout_range; static const char* linked_map_codes_columns[_countof(shout_range.linked_map_codes)] = { "LField1", "LField2", "LField3", "LField4", "LField5", "LField6", "LField7" }; const int max_rows = GetRowSize(); for (int row = 0; row < max_rows; ++row) { ZeroMemory(&shout_range, sizeof(shout_range)); shout_range.map_code = this->GetDataWORD("MapCode", row); shout_range.zone_type = this->GetDataBYTE("MKind", row); for (int index = 0; index < _countof(shout_range.linked_map_codes); ++index) { if (MAPCODE* dest = &shout_range.linked_map_codes[index]) { *dest = GetDataWORD(linked_map_codes_columns[index], row); }; }; strncpy(shout_range.map_name, this->GetDataString("MName", row), _countof(shout_range.map_name)); shout_range.map_name[_countof(shout_range.map_name) - 1] = '\0'; ns_world::community::ShoutRangeTable::_Pairib result = shout_range_table_.insert(\ ns_world::community::ShoutRangeTable::value_type(shout_range.map_code, shout_range)); ASSERT(result.second); }; //end 'foreach row in rows' return true; } bool ns_world::WorldChannelManager::AddChannel( DWORD channel_id, ns_world::ServerSessionInWorld* binding_session) { ;{ CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { const ChannelPair& channel_pair = *it; if (channel_pair.session != binding_session) { continue; }; ASSERT(!"unexpected state"); return false; }; }; ns_world::community::WorldChannel* channel = \ TAllocNew(ns_world::community::WorldChannel)(channel_id, binding_session); binding_session->BindChannel(channel); ChannelPair channel_pair = { channel, binding_session }; channel_list_.push_back(channel_pair); #ifdef _JP_0_20101123_PMS WorldServer::Instance()->GetPMSManager()->SetChannelCount(DWORD(channel_list_.size())); #endif SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=added channel(%d)|"), channel_id); return true; } bool ns_world::WorldChannelManager::RemoveChannel( ns_world::ServerSessionInWorld* binding_session) { if (shutdown_process_) { ASSERT(channel_list_.empty()); return true; }; CHANNEL_MAP::iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { const ChannelPair& channel_pair = *it; if (channel_pair.session != binding_session) { continue; }; break; }; if (it == end) { ASSERT(!"unexpected state"); return false; }; const ChannelPair& channel_pair = *it; if (ns_world::WorldUserManager* user_manager = ns_world::WorldUserManager::Instance()) { user_manager->OnCloseChannel(channel_pair.channel); }; const int channel_id = channel_pair.channel->GetChannelID(); __TOUCHED(channel_id); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=removed channel(%d)|"), channel_id); // TAllocDelete(ns_world::community::WorldChannel, channel_pair.channel); channel_list_.erase(it); #ifdef _JP_0_20101123_PMS WorldServer::Instance()->GetPMSManager()->SetChannelCount(DWORD(channel_list_.size())); #endif return true; } ns_world::community::WorldChannel* ns_world::WorldChannelManager::FindChannel( ns_world::ServerSessionInWorld* agent_session) { return agent_session->GetChannel(); } ns_world::community::WorldChannel* ns_world::WorldChannelManager::FindChannel( DWORD channel_id) const { CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { const ChannelPair& channel_pair = *it; if (channel_pair.session->GetChannelID() == channel_id) { return channel_pair.channel; }; }; return NULL; } /* void ns_world::WorldChannelManager::SendToAllChannel(BYTE *pMsg, WORD wSize) { CHANNEL_MAP_ITER it; ns_world::community::WorldChannel *pChannel; for (it = channel_list_.begin(); it != channel_list_.end(); ++it) { pChannel = it->second; pChannel->SendToAll(pMsg, wSize); } } */ void ns_world::WorldChannelManager::SendToStaticFields(MSG_BASE* msg_base, uint16_t msg_size) { CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { ns_world::community::WorldChannel* channel = (*it).channel; channel->SendToStaticFields(msg_base, msg_size); }; } void ns_world::WorldChannelManager::SendToBattleZones(MSG_BASE* msg_base, uint16_t msg_size) { CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { ns_world::community::WorldChannel* channel = (*it).channel; channel->SendToBattleZones(msg_base, msg_size); }; } void ns_world::WorldChannelManager::DisplayChannelInfo() { CHANNEL_MAP::const_iterator it = channel_list_.begin(); const CHANNEL_MAP::const_iterator end = channel_list_.end(); for (; it != end; ++it) { ns_world::community::WorldChannel* channel = (*it).channel; channel->DisplayInfo(); }; } //================================================================================================== // ChatRoom service interfaces ns_world::community::ChatRoomCommunity* ns_world::WorldChannelManager::GetLinkedChatRoom(ns_world::WorldUser* user) { return user->chat_room_node_.chat_room; }; ulong ns_world::WorldChannelManager::GetChatRoomGuid(\ const util::StrArrayForRoomTitle& input_chat_room_name) { util::StrArrayForRoomTitle chat_room_name; _tcsncpy(chat_room_name, input_chat_room_name, _countof(chat_room_name)); chat_room_name[_countof(chat_room_name) - 1] = _T('\0'); _tcslwr(chat_room_name); return util::StreamHashKey::GetStringHashKey(chat_room_name); }; ns_world::community::ChatRoomCommunity* ns_world::WorldChannelManager::GetChatRoomCommunity(ulong chatroom_guid) const { ChatRoomTable::const_iterator found = chat_room_table_.find(chatroom_guid); if (found == chat_room_table_.end()) { return NULL; }; ns_world::community::ChatRoomCommunity* chat_room = found->second; return chat_room; } ns_world::community::ChatRoomCommunity* ns_world::WorldChannelManager::GetChatRoomCommunityByName( const util::StrArrayForRoomTitle& input_chat_room_name) const { ulong chat_room_guid = this->GetChatRoomGuid(input_chat_room_name); return this->GetChatRoomCommunity(chat_room_guid); } bool ns_world::WorldChannelManager::EnterChatRoomCommunity( ns_world::WorldUser* user, const util::StrArrayForRoomTitle& input_chat_room_name) { // TODO: check whether the user is already joined other chat_room. if (user->chat_room_node_.chat_room != NULL) { MSG_CW_CHAT_CHANNEL_JOIN_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_CHAT_ALREADYINROOM; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg='%s' is already joined the channel (%s)|"), user->GetCharName(), user->chat_room_node_.chat_room->chat_room_name_); return false; }; util::StrArrayForRoomTitle chat_room_name; _tcsncpy(chat_room_name, input_chat_room_name, _countof(chat_room_name)); chat_room_name[_countof(chat_room_name) - 1] = _T('\0'); MSG_CW_CHAT_CHANNEL_JOIN_ACK msg_ack; MSG_CW_CHAT_CHANNEL_JOIN_BRD msg_brd; ;{ ZeroMemory(&msg_ack, sizeof(msg_ack)); new (&msg_ack) MSG_CW_CHAT_CHANNEL_JOIN_ACK; ZeroMemory(&msg_brd, sizeof(msg_brd)); new (&msg_brd) MSG_CW_CHAT_CHANNEL_JOIN_BRD; msg_brd.m_byChannelID = static_cast(\ user->GetUserAccountInfo().channel->GetChannelID()); _tcsncpy(msg_brd.m_ptszJoinMember, user->GetCharName(), _countof(msg_brd.m_ptszJoinMember)); msg_brd.m_ptszJoinMember[_countof(msg_brd.m_ptszJoinMember) - 1] = _T('\0'); }; ns_world::community::ChatRoomCommunity* chat_room = GetChatRoomCommunityByName(chat_room_name); if (chat_room == NULL) { // NOTE: if this flow result is fails, ChatRoomCommunity object is release by Update. chat_room = TAllocNew(ns_world::community::ChatRoomCommunity); chat_room->RegisterRoomName(chat_room_name); msg_ack.m_bCreated = true; }; size_t number_of_joined_users = chat_room->GetNumberOfJoinedUsers(); if (number_of_joined_users >= chat_room->kMaxNumberOfJoinedMembers) { MSG_CW_CHAT_CHANNEL_JOIN_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_CHAT_UNKNOWN; user->SendPacket(&msg_nak, sizeof(msg_nak)); SUNLOG(eFULL_LOG, _T("|["__FUNCTION__"]|Msg=this chatroom('%s') cannot take on any more user, (%d)|"), chat_room_name, number_of_joined_users); return false; }; // ±âÁ¸ ¸â¹öµé¿¡°Ô ½Å±ÔÀ¯Àú µé¾î¿Â´Ù°í ¾Ë·ÁÁÖ°í BOOST_STATIC_ASSERT(MAX_CHATZONE_USER == chat_room->kMaxNumberOfJoinedMembers && MAX_CHATZONE_USER <= UCHAR_MAX); // CHANGES: f110908.1L, remove '+1', custom logic = "(BYTE)number_of_users + 1" msg_brd.m_byUserNum = static_cast(number_of_joined_users); chat_room->SendToAll(&msg_brd, sizeof(msg_brd)); if (chat_room->Enter(user, user->GetConnectedCharInfo()) == false) { MSG_CW_CHAT_CHANNEL_JOIN_NAK msg_nak; msg_nak.m_byErrorCode = RC::RC_CHAT_UNKNOWN; user->SendPacket(&msg_nak, sizeof(msg_nak)); // µé¾î¿ÀÁö ¾Ê¾Ò´Ù´Â °É È®ÀνÃÄÑÁØ´Ù MSG_CW_CHAT_CHANNEL_OUT_BRD out_msg_brd; _tcsncpy(out_msg_brd.m_ptszOutName, msg_brd.m_ptszJoinMember, _countof(out_msg_brd.m_ptszOutName)); // null-terminated out_msg_brd.m_byUserNum = msg_brd.m_byUserNum; chat_room->SendToAll(&out_msg_brd, sizeof(out_msg_brd)); return false; }; // user->JoinChannelChatRoom( pChatZone ); <- chat_root->Enter number_of_joined_users = chat_room->GetNumberOfJoinedUsers(); msg_brd.m_byUserNum = static_cast(number_of_joined_users); user->SendPacket(&msg_ack, sizeof(msg_ack)); return true; } bool ns_world::WorldChannelManager::LeaveChatRoomCommunity(ns_world::WorldUser* user) { ns_world::community::ChatRoomUserNode* const user_chat_node = &user->chat_room_node_; if (user_chat_node->chat_room == NULL) { ASSERT(util::LList::IsEmpty(user_chat_node)); return false; }; ns_world::ConnectedCharInfo origin_info = user->GetConnectedCharInfo(); return user_chat_node->chat_room->Leave(user, &origin_info); } bool ns_world::WorldChannelManager::LoadChatRoomMembers(ns_world::WorldUser* user, ns_functor::ChatRoomMemberListFilter::MemberInfoArray& result_member_list, uint8_t* const result_number_of_members) const { *result_number_of_members = 0; // ns_world::community::ChatRoomUserNode* const user_chat_node = &user->chat_room_node_; const ns_world::community::ChatRoomCommunity* const chat_room = user_chat_node->chat_room; if (FlowControl::FCAssert(chat_room != NULL) == false) { return false; }; BOOST_STATIC_ASSERT(MAX_CHATZONE_USER == chat_room->kMaxNumberOfJoinedMembers && MAX_CHATZONE_USER == _countof(result_member_list)); const ns_world::community::ChatRoomUserNode* it = chat_room->user_list_.next; for (int counter = 0; counter < chat_room->kMaxNumberOfJoinedMembers && it != &chat_room->user_list_; it = it->next, ++(*result_number_of_members), ++counter) { util::StrArrayForCharName& dest_spot = result_member_list[*result_number_of_members]; _tcsncpy(dest_spot, it->base->GetCharName(), _countof(dest_spot)); }; return true; } //================================================================================================== void ns_world::WorldChannelManager::Update() { #if WORLD_CONTENTS_BLOCK // ÀÏÁ¤ ½Ã°£¸¶´Ù µ¿Á¢ Á¤º¸ Àü¼Û DWORD dwTotalCount=0, dwVillageCount=0, dwBattleZoneCount=0; // 10Ãʸ¶´Ù üũ...´õ·´°Ô »¡¸® Çϳ×...-0- if (statistics_timer_.IsExpired()) { CHANNEL_MAP_ITER it; ns_world::community::WorldChannel *pChannel; MSG_MW_USERCOUNT_SYN sendMsg; BYTE byChannel; DWORD dwTotalTemp = 0; // Àüü µ¿Á¢ sendMsg.byChannelCount = 0; for (it = channel_list_.begin(); it != channel_list_.end(); ++it) { pChannel = it->second; byChannel = sendMsg.byChannelCount; sendMsg.ChannelInfo[byChannel].channel_id = pChannel->GetChannelID(); pChannel->RefreshUserNum(); // ÀÏ´Ü ¸Å¹ø À¯Àú ¼ýÀÚ °»½Å - Inc/Dec ¾µ °æ¿ì ¿¹¿Ü »óȲ¿¡ ´ëÇÑ ´ëó°¡ Á¦´ë·Î ¾È µÈ´Ù // Àӽ÷Π·ÎµùÁßÀ̰ųª Çʵå Áö¿ªµé¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â °÷¿¡ ÀÖ´Â ³ðµéÀ» ¹èƲÁ¸ µ¿Á¢¿¡ ÇÕ»êÇÑ´Ù // ÇÕ»ê ¹æ¹ý: ¼öÁ¤µÈ ¹èƲÁ¸ µ¿Á¢ = ¹èƲÁ¸ µ¿Á¢ + (³²´Â µ¿Á¢) // = ¹èƲÁ¸ µ¿Á¢ + (Àüü µ¿Á¢ - ¸¶À» µ¿Á¢ - ¹èƲÁ¸ µ¿Á¢) // = Àüü µ¿Á¢ - ¸¶À» µ¿Á¢ sendMsg.ChannelInfo[byChannel].dwVillageCount = pChannel->GetZoneUserNum(eZONETYPE_CHARSELECT) + pChannel->GetZoneUserNum(eZONETYPE_VILLAGE) + pChannel->GetZoneUserNum(eZONETYPE_DOMINATION_FIELD) + pChannel->GetZoneUserNum(eZONETYPE_FIELD); if (pChannel->GetNumerOfNormalUsers() < sendMsg.ChannelInfo[byChannel].dwVillageCount) { MessageCount(eCRITICAL_LOG, "ns_world::community::WorldChannel[%u] WorldUser Statistics Error! Not Correct Field UserNum!![%u/%u]", pChannel->GetNumerOfNormalUsers(), sendMsg.ChannelInfo[byChannel].dwVillageCount); sendMsg.ChannelInfo[byChannel].dwBattleZoneCount = 0; } else { sendMsg.ChannelInfo[byChannel].dwBattleZoneCount = pChannel->GetNumerOfNormalUsers() - sendMsg.ChannelInfo[byChannel].dwVillageCount; } sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount = pChannel->GetZonePCRoomUserNum(eZONETYPE_CHARSELECT) + pChannel->GetZonePCRoomUserNum(eZONETYPE_VILLAGE) + pChannel->GetZonePCRoomUserNum(eZONETYPE_DOMINATION_FIELD) + pChannel->GetZonePCRoomUserNum(eZONETYPE_FIELD); if (pChannel->GetNumerOfPCRoomUsers() < sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount) { MessageCount(eCRITICAL_LOG, "ns_world::community::WorldChannel[%u] WorldUser Statistics Error! Not Correct Field UserNum!![%u/%u]", pChannel->GetNumerOfNormalUsers(), sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount); sendMsg.ChannelInfo[byChannel].dwBattleZonePCRoomCount = 0; } else { sendMsg.ChannelInfo[byChannel].dwBattleZonePCRoomCount = pChannel->GetNumerOfPCRoomUsers() - sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount; } MessageCount(eFULL_LOG, "Connected Users[ns_world::community::WorldChannel%d]:Total(%u)Field(%u/%u)Battle(%u/%u)", sendMsg.ChannelInfo[byChannel].channel_id, pChannel->GetTotalUserNum(), sendMsg.ChannelInfo[byChannel].dwVillageCount, sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount, sendMsg.ChannelInfo[byChannel].dwBattleZoneCount, sendMsg.ChannelInfo[byChannel].dwBattleZonePCRoomCount); dwTotalCount += pChannel->GetTotalUserNum(); dwVillageCount += sendMsg.ChannelInfo[byChannel].dwVillageCount + sendMsg.ChannelInfo[byChannel].dwVillagePCRoomCount; dwBattleZoneCount += sendMsg.ChannelInfo[byChannel].dwBattleZoneCount + sendMsg.ChannelInfo[byChannel].dwBattleZonePCRoomCount; sendMsg.byChannelCount++; } MessageCount(eCRITICAL_LOG, "Total Users:Total(%u)Field(%u)Battle(%u)", dwTotalCount, dwVillageCount, dwBattleZoneCount); // ServerInfo¸¦ ÆÄÀÏ¿¡¼­ ¹ÞÁö ¾Ê¾Ò´Âµ¥ if (!WorldServerInfoParser::Instance()->IsServerInfoFromFile()) { // ¸¶½ºÅÍ ¼­¹ö¿¡ Á¢¼Óµµ ¾È µÅ ÀÖÀ¸¸é µ¿Á¢ º¸°í¿¡ ½ÇÆÐÇÑ °Å´Ù! ServerSession *pMasterServer = ServerSessionManager::Instance()->GetMasterServer(); if (!pMasterServer) { MessageOut(eCRITICAL_LOG, "Connect Statistics Send Failed - No Master Server"); return; } pMasterServer->Send((BYTE*)&sendMsg, sendMsg.GetSize()); MessageOut(eFULL_LOG, "Send Connect Statistics to Master Server"); } } #endif //WORLD_CONTENTS_BLOCK } ns_world::community::FieldInfo* ns_world::WorldChannelManager::GetFieldInfo(DWORD field_code) { FieldInfoTable::const_iterator found = field_info_table_.find(field_code); if (found == field_info_table_.end()) { return NULL; }; ns_world::community::FieldInfo* field_info = found->second; return field_info; } bool ns_world::WorldChannelManager::LoadFieldInfo() { // (WAVERIX)(080605)(reduce error rates) MapInfoParser* const map_info_parser = MapInfoParser::Instance(); const sMAPINFO_HASH& map_table = map_info_parser->GetMapInfoHash(); if (map_table.empty()) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|Msg=map table is empty")); return true; }; // ¸¶À» ¸ÊÀÎ °æ¿ì¸¸ ½ÇÁ¦·Î Àд´٠// (WAVERIX)(080718)(memory leak buf-fix) : [ÇØ¿Ü] solarauth¿ÍÀÇ Àç Á¢¼Ó½Ã ¹®Á¦°¡ ¾ß±âµÈ´Ù. // - field_info_table_´Â LoadFieldInfo°¡ È£ÃâµÇ´Â ½ÃÁ¡¿¡¸¸ Ãß°¡µÈ´Ù. // - µû¶ó¼­ field_info_table_¿¡ °ªÀÌ Á¸Àç½Ã ±×³É true¹ÝȯÇϱâ·Î ÇÑ´Ù. if (field_info_table_.empty() == false) { SUNLOG(eCRITICAL_LOG, "Already Loaded Fields"); return true; }; CDiscAccess disc_access; disc_access.Create(); FOREACH_CONTAINER(const sMAPINFO_HASH::value_type& map_node, map_table, sMAPINFO_HASH) { const sMAPINFO* const map_info = map_node.second; const eZONETYPE zone_type = map_info->GetZoneType4SharedCode(); bool used_sector_control = (zone_type == eZONETYPE_FIELD) || (zone_type == eZONETYPE_VILLAGE) || (zone_type == eZONETYPE_DOMINATION_FIELD); for (int index = 0; index < _countof(map_info->FCode); ++index) { const FIELDCODE field_code = map_info->FCode[index]; if (field_code == 0) { continue; }; if (used_sector_control == false) { continue; }; if (this->GetFieldInfo(field_code)) { continue; }; ns_world::community::FieldInfo* const field_info = \ TAllocNew(ns_world::community::FieldInfo); if (!field_info->Create(map_info_parser->GetFieldInfo(field_code), true, &disc_access)) { continue; }; //const FIELDCODE field_code = field_info->GetFieldCode(); const FieldInfoTable::_Pairib inserted = field_info_table_.insert(\ FieldInfoTable::value_type(field_code, field_info)); if (FlowControl::FCAssert(inserted.second)) { SUNLOG(eFULL_LOG, "FieldInfo[%u] Template Add Completed", field_code); } else { SUNLOG(eCRITICAL_LOG, "FieldInfo[%u] Duplicated Info %u\n", field_code); delete field_info; }; }; //end 'for' }; //end 'foreach map_info in map_infos return true; }