Ru-MaNGOS

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

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

Отвергнутые патчи Патчи, отвергнутые от приёма в GIT

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.10.2010, 14:57   #1
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию realm-dependent расстановка объектов и НПЦ

Продолжая процесс переноса обновляемых таблиц в базу characters, решил попробовать сделать базу mangos полностью ридонли.
Для этого пришлось вынести в characters "продолжения" таблиц gameobject и creatures, что за компанию позволяет иметь у нескольких реалмов одну базу mangos и разную расстановку НПЦ/ГО в разных реалмах.
Патч позволяет также заменять ГО и НПС в мире не изменяя при этом оригинальную базу (при загрузке объекты с одинаковым гуидом заменятся на те что изменены в конкретно этом реалме).
Код:
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index e7ef2ef..24f6a90 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1016,9 +1016,9 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
     data.spawnMask = spawnMask;
 
     // updated in DB
-    WorldDatabase.BeginTransaction();
+    CharacterDatabase.BeginTransaction();
 
-    WorldDatabase.PExecuteLog("DELETE FROM creature WHERE guid = '%u'", m_DBTableGuid);
+    CharacterDatabase.PExecuteLog("DELETE FROM creature WHERE guid = '%u'", m_DBTableGuid);
 
     std::ostringstream ss;
     ss << "INSERT INTO creature VALUES ("
@@ -1041,9 +1041,9 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
         << (m_isDeadByDefault ? 1 : 0) << ","               //is_dead
         << GetDefaultMovementType() << ")";                 //default movement generator type
 
-    WorldDatabase.PExecuteLog("%s", ss.str().c_str());
+    CharacterDatabase.PExecuteLog("%s", ss.str().c_str());
 
-    WorldDatabase.CommitTransaction();
+    CharacterDatabase.CommitTransaction();
 }
 
 void Creature::SelectLevel(const CreatureInfo *cinfo, float percentHealth, float percentMana)
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 2f9318c..3a76073 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -557,10 +557,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
         << uint32(GetGoAnimProgress()) << ", "
         << uint32(GetGoState()) << ")";
 
-    WorldDatabase.BeginTransaction();
-    WorldDatabase.PExecuteLog("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid);
-    WorldDatabase.PExecuteLog("%s", ss.str().c_str());
-    WorldDatabase.CommitTransaction();
+    CharacterDatabase.BeginTransaction();
+    CharacterDatabase.PExecuteLog("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid);
+    CharacterDatabase.PExecuteLog("%s", ss.str().c_str());
+    CharacterDatabase.CommitTransaction();
 }
 
 bool GameObject::LoadFromDB(uint32 guid, Map *map)
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 50be622..2be8d89 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -1186,17 +1186,31 @@ void ObjectMgr::LoadCreatureModelRace()
     sLog.outString( ">> Loaded %u creature_model_race entries", count);
 }
 
-void ObjectMgr::LoadCreatures()
+void ObjectMgr::LoadCreatures(bool currentRealm)
 {
     uint32 count = 0;
+    QueryResult *result;
+    if (!currentRealm)
+    {
     //                                                0              1   2    3
-    QueryResult *result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid,"
+    result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid,"
     //   4             5           6           7           8            9              10         11
         "equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint,"
     //   12         13       14          15            16         17         18     19
         "curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, event, pool_entry "
         "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
         "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
+    }
+    else
+    {
+    //                                                0              1   2    3
+    result = CharacterDatabase.Query("SELECT creature.guid, id, map, modelid,"
+    //   4             5           6           7           8            9              10         11
+        "equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint,"
+    //   12         13       14          15            16         17         18     19
+        "curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, 0,     0  "
+        "FROM creature");
+    }
 
     if(!result)
     {
@@ -1393,16 +1407,26 @@ void ObjectMgr::RemoveCreatureFromGrid(uint32 guid, CreatureData const* data)
     }
 }
 
