From 73568c79b5de3c0578dba2a915bccff09b30ce98 Mon Sep 17 00:00:00 2001 From: Warlord123 Date: Sun, 19 Dec 2010 21:52:30 +0300 Subject: [PATCH] [10893] Speedup check code at `gossip_menu_option` loading. Signed-off-by: VladimirMangos --- src/game/ObjectMgr.cpp | 34 ++++++++++++++++++++-------------- src/shared/revision_nr.h | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index afccfb02136..bd044a1aaa2 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -9246,6 +9246,14 @@ void ObjectMgr::LoadGossipMenuItems() for(ScriptMapMap::const_iterator itr = sGossipScripts.begin(); itr != sGossipScripts.end(); ++itr) gossipScriptSet.insert(itr->first); + // prepare menuid -> CreatureInfo map for fast access + typedef std::multimap Menu2CInfoMap; + Menu2CInfoMap menu2CInfoMap; + for(uint32 i = 1; i < sCreatureStorage.MaxEntry; ++i) + if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry(i)) + if (cInfo->GossipMenuId) + menu2CInfoMap.insert(Menu2CInfoMap::value_type(cInfo->GossipMenuId, cInfo)); + do { bar.step(); @@ -9326,23 +9334,21 @@ void ObjectMgr::LoadGossipMenuItems() { bool found_menu_uses = false; bool found_flags_uses = false; - for(uint32 i = 1; !found_flags_uses && i < sCreatureStorage.MaxEntry; ++i) + + std::pair tm_bounds = menu2CInfoMap.equal_range(gMenuItem.menu_id); + for (Menu2CInfoMap::const_iterator it2 = tm_bounds.first; !found_flags_uses && it2 != tm_bounds.second; ++it2) { - if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry(i)) - { - if (cInfo->GossipMenuId == gMenuItem.menu_id) - { - found_menu_uses = true; + CreatureInfo const* cInfo = it2->second; - // some from creatures with gossip menu can use gossip option base at npc_flags - if (gMenuItem.npc_option_npcflag & cInfo->npcflag) - found_flags_uses = true; + found_menu_uses = true; - // unused check data preparing part - if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) - menu_ids.erase(cInfo->GossipMenuId); - } - } + // some from creatures with gossip menu can use gossip option base at npc_flags + if (gMenuItem.npc_option_npcflag & cInfo->npcflag) + found_flags_uses = true; + + // unused check data preparing part + if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) + menu_ids.erase(gMenuItem.menu_id); } if (found_menu_uses && !found_flags_uses) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3c134894cbf..f058cc4042d 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10892" + #define REVISION_NR "10893" #endif // __REVISION_NR_H__