aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorfunjoker <torti-esser@web.de>2017-03-20 08:54:29 +0100
committerShauren <shauren.trinity@gmail.com>2017-03-20 08:54:29 +0100
commit945cfce1f63f2d629d32da8be2e696900e81d835 (patch)
tree5689e690facc26cfb0af9301a6ce683f2e9b6129 /src/server/game/Entities/Player
parentd4176eb2f1a1860ee0691111d62cb8b231ac2fff (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.cpp92
-rw-r--r--src/server/game/Entities/Player/Player.h1
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;