-void ObjectMgr::LoadGameobjects()
+void ObjectMgr::LoadGameobjects(bool currentRealm)
 {
     uint32 count = 0;
-
+    QueryResult *result;
+    if (!currentRealm)
+    {
     //                                                0                1   2    3           4           5           6
-    QueryResult *result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation,"
+    result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation,"
     //   7          8          9          10         11             12            13     14         15         16     17
         "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, event, pool_entry "
         "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
         "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
+    }
+    else
+    {
+    result = CharacterDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation,"
+    //   7          8          9          10         11             12            13     14         15         16     17
+        "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, 0,      0 "
+        "FROM gameobject");
+    }
 
     if(!result)
     {
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 1452682..11d3dee 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -960,14 +960,14 @@ class ObjectMgr
         void LoadDbScriptStrings();
         void LoadCreatureLocales();
         void LoadCreatureTemplates();
-        void LoadCreatures();
+        void LoadCreatures(bool currentRealm = false);
         void LoadCreatureRespawnTimes();
         void LoadCreatureAddons();
         void LoadCreatureModelInfo();
         void LoadCreatureModelRace();
         void LoadEquipmentTemplates();
         void LoadGameObjectLocales();
-        void LoadGameobjects();
+        void LoadGameobjects(bool currentRealm = false);
         void LoadGameobjectRespawnTimes();
         void LoadItemPrototypes();
         void LoadItemRequiredTarget();
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 9b38fb4..59d0e3d 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1056,6 +1056,9 @@ void World::SetInitialWorldSettings()
     sLog.outString( "Loading Creature Data..." );
     sObjectMgr.LoadCreatures();
 
+    sLog.outString( "Loading Creature Data from character DB..." );
+    sObjectMgr.LoadCreatures(true);
+
     sLog.outString( "Loading pet levelup spells..." );
     sSpellMgr.LoadPetLevelupSpellMap();
 
@@ -1074,6 +1077,9 @@ void World::SetInitialWorldSettings()
     sLog.outString( "Loading Gameobject Data..." );
     sObjectMgr.LoadGameobjects();
 
+    sLog.outString( "Loading Gameobject Data from character DB..." );
+    sObjectMgr.LoadGameobjects(true);
+
     sLog.outString( "Loading Gameobject Respawn Data..." ); // must be after PackInstances()
     sObjectMgr.LoadGameobjectRespawnTimes();
 
--
Внимание! Патч написан за 10 минут и серьезно не тестировался. Не решены проблемы с вейпойнтами, эвентами и пулами (хотя я не уверен что их вообще надо решать). Будут проблемы - пишите, подумаем.

PS да, и не забудьте создать в базе characters таблицы gameobject и creature, можно скулем для создания базы mangos

Последний раз редактировалось rsa; 06.10.2010 в 15:00.
rsa вне форума   Ответить с цитированием
Старый 07.10.2010, 16:52   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Таблицы creature_addon, creature_battleground, creature_movement, game_event_creature, game_event_gameobject, gameobject_battleground, pool_creature, pool_gameobject, pool_pool тоже будешь переносить?
zergtmn вне форума   Ответить с цитированием
Старый 07.10.2010, 17:03   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если хочешь, чтобы база мангос была только для чтения, то изменяемые таблицы игрового мира лучше вынести в отдельную базу, чем захламлять базу персонажей.
virusav вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Gerald (06.03.2011)
Старый 07.10.2010, 17:50   #4
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Таблицы creature_addon, creature_battleground, creature_movement, game_event_creature, game_event_gameobject, gameobject_battleground, pool_creature, pool_gameobject, pool_pool тоже будешь переносить?
По идее конечно надо. Только не переносить, а делать "довесок". Однако в большей части этих таблиц необходимости в реалм-депенедент нету.
rsa вне форума   Ответить с цитированием
Старый 03.03.2011, 20:45   #5
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

И в итоге закончится что все таблицы кроме template в этой новой базе - а template-ы не самые большие таблицы. Не проще иметь прсто 2 копии базы для 2 реалмов если уже у них заселение разное.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 03.03.2011, 20:57   #6
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Vladimir Посмотреть сообщение
И в итоге закончится что все таблицы кроме template в этой новой базе - а template-ы не самые большие таблицы. Не проще иметь прсто 2 копии базы для 2 реалмов если уже у них заселение разное.
нет, не проще - серьезные проблемы с обновлением. но оказалось есть куда более простой путь - отображение таблиц с помощью temptable. так что вопрос помер сам собой *template храним в базе mangos_template и отображаем их на mangos* сколько угодно...
rsa вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10195] Some gender dependent spells newsbot CMaNGOS Commits 0 15.07.2010 04:52
[9882] Add support for mounts dependent from riding skill and location newsbot CMaNGOS Commits 5 13.05.2010 02:10
Деспавн объектов и деактивация virusav Баг-репорты 12 18.04.2010 20:56
[9746] Implement show realm version and build in realm list. newsbot CMaNGOS Commits 0 14.04.2010 08:20
[9704] Add to achievement_reward support gender dependent rewards. newsbot CMaNGOS Commits 0 09.04.2010 06:40


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


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