aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2009-12-19 18:08:07 +0100
committern0n4m3 <none@none>2009-12-19 18:08:07 +0100
commite1e11ed43ea62e562eb13326c5b2e207ede2731a (patch)
tree09bf86cb7a8538de94ac47d7eb83ca25b33c4321 /src
parentef2cbee517417814d2f5fe5afb4148fb8804b4b2 (diff)
Add basic support for QUEST_FLAGS_PARTY_ACCEPT (2). by NoFantasy
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Player.cpp27
-rw-r--r--src/game/Player.h1
-rw-r--r--src/game/QuestHandler.cpp53
3 files changed, 80 insertions, 1 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index e607b9a453f..1d5b1860740 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -14507,6 +14507,33 @@ void Player::SendCanTakeQuestResponse( uint32 msg )
sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID");
}
+void Player::SendQuestConfirmAccept(const Quest* pQuest, Player* pReceiver)
+{
+ if (pReceiver)
+ {
+ std::string strTitle = pQuest->GetTitle();
+
+ int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
+
+ if (loc_idx >= 0)
+ {
+ if (const QuestLocale* pLocale = objmgr.GetQuestLocale(pQuest->GetQuestId()))
+ {
+ if (pLocale->Title.size() > loc_idx && !pLocale->Title[loc_idx].empty())
+ strTitle = pLocale->Title[loc_idx];
+ }
+ }
+
+ WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + strTitle.size() + 8));
+ data << uint32(pQuest->GetQuestId());
+ data << strTitle;
+ data << uint64(GetGUID());
+ pReceiver->GetSession()->SendPacket(&data);
+
+ sLog.outDebug("WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
+ }
+}
+
void Player::SendPushToPartyResponse( Player *pPlayer, uint32 msg )
{
if( pPlayer )
diff --git a/src/game/Player.h b/src/game/Player.h
index f216f4e548b..8eddb4b0881 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1338,6 +1338,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void SendQuestFailed( uint32 quest_id );
void SendQuestTimerFailed( uint32 quest_id );
void SendCanTakeQuestResponse( uint32 msg );
+ void SendQuestConfirmAccept(Quest const* pQuest, Player* pReceiver);
void SendPushToPartyResponse( Player *pPlayer, uint32 msg );
void SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count );
void SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, uint32 creatureOrGO_idx, uint32 old_count, uint32 add_count );
diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp
index cc8d3e4a87c..48ec382b6e8 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -158,6 +158,30 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
{
_player->AddQuest( qInfo, pObject );
+ if (qInfo->HasFlag(QUEST_FLAGS_PARTY_ACCEPT))
+ {
+ if (Group* pGroup = _player->GetGroup())
+ {
+ for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* pPlayer = itr->getSource();
+
+ if (!pPlayer || pPlayer == _player) // not self
+ continue;
+
+ if (pPlayer->CanTakeQuest(qInfo, true))
+ {
+ pPlayer->SetDivider(_player->GetGUID());
+
+ //need confirmation that any gossip window will close
+ pPlayer->PlayerTalkClass->CloseGossip();
+
+ _player->SendQuestConfirmAccept(qInfo, pPlayer);
+ }
+ }
+ }
+ }
+
if ( _player->CanCompleteQuest( quest ) )
_player->CompleteQuest( quest );
@@ -375,7 +399,34 @@ void WorldSession::HandleQuestConfirmAccept(WorldPacket& recv_data)
uint32 quest;
recv_data >> quest;
- sLog.outDebug( "WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT quest = %u",quest );
+ sLog.outDebug("WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT quest = %u", quest);
+
+ if (const Quest* pQuest = objmgr.GetQuestTemplate(quest))
+ {
+ if (!pQuest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT))
+ return;
+
+ Player* pOriginalPlayer = ObjectAccessor::FindPlayer(_player->GetDivider());
+
+ if (!pOriginalPlayer)
+ return;
+
+ if (pQuest->GetType() == QUEST_TYPE_RAID)
+ {
+ if (!_player->IsInSameRaidWith(pOriginalPlayer))
+ return;
+ }
+ else
+ {
+ if (!_player->IsInSameGroupWith(pOriginalPlayer))
+ return;
+ }
+
+ if (_player->CanAddQuest(pQuest, true))
+ _player->AddQuest(pQuest, NULL); // NULL, this prevent DB script from duplicate running
+
+ _player->SetDivider(0);
+ }
}
void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)