diff options
| author | funjoker <torti-esser@web.de> | 2017-03-20 08:54:29 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-03-20 08:54:29 +0100 |
| commit | 945cfce1f63f2d629d32da8be2e696900e81d835 (patch) | |
| tree | 5689e690facc26cfb0af9301a6ce683f2e9b6129 /src/server/game/Entities/Player | |
| parent | d4176eb2f1a1860ee0691111d62cb8b231ac2fff (diff) | |
Core/Conditions: Implemented new condition type CONDITION_QUEST_OBJECTIVE_COMPLETE (#18235)
Closes #17863
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 92 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 |
2 files changed, 51 insertions, 42 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bc2d1f0b194..26ed9f8263f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14629,48 +14629,8 @@ bool Player::CanCompleteQuest(uint32 quest_id) { for (QuestObjective const& obj : qInfo->GetObjectives()) { - switch (obj.Type) - { - case QUEST_OBJECTIVE_MONSTER: - case QUEST_OBJECTIVE_ITEM: - case QUEST_OBJECTIVE_GAMEOBJECT: - case QUEST_OBJECTIVE_PLAYERKILLS: - case QUEST_OBJECTIVE_TALKTO: - case QUEST_OBJECTIVE_WINPVPPETBATTLES: - case QUEST_OBJECTIVE_HAVE_CURRENCY: - case QUEST_OBJECTIVE_OBTAIN_CURRENCY: - if (GetQuestObjectiveData(qInfo, obj.StorageIndex) < obj.Amount) - return false; - break; - case QUEST_OBJECTIVE_MIN_REPUTATION: - if (GetReputationMgr().GetReputation(obj.ObjectID) < obj.Amount) - return false; - break; - case QUEST_OBJECTIVE_MAX_REPUTATION: - if (GetReputationMgr().GetReputation(obj.ObjectID) > obj.Amount) - return false; - break; - case QUEST_OBJECTIVE_MONEY: - if (!HasEnoughMoney(uint64(obj.Amount))) - return false; - break; - case QUEST_OBJECTIVE_AREATRIGGER: - if (!GetQuestObjectiveData(qInfo, obj.StorageIndex)) - return false; - break; - case QUEST_OBJECTIVE_LEARNSPELL: - if (!HasSpell(obj.ObjectID)) - return false; - break; - case QUEST_OBJECTIVE_CURRENCY: - if (!HasCurrency(obj.ObjectID, obj.Amount)) - return false; - break; - default: - TC_LOG_ERROR("entities.player.quest", "Player::CanCompleteQuest: Player '%s' (%s) tried to complete a quest (ID: %u) with an unknown objective type %u", - GetName().c_str(), GetGUID().ToString().c_str(), quest_id, obj.Type); - return false; - } + if (!IsQuestObjectiveComplete(qInfo, obj)) + return false; } if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0) @@ -16795,6 +16755,54 @@ int32 Player::GetQuestObjectiveData(Quest const* quest, int8 storageIndex) const return status.ObjectiveData[storageIndex]; } +bool Player::IsQuestObjectiveComplete(Quest const* quest, QuestObjective const& objective) const +{ + switch (objective.Type) + { + case QUEST_OBJECTIVE_MONSTER: + case QUEST_OBJECTIVE_ITEM: + case QUEST_OBJECTIVE_GAMEOBJECT: + case QUEST_OBJECTIVE_PLAYERKILLS: + case QUEST_OBJECTIVE_TALKTO: + case QUEST_OBJECTIVE_WINPVPPETBATTLES: + case QUEST_OBJECTIVE_HAVE_CURRENCY: + case QUEST_OBJECTIVE_OBTAIN_CURRENCY: + if (GetQuestObjectiveData(quest, objective.StorageIndex) < objective.Amount) + return false; + break; + case QUEST_OBJECTIVE_MIN_REPUTATION: + if (GetReputationMgr().GetReputation(objective.ObjectID) < objective.Amount) + return false; + break; + case QUEST_OBJECTIVE_MAX_REPUTATION: + if (GetReputationMgr().GetReputation(objective.ObjectID) > objective.Amount) + return false; + break; + case QUEST_OBJECTIVE_MONEY: + if (!HasEnoughMoney(uint64(objective.Amount))) + return false; + break; + case QUEST_OBJECTIVE_AREATRIGGER: + if (!GetQuestObjectiveData(quest, objective.StorageIndex)) + return false; + break; + case QUEST_OBJECTIVE_LEARNSPELL: + if (!HasSpell(objective.ObjectID)) + return false; + break; + case QUEST_OBJECTIVE_CURRENCY: + if (!HasCurrency(objective.ObjectID, objective.Amount)) + return false; + break; + default: + TC_LOG_ERROR("entities.player.quest", "Player::CanCompleteQuest: Player '%s' (%s) tried to complete a quest (ID: %u) with an unknown objective type %u", + GetName().c_str(), GetGUID().ToString().c_str(), quest->ID, objective.Type); + return false; + } + + return true; +} + void Player::SetQuestObjectiveData(Quest const* quest, int8 storageIndex, int32 data) { if (storageIndex < 0) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index dcfd2674057..d358a9a8ff2 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1618,6 +1618,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool CanShareQuest(uint32 questId) const; int32 GetQuestObjectiveData(Quest const* quest, int8 storageIndex) const; + bool IsQuestObjectiveComplete(Quest const* quest, QuestObjective const& objective) const; void SetQuestObjectiveData(Quest const* quest, int8 storageIndex, int32 data); void SendQuestComplete(Quest const* quest) const; void SendQuestReward(Quest const* quest, uint32 XP) const; |
