diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 66 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 6 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 4 |
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]; |