Ru-MaNGOS

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

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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.10.2010, 10:48   #1
Burned
Новичок
 
Аватар для Burned
 
Регистрация: 07.03.2010
Адрес: Украина
Сообщений: 26
Сказал(а) спасибо: 28
Поблагодарили 26 раз(а) в 8 сообщениях
Burned На верном пути
По умолчанию [patch]Маска класов для квестов

Что делает: Патч добавляет возможность указания маски игровых класов, как еще одного условия для получения квеста. Заменяет не полностью функциональное поле SkillOrClass в quest_template.
Ревизия: 10578
Автор: Shauren
Оригинальный коммит в тринити: http://code.google.com/p/trinitycore...r=6f1c4fcf4e1b тут опечатка с uint8 вместо uint32, которую позже исправили; в патче ниже опечатки нет.
Описание:
В wotlk есть квесты, взять которые могут только определенное количество класов. Например, квесты в ледяной короне, там есть квесты для дк и для всех остальных. Кроме того есть еще один пример с квестом на потёртую рукоять, а именно завершающие в цепочке - http://www.wowhead.com/quest=24598
Очень обидно, когда игроки получают не то, что им нужно, взяв квест с одинаковым названием, но другой наградой.

Код:
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 98efb7c..928e6d6 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -3556,7 +3556,7 @@ void ObjectMgr::LoadQuests()
     mExclusiveQuestGroups.clear();
 
     //                                                0      1       2           3             4         5           6     7              8
-    QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
+    QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClassMask, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
     //   9                    10                 11                     12                   13                     14                   15                16
         "RepObjectiveFaction, RepObjectiveValue, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime,"
     //   17          18            19           20            21            22           23           24              25
@@ -3708,41 +3708,41 @@ void ObjectMgr::LoadQuests()
             if (ClassByQuestSort(-int32(qinfo->ZoneOrSort)))
             {
                 // SkillOrClass should not have class case when class case already set in ZoneOrSort.
-                if (qinfo->SkillOrClass < 0)
+                if (qinfo->SkillOrClassMask < 0)
                 {
-                    sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (class sort case) and `SkillOrClass` = %i (class case), redundant.",
-                        qinfo->GetQuestId(),qinfo->ZoneOrSort,qinfo->SkillOrClass);
+                    sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (class sort case) and `SkillOrClassMask` = %i (class case), redundant.",
+                        qinfo->GetQuestId(),qinfo->ZoneOrSort,qinfo->SkillOrClassMask);
                 }
             }
             //check for proper SkillOrClass value (skill case)
             if (int32 skill_id =  SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
             {
                 // skill is positive value in SkillOrClass
-                if (qinfo->SkillOrClass != skill_id )
+                if (qinfo->SkillOrClassMask != skill_id )
                 {
-                    sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (skill sort case) but `SkillOrClass` does not have a corresponding value (%i).",
+                    sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (skill sort case) but `SkillOrClassMask` does not have a corresponding value (%i).",
                         qinfo->GetQuestId(),qinfo->ZoneOrSort,skill_id);
                     //override, and force proper value here?
                 }
             }
         }
 
-        // SkillOrClass (class case)
-        if (qinfo->SkillOrClass < 0)
+        // SkillOrClassMask (class case)
+        if (qinfo->SkillOrClassMask < 0)
         {
-            if (!sChrClassesStore.LookupEntry(-int32(qinfo->SkillOrClass)))
+            if (!(-int32(qinfo->SkillOrClassMask) & CLASSMASK_ALL_PLAYABLE))
             {
-                sLog.outErrorDb("Quest %u has `SkillOrClass` = %i (class case) but class (%i) does not exist",
-                    qinfo->GetQuestId(),qinfo->SkillOrClass,-qinfo->SkillOrClass);
+                sLog.outErrorDb("Quest %u has `SkillOrClassMask` = %i (class case) but classmask does not have valid class",
+                    qinfo->GetQuestId(),qinfo->SkillOrClassMask);
             }
         }
-        // SkillOrClass (skill case)
-        if (qinfo->SkillOrClass > 0)
+        // SkillOrClassMask (skill case)
+        if (qinfo->SkillOrClassMask > 0)
         {
-            if (!sSkillLineStore.LookupEntry(qinfo->SkillOrClass))
+            if (!sSkillLineStore.LookupEntry(qinfo->SkillOrClassMask))
             {
                 sLog.outErrorDb("Quest %u has `SkillOrClass` = %u (skill case) but skill (%i) does not exist",
-                    qinfo->GetQuestId(),qinfo->SkillOrClass,qinfo->SkillOrClass);
+                    qinfo->GetQuestId(),qinfo->SkillOrClassMask,qinfo->SkillOrClassMask);
             }
         }
 
@@ -3755,10 +3755,10 @@ void ObjectMgr::LoadQuests()
                 // no changes, quest can't be done for this requirement
             }
 
-            if (qinfo->SkillOrClass <= 0)
+            if (qinfo->SkillOrClassMask <= 0)
             {
                 sLog.outErrorDb("Quest %u has `RequiredSkillValue` = %u but `SkillOrClass` = %i (class case), value ignored.",
-                    qinfo->GetQuestId(),qinfo->RequiredSkillValue,qinfo->SkillOrClass);
+                    qinfo->GetQuestId(),qinfo->RequiredSkillValue,qinfo->SkillOrClassMask);
                 // no changes, quest can't be done for this requirement (fail at wrong skill id)
             }
         }
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index dbb71d9..2692afd 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -13773,11 +13773,11 @@ void Player::FailQuest(uint32 questId)
 
 bool Player::SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ) const
 {
-    int32 zoneOrSort   = qInfo->GetZoneOrSort();
-    int32 skillOrClass = qInfo->GetSkillOrClass();
+    int32 zoneOrSort       = qInfo->GetZoneOrSort();
+    int32 skillOrClassMask = qInfo->GetSkillOrClassMask();
 
     // skip zone zoneOrSort and 0 case skillOrClass
-    if (zoneOrSort >= 0 && skillOrClass == 0)
+    if (zoneOrSort >= 0 && skillOrClassMask == 0)
         return true;
 
     int32 questSort = -zoneOrSort;
@@ -13792,10 +13792,10 @@ bool Player::SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ) const
     }
 
     // check class
