aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-05-11 15:47:58 +0200
committerShauren <shauren.trinity@gmail.com>2021-05-11 15:47:58 +0200
commitd9d242bea4e9fd000098d24a5a5c5d11ea4725e4 (patch)
treea89103ff8849f2fd42c438a7338ee64c1bf5d874 /src
parent2ffedf30a9f177ba848bb74c1b41375ac6d734a9 (diff)
Core/Quests: Set quest accept time updatefield
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp63
-rw-r--r--src/server/game/Entities/Player/Player.h8
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);