[8355] Implement QUEST_STATUS_FAILED and simplify related code.

Use FailQuest for all quests that can fail and remove no longer needed function FailedTimedQuest.

Signed-off-by: NoFantasy <nofantasy@nf.no>
This commit is contained in:
NoFantasy 2009-08-12 13:07:26 +02:00
parent 74a9624cc3
commit 88cf55928c
4 changed files with 36 additions and 42 deletions

View file

@ -1093,8 +1093,8 @@ void Player::Update( uint32 p_time )
if( q_status.m_timer <= p_time ) if( q_status.m_timer <= p_time )
{ {
uint32 quest_id = *iter; uint32 quest_id = *iter;
++iter; // current iter will be removed in FailTimedQuest ++iter; // current iter will be removed in FailQuest
FailTimedQuest( quest_id ); FailQuest(quest_id);
} }
else else
{ {
@ -12790,41 +12790,30 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
SetCanDelayTeleport(false); SetCanDelayTeleport(false);
} }
void Player::FailQuest( uint32 quest_id ) void Player::FailQuest(uint32 questId)
{ {
if( quest_id ) if (Quest const* pQuest = objmgr.GetQuestTemplate(questId))
{ {
IncompleteQuest( quest_id ); SetQuestStatus(questId, QUEST_STATUS_FAILED);
uint16 log_slot = FindQuestSlot( quest_id ); uint16 log_slot = FindQuestSlot(questId);
if( log_slot < MAX_QUEST_LOG_SIZE)
if (log_slot < MAX_QUEST_LOG_SIZE)
{ {
SetQuestSlotTimer(log_slot, 1 ); SetQuestSlotTimer(log_slot, 1);
SetQuestSlotState(log_slot,QUEST_STATE_FAIL); SetQuestSlotState(log_slot, QUEST_STATE_FAIL);
} }
SendQuestFailed( quest_id );
}
}
void Player::FailTimedQuest( uint32 quest_id ) if (pQuest->HasFlag(QUEST_MANGOS_FLAGS_TIMED))
{
if( quest_id )
{
QuestStatusData& q_status = mQuestStatus[quest_id];
q_status.m_timer = 0;
if (q_status.uState != QUEST_NEW)
q_status.uState = QUEST_CHANGED;
IncompleteQuest( quest_id );
uint16 log_slot = FindQuestSlot( quest_id );
if( log_slot < MAX_QUEST_LOG_SIZE)
{ {
SetQuestSlotTimer(log_slot, 1 ); QuestStatusData& q_status = mQuestStatus[questId];
SetQuestSlotState(log_slot,QUEST_STATE_FAIL);
q_status.m_timer = 0;
SendQuestTimerFailed(questId);
} }
SendQuestTimerFailed( quest_id ); else
SendQuestFailed(questId);
} }
} }
@ -13273,21 +13262,22 @@ bool Player::CanShareQuest(uint32 quest_id) const
return false; return false;
} }
void Player::SetQuestStatus( uint32 quest_id, QuestStatus status ) void Player::SetQuestStatus(uint32 quest_id, QuestStatus status)
{ {
Quest const* qInfo = objmgr.GetQuestTemplate(quest_id); if (Quest const* qInfo = objmgr.GetQuestTemplate(quest_id))
if( qInfo )
{ {
if( status == QUEST_STATUS_NONE || status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE ) if (status == QUEST_STATUS_NONE || status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_FAILED)
{ {
if( qInfo->HasFlag( QUEST_MANGOS_FLAGS_TIMED ) ) if (qInfo->HasFlag(QUEST_MANGOS_FLAGS_TIMED))
m_timedquests.erase(qInfo->GetQuestId()); m_timedquests.erase(qInfo->GetQuestId());
} }
QuestStatusData& q_status = mQuestStatus[quest_id]; QuestStatusData& q_status = mQuestStatus[quest_id];
q_status.m_status = status; q_status.m_status = status;
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
if (q_status.uState != QUEST_NEW)
q_status.uState = QUEST_CHANGED;
} }
UpdateForQuestWorldObjects(); UpdateForQuestWorldObjects();
@ -15128,16 +15118,20 @@ void Player::_LoadQuestStatus(QueryResult *result)
questStatusData.uState = QUEST_UNCHANGED; questStatusData.uState = QUEST_UNCHANGED;
// add to quest log // add to quest log
if( slot < MAX_QUEST_LOG_SIZE && if (slot < MAX_QUEST_LOG_SIZE &&
( questStatusData.m_status == QUEST_STATUS_INCOMPLETE || ((questStatusData.m_status == QUEST_STATUS_INCOMPLETE ||
questStatusData.m_status == QUEST_STATUS_COMPLETE && questStatusData.m_status == QUEST_STATUS_COMPLETE ||
(!questStatusData.m_rewarded || pQuest->IsDaily()) ) ) questStatusData.m_status == QUEST_STATUS_FAILED) &&
(!questStatusData.m_rewarded || pQuest->IsDaily())))
{ {
SetQuestSlot(slot, quest_id, quest_time); SetQuestSlot(slot, quest_id, quest_time);
if(questStatusData.m_status == QUEST_STATUS_COMPLETE) if (questStatusData.m_status == QUEST_STATUS_COMPLETE)
SetQuestSlotState(slot, QUEST_STATE_COMPLETE); SetQuestSlotState(slot, QUEST_STATE_COMPLETE);
if (questStatusData.m_status == QUEST_STATUS_FAILED)
SetQuestSlotState(slot, QUEST_STATE_FAIL);
for(uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx) for(uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
if(questStatusData.m_creatureOrGOcount[idx]) if(questStatusData.m_creatureOrGOcount[idx])
SetQuestSlotCounter(slot, idx, questStatusData.m_creatureOrGOcount[idx]); SetQuestSlotCounter(slot, idx, questStatusData.m_creatureOrGOcount[idx]);

View file

@ -1280,7 +1280,6 @@ class MANGOS_DLL_SPEC Player : public Unit
void IncompleteQuest( uint32 quest_id ); void IncompleteQuest( uint32 quest_id );
void RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce = true ); void RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce = true );
void FailQuest( uint32 quest_id ); void FailQuest( uint32 quest_id );
void FailTimedQuest( uint32 quest_id );
bool SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ); bool SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg );
bool SatisfyQuestLevel( Quest const* qInfo, bool msg ); bool SatisfyQuestLevel( Quest const* qInfo, bool msg );
bool SatisfyQuestLog( bool msg ); bool SatisfyQuestLog( bool msg );

View file

@ -97,6 +97,7 @@ enum QuestStatus
QUEST_STATUS_UNAVAILABLE = 2, QUEST_STATUS_UNAVAILABLE = 2,
QUEST_STATUS_INCOMPLETE = 3, QUEST_STATUS_INCOMPLETE = 3,
QUEST_STATUS_AVAILABLE = 4, QUEST_STATUS_AVAILABLE = 4,
QUEST_STATUS_FAILED = 5,
MAX_QUEST_STATUS MAX_QUEST_STATUS
}; };

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8354" #define REVISION_NR "8355"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__