-    if( skillOrClass < 0 )
+    if (skillOrClassMask < 0)
     {
-        uint8 reqClass = -int32(skillOrClass);
-        if(getClass() != reqClass)
+        uint32 reqClassMask = -int32(skillOrClassMask);
+        if (!(reqClassMask & getClassMask()))
         {
             if( msg )
                 SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ );
@@ -13803,9 +13803,9 @@ bool Player::SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ) const
         }
     }
     // check skill
-    else if( skillOrClass > 0 )
+    else if (skillOrClassMask > 0)
     {
-        uint32 reqSkill = skillOrClass;
+        uint32 reqSkill = skillOrClassMask;
         if( GetSkillValue( reqSkill ) < qInfo->GetRequiredSkillValue() )
         {
             if( msg )
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index e2d86ca..613b47b 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -25,7 +25,7 @@ Quest::Quest(Field * questRecord)
     QuestId = questRecord[0].GetUInt32();
     QuestMethod = questRecord[1].GetUInt32();
     ZoneOrSort = questRecord[2].GetInt32();
-    SkillOrClass = questRecord[3].GetInt32();
+    SkillOrClassMask = questRecord[3].GetInt32();
     MinLevel = questRecord[4].GetUInt32();
     QuestLevel = questRecord[5].GetInt32();
     Type = questRecord[6].GetUInt32();
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index 6e62e37..d7e8e6e 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -202,7 +202,7 @@ class Quest
         uint32 GetQuestId() const { return QuestId; }
         uint32 GetQuestMethod() const { return QuestMethod; }
         int32  GetZoneOrSort() const { return ZoneOrSort; }
-        int32  GetSkillOrClass() const { return SkillOrClass; }
+        int32  GetSkillOrClassMask() const { return SkillOrClassMask; }
         uint32 GetMinLevel() const { return MinLevel; }
         int32  GetQuestLevel() const { return QuestLevel; }
         uint32 GetType() const { return Type; }
@@ -303,7 +303,7 @@ class Quest
         uint32 QuestId;
         uint32 QuestMethod;
         int32  ZoneOrSort;
-        int32  SkillOrClass;
+        int32  SkillOrClassMask;
         uint32 MinLevel;
         int32  QuestLevel;
         uint32 Type;
sql:
Код:
ALTER TABLE `quest_template` CHANGE COLUMN `SkillOrClass` `SkillOrClassMask` mediumint(8) NOT NULL DEFAULT '0';
UPDATE `quest_template` SET `SkillOrClassMask`=-(1<<(-`SkillOrClassMask`-1)) WHERE `SkillOrClassMask`<0;

Вот пример исправления для базы ytdb.
Код:
-- priest shaman druid (24595 ali)
UPDATE `quest_template` SET `SkillOrClassMask`=-1104 WHERE `entry` IN (24595,24598);
-- other (24553 ali)
UPDATE `quest_template` SET `SkillOrClassMask`=-431 WHERE `entry` IN (24564,24553);
Burned вне форума   Ответить с цитированием
Старый 05.10.2010, 11:06   #2
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Где-то я подобное уже видел:
http://ru-mangos.ru/showthread.php?t=1550
virusav вне форума   Ответить с цитированием
Старый 05.10.2010, 12:35   #3
timmit
YTDB Dev
 
Регистрация: 01.02.2010
Сообщений: 115
Сказал(а) спасибо: 0
Поблагодарили 36 раз(а) в 25 сообщениях
timmit На верном пути
По умолчанию

Я не сравнивал, а тут намного отличается от твоего virusav?
timmit вне форума   Ответить с цитированием
Старый 05.10.2010, 12:44   #4
Burned
Новичок
 
Аватар для Burned
 
Регистрация: 07.03.2010
Адрес: Украина
Сообщений: 26
Сказал(а) спасибо: 28
Поблагодарили 26 раз(а) в 8 сообщениях
Burned На верном пути
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Где-то я подобное уже видел:
http://ru-mangos.ru/showthread.php?t=1550
Извиняюсь, наверное можно в отвергнутые.

Ну и почему за 4 месяца так никто его и не рассмотрел?
Burned вне форума   Ответить с цитированием
Старый 05.10.2010, 13:24   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Цитата:
Сообщение от timmit Посмотреть сообщение
Я не сравнивал, а тут намного отличается от твоего virusav?
хз, я на работе, не смотрел.

Цитата:
Сообщение от Burned Посмотреть сообщение
Ну и почему за 4 месяца так никто его и не рассмотрел?
Возможно, потому, что оригинальный патч взят с тринити.
virusav вне форума   Ответить с цитированием
Ответ

Метки
квест


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условия завершения квестов deadangel Баг-репорты 4 30.09.2010 16:47
[patch]Маски классов для квестов virusav Отвергнутые патчи 5 19.08.2010 22:26
Отображение сгруппированных квестов timmit Баг-репорты 7 30.05.2010 12:59
Предложение квестов группе frenk Баг-репорты 6 08.03.2010 21:41


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


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