aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp66
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Quests/QuestDef.h4
3 files changed, 62 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 6b554595583..1f14c70b9db 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14202,7 +14202,7 @@ bool Player::CanCompleteRepeatableQuest(Quest const *pQuest)
bool Player::CanRewardQuest(Quest const *pQuest, bool msg)
{
// not auto complete quest and not completed quest (only cheating case, then ignore without message)
- if (!pQuest->IsAutoComplete() && !(pQuest->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && GetQuestStatus(pQuest->GetQuestId()) != QUEST_STATUS_COMPLETE)
+ if (!pQuest->IsDFQuest() && !pQuest->IsAutoComplete() && !(pQuest->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && GetQuestStatus(pQuest->GetQuestId()) != QUEST_STATUS_COMPLETE)
return false;
// daily quest can't be rewarded (25 daily quest already completed)
@@ -14502,11 +14502,14 @@ void Player::RewardQuest(Quest const *pQuest, uint32 reward, Object* questGiver,
CharacterDatabase.CommitTransaction(trans);
}
- if (pQuest->IsDaily())
+ if (pQuest->IsDaily() || pQuest->IsDFQuest())
{
SetDailyQuestStatus(quest_id);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id);
+ if (pQuest->IsDaily())
+ {
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id);
+ }
} else if (pQuest->IsWeekly())
SetWeeklyQuestStatus(quest_id);
@@ -14948,9 +14951,17 @@ bool Player::SatisfyQuestPrevChain(Quest const* qInfo, bool msg)
bool Player::SatisfyQuestDay(Quest const* qInfo, bool msg)
{
- if (!qInfo->IsDaily())
+ if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
return true;
+ if (qInfo->IsDFQuest())
+ {
+ if (!m_DFQuests.empty())
+ return false;
+
+ return true
+ }
+
bool have_slot = false;
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
{
@@ -17219,6 +17230,8 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result)
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx,0);
+ m_DFQuests.clear();
+
//QueryResult *result = CharacterDatabase.PQuery("SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GetGUIDLow());
if (result)
@@ -17227,6 +17240,16 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result)
do
{
+ if (Quest const* qQuest = sObjectMgr.GetQuestTemplate(result->GetUInt32(0)))
+ {
+ if (qQuest->IsDFQuest())
+ {
+ m_DFQuests.insert(qQuest->GetQuestId());
+ m_lastDailyQuestTime = (time_t)result->GetUInt64(1);
+ continue;
+ }
+ }
+
if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
{
sLog.outError("Player (GUID: %u) have more 25 daily quest records in `charcter_queststatus_daily`",GetGUIDLow());
@@ -18187,6 +18210,15 @@ void Player::_SaveDailyQuestStatus(SQLTransaction& trans)
if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx))
trans->PAppend("INSERT INTO character_queststatus_daily (guid,quest,time) VALUES ('%u', '%u','" UI64FMTD "')",
GetGUIDLow(), GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx),uint64(m_lastDailyQuestTime));
+
+ if (!m_DFQuests.empty())
+ {
+ for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
+ {
+ trans->PAppend("INSERT INTO character_queststatus_daily (guid,quest,time) VALUES ('%u', '%u','" UI64FMTD "')",
+ GetGUIDLow(),(*itr),uint64(m_lastDailyQuestTime));
+ }
+ }
}
void Player::_SaveWeeklyQuestStatus(SQLTransaction& trans)
@@ -21376,14 +21408,26 @@ void Player::SendAurasForTarget(Unit *target)
void Player::SetDailyQuestStatus(uint32 quest_id)
{
- for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
+ if (Quest const* qQuest = sObjectMgr.GetQuestTemplate(quest_id))
{
- if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx))
+ if (!qQuest->IsDFQuest())
{
- SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx,quest_id);
- m_lastDailyQuestTime = time(NULL); // last daily quest time
+ for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
+ {
+ if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx))
+ {
+ SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx,quest_id);
+ m_lastDailyQuestTime = time(NULL); // last daily quest time
+ m_DailyQuestChanged = true;
+ break;
+ }
+ }
+
+ } else
+ {
+ m_DFQuests.insert(quest_id);
+ m_lastDailyQuestTime = time(NULL);
m_DailyQuestChanged = true;
- break;
}
}
}
@@ -21400,6 +21444,8 @@ void Player::ResetDailyQuestStatus()
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx,0);
+ m_DFQuests.clear(); // Dungeon Finder Quests.
+
// DB data deleted in caller
m_DailyQuestChanged = false;
m_lastDailyQuestTime = 0;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index c3f504ca9c5..64380445d8c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2255,10 +2255,7 @@ class Player : public Unit, public GridObject<Player>
void RemoveAtLoginFlag(AtLoginFlags f, bool in_db_also = false);
// Dungeon Finder
-// bool isLfgDungeonDone(const uint32 entry) { return m_LookingForGroup.donerandomDungeons.find(entry) != m_LookingForGroup.donerandomDungeons.end(); }
LfgDungeonSet *GetLfgDungeons() { return &m_LookingForGroup.applyDungeons; }
-// LfgDungeonSet *GetLfgDungeonsDone() { return &m_LookingForGroup.donerandomDungeons; }
-// void SetLfgDungeonDone(const uint32 entry) { m_LookingForGroup.donerandomDungeons.insert(entry); }
std::string GetLfgComment() { return m_LookingForGroup.comment; }
void SetLfgComment(std::string _comment) { m_LookingForGroup.comment = _comment; }
uint8 GetLfgRoles() { return m_LookingForGroup.roles; }
@@ -2269,6 +2266,9 @@ class Player : public Unit, public GridObject<Player>
void SetLfgState(LfgState state) { m_LookingForGroup.state = state; }
bool isUsingLfg() { return GetLfgState() != LFG_STATE_NONE; }
+ typedef std::set<uint32> DFQuestsDoneList;
+ DFQuestsDoneList m_DFQuests;
+
// Temporarily removed pet cache
uint32 GetTemporaryUnsummonedPetNumber() const { return m_temporaryUnsummonedPetNumber; }
void SetTemporaryUnsummonedPetNumber(uint32 petnumber) { m_temporaryUnsummonedPetNumber = petnumber; }
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 85382aade77..00b40f13356 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -149,8 +149,9 @@ enum __QuestFlags
QUEST_TRINITY_FLAGS_REPEATABLE = 0x00100000, // Set by 1 in SpecialFlags from DB
QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT = 0x00200000, // Set by 2 in SpecialFlags from DB (if reequired area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script)
QUEST_TRINITY_FLAGS_AUTO_ACCEPT = 0x00400000, // Set by 4 in SpecialFlags in DB if the quest is to be auto-accepted.
+ QUEST_TRINITY_FLAGS_DF_QUEST = 0x00800000, // Set by 8 in SpecialFlags in DB if the quest is used by Dungeon Finder.
- QUEST_TRINITY_FLAGS_DB_ALLOWED = 0xFFFFF | QUEST_TRINITY_FLAGS_REPEATABLE | QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT | QUEST_TRINITY_FLAGS_AUTO_ACCEPT,
+ QUEST_TRINITY_FLAGS_DB_ALLOWED = 0xFFFFF | QUEST_TRINITY_FLAGS_REPEATABLE | QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT | QUEST_TRINITY_FLAGS_AUTO_ACCEPT | QUEST_TRINITY_FLAGS_DF_QUEST,
// Trinity flags for internal use only
QUEST_TRINITY_FLAGS_DELIVER = 0x04000000, // Internal flag computed only
@@ -251,6 +252,7 @@ class Quest
bool IsAutoAccept() const { return QuestFlags & QUEST_FLAGS_AUTO_ACCEPT; }
bool IsRaidQuest() const { return Type == QUEST_TYPE_RAID || Type == QUEST_TYPE_RAID_10 || Type == QUEST_TYPE_RAID_25; }
bool IsAllowedInRaid() const;
+ bool IsDFQuest() const { return QuestFlags & QUEST_TRINITY_FLAGS_DF_QUEST; }
// multiple values
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];