Index: src/game/NPCHandler.cpp =================================================================== --- src/game/NPCHandler.cpp (revision 4524) +++ src/game/NPCHandler.cpp (working copy) @@ -254,6 +254,7 @@ if(!Script->GossipHello( _player, unit )) { + _player->TalkedToCreature(unit->GetEntry(),unit->GetGUID()); unit->prepareGossipMenu(_player,0); unit->sendPreparedGossip( _player ); } Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 4524) +++ src/game/Player.cpp (working copy) @@ -10508,7 +10508,7 @@ } } - if ( qInfo->HasSpecialFlag( QUEST_SPECIAL_FLAGS_KILL_OR_CAST ) ) + if ( qInfo->HasSpecialFlag( QUEST_SPECIAL_FLAGS_KILL_OR_CAST + QUEST_SPECIAL_FLAGS_SPEAKTO ) ) { for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++) { @@ -10671,7 +10671,7 @@ questStatusData.m_itemcount[i] = 0; } - if ( pQuest->HasSpecialFlag( QUEST_SPECIAL_FLAGS_KILL_OR_CAST ) ) + if ( pQuest->HasSpecialFlag( QUEST_SPECIAL_FLAGS_KILL_OR_CAST + QUEST_SPECIAL_FLAGS_SPEAKTO ) ) { for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++) questStatusData.m_creatureOrGOcount[i] = 0; @@ -11578,7 +11578,56 @@ } } } +void Player::TalkedToCreature( uint32 entry, uint64 guid ) +{ + uint32 questid; + uint32 reqTalkCount; + uint32 curTalkCount; + uint32 addTalkCount = 1; + for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ ) + { + questid = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + 3*i); + if(!questid) + continue; + + Quest * qInfo = objmgr.mQuestTemplates[questid]; + if ( qInfo && mQuestStatus[questid].m_status == QUEST_STATUS_INCOMPLETE ) + { + if( qInfo->HasSpecialFlag( QUEST_SPECIAL_FLAGS_SPEAKTO ) ) + { + for (int j = 0; j < QUEST_OBJECTIVES_COUNT; j++) + { + if(qInfo->ReqSpell[j] > 0 || qInfo->ReqCreatureOrGOId[j] < 0)// skip spell casts and Gameobject objectives + continue; + + if(qInfo->ReqCreatureOrGOId[j] == entry ) + { + reqTalkCount = qInfo->ReqCreatureOrGOCount[j]; + curTalkCount = mQuestStatus[questid].m_creatureOrGOcount[j]; + if ( curTalkCount < reqTalkCount ) + { + mQuestStatus[questid].m_creatureOrGOcount[j] = curTalkCount + addTalkCount; + if (mQuestStatus[questid].uState != QUEST_NEW) mQuestStatus[questid].uState = QUEST_CHANGED; + + SendQuestUpdateAddCreature( questid, guid, j, curTalkCount, addTalkCount); + } + if ( CanCompleteQuest( questid ) ) + CompleteQuest( questid ); + return; + } + } + } + } + } +} void Player::MoneyChanged( uint32 count ) { uint32 questid; Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 4524) +++ src/game/Player.h (working copy) @@ -1005,6 +1005,7 @@ void ItemRemovedQuestCheck( uint32 entry, uint32 count ); void KilledMonster( uint32 entry, uint64 guid ); void CastedCreatureOrGO( uint32 entry, uint64 guid, uint32 spell_id ); + void TalkedToCreature( uint32 entry, uint64 guid ); void MoneyChanged( uint32 value ); bool HasQuestForItem( uint32 itemid ); bool CanShareQuest(uint32 quest_id);