diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-05-11 15:47:58 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-05-11 15:47:58 +0200 |
commit | d9d242bea4e9fd000098d24a5a5c5d11ea4725e4 (patch) | |
tree | a89103ff8849f2fd42c438a7338ee64c1bf5d874 /src | |
parent | 2ffedf30a9f177ba848bb74c1b41375ac6d734a9 (diff) |
Core/Quests: Set quest accept time updatefield
Diffstat (limited to 'src')
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 8 |
3 files changed, 46 insertions, 29 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 1a1baa50df6..ec18eda213e 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -95,7 +95,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, difficulty, stackCount, maxDuration, remainTime, remainCharges, castItemId, castItemLevel FROM character_aura WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_AURA_EFFECTS, "SELECT casterGuid, itemGuid, spell, effectMask, effectIndex, amount, baseAmount FROM character_aura_effect WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, acceptTime, endTime FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS_OBJECTIVES, "SELECT quest, objective, data FROM character_queststatus_objectives WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS_OBJECTIVES_CRITERIA, "SELECT questObjectiveId FROM character_queststatus_objectives_criteria WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS_OBJECTIVES_CRITERIA_PROGRESS, "SELECT criteriaId, counter, date FROM character_queststatus_objectives_criteria_progress WHERE guid = ?", CONNECTION_ASYNC); @@ -652,7 +652,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, acceptTime, endTime) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_CHAR_QUESTSTATUS_OBJECTIVES, "REPLACE INTO character_queststatus_objectives (guid, quest, objective, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_OBJECTIVES_BY_QUEST, "DELETE FROM character_queststatus_objectives WHERE guid = ? AND quest = ?", CONNECTION_ASYNC); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5c2e0ebfe10..5887a25aa69 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15336,7 +15336,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) } } - uint32 qtime = 0; + time_t endTime = 0; if (uint32 limittime = quest->GetLimitTime()) { // shared timed quest @@ -15345,7 +15345,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) AddTimedQuest(quest_id); questStatusData.Timer = limittime * IN_MILLISECONDS; - qtime = static_cast<uint32>(GameTime::GetGameTime()) + limittime; + endTime = GameTime::GetGameTime() + limittime; } else questStatusData.Timer = 0; @@ -15367,7 +15367,9 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty)); } - SetQuestSlot(log_slot, quest_id, qtime); + SetQuestSlot(log_slot, quest_id); + SetQuestSlotEndTime(log_slot, endTime); + SetQuestSlotAcceptTime(log_slot, GameTime::GetGameTime()); m_QuestStatusSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE; @@ -15775,10 +15777,7 @@ void Player::FailQuest(uint32 questId) uint16 log_slot = FindQuestSlot(questId); if (log_slot < MAX_QUEST_LOG_SIZE) - { - SetQuestSlotTimer(log_slot, 1); SetQuestSlotState(log_slot, QUEST_STATE_FAIL); - } if (quest->GetLimitTime()) { @@ -16598,11 +16597,16 @@ uint16 Player::GetQuestSlotCounter(uint16 slot, uint8 counter) const return 0; } -uint32 Player::GetQuestSlotTime(uint16 slot) const +uint32 Player::GetQuestSlotEndTime(uint16 slot) const { return m_playerData->QuestLog[slot].EndTime; } +uint32 Player::GetQuestSlotAcceptTime(uint16 slot) const +{ + return m_playerData->QuestLog[slot].AcceptTime; +} + bool Player::GetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) const { if (objectiveIndex < MAX_QUEST_COUNTS) @@ -16632,14 +16636,16 @@ int32 Player::GetQuestSlotObjectiveData(uint16 slot, QuestObjective const& objec return GetQuestSlotObjectiveFlag(slot, objective.StorageIndex) ? 1 : 0; } -void Player::SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer /*= 0*/) +void Player::SetQuestSlot(uint16 slot, uint32 quest_id) { auto questLogField = m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::QuestLog, slot); SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::QuestID), quest_id); SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::StateFlags), 0); + SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::EndTime), 0); + SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::AcceptTime), 0); + SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::ObjectiveFlags), 0); for (uint32 i = 0; i < MAX_QUEST_COUNTS; ++i) SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::ObjectiveProgress, i), 0); - SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::EndTime), timer); } void Player::SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count) @@ -16666,11 +16672,18 @@ void Player::RemoveQuestSlotState(uint16 slot, uint32 state) .ModifyValue(&UF::QuestLog::StateFlags), state); } -void Player::SetQuestSlotTimer(uint16 slot, uint32 timer) +void Player::SetQuestSlotEndTime(uint16 slot, time_t endTime) +{ + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData) + .ModifyValue(&UF::PlayerData::QuestLog, slot) + .ModifyValue(&UF::QuestLog::EndTime), uint32(endTime)); +} + +void Player::SetQuestSlotAcceptTime(uint16 slot, time_t acceptTime) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData) .ModifyValue(&UF::PlayerData::QuestLog, slot) - .ModifyValue(&UF::QuestLog::EndTime), timer); + .ModifyValue(&UF::QuestLog::AcceptTime), uint32(acceptTime)); } void Player::SetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) @@ -19305,8 +19318,8 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) { uint16 slot = 0; - //// 0 1 2 3 - //QueryResult* result = CharacterDatabase.PQuery("SELECT quest, status, explored, timer WHERE guid = '%u' AND status <> 0", GetGUIDLow()); + //// 0 1 2 3 4 + //QueryResult* result = CharacterDatabase.PQuery("SELECT quest, status, explored, acceptTime, endTime WHERE guid = '%u' AND status <> 0", GetGUIDLow()); if (result) { @@ -19334,25 +19347,28 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) questStatusData.Explored = (fields[2].GetUInt8() > 0); - time_t quest_time = fields[2].GetInt64(); + time_t acceptTime = time_t(fields[3].GetInt64()); + time_t endTime = time_t(fields[4].GetInt64()); if (quest->GetLimitTime() && !GetQuestRewardStatus(quest_id)) { AddTimedQuest(quest_id); - if (quest_time <= GameTime::GetGameTime()) + if (endTime <= GameTime::GetGameTime()) questStatusData.Timer = 1; else - questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime()) * IN_MILLISECONDS); + questStatusData.Timer = uint32((endTime - GameTime::GetGameTime()) * IN_MILLISECONDS); } else - quest_time = 0; + endTime = 0; // add to quest log if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE) { questStatusData.Slot = slot; - SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped + SetQuestSlot(slot, quest_id); + SetQuestSlotEndTime(slot, endTime); + SetQuestSlotAcceptTime(slot, acceptTime); if (questStatusData.Status == QUEST_STATUS_COMPLETE) SetQuestSlotState(slot, QUEST_STATE_COMPLETE); @@ -21015,17 +21031,15 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction& trans) if (!isTransaction) trans = CharacterDatabase.BeginTransaction(); - QuestStatusSaveMap::iterator saveItr; - QuestStatusMap::iterator statusItr; CharacterDatabasePreparedStatement* stmt; bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS); - for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr) + for (auto saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr) { if (saveItr->second == QUEST_DEFAULT_SAVE_TYPE) { - statusItr = m_QuestStatus.find(saveItr->first); + auto statusItr = m_QuestStatus.find(saveItr->first); if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE)) { QuestStatusData const& qData = statusItr->second; @@ -21036,7 +21050,8 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction& trans) stmt->setUInt32(1, statusItr->first); stmt->setUInt8(2, uint8(qData.Status)); stmt->setBool(3, qData.Explored); - stmt->setInt64(4, qData.Timer / IN_MILLISECONDS + GameTime::GetGameTime()); + stmt->setInt64(4, GetQuestSlotAcceptTime(qData.Slot)); + stmt->setInt64(5, GetQuestSlotEndTime(qData.Slot)); trans->Append(stmt); // Save objectives @@ -21079,7 +21094,7 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction& trans) m_QuestStatusSave.clear(); - for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr) + for (auto saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr) { if (saveItr->second == QUEST_DEFAULT_SAVE_TYPE) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2f0e03a0193..ad8e9ac1e7a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1513,14 +1513,16 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 GetQuestSlotQuestId(uint16 slot) const; uint32 GetQuestSlotState(uint16 slot) const; uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const; - uint32 GetQuestSlotTime(uint16 slot) const; + uint32 GetQuestSlotEndTime(uint16 slot) const; + uint32 GetQuestSlotAcceptTime(uint16 slot) const; bool GetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) const; int32 GetQuestSlotObjectiveData(uint16 slot, QuestObjective const& objective) const; - void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0); + void SetQuestSlot(uint16 slot, uint32 quest_id); void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count); void SetQuestSlotState(uint16 slot, uint32 state); void RemoveQuestSlotState(uint16 slot, uint32 state); - void SetQuestSlotTimer(uint16 slot, uint32 timer); + void SetQuestSlotEndTime(uint16 slot, time_t endTime); + void SetQuestSlotAcceptTime(uint16 slot, time_t acceptTime); void SetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex); void RemoveQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex); void SetQuestCompletedBit(uint32 questBit, bool completed); |