diff options
| author | n0n4m3 <none@none> | 2009-12-19 18:08:07 +0100 | 
|---|---|---|
| committer | n0n4m3 <none@none> | 2009-12-19 18:08:07 +0100 | 
| commit | e1e11ed43ea62e562eb13326c5b2e207ede2731a (patch) | |
| tree | 09bf86cb7a8538de94ac47d7eb83ca25b33c4321 /src | |
| parent | ef2cbee517417814d2f5fe5afb4148fb8804b4b2 (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.cpp | 27 | ||||
| -rw-r--r-- | src/game/Player.h | 1 | ||||
| -rw-r--r-- | src/game/QuestHandler.cpp | 53 | 
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) | 
