aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Entities/Player/Player.cpp78
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp23
3 files changed, 44 insertions, 61 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bc513badb8e..fe1bba62388 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15093,6 +15093,30 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
uint32 quest_id = quest->GetQuestId();
QuestStatus oldStatus = GetQuestStatus(quest_id);
+ if (quest->IsDaily() || quest->IsDFQuest())
+ {
+ SetDailyQuestStatus(quest_id);
+ if (quest->IsDaily())
+ {
+ StartCriteria(CriteriaStartEvent::CompleteDailyQuest, 0);
+ UpdateCriteria(CriteriaType::CompleteDailyQuest, quest_id);
+ UpdateCriteria(CriteriaType::CompleteAnyDailyQuestPerDay, quest_id);
+ }
+ }
+ else if (quest->IsWeekly())
+ SetWeeklyQuestStatus(quest_id);
+ else if (quest->IsMonthly())
+ SetMonthlyQuestStatus(quest_id);
+ else if (quest->IsSeasonal())
+ SetSeasonalQuestStatus(quest_id);
+
+ RemoveTimedQuest(quest_id);
+ RemoveActiveQuest(quest_id, false);
+ if (quest->CanIncreaseRewardedQuestCounters())
+ SetRewardedQuest(quest_id);
+
+ SetQuestCompletedBit(quest_id, true);
+
for (QuestObjective const& obj : quest->GetObjectives())
{
switch (obj.Type)
@@ -15125,8 +15149,6 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
}
}
- RemoveTimedQuest(quest_id);
-
if (quest->GetRewItemsCount() > 0)
{
for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
@@ -15213,10 +15235,6 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
if (uint32 skill = quest->GetRewardSkillId())
UpdateSkillPro(skill, 1000, quest->GetRewardSkillPoints());
- uint16 log_slot = FindQuestSlot(quest_id);
- if (log_slot < MAX_QUEST_LOG_SIZE)
- SetQuestSlot(log_slot, 0);
-
uint32 XP = GetQuestXPReward(quest);
int32 moneyRew = 0;
@@ -15260,27 +15278,6 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
CharacterDatabase.CommitTransaction(trans);
}
- if (quest->IsDaily() || quest->IsDFQuest())
- {
- SetDailyQuestStatus(quest_id);
- if (quest->IsDaily())
- {
- StartCriteria(CriteriaStartEvent::CompleteDailyQuest, 0);
- UpdateCriteria(CriteriaType::CompleteDailyQuest, quest_id);
- UpdateCriteria(CriteriaType::CompleteAnyDailyQuestPerDay, quest_id);
- }
- }
- else if (quest->IsWeekly())
- SetWeeklyQuestStatus(quest_id);
- else if (quest->IsMonthly())
- SetMonthlyQuestStatus(quest_id);
- else if (quest->IsSeasonal())
- SetSeasonalQuestStatus(quest_id);
-
- RemoveActiveQuest(quest_id, false);
- if (quest->CanIncreaseRewardedQuestCounters())
- SetRewardedQuest(quest_id);
-
SendQuestReward(quest, questGiver ? questGiver->ToCreature() : nullptr, XP, !announce);
RewardReputation(quest);
@@ -15320,8 +15317,6 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
// make full db save
SaveToDB(false);
- SetQuestCompletedBit(quest_id, true);
-
if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
{
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
@@ -16037,6 +16032,8 @@ void Player::RemoveActiveQuest(uint32 questId, bool update /*= true*/)
QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
if (itr != m_QuestStatus.end())
{
+ SetQuestSlot(itr->second.Slot, 0);
+
for (auto objectiveItr = m_questObjectiveStatus.begin(); objectiveItr != m_questObjectiveStatus.end(); )
{
if (objectiveItr->second.QuestStatusItr == itr)
@@ -16295,11 +16292,13 @@ void Player::SkipQuests(std::vector<uint32> const& questIds)
if (!quest)
return;
- uint16 questSlot = FindQuestSlot(questId);
- QuestStatus oldStatus = GetQuestStatus(questSlot);
+ QuestStatus oldStatus = GetQuestStatus(questId);
- if (questSlot != MAX_QUEST_LOG_SIZE)
+ if (oldStatus != QUEST_STATUS_NONE && oldStatus != QUEST_STATUS_REWARDED)
{
+ RemoveActiveQuest(questId);
+ TakeQuestSourceItem(questId, true); // remove quest src item from player
+ AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements.
if (quest->GetLimitTime())
RemoveTimedQuest(questId);
@@ -16308,11 +16307,6 @@ void Player::SkipQuests(std::vector<uint32> const& questIds)
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
UpdatePvPState();
}
-
- SetQuestSlot(questSlot, 0);
- TakeQuestSourceItem(questId, true); // remove quest src item from player
- AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements.
- RemoveActiveQuest(questId);
}
SetRewardedQuest(questId);
@@ -19606,10 +19600,6 @@ void Player::_LoadQuestStatus(PreparedQueryResult result)
}
while (result->NextRow());
}
-
- // clear quest log tail
- for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
- SetQuestSlot(i, 0);
}
void Player::_LoadQuestStatusObjectives(PreparedQueryResult result)
@@ -25474,9 +25464,8 @@ void Player::DailyReset()
if (!quest || !quest->IsDaily() || !quest->HasFlagEx(QUEST_FLAGS_EX_REMOVE_ON_PERIODIC_RESET))
continue;
- SetQuestSlot(slot, 0);
- AbandonQuest(questId);
RemoveActiveQuest(questId);
+ AbandonQuest(questId);
DespawnPersonalSummonsForQuest(questId);
if (quest->GetLimitTime())
@@ -25513,9 +25502,8 @@ void Player::ResetWeeklyQuestStatus()
if (!quest || !quest->IsWeekly() || !quest->HasFlagEx(QUEST_FLAGS_EX_REMOVE_ON_PERIODIC_RESET))
continue;
- SetQuestSlot(slot, 0);
- AbandonQuest(questId);
RemoveActiveQuest(questId);
+ AbandonQuest(questId);
DespawnPersonalSummonsForQuest(questId);
if (quest->GetLimitTime())
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 085ec2e1ff9..7c212046640 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -416,6 +416,8 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove
Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
QuestStatus oldStatus = _player->GetQuestStatus(questId);
+ _player->RemoveActiveQuest(questId);
+
if (quest)
{
if (quest->HasFlagEx(QUEST_FLAGS_EX_NO_ABANDON_ONCE_BEGUN))
@@ -434,10 +436,8 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove
}
_player->SendForceSpawnTrackingUpdate(questId);
- _player->SetQuestSlot(packet.Entry, 0);
_player->TakeQuestSourceItem(questId, true); // remove quest src item from player
_player->AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements.
- _player->RemoveActiveQuest(questId);
_player->DespawnPersonalSummonsForQuest(questId);
TC_LOG_INFO("network", "Player {} abandoned quest {}", _player->GetGUID().ToString(), questId);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 10e2d052c69..ef3394e367e 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4068,26 +4068,21 @@ void Spell::EffectQuestClear()
if (oldStatus == QUEST_STATUS_NONE)
return;
+ player->RemoveActiveQuest(quest_id, false);
+
// remove all quest entries for 'entry' from quest log
- for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
+ if (oldStatus != QUEST_STATUS_REWARDED)
{
- uint32 logQuest = player->GetQuestSlotQuestId(slot);
- if (logQuest == quest_id)
- {
- player->SetQuestSlot(slot, 0);
-
- // we ignore unequippable quest items in this case, it's still be equipped
- player->TakeQuestSourceItem(logQuest, false);
+ // we ignore unequippable quest items in this case, it's still be equipped
+ player->TakeQuestSourceItem(quest_id, false);
- if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
- {
- player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest();
- player->UpdatePvPState();
- }
+ if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
+ {
+ player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest();
+ player->UpdatePvPState();
}
}
- player->RemoveActiveQuest(quest_id, false);
player->RemoveRewardedQuest(quest_id);
player->DespawnPersonalSummonsForQuest(quest_id);