|
Отвергнутые патчи Патчи, отвергнутые от приёма в GIT |
|
Опции темы | Поиск в этой теме | Опции просмотра |
05.10.2010, 10:48 | #1 |
Новичок
Регистрация: 07.03.2010
Адрес: Украина
Сообщений: 26
Сказал(а) спасибо: 28
Поблагодарили 26 раз(а) в 8 сообщениях
|
[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; Код:
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); |
05.10.2010, 11:06 | #2 |
Администратор
|
|
05.10.2010, 12:35 | #3 |
YTDB Dev
Регистрация: 01.02.2010
Сообщений: 115
Сказал(а) спасибо: 0
Поблагодарили 36 раз(а) в 25 сообщениях
|
Я не сравнивал, а тут намного отличается от твоего virusav?
|
05.10.2010, 12:44 | #4 | |
Новичок
Регистрация: 07.03.2010
Адрес: Украина
Сообщений: 26
Сказал(а) спасибо: 28
Поблагодарили 26 раз(а) в 8 сообщениях
|
Цитата:
Ну и почему за 4 месяца так никто его и не рассмотрел? |
|
05.10.2010, 13:24 | #5 |
Администратор
|
|
Метки |
квест |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Условия завершения квестов | 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 |