Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Принятые патчи

Важная информация

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.04.2012, 21:29   #1
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию [11982] USE_CREATURE_IN_GOSSIP_MENU_CHECK

Если в конфиге поставить LogFilter_DbStrictedCheck = 0, то получаем много ошибок вида
Код:
... Table `gossip_menu` contain unused (in creature or GO or menu options) menu id XXX.
При этом большинство из этих menu_id есть в базе.
Проблема в том, что не учитываются коды меню из таблицы `creature_template`.
Код:
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 75c7d30..629b253 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -8698,7 +8698,10 @@ void ObjectMgr::LoadGossipMenuItems(std::set<uint32>& gossipScriptSet)
     for(uint32 i = 1;  i < sCreatureStorage.MaxEntry; ++i)
         if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(i))
             if (cInfo->GossipMenuId)
+            {
+                menu_ids.erase(cInfo->GossipMenuId);
                 menu2CInfoMap.insert(Menu2CInfoMap::value_type(cInfo->GossipMenuId, cInfo));
+            }
 
     do
     {
Результаты проверки:
1. Чистое ядро: в логе 1414 номеров menu_id, совпадения с таблицей `creature_template` есть.
2. С патчем: в логе 111 номеров menu_id. В таблицах `creature_template`, `gameobject_template` и `gossip_menu_option` совпадений нет.
virusav вне форума  
5 пользователя(ей) сказали cпасибо:
evilstar (27.04.2012), KiriX (30.04.2012), lovepsone (28.04.2012), schmoozerd (28.04.2012), YuruY (28.04.2012)
Старый 28.04.2012, 15:13   #2
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

Nice catch. Atm we only consider menus with gossip_menu_option entries as "found"

So I think this should be good:
Код:
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 75c7d30..180142b 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -8681,7 +8681,7 @@ void ObjectMgr::LoadGossipMenuItems(std::set<uint32>& gossipScriptSet)
             if (itr->first)
                 menu_ids.insert(itr->first);
 
-        for(uint32 i = 1; i < sGOStorage.MaxEntry; ++i)
+        for (uint32 i = 1; i < sGOStorage.MaxEntry; ++i)
             if (GameObjectInfo const* gInfo = sGOStorage.LookupEntry<GameObjectInfo>(i))
                 if (uint32 menuid = gInfo->GetGossipMenuId())
                     menu_ids.erase(menuid);
@@ -8695,11 +8695,17 @@ void ObjectMgr::LoadGossipMenuItems(std::set<uint32>& gossipScriptSet)
     // prepare menuid -> CreatureInfo map for fast access
     typedef  std::multimap<uint32, const CreatureInfo*> Menu2CInfoMap;
     Menu2CInfoMap menu2CInfoMap;
-    for(uint32 i = 1;  i < sCreatureStorage.MaxEntry; ++i)
+    for (uint32 i = 1;  i < sCreatureStorage.MaxEntry; ++i)
         if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(i))
             if (cInfo->GossipMenuId)
