diff options
| author | Intel <chemicstry@gmail.com> | 2014-12-28 22:55:53 +0200 |
|---|---|---|
| committer | Intel <chemicstry@gmail.com> | 2014-12-28 22:55:53 +0200 |
| commit | a782515246d5583a4c0e5cc8834133d425920b56 (patch) | |
| tree | f181c34ad982c8f63b3772f2ddf0b90a4986740f /src/server/scripts | |
| parent | 0dec23b43ad8692189b511bb114ef3b772678fe3 (diff) | |
Core/Quests: Updated Quest System to new Format
All quest requirements are now in quest_objectives table
quest_template table contains _ONLY_ WDB data and must not be modified
Currently supported objectives are MONSTER, GAMEOBJECT, ITEM, TALKTO, CURRENCY, REPUTATION, MONEY, PLAYERKILLS, AREATRIGGER
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Commands/cs_lookup.cpp | 6 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_quest.cpp | 104 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_borean_tundra.cpp | 2 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_sholazar_basin.cpp | 9 | ||||
| -rw-r--r-- | src/server/scripts/World/go_scripts.cpp | 2 |
5 files changed, 58 insertions, 65 deletions
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index d746b07af75..f92e62f2aa9 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -599,9 +599,9 @@ public: uint8 ulocaleIndex = uint8(localeIndex); if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(qInfo->GetQuestId())) { - if (questLocale->Title.size() > ulocaleIndex && !questLocale->Title[ulocaleIndex].empty()) + if (questLocale->LogTitle.size() > ulocaleIndex && !questLocale->LogTitle[ulocaleIndex].empty()) { - std::string title = questLocale->Title[ulocaleIndex]; + std::string title = questLocale->LogTitle[ulocaleIndex]; if (Utf8FitTo(title, wNamePart)) { @@ -647,7 +647,7 @@ public: } } - std::string title = qInfo->GetTitle(); + std::string title = qInfo->GetLogTitle(); if (title.empty()) continue; diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 91ccd358f93..26806ce6785 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -180,67 +180,61 @@ public: return false; } - // Add quest items for quests that require items - for (uint8 x = 0; x < QUEST_ITEM_OBJECTIVES_COUNT; ++x) + for (uint32 i = 0; i < quest->Objectives.size(); ++i) { - uint32 id = quest->RequiredItemId[x]; - uint32 count = quest->RequiredItemCount[x]; - if (!id || !count) - continue; + QuestObjective const& obj = quest->Objectives[i]; - uint32 curItemCount = player->GetItemCount(id, true); - - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, id, count-curItemCount); - if (msg == EQUIP_ERR_OK) - { - Item* item = player->StoreNewItem(dest, id, true); - player->SendNewItem(item, count-curItemCount, true, false); - } - } - - // All creature/GO slain/cast (not required, but otherwise it will display "Creature slain 0/10") - for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - { - int32 creature = quest->RequiredNpcOrGo[i]; - uint32 creatureCount = quest->RequiredNpcOrGoCount[i]; - - if (creature > 0) + switch (obj.Type) { - if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creature)) - for (uint16 z = 0; z < creatureCount; ++z) - player->KilledMonster(creatureInfo, ObjectGuid::Empty); + case QUEST_OBJECTIVE_ITEM: + { + uint32 curItemCount = player->GetItemCount(obj.ObjectID, true); + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, obj.ObjectID, obj.Amount - curItemCount); + if (msg == EQUIP_ERR_OK) + { + Item* item = player->StoreNewItem(dest, obj.ObjectID, true); + player->SendNewItem(item, obj.Amount - curItemCount, true, false); + } + break; + } + case QUEST_OBJECTIVE_MONSTER: + { + if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(obj.ObjectID)) + for (uint16 z = 0; z < obj.Amount; ++z) + player->KilledMonster(creatureInfo, ObjectGuid::Empty); + break; + } + case QUEST_OBJECTIVE_GAMEOBJECT: + { + for (uint16 z = 0; z < obj.Amount; ++z) + player->KillCreditGO(obj.ObjectID); + break; + } + case QUEST_OBJECTIVE_MIN_REPUTATION: + { + uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); + if (curRep < uint32(obj.Amount)) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) + player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); + break; + } + case QUEST_OBJECTIVE_MAX_REPUTATION: + { + uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); + if (curRep > uint32(obj.Amount)) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) + player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); + break; + } + case QUEST_OBJECTIVE_MONEY: + { + player->ModifyMoney(obj.Amount); + break; + } } - else if (creature < 0) - for (uint16 z = 0; z < creatureCount; ++z) - player->KillCreditGO(creature); } - // If the quest requires reputation to complete - if (uint32 repFaction = quest->GetRepObjectiveFaction()) - { - uint32 repValue = quest->GetRepObjectiveValue(); - uint32 curRep = player->GetReputationMgr().GetReputation(repFaction); - if (curRep < repValue) - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction)) - player->GetReputationMgr().SetReputation(factionEntry, repValue); - } - - // If the quest requires a SECOND reputation to complete - if (uint32 repFaction = quest->GetRepObjectiveFaction2()) - { - uint32 repValue2 = quest->GetRepObjectiveValue2(); - uint32 curRep = player->GetReputationMgr().GetReputation(repFaction); - if (curRep < repValue2) - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction)) - player->GetReputationMgr().SetReputation(factionEntry, repValue2); - } - - // If the quest requires money - int32 ReqOrRewMoney = quest->GetRewOrReqMoney(); - if (ReqOrRewMoney < 0) - player->ModifyMoney(-ReqOrRewMoney); - if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER)) // check if Quest Tracker is enabled { // prepare Quest Tracker datas diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 5585d09b0d6..f1d413c181c 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -2052,7 +2052,7 @@ public: { Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_YOU_RE_NOT_SO_BIG_NOW); if (qInfo) - player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); + player->KilledMonsterCredit(qInfo->Objectives[0].ObjectID); } } }; diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index f4275121101..21468ccce90 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -493,16 +493,15 @@ public: if (!quest) return; - QuestStatusMap::const_iterator itr = player->getQuestStatusMap().find(QUEST_TASTE_TEST); - if (itr->second.Status != QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(QUEST_TASTE_TEST) != QUEST_STATUS_INCOMPLETE) return; - for (uint8 i = 0; i < 3; ++i) + for (uint32 i = 0; i < quest->Objectives.size(); ++i) { - if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry()) + if (uint32(quest->Objectives[i].ObjectID) != me->GetEntry()) continue; - if (itr->second.CreatureOrGOCount[i] != 0) + if (player->GetQuestObjectiveData(quest, i) != 0) continue; player->KilledMonsterCredit(me->GetEntry()); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 800b533d216..625a8fb05bf 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -898,7 +898,7 @@ public: if (qInfo) { /// @todo prisoner should help player for a short period of time - player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); + player->KilledMonsterCredit(qInfo->Objectives[0].ObjectID); pPrisoner->DisappearAndDie(); } return true; |
