Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

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

Баг-репорты Описываем проблемы и ошибки работы ядра

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.05.2011, 07:06   #1
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию Карта 0 (вост. королевства) не получает script_id

Сабж собственно. Причем скрипт грузится, но в структуре WorldTemplate для карты 0 script_id всегда = 0. Убедиться можно при помощи патча (это не фикс! просто иллюстрация), скрипт естественно должен быть присвоен:
Код:
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index ed9a7e7..5528a13 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -1155,8 +1155,22 @@ void Map::CreateInstanceData(bool load)
     {
         if (WorldTemplate const* mInstance = ObjectMgr::GetWorldTemplate(GetId()))
             i_script_id = mInstance->script_id;
+        DEBUG_LOG("Loading instance data for WorldMap: %u script: %u ", GetId(), i_script_id);
+        if (!i_script_id)
+        {
+            QueryResult* result = WorldDatabase.PQuery("SELECT ScriptName FROM world_template WHERE map = '%u'", GetId());
+            if (result)
+            {
+                Field* fields = result->Fetch();
+                const char* scriptname = fields[0].GetString();
+                i_script_id = sScriptMgr.GetScriptId(scriptname);
+                delete result;
+            }
+        }
+        DEBUG_LOG("Loading instance data for WorldMap: %u script: %u ", GetId(), i_script_id);
     }
 
+
     if (!i_script_id)
         return;
поиски источника бага привели в район преобразования форматов в SQLStorage и тут я сломался (насколько же ... хм... запутанная система присвоения script_id в мангосе однако. непонятно только зачем она вообще, все равно все время ищем по имени...)
rsa вне форума   Ответить с цитированием
Старый 04.05.2011, 09:39   #2
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

KiriX вне форума   Ответить с цитированием
Старый 04.05.2011, 11:17   #3
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
во первых ему присваивается номер в списке скриптов, и вовсе не 0. во вторых номер 0 для скриптов - служебный, там должен быть скрипт с именем "", иначе что-то обломится.
rsa вне форума   Ответить с цитированием
Старый 04.05.2011, 13:40   #4
wk23
Пользователь
 
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
wk23 На верном пути
По умолчанию

сделать по умолчанию -1, а не 0
Код:
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index fed3ab2..0dc52ae 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -74,7 +74,7 @@ Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode)
   m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_persistentState(NULL),
   m_activeNonPlayersIter(m_activeNonPlayers.end()),
   i_gridExpiry(expiry), m_TerrainData(sTerrainMgr.LoadTerrain(id)),
-  i_data(NULL), i_script_id(0)
+  i_data(NULL), i_script_id(-1)
 {
     m_CreatureGuids.Set(sObjectMgr.GetFirstTemporaryCreatureLowGuid());
     m_GameObjectGuids.Set(sObjectMgr.GetFirstTemporaryGameObjectLowGuid());
diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp
index 08a92b7..30a792f 100644
--- a/src/game/ScriptMgr.cpp
+++ b/src/game/ScriptMgr.cpp
@@ -942,13 +942,13 @@ uint32 ScriptMgr::GetScriptId(const char *name) const
     // use binary search to find the script name in the sorted vector
     // assume "" is the first element
     if (!name)
-        return 0;
+        return 1;
 
     ScriptNameMap::const_iterator itr =
         std::lower_bound(m_scriptNames.begin(), m_scriptNames.end(), name);
 
     if (itr == m_scriptNames.end() || *itr != name)
-        return 0;
+        return -1;
 
     return uint32(itr - m_scriptNames.begin());
 }
wk23 вне форума   Ответить с цитированием
Старый 04.05.2011, 13:55   #5
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

я не зря привел пример для просмотра. реальный номер скрипта у меня 1792 а вовсе не 0. он не прописывается в структуру WorldTemlate, а 0 значение работает правильно.
rsa вне форума   Ответить с цитированием
Старый 04.05.2011, 18:56   #6
SilverIce
MaNGOS Dev
 
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
SilverIce Скоро придёт к известности
По умолчанию

все загружается правильно
но SQLStorage LookupEntry возвращает null при нулевом entry.. споткнулись

Последний раз редактировалось SilverIce; 04.05.2011 в 19:01.
SilverIce вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
rsa (04.05.2011)
Старый 04.05.2011, 19:57   #7
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от SilverIce Посмотреть сообщение
все загружается правильно
но SQLStorage LookupEntry возвращает null при нулевом entry.. споткнулись
something like this I expected. Thanks.
rsa вне форума   Ответить с цитированием
Старый 13.05.2011, 07:28   #8
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Поскольку решение проблемы судя по всему никому не интересно, предлагаю собственное -
https://github.com/mangosR2/mangos/c...f66b38b4a5c61d
пока судя по всему ничего не испортилось. Глядя по коду тоже возможных проблем не нашел. Кто-то вообще может сказать на кой черт это исключение было изначально?
rsa вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (13.05.2011)
Старый 13.05.2011, 08:46   #9
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Потому что 0 используется в коде как пустой guid/entry.

Код:
// хотим получить nullptr при m_castItem = 0
if(ItemPrototype const* itemInfo = sItemStorage.LookupEntry(m_castItem))
    ...
На счет скриптов, я все же считаю, что они должны привязываться сразу к зонам, а не к целым картам.
zergtmn вне форума   Ответить с цитированием
Старый 13.05.2011, 09:19   #10
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Потому что 0 используется в коде как пустой guid/entry.

Код:
// хотим получить nullptr при m_castItem = 0
if(ItemPrototype const* itemInfo = sItemStorage.LookupEntry(m_castItem))
    ...
На счет скриптов, я все же считаю, что они должны привязываться сразу к зонам, а не к целым картам.
спасибо за наводку. но по моему такие случаи нужно отслеживать в коде обработчиков, а не делать хак в storage (который должен быть туп как пробка). и прототип в этом случае все равно NULL если итема 0 нет в базе.

по поводу привязки скриптов к зонам - у меня уже сделано, зональные скрипты вызываются из скрипта карты при необходимости.
rsa вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
POMM - Карта игроков karobas WWW 12 13.05.2012 11:16
[map] Flash-карта онлайна - Stalker Edition Кот ДаWINчи WWW 13 04.04.2012 14:25
Получение данных Карта->Зона Hantet WWW 9 11.09.2010 22:21


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


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