Core/Player: Fix an issue with Player::RemoveRewardedQuest not deleting the queststatus_rewarded form database
Needed for SPELL_EFFECT_CLEAR_QUEST
This commit is contained in:
@@ -1635,7 +1635,7 @@ void Player::Update(uint32 p_time)
|
||||
else
|
||||
{
|
||||
q_status.Timer -= p_time;
|
||||
m_QuestStatusSave[*iter] = true;
|
||||
m_QuestStatusSave[*iter] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
@@ -15220,7 +15220,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver)
|
||||
|
||||
SetQuestSlot(log_slot, quest_id, qtime);
|
||||
|
||||
m_QuestStatusSave[quest_id] = true;
|
||||
m_QuestStatusSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, quest_id);
|
||||
|
||||
@@ -15392,7 +15392,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
|
||||
|
||||
RemoveActiveQuest(quest_id, false);
|
||||
m_RewardedQuests.insert(quest_id);
|
||||
m_RewardedQuestsSave[quest_id] = true;
|
||||
m_RewardedQuestsSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
// StoreNewItem, mail reward, etc. save data directly to the database
|
||||
// to prevent exploitable data desynchronisation we save the quest status to the database too
|
||||
@@ -16040,7 +16040,7 @@ void Player::SetQuestStatus(uint32 questId, QuestStatus status, bool update /*=
|
||||
if (sObjectMgr->GetQuestTemplate(questId))
|
||||
{
|
||||
m_QuestStatus[questId].Status = status;
|
||||
m_QuestStatusSave[questId] = true;
|
||||
m_QuestStatusSave[questId] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
}
|
||||
|
||||
if (update)
|
||||
@@ -16053,7 +16053,7 @@ void Player::RemoveActiveQuest(uint32 questId, bool update /*= true*/)
|
||||
if (itr != m_QuestStatus.end())
|
||||
{
|
||||
m_QuestStatus.erase(itr);
|
||||
m_QuestStatusSave[questId] = false;
|
||||
m_QuestStatusSave[questId] = QUEST_DELETE_SAVE_TYPE;
|
||||
}
|
||||
|
||||
if (update)
|
||||
@@ -16066,7 +16066,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/)
|
||||
if (rewItr != m_RewardedQuests.end())
|
||||
{
|
||||
m_RewardedQuests.erase(rewItr);
|
||||
m_RewardedQuestsSave[questId] = false;
|
||||
m_RewardedQuestsSave[questId] = QUEST_FORCE_DELETE_SAVE_TYPE;
|
||||
}
|
||||
|
||||
if (update)
|
||||
@@ -16232,7 +16232,7 @@ void Player::AdjustQuestReqItemCount(Quest const* quest, QuestStatusData& questS
|
||||
uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
|
||||
|
||||
questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
|
||||
m_QuestStatusSave[quest->GetQuestId()] = true;
|
||||
m_QuestStatusSave[quest->GetQuestId()] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16323,7 +16323,7 @@ void Player::AreaExploredOrEventHappens(uint32 questId)
|
||||
if (!q_status.Explored)
|
||||
{
|
||||
q_status.Explored = true;
|
||||
m_QuestStatusSave[questId] = true;
|
||||
m_QuestStatusSave[questId] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
}
|
||||
}
|
||||
if (CanCompleteQuest(questId))
|
||||
@@ -16376,7 +16376,7 @@ void Player::ItemAddedQuestCheck(uint32 entry, uint32 count)
|
||||
if (curitemcount < reqitemcount)
|
||||
{
|
||||
q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
}
|
||||
if (CanCompleteQuest(questid))
|
||||
CompleteQuest(questid);
|
||||
@@ -16420,7 +16420,7 @@ void Player::ItemRemovedQuestCheck(uint32 entry, uint32 count)
|
||||
if (newItemCount != q_status.ItemCount[j])
|
||||
{
|
||||
q_status.ItemCount[j] = newItemCount;
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
IncompleteQuest(questid);
|
||||
}
|
||||
return;
|
||||
@@ -16488,7 +16488,7 @@ void Player::KilledMonsterCredit(uint32 entry, uint64 guid /*= 0*/)
|
||||
{
|
||||
q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
|
||||
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
|
||||
}
|
||||
@@ -16530,7 +16530,7 @@ void Player::KilledPlayerCredit()
|
||||
{
|
||||
q_status.PlayerCount = curkill + addkillcount;
|
||||
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
SendQuestUpdateAddPlayer(qInfo, curkill, addkillcount);
|
||||
}
|
||||
@@ -16582,7 +16582,7 @@ void Player::KillCreditGO(uint32 entry, uint64 guid)
|
||||
{
|
||||
q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
|
||||
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
|
||||
}
|
||||
@@ -16639,7 +16639,7 @@ void Player::TalkedToCreature(uint32 entry, uint64 guid)
|
||||
{
|
||||
q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
|
||||
|
||||
m_QuestStatusSave[questid] = true;
|
||||
m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
|
||||
}
|
||||
@@ -19778,7 +19778,7 @@ void Player::_SaveQuestStatus(SQLTransaction& trans)
|
||||
|
||||
for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
|
||||
{
|
||||
if (saveItr->second)
|
||||
if (saveItr->second == QUEST_DEFAULT_SAVE_TYPE)
|
||||
{
|
||||
statusItr = m_QuestStatus.find(saveItr->first);
|
||||
if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
|
||||
@@ -19815,7 +19815,7 @@ void Player::_SaveQuestStatus(SQLTransaction& trans)
|
||||
|
||||
for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
|
||||
{
|
||||
if (saveItr->second)
|
||||
if (saveItr->second == QUEST_DEFAULT_SAVE_TYPE)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
|
||||
stmt->setUInt32(0, GetGUIDLow());
|
||||
@@ -19823,7 +19823,7 @@ void Player::_SaveQuestStatus(SQLTransaction& trans)
|
||||
trans->Append(stmt);
|
||||
|
||||
}
|
||||
else if (!keepAbandoned)
|
||||
else if (saveItr->second == QUEST_FORCE_DELETE_SAVE_TYPE || !keepAbandoned)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST);
|
||||
stmt->setUInt32(0, GetGUIDLow());
|
||||
|
||||
@@ -524,8 +524,16 @@ enum AtLoginFlags
|
||||
typedef std::map<uint32, QuestStatusData> QuestStatusMap;
|
||||
typedef std::set<uint32> RewardedQuestSet;
|
||||
|
||||
// quest, keep
|
||||
typedef std::map<uint32, bool> QuestStatusSaveMap;
|
||||
enum QuestSaveType
|
||||
{
|
||||
QUEST_DEFAULT_SAVE_TYPE = 0,
|
||||
QUEST_DELETE_SAVE_TYPE,
|
||||
QUEST_FORCE_DELETE_SAVE_TYPE
|
||||
};
|
||||
|
||||
// quest
|
||||
typedef std::map<uint32, QuestSaveType> QuestStatusSaveMap;
|
||||
|
||||
|
||||
enum QuestSlotOffsets
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user