+            {
                 menu2CInfoMap.insert(Menu2CInfoMap::value_type(cInfo->GossipMenuId, cInfo));
 
+                // unused check data preparing part
+                if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK))
+                    menu_ids.erase(cInfo->GossipMenuId);
+            }
+
     do
     {
         bar.step();
@@ -8777,7 +8783,7 @@ void ObjectMgr::LoadGossipMenuItems(std::set<uint32>& gossipScriptSet)
         if (gMenuItem.option_id >= GOSSIP_OPTION_MAX)
             sLog.outErrorDb("Table gossip_menu_option for menu %u, id %u has unknown option id %u. Option will not be used", gMenuItem.menu_id, gMenuItem.id, gMenuItem.option_id);
 
-        if (gMenuItem.menu_id && (gMenuItem.npc_option_npcflag || !sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)))
+        if (gMenuItem.menu_id && gMenuItem.npc_option_npcflag)
         {
             bool found_menu_uses = false;
             bool found_flags_uses = false;
@@ -8792,10 +8798,6 @@ void ObjectMgr::LoadGossipMenuItems(std::set<uint32>& gossipScriptSet)
                 // 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)
schmoozerd вне форума  
Старый 28.04.2012, 16:05   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если menu_id есть в таблицах `creature_template`, `gameobject_template` или `gossip_menu_option`, то в переменной menu_ids их не должно быть.

Если LOG_FILTER_DB_STRICTED_CHECK = 1, то menu_id, отсутствующие в соответствующих таблицах, удаляются из menu_ids.

Если удалять menu_id из menu_ids только при LOG_FILTER_DB_STRICTED_CHECK = 0, то будем обрабатывать больше записей, чем в моем варианте.

Все равно существующие записи не дадут ошибку в логе при любом значении LOG_FILTER_DB_STRICTED_CHECK, поэтому лучше их сразу удалять при проверке в цикле по объектам, нпц и подпукнтам госсипов.

Если я неправильно понял суть переменной menu_ids, то просьба пояснить.
virusav вне форума  
Старый 28.04.2012, 16:38   #4
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

Very hard for me to understand what you really mean.

If LOG_FILTER_* is set this means that the related log is filtered. which means not displayed.
Hence if you want to see LOG_FILTER_* output you have to set =0.

HasLogFilter(*) returns if LOG_FILTER_* = 1.

The idea is to output which menu-ids are unused if you run the mode in DB_STRICTED_CHECK (by setting LOG_FILTER_DB_STRICTED_CHECK = 0 )

So the check !HasLogFilter(*) returns if you want the additional checks.

the variable menu_ids has the idea to contains all entries of `gossip_menu` - which are unused.
To actually fill this variable (it is a set) all used menu-ids are inserted, and all used are erased.
This way, the remaining are exactly the ones that are unused.

In current clean code, the removed ones are the ones that
- are used in gameobject_template
- OR are used in gossip_menu_option.action_menu_id
- OR are used in gossip_menu_option

hence the many ones that are used only in creature_template are not removed, and hence give false error output.
Your patch fixes this.

However with your patch, menu-ids used in gossip_menu_option are attempted to remvoe again, (which is useless) - this is why I removed these few lines in my patch (chunk @@ -8792,10 +8798,6 @@ )
schmoozerd вне форума  
Старый 28.04.2012, 17:22   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

В моем представлении должно быть так:
1. Заполняем menu_ids.
2. Удаляем из menu_ids все меню объектов.
3. Удаляем из menu_ids все меню нпц.
4. Удаляем из menu_ids все `gossip_menu_option`.`action_menu_id`.
5. Если LOG_FILTER_DB_STRICTED_CHECK = 1, то удаляем из menu_ids все неиспользуемые меню.
6. Если LOG_FILTER_DB_STRICTED_CHECK = 0, то выводим ошибки.

После пунктов 2, 3 и 4 в menu_ids должны остаться только неиспользуемые меню.
Если пропустить пункт 3, то в пунктах 5 и 6 будем обрабатывать больше записей.

Возможно, я не так понял вашу правку, так как сейчас у меня нет исходников под рукой.

Лишь бы патч был принят в правильном варианте
virusav вне форума  
Старый 30.04.2012, 23:19   #6
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

virusav, schmoozerd предлагает точно тоже самое, что и ты, только немного иначе в коде. Более правильно по его мнению (тут уж я судить не берусь). Но работать будет точно также как и предполагает твоя правка
KiriX вне форума  
Пользователь сказал cпасибо:
schmoozerd (04.05.2012)
Старый 02.05.2012, 19:24   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Предлагаю принять какой-нибудь вариант патча, раз оба правильные.
virusav вне форума  
Пользователь сказал cпасибо:
KiriX (03.05.2012)
Старый 04.05.2012, 17:47   #8
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

In [11982]. Thank you

Sorry for the misunderstandings
schmoozerd вне форума  
2 пользователя(ей) сказали cпасибо:
KiriX (04.05.2012), lovepsone (04.05.2012)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[11982] Fix DB_STRICTED_CHECK output for gossip newsbot CMaNGOS Commits 0 04.05.2012 17:51


Текущее время: 06:50. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot