diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp index 3853cec18..bef5f99c2 100644 --- a/src/game/LootMgr.cpp +++ b/src/game/LootMgr.cpp @@ -1217,7 +1217,7 @@ void LoadLootTemplates_Item() if (ids_set.find(proto->ItemId) != ids_set.end() || proto->MaxMoneyLoot > 0) ids_set.erase(proto->ItemId); // wdb have wrong data cases, so skip by default - else if ((sLog.getLogFilter() & LOG_FILTER_DB_STRICTED_CHECK) == 0) + else if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) LootTemplates_Item.ReportNotExistedId(proto->ItemId); } } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 86c9372f5..4d9d84c79 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -9132,6 +9132,19 @@ void ObjectMgr::LoadGossipMenu() sLog.outString(); sLog.outString( ">> Loaded %u gossip_menu entries", count); + + // post loading tests + for(uint32 i = 1; i < sCreatureStorage.MaxEntry; ++i) + if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry(i)) + if (cInfo->GossipMenuId) + if (m_mGossipMenusMap.find(cInfo->GossipMenuId) == m_mGossipMenusMap.end()) + sLog.outErrorDb("Creature (Entry: %u) has gossip_menu_id = %u for nonexistent menu", cInfo->Entry, cInfo->GossipMenuId); + + for(uint32 i = 1; i < sGOStorage.MaxEntry; ++i) + if (GameObjectInfo const* gInfo = sGOStorage.LookupEntry(i)) + if (uint32 menuid = gInfo->GetGossipMenuId()) + if (m_mGossipMenusMap.find(menuid) == m_mGossipMenusMap.end()) + ERROR_DB_STRICT_LOG("Gameobject (Entry: %u) has gossip_menu_id = %u for nonexistent menu", gInfo->id, menuid); } void ObjectMgr::LoadGossipMenuItems() @@ -9157,6 +9170,25 @@ void ObjectMgr::LoadGossipMenuItems() return; } + // prepare data for unused menu ids + std::set menu_ids; // for later integrity check + if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) // check unused menu ids only in strict mode + { + for (GossipMenusMap::const_iterator itr = m_mGossipMenusMap.begin(); itr != m_mGossipMenusMap.end(); ++itr) + menu_ids.insert(itr->first); + + for(uint32 i = 1; i < sCreatureStorage.MaxEntry; ++i) + if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry(i)) + if (cInfo->GossipMenuId) + menu_ids.erase(cInfo->GossipMenuId); + + for(uint32 i = 1; i < sGOStorage.MaxEntry; ++i) + if (GameObjectInfo const* gInfo = sGOStorage.LookupEntry(i)) + if (uint32 menuid = gInfo->GetGossipMenuId()) + menu_ids.erase(menuid); + } + + // loading barGoLink bar((int)result->GetRowCount()); uint32 count = 0; @@ -9197,6 +9229,15 @@ void ObjectMgr::LoadGossipMenuItems() uint32 cond_3_val_1 = fields[19].GetUInt32(); uint32 cond_3_val_2 = fields[20].GetUInt32(); + if (gMenuItem.menu_id) // == 0 id is special and not have menu_id data + { + if (m_mGossipMenusMap.find(gMenuItem.menu_id) == m_mGossipMenusMap.end()) + { + sLog.outErrorDb("Gossip menu option (MenuId: %u) for nonexistent menu", gMenuItem.menu_id); + continue; + } + } + if (!PlayerCondition::IsValid(cond_1, cond_1_val_1, cond_1_val_2)) { sLog.outErrorDb("Table gossip_menu_option menu %u, invalid condition 1 for id %u", gMenuItem.menu_id, gMenuItem.id); @@ -9213,6 +9254,14 @@ void ObjectMgr::LoadGossipMenuItems() continue; } + if (gMenuItem.action_menu_id) + { + if (m_mGossipMenusMap.find(gMenuItem.action_menu_id) == m_mGossipMenusMap.end()) + sLog.outErrorDb("Gossip menu option (MenuId: %u Id: %u) have action_menu_id = %u for nonexistent menu", gMenuItem.menu_id, gMenuItem.id, gMenuItem.action_menu_id); + else if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) + menu_ids.erase(gMenuItem.action_menu_id); + } + if (gMenuItem.option_icon >= GOSSIP_ICON_MAX) { sLog.outErrorDb("Table gossip_menu_option for menu %u, id %u has unknown icon id %u. Replacing with GOSSIP_ICON_CHAT", gMenuItem.menu_id, gMenuItem.id, gMenuItem.option_icon); @@ -9261,10 +9310,13 @@ void ObjectMgr::LoadGossipMenuItems() delete result; - if (!gossipScriptSet.empty()) + for(std::set::const_iterator itr = gossipScriptSet.begin(); itr != gossipScriptSet.end(); ++itr) + sLog.outErrorDb("Table `gossip_scripts` contain unused script, id %u.", *itr); + + if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) { - for(std::set::const_iterator itr = gossipScriptSet.begin(); itr != gossipScriptSet.end(); ++itr) - sLog.outErrorDb("Table `gossip_scripts` contain unused script, id %u.", *itr); + for(std::set::const_iterator itr = menu_ids.begin(); itr != menu_ids.end(); ++itr) + sLog.outErrorDb("Table `gossip_menu` contain unused (in creature or GO or menu options) menu id %u.", *itr); } sLog.outString(); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 86ed6e9e6..134c12223 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -13062,7 +13062,10 @@ uint32 Player::GetGossipTextId(uint32 menuId) for(GossipMenusMap::const_iterator itr = pMenuBounds.first; itr != pMenuBounds.second; ++itr) { if (sObjectMgr.IsPlayerMeetToCondition(this, itr->second.cond_1) && sObjectMgr.IsPlayerMeetToCondition(this, itr->second.cond_2)) + { textId = itr->second.text_id; + break; + } } return textId; @@ -17485,7 +17488,7 @@ void Player::_SaveStats() void Player::outDebugStatsValues() const { // optimize disabled debug output - if(!sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG) || (sLog.getLogFilter() & LOG_FILTER_PLAYER_STATS)!=0) + if(!sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG) || sLog.HasLogFilter(LOG_FILTER_PLAYER_STATS)) return; sLog.outDebug("HP is: \t\t\t%u\t\tMP is: \t\t\t%u",GetMaxHealth(), GetMaxPower(POWER_MANA)); diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index 59af9ba0f..e7e637597 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -512,12 +512,10 @@ bool ChatHandler::HandleServerLogFilterCommand(char* args) { if (!*args) { - uint32 logfiler = sLog.getLogFilter(); - SendSysMessage(LANG_LOG_FILTERS_STATE_HEADER); for(int i = 0; i < LOG_FILTER_COUNT; ++i) if (*logFilterData[i].name) - PSendSysMessage(" %-20s = %s",logFilterData[i].name,(logfiler & (1 << i)) !=0 ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF)); + PSendSysMessage(" %-20s = %s",logFilterData[i].name, sLog.HasLogFilter(1 << i) ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF)); return true; } diff --git a/src/shared/Log.h b/src/shared/Log.h index b332d9b26..33c8f3207 100644 --- a/src/shared/Log.h +++ b/src/shared/Log.h @@ -153,7 +153,7 @@ class Log : public MaNGOS::Singleton= loglvl || (m_logFileLevel >= loglvl && logfile); } bool IsOutCharDump() const { return m_charLog_Dump; } @@ -201,7 +201,7 @@ class Log : public MaNGOS::Singleton