[7226] Avoid 2 mQuestStatus[quest_id] calls from AddQuest code for speed and possible aliasing problems.

Original patch provided by zhenya.
This commit is contained in:
VladimirMangos 2009-02-03 02:16:23 +03:00
parent a1eaf1af6f
commit 2c7216ac8c
3 changed files with 16 additions and 14 deletions

View file

@ -12533,8 +12533,6 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
// if not exist then created with set uState==NEW and rewarded=false // if not exist then created with set uState==NEW and rewarded=false
QuestStatusData& questStatusData = mQuestStatus[quest_id]; QuestStatusData& questStatusData = mQuestStatus[quest_id];
if (questStatusData.uState != QUEST_NEW)
questStatusData.uState = QUEST_CHANGED;
// check for repeatable quests status reset // check for repeatable quests status reset
questStatusData.m_status = QUEST_STATUS_INCOMPLETE; questStatusData.m_status = QUEST_STATUS_INCOMPLETE;
@ -12542,18 +12540,18 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
if ( pQuest->HasFlag( QUEST_MANGOS_FLAGS_DELIVER ) ) if ( pQuest->HasFlag( QUEST_MANGOS_FLAGS_DELIVER ) )
{ {
for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++) for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
questStatusData.m_itemcount[i] = 0; questStatusData.m_itemcount[i] = 0;
} }
if ( pQuest->HasFlag(QUEST_MANGOS_FLAGS_KILL_OR_CAST | QUEST_MANGOS_FLAGS_SPEAKTO) ) if ( pQuest->HasFlag(QUEST_MANGOS_FLAGS_KILL_OR_CAST | QUEST_MANGOS_FLAGS_SPEAKTO) )
{ {
for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++) for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
questStatusData.m_creatureOrGOcount[i] = 0; questStatusData.m_creatureOrGOcount[i] = 0;
} }
GiveQuestSourceItem( pQuest ); GiveQuestSourceItem( pQuest );
AdjustQuestReqItemCount( pQuest ); AdjustQuestReqItemCount( pQuest, questStatusData );
if( pQuest->GetRepObjectiveFaction() ) if( pQuest->GetRepObjectiveFaction() )
SetFactionVisibleForFactionId(pQuest->GetRepObjectiveFaction()); SetFactionVisibleForFactionId(pQuest->GetRepObjectiveFaction());
@ -12576,6 +12574,9 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
SetQuestSlot(log_slot, quest_id, qtime); SetQuestSlot(log_slot, quest_id, qtime);
if (questStatusData.uState != QUEST_NEW)
questStatusData.uState = QUEST_CHANGED;
//starting initial quest script //starting initial quest script
if(questGiver && pQuest->GetQuestStartScript()!=0) if(questGiver && pQuest->GetQuestStartScript()!=0)
sWorld.ScriptsStart(sQuestStartScripts, pQuest->GetQuestStartScript(), questGiver, this); sWorld.ScriptsStart(sQuestStartScripts, pQuest->GetQuestStartScript(), questGiver, this);
@ -12805,8 +12806,9 @@ void Player::FailTimedQuest( uint32 quest_id )
{ {
QuestStatusData& q_status = mQuestStatus[quest_id]; QuestStatusData& q_status = mQuestStatus[quest_id];
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
q_status.m_timer = 0; q_status.m_timer = 0;
if (q_status.uState != QUEST_NEW)
q_status.uState = QUEST_CHANGED;
IncompleteQuest( quest_id ); IncompleteQuest( quest_id );
@ -13292,18 +13294,18 @@ uint32 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry)
if( !qInfo ) if( !qInfo )
return 0; return 0;
for (int j = 0; j < QUEST_OBJECTIVES_COUNT; j++) for (int j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
if ( qInfo->ReqCreatureOrGOId[j] == entry ) if ( qInfo->ReqCreatureOrGOId[j] == entry )
return mQuestStatus[quest_id].m_creatureOrGOcount[j]; return mQuestStatus[quest_id].m_creatureOrGOcount[j];
return 0; return 0;
} }
void Player::AdjustQuestReqItemCount( Quest const* pQuest ) void Player::AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData )
{ {
if ( pQuest->HasFlag( QUEST_MANGOS_FLAGS_DELIVER ) ) if ( pQuest->HasFlag( QUEST_MANGOS_FLAGS_DELIVER ) )
{ {
for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++) for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
{ {
uint32 reqitemcount = pQuest->ReqItemCount[i]; uint32 reqitemcount = pQuest->ReqItemCount[i];
if( reqitemcount != 0 ) if( reqitemcount != 0 )
@ -13311,9 +13313,8 @@ void Player::AdjustQuestReqItemCount( Quest const* pQuest )
uint32 quest_id = pQuest->GetQuestId(); uint32 quest_id = pQuest->GetQuestId();
uint32 curitemcount = GetItemCount(pQuest->ReqItemId[i],true); uint32 curitemcount = GetItemCount(pQuest->ReqItemId[i],true);
QuestStatusData& q_status = mQuestStatus[quest_id]; questStatusData.m_itemcount[i] = std::min(curitemcount, reqitemcount);
q_status.m_itemcount[i] = std::min(curitemcount, reqitemcount); if (questStatusData.uState != QUEST_NEW) questStatusData.uState = QUEST_CHANGED;
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
} }
} }
} }

View file

@ -1261,7 +1261,6 @@ class MANGOS_DLL_SPEC Player : public Unit
} }
} }
uint32 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry); uint32 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry);
void AdjustQuestReqItemCount( Quest const* pQuest );
void AreaExploredOrEventHappens( uint32 questId ); void AreaExploredOrEventHappens( uint32 questId );
void GroupEventHappens( uint32 questId, WorldObject const* pEventObject ); void GroupEventHappens( uint32 questId, WorldObject const* pEventObject );
void ItemAddedQuestCheck( uint32 entry, uint32 count ); void ItemAddedQuestCheck( uint32 entry, uint32 count );
@ -2393,6 +2392,8 @@ class MANGOS_DLL_SPEC Player : public Unit
uint8 _CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot ) const; uint8 _CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot ) const;
Item* _StoreItem( uint16 pos, Item *pItem, uint32 count, bool clone, bool update ); Item* _StoreItem( uint16 pos, Item *pItem, uint32 count, bool clone, bool update );
void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData );
GridReference<Player> m_gridRef; GridReference<Player> m_gridRef;
MapReference m_mapRef; MapReference m_mapRef;
}; };

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 "7225" #define REVISION_NR "7226"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__