diff options
Diffstat (limited to 'src/game/GossipDef.cpp')
| -rw-r--r-- | src/game/GossipDef.cpp | 108 | 
1 files changed, 76 insertions, 32 deletions
diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp index b0f717eea9e..c362b23ff71 100644 --- a/src/game/GossipDef.cpp +++ b/src/game/GossipDef.cpp @@ -1,7 +1,7 @@  /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>   * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -127,7 +127,7 @@ bool PlayerMenu::GossipOptionCoded( unsigned int Selection )  void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )  {      WorldPacket data( SMSG_GOSSIP_MESSAGE, (100) );         // guess size -    data << npcGUID; +    data << uint64(npcGUID);      data << uint32(0);                                      // new 2.4.0      data << uint32( TitleTextId );      data << uint32( mGossipMenu.MenuItemCount() );          // max count 0x0F @@ -153,7 +153,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )          data << uint32(questID);          data << uint32( qItem.m_qIcon ); -        data << uint32( pQuest ? pQuest->GetQuestLevel() : 0 ); +        data << uint32(pSession->GetPlayer()->GetQuestLevel(pQuest));          std::string Title = pQuest->GetTitle();          int loc_idx = pSession->GetSessionDbLocaleIndex(); @@ -181,6 +181,7 @@ void PlayerMenu::CloseGossip()      //sLog.outDebug( "WORLD: Sent SMSG_GOSSIP_COMPLETE" );  } +// Outdated  void PlayerMenu::SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flags, uint32 Data, char const * locName )  {      WorldPacket data( SMSG_GOSSIP_POI, (4+4+4+4+4+10) );    // guess size @@ -194,12 +195,43 @@ void PlayerMenu::SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flag      //sLog.outDebug("WORLD: Sent SMSG_GOSSIP_POI");  } -void PlayerMenu::SendTalking( uint32 textID ) +void PlayerMenu::SendPointOfInterest( uint32 poi_id )  { -    GossipText *pGossip; -    std::string GossipStr; +    PointOfInterest const* poi = objmgr.GetPointOfInterest(poi_id); +    if(!poi) +    { +        sLog.outErrorDb("Requested send not existed POI (Id: %u), ignore.",poi_id); +        return; +    } + +    std::string icon_name = poi->icon_name; + +    int loc_idx = pSession->GetSessionDbLocaleIndex(); +    if (loc_idx >= 0) +    { +        PointOfInterestLocale const *pl = objmgr.GetPointOfInterestLocale(poi_id); +        if (pl) +        { +            if (pl->IconName.size() > size_t(loc_idx) && !pl->IconName[loc_idx].empty()) +                icon_name = pl->IconName[loc_idx]; +        } +    } + +    WorldPacket data( SMSG_GOSSIP_POI, (4+4+4+4+4+10) );    // guess size +    data << uint32(poi->flags); +    data << float(poi->x); +    data << float(poi->y); +    data << uint32(poi->icon); +    data << uint32(poi->data); +    data << icon_name; + +    pSession->SendPacket( &data ); +    //sLog.outDebug("WORLD: Sent SMSG_GOSSIP_POI"); +} -    pGossip = objmgr.GetGossipText(textID); +void PlayerMenu::SendTalking( uint32 textID ) +{ +    GossipText const* pGossip = objmgr.GetGossipText(textID);      WorldPacket data( SMSG_NPC_TEXT_UPDATE, 100 );          // guess size      data << textID;                                         // can be < 0 @@ -259,14 +291,11 @@ void PlayerMenu::SendTalking( uint32 textID )              data << pGossip->Options[i].Language; -            data << pGossip->Options[i].Emotes[0]._Delay; -            data << pGossip->Options[i].Emotes[0]._Emote; - -            data << pGossip->Options[i].Emotes[1]._Delay; -            data << pGossip->Options[i].Emotes[1]._Emote; - -            data << pGossip->Options[i].Emotes[2]._Delay; -            data << pGossip->Options[i].Emotes[2]._Emote; +            for(int j = 0; j < 3; ++j) +            { +                data << pGossip->Options[i].Emotes[j]._Delay; +                data << pGossip->Options[i].Emotes[j]._Emote; +            }          }      }      pSession->SendPacket( &data ); @@ -373,7 +402,7 @@ void PlayerMenu::SendQuestGiverQuestList( QEmote eEmote, const std::string& Titl          data << uint32(questID);          data << uint32(qmi.m_qIcon); -        data << uint32(pQuest ? pQuest->GetQuestLevel() : 0); +        data << uint32(pSession->GetPlayer()->GetQuestLevel(pQuest));          data << title;      }      pSession->SendPacket( &data ); @@ -417,10 +446,14 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID      }      data << uint64(npcGUID); +    data << uint64(0);                                      // wotlk, something todo with quest sharing?      data << uint32(pQuest->GetQuestId()); -    data << Title << Details << Objectives; +    data << Title; +    data << Details; +    data << Objectives;      data << uint32(ActivateAccept);      data << uint32(pQuest->GetSuggestedPlayers()); +    data << uint8(0);                                       // new wotlk      if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))      { @@ -466,6 +499,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID      data << uint32(pQuest->GetRewSpell());                  // reward spell, this spell will display (icon) (casted if RewSpellCast==0)      data << uint32(pQuest->GetRewSpellCast());              // casted spell      data << uint32(pQuest->GetCharTitleId());               // CharTitleId, new 2.4.0, player gets this title (id from CharTitles) +    data << uint32(pQuest->GetBonusTalents());              // bonus talents      data << uint32(QUEST_EMOTE_COUNT);      for (uint32 i=0; i < QUEST_EMOTE_COUNT; i++) @@ -514,7 +548,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )      data << uint32(pQuest->GetQuestId());      data << uint32(pQuest->GetQuestMethod());               // Accepted values: 0, 1 or 2. 0==IsAutoComplete() (skip objectives/details) -    data << uint32(pQuest->GetQuestLevel());                // may be 0 +    data << uint32(pQuest->GetQuestLevel());                // may be 0, static data, in other cases must be used dynamic level: Player::GetQuestLevel      data << uint32(pQuest->GetZoneOrSort());                // zone or sort to display in quest log      data << uint32(pQuest->GetType()); @@ -542,6 +576,8 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )      data << uint32(pQuest->GetSrcItemId());      data << uint32(pQuest->GetFlags() & 0xFFFF);      data << uint32(pQuest->GetCharTitleId());               // CharTitleId, new 2.4.0, player gets this title (id from CharTitles) +    data << uint32(pQuest->GetPlayersSlain());              // players slain +    data << uint32(pQuest->GetBonusTalents());              // bonus talents      int iI; @@ -588,15 +624,23 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )              data << uint32(pQuest->ReqCreatureOrGOId[iI]);          }          data << uint32(pQuest->ReqCreatureOrGOCount[iI]); +        data << uint32(pQuest->ReqSourceId[iI]); +    } + +    for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; ++iI) +    {          data << uint32(pQuest->ReqItemId[iI]);          data << uint32(pQuest->ReqItemCount[iI]);      } +    data << uint32(0);                                      // TODO: 5 item objective +    data << uint32(0); +      for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; iI++)          data << ObjectiveText[iI];      pSession->SendPacket( &data ); -    sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u",pQuest->GetQuestId() ); +    sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", pQuest->GetQuestId() );  }  void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, bool EnbleNext ) @@ -678,9 +722,10 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID,      data << uint32(0x08);                                   // unused by client?      data << uint32(pQuest->GetRewSpell());                  // reward spell, this spell will display (icon) (casted if RewSpellCast==0)      data << uint32(pQuest->GetRewSpellCast());              // casted spell -    data << uint32(0x00);                                   // unk, NOT honor +    data << uint32(0);                                      // unknown +    data << uint32(pQuest->GetBonusTalents());              // bonus talents      pSession->SendPacket( &data ); -    sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() ); +    sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() );  }  void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID, bool Completable, bool CloseOnCancel ) @@ -688,16 +733,8 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID      // We can always call to RequestItems, but this packet only goes out if there are actually      // items.  Otherwise, we'll skip straight to the OfferReward -    // We may wish a better check, perhaps checking the real quest requirements -    if (pQuest->GetRequestItemsText().empty()) -    { -        SendQuestGiverOfferReward(pQuest, npcGUID, true); -        return; -    } - -    std::string Title,RequestItemsText; -    Title = pQuest->GetTitle(); -    RequestItemsText = pQuest->GetRequestItemsText(); +    std::string Title = pQuest->GetTitle(); +    std::string RequestItemsText = pQuest->GetRequestItemsText();      int loc_idx = pSession->GetSessionDbLocaleIndex();      if (loc_idx >= 0) @@ -712,6 +749,13 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID          }      } +    // We may wish a better check, perhaps checking the real quest requirements +    if (RequestItemsText.empty()) +    { +        SendQuestGiverOfferReward(pQuest, npcGUID, true); +        return; +    } +      WorldPacket data( SMSG_QUESTGIVER_REQUEST_ITEMS, 50 );  // guess size      data << npcGUID;      data << pQuest->GetQuestId();  | 
