Fixed quests.

Fixed bg list packet.
This commit is contained in:
tomrus88 2010-03-24 11:52:22 +03:00
parent 292f6189ea
commit 3db72991f9
4 changed files with 59 additions and 37 deletions

View file

@ -1250,7 +1250,7 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket *data, BattleGro
*data << uint32(bg->GetMapId()); // map id *data << uint32(bg->GetMapId()); // map id
*data << uint32(Time1); // time to bg auto leave, 0 at bg start, 120000 after bg end, milliseconds *data << uint32(Time1); // time to bg auto leave, 0 at bg start, 120000 after bg end, milliseconds
*data << uint32(Time2); // time from bg start, milliseconds *data << uint32(Time2); // time from bg start, milliseconds
*data << uint8(0x1); // unk sometimes 0x0! *data << uint8(0x1); // Lua_GetBattlefieldArenaFaction (bool)
break; break;
default: default:
sLog.outError("Unknown BG status!"); sLog.outError("Unknown BG status!");
@ -1802,17 +1802,32 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6
*data << uint64(guid); // battlemaster guid *data << uint64(guid); // battlemaster guid
*data << uint8(fromWhere); // from where you joined *data << uint8(fromWhere); // from where you joined
*data << uint32(bgTypeId); // battleground id *data << uint32(bgTypeId); // battleground id
*data << uint8(0); // unk
*data << uint8(0); // unk
// Rewards
*data << uint8(0); // 3.3.3 hasWin
*data << uint32(0); // 3.3.3 winHonor
*data << uint32(0); // 3.3.3 winArena
*data << uint32(0); // 3.3.3 lossHonor
uint8 isRandom = 0;
*data << uint8(isRandom); // 3.3.3 isRandom
if(isRandom)
{
// Rewards (random)
*data << uint8(0); // 3.3.3 hasWin_Random
*data << uint32(0); // 3.3.3 winHonor_Random
*data << uint32(0); // 3.3.3 winArena_Random
*data << uint32(0); // 3.3.3 lossHonor_Random
}
if(bgTypeId == BATTLEGROUND_AA) // arena if(bgTypeId == BATTLEGROUND_AA) // arena
{ {
*data << uint8(4); // unk *data << uint32(0); // arena - no instances showed
*data << uint8(0); // unk
*data << uint32(0); // unk (count?)
} }
else // battleground else // battleground
{ {
*data << uint8(0); // unk, different for each bg type
*data << uint8(0); // unk
size_t count_pos = data->wpos(); size_t count_pos = data->wpos();
uint32 count = 0; uint32 count = 0;
*data << uint32(0); // number of bg instances *data << uint32(0); // number of bg instances

View file

@ -80,21 +80,24 @@ void GossipMenu::AddMenuItem(uint8 Icon, char const* Message, uint32 dtSender, u
uint32 GossipMenu::MenuItemSender( unsigned int ItemId ) uint32 GossipMenu::MenuItemSender( unsigned int ItemId )
{ {
if ( ItemId >= m_gItems.size() ) return 0; if ( ItemId >= m_gItems.size() )
return 0;
return m_gItems[ ItemId ].m_gSender; return m_gItems[ ItemId ].m_gSender;
} }
uint32 GossipMenu::MenuItemAction( unsigned int ItemId ) uint32 GossipMenu::MenuItemAction( unsigned int ItemId )
{ {
if ( ItemId >= m_gItems.size() ) return 0; if ( ItemId >= m_gItems.size() )
return 0;
return m_gItems[ ItemId ].m_gOptionId; return m_gItems[ ItemId ].m_gOptionId;
} }
bool GossipMenu::MenuItemCoded( unsigned int ItemId ) bool GossipMenu::MenuItemCoded( unsigned int ItemId )
{ {
if ( ItemId >= m_gItems.size() ) return 0; if ( ItemId >= m_gItems.size() )
return 0;
return m_gItems[ ItemId ].m_gCoded; return m_gItems[ ItemId ].m_gCoded;
} }
@ -194,8 +197,9 @@ void PlayerMenu::CloseGossip()
void PlayerMenu::SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flags, uint32 Data, char const * locName ) 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 WorldPacket data( SMSG_GOSSIP_POI, (4+4+4+4+4+10) ); // guess size
data << Flags; data << uint32(Flags);
data << X << Y; data << float(X);
data << float(Y);
data << uint32(Icon); data << uint32(Icon);
data << uint32(Data); data << uint32(Data);
data << locName; data << locName;
@ -346,7 +350,8 @@ QuestMenu::~QuestMenu()
void QuestMenu::AddMenuItem( uint32 QuestId, uint8 Icon) void QuestMenu::AddMenuItem( uint32 QuestId, uint8 Icon)
{ {
Quest const* qinfo = sObjectMgr.GetQuestTemplate(QuestId); Quest const* qinfo = sObjectMgr.GetQuestTemplate(QuestId);
if (!qinfo) return; if (!qinfo)
return;
ASSERT( m_qItems.size() <= GOSSIP_MAX_MENU_ITEMS ); ASSERT( m_qItems.size() <= GOSSIP_MAX_MENU_ITEMS );
@ -387,8 +392,8 @@ void PlayerMenu::SendQuestGiverQuestList( QEmote eEmote, const std::string& Titl
QuestMenuItem const& qmi = mQuestMenu.GetItem(count); QuestMenuItem const& qmi = mQuestMenu.GetItem(count);
uint32 questID = qmi.m_qId; uint32 questID = qmi.m_qId;
Quest const *pQuest = sObjectMgr.GetQuestTemplate(questID);
if(pQuest) if(Quest const *pQuest = sObjectMgr.GetQuestTemplate(questID))
{ {
std::string title = pQuest->GetTitle(); std::string title = pQuest->GetTitle();
@ -434,8 +439,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
int loc_idx = pSession->GetSessionDbLocaleIndex(); int loc_idx = pSession->GetSessionDbLocaleIndex();
if (loc_idx >= 0) if (loc_idx >= 0)
{ {
QuestLocale const *ql = sObjectMgr.GetQuestLocale(pQuest->GetQuestId()); if (QuestLocale const *ql = sObjectMgr.GetQuestLocale(pQuest->GetQuestId()))
if (ql)
{ {
if (ql->Title.size() > (size_t)loc_idx && !ql->Title[loc_idx].empty()) if (ql->Title.size() > (size_t)loc_idx && !ql->Title[loc_idx].empty())
Title = ql->Title[loc_idx]; Title = ql->Title[loc_idx];
@ -453,11 +457,10 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << Title; data << Title;
data << Details; data << Details;
data << Objectives; data << Objectives;
data << uint8(ActivateAccept ? 1 : 0); // auto finish? data << uint8(ActivateAccept ? 1 : 0); // auto finish
data << uint32(pQuest->GetFlags()); // 3.3.3 questFlags
data << uint32(pQuest->GetSuggestedPlayers()); data << uint32(pQuest->GetSuggestedPlayers());
data << uint32(0); // flags PvP data << uint8(0); // IsFinished? value is sent back to server in quest accept packet
data << uint8(0); // value is sent back to server in quest accept packet
//data << uint32(0); // auto accept?
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{ {
@ -616,7 +619,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
// rewarded honor points // rewarded honor points
data << uint32(pQuest->GetRewHonorAddition()); data << uint32(pQuest->GetRewHonorAddition());
data << float(pQuest->GetRewHonorMultiplier()); // new reward honor (multipled by ~62 at client side) data << float(pQuest->GetRewHonorMultiplier()); // new reward honor (multiplied by ~62 at client side)
data << uint32(pQuest->GetSrcItemId()); // source item id data << uint32(pQuest->GetSrcItemId()); // source item id
data << uint32(pQuest->GetFlags() & 0xFFFF); // quest flags data << uint32(pQuest->GetFlags() & 0xFFFF); // quest flags
@ -723,9 +726,9 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID,
data << Title; data << Title;
data << OfferRewardText; data << OfferRewardText;
data << uint8(EnableNext ? 1 : 0); // Auto Finish? data << uint8(EnableNext ? 1 : 0); // Auto Finish
data << uint32(0); // 3.3.3 data << uint32(pQuest->GetFlags()); // 3.3.3 questFlags
data << uint32(0); // SuggestedGroupNum data << uint32(pQuest->GetSuggestedPlayers()); // SuggestedGroupNum
uint32 EmoteCount = 0; uint32 EmoteCount = 0;
for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
@ -846,11 +849,12 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
// Close Window after cancel // Close Window after cancel
if (CloseOnCancel) if (CloseOnCancel)
data << uint32(0x01); // auto finish? data << uint32(0x01); // auto finish
else else
data << uint32(0x00); data << uint32(0x00);
data << uint32(0x00); // SuggestedGroupNum data << uint32(pQuest->GetFlags()); // 3.3.3 questFlags
data << uint32(pQuest->GetSuggestedPlayers()); // SuggestedGroupNum
// Required Money // Required Money
data << uint32(pQuest->GetRewOrReqMoney() < 0 ? -pQuest->GetRewOrReqMoney() : 0); data << uint32(pQuest->GetRewOrReqMoney() < 0 ? -pQuest->GetRewOrReqMoney() : 0);
@ -871,14 +875,14 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
data << uint32(0); data << uint32(0);
} }
if ( !Completable ) if ( !Completable ) // Completable = flags1 && flags2 && flags3 && flags4
data << uint32(0x00); data << uint32(0x00); // flags1
else else
data << uint32(0x03); data << uint32(0x03);
data << uint32(0x04); data << uint32(0x04); // flags2
data << uint32(0x08); data << uint32(0x08); // flags3
data << uint32(0x10); data << uint32(0x10); // flags4
pSession->SendPacket( &data ); pSession->SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() ); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() );

View file

@ -603,6 +603,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt32Value(PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24))); SetUInt32Value(PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)));
SetUInt32Value(PLAYER_BYTES_2, (facialHair | (0x00 << 8) | (0x00 << 16) | (0x02 << 24))); SetUInt32Value(PLAYER_BYTES_2, (facialHair | (0x00 << 8) | (0x00 << 16) | (0x02 << 24)));
SetByteValue(PLAYER_BYTES_3, 0, gender); SetByteValue(PLAYER_BYTES_3, 0, gender);
SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
SetUInt32Value( PLAYER_GUILDID, 0 ); SetUInt32Value( PLAYER_GUILDID, 0 );
SetUInt32Value( PLAYER_GUILDRANK, 0 ); SetUInt32Value( PLAYER_GUILDRANK, 0 );

View file

@ -135,13 +135,13 @@ enum __QuestFlags
QUEST_FLAGS_AUTO_REWARDED = 0x00000400, // These quests are automatically rewarded on quest complete and they will never appear in quest log client side. QUEST_FLAGS_AUTO_REWARDED = 0x00000400, // These quests are automatically rewarded on quest complete and they will never appear in quest log client side.
QUEST_FLAGS_TBC_RACES = 0x00000800, // Not used currently: Blood elf/Draenei starting zone quests QUEST_FLAGS_TBC_RACES = 0x00000800, // Not used currently: Blood elf/Draenei starting zone quests
QUEST_FLAGS_DAILY = 0x00001000, // Used to know quest is Daily one QUEST_FLAGS_DAILY = 0x00001000, // Used to know quest is Daily one
QUEST_FLAGS_UNK3 = 0x00002000, // activates PvP? QUEST_FLAGS_FLAGS_PVP = 0x00002000, // activates PvP on accept
QUEST_FLAGS_UNK4 = 0x00004000, // ? Membership Card Renewal QUEST_FLAGS_UNK4 = 0x00004000, // ? Membership Card Renewal
QUEST_FLAGS_WEEKLY = 0x00008000, // Not used currently: Weekly quests QUEST_FLAGS_WEEKLY = 0x00008000, // Not used currently: Weekly quests
QUEST_FLAGS_AUTOCOMPLETE = 0x00010000, // auto complete QUEST_FLAGS_AUTOCOMPLETE = 0x00010000, // auto complete
QUEST_FLAGS_UNK5 = 0x00020000, // has something to do with ReqItemId and SrcItemId QUEST_FLAGS_UNK5 = 0x00020000, // has something to do with ReqItemId and SrcItemId
QUEST_FLAGS_UNK6 = 0x00040000, // use Objective text as Complete text QUEST_FLAGS_UNK6 = 0x00040000, // use Objective text as Complete text
QUEST_FLAGS_LOW_LEVEL = 0x00080000, // quests in starting areas QUEST_FLAGS_AUTO_ACCEPT = 0x00080000, // quests in starting areas
// Mangos flags for set SpecialFlags in DB if required but used only at server // Mangos flags for set SpecialFlags in DB if required but used only at server
QUEST_MANGOS_FLAGS_REPEATABLE = 0x01000000, // Set by 1 in SpecialFlags from DB QUEST_MANGOS_FLAGS_REPEATABLE = 0x01000000, // Set by 1 in SpecialFlags from DB
@ -239,6 +239,8 @@ class Quest
bool IsAutoComplete() const { return QuestMethod ? false : true; } bool IsAutoComplete() const { return QuestMethod ? false : true; }
uint32 GetFlags() const { return QuestFlags; } uint32 GetFlags() const { return QuestFlags; }
bool IsDaily() const { return QuestFlags & QUEST_FLAGS_DAILY; } bool IsDaily() const { return QuestFlags & QUEST_FLAGS_DAILY; }
bool IsWeekly() const { return QuestFlags & QUEST_FLAGS_WEEKLY; }
bool IsAutoAccept() const { return QuestFlags & QUEST_FLAGS_AUTO_ACCEPT; }
// multiple values // multiple values
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT]; std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];