aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2016_xx_xx_xx_world_legion_02.sql14
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp16
-rw-r--r--src/server/game/Entities/Player/Player.cpp38
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp69
-rw-r--r--src/server/game/Quests/QuestDef.cpp141
-rw-r--r--src/server/game/Quests/QuestDef.h15
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp104
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h41
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp12
10 files changed, 267 insertions, 185 deletions
diff --git a/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql b/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql
new file mode 100644
index 00000000000..c4b7fca6d19
--- /dev/null
+++ b/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql
@@ -0,0 +1,14 @@
+ALTER TABLE `quest_template`
+ CHANGE `RewardDisplaySpell` `RewardDisplaySpell1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardBonusMoney`,
+ ADD `RewardDisplaySpell2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardDisplaySpell1`,
+ ADD `RewardDisplaySpell3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardDisplaySpell2`,
+ ADD `RewardArtifactXPDifficulty` int(10) unsigned NOT NULL DEFAULT '0' AFTER `StartItem`,
+ ADD `RewardArtifactXPMultiplier` float NOT NULL DEFAULT '1' AFTER `RewardArtifactXPDifficulty`,
+ ADD `RewardArtifactCategoryID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardArtifactXPMultiplier`,
+ DROP `RewardTalents`,
+ ADD `RewardFactionCapIn1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride1`,
+ ADD `RewardFactionCapIn2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride2`,
+ ADD `RewardFactionCapIn3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride3`,
+ ADD `RewardFactionCapIn4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride4`,
+ ADD `RewardFactionCapIn5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride5`,
+ ADD `QuestRewardID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllowableRaces`;
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 911517982c2..a5a0f53aaf6 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -365,8 +365,9 @@ void PlayerMenu::SendQuestGiverQuestList(ObjectGuid guid)
AddQuestLevelToTitle(title, quest->GetQuestLevel());
bool repeatable = false; // NYI
+ bool ignored = false; // NYI
- questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, title));
+ questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, ignored, title));
}
}
@@ -510,17 +511,22 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.RewardMoneyDifficulty = quest->GetRewMoneyDifficulty();
packet.Info.RewardMoneyMultiplier = quest->GetMoneyMultiplier();
packet.Info.RewardBonusMoney = quest->GetRewMoneyMaxLevel();
- packet.Info.RewardDisplaySpell = quest->GetRewDisplaySpell();
+ for (uint8 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
+ packet.Info.RewardDisplaySpell[i] = quest->RewardDisplaySpell[i];
+
packet.Info.RewardSpell = quest->GetRewSpell();
packet.Info.RewardHonor = quest->GetRewHonor();
packet.Info.RewardKillHonor = quest->GetRewKillHonor();
+ packet.Info.RewardArtifactXPDifficulty = quest->GetArtifactXPDifficulty();
+ packet.Info.RewardArtifactXPMultiplier = quest->GetArtifactXPMultiplier();
+ packet.Info.RewardArtifactCategoryID = quest->GetArtifactCategoryId();
+
packet.Info.StartItem = quest->GetSrcItemId();
packet.Info.Flags = quest->GetFlags();
packet.Info.FlagsEx = quest->GetFlagsEx();
packet.Info.RewardTitle = quest->GetRewTitle();
- packet.Info.RewardTalents = quest->GetBonusTalents();
packet.Info.RewardArenaPoints = quest->GetRewArenaPoints();
packet.Info.RewardSkillLineID = quest->GetRewardSkillId();
packet.Info.RewardNumSkillUps = quest->GetRewardSkillPoints();
@@ -553,6 +559,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.RewardFactionID[i] = quest->RewardFactionId[i];
packet.Info.RewardFactionValue[i] = quest->RewardFactionValue[i];
packet.Info.RewardFactionOverride[i] = quest->RewardFactionOverride[i];
+ packet.Info.RewardFactionCapIn[i] = quest->RewardFactionCapIn[i];
}
packet.Info.POIContinent = quest->GetPOIContinent();
@@ -569,6 +576,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.AreaDescription = areaDescription;
packet.Info.QuestCompletionLog = questCompletionLog;
packet.Info.AllowableRaces = quest->GetAllowableRaces();
+ packet.Info.QuestRewardID = quest->GetRewardId();
for (QuestObjective const& questObjective : quest->GetObjectives())
{
@@ -720,7 +728,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
switch (obj.Type)
{
case QUEST_OBJECTIVE_ITEM:
- packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount));
+ packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount, obj.Flags));
break;
case QUEST_OBJECTIVE_CURRENCY:
packet.Currency.push_back(WorldPackets::Quest::QuestCurrency(obj.ObjectID, obj.Amount));
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 302ea0c13bd..388fb2b6bab 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14386,22 +14386,28 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_APPLY_AURA))
{
- if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
- creature->CastSpell(this, quest->GetRewSpell(), true);
+ if (Unit* unit = questGiver->ToUnit())
+ unit->CastSpell(this, quest->GetRewSpell(), true);
}
else
CastSpell(this, quest->GetRewSpell(), true);
}
- else if (quest->GetRewDisplaySpell() > 0)
+ else
{
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewDisplaySpell());
- if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM))
+ for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
{
- if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
- creature->CastSpell(this, quest->GetRewDisplaySpell(), true);
+ if (quest->RewardDisplaySpell[i] > 0)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->RewardDisplaySpell[i]);
+ if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM))
+ {
+ if (Unit* unit = questGiver->ToUnit())
+ unit->CastSpell(this, quest->RewardDisplaySpell[i], true);
+ }
+ else
+ CastSpell(this, quest->RewardDisplaySpell[i], true);
+ }
}
- else
- CastSpell(this, quest->GetRewDisplaySpell(), true);
}
if (quest->GetZoneOrSort() > 0)
@@ -15554,7 +15560,7 @@ void Player::KilledPlayerCredit()
if (curKillCount < uint32(obj.Amount))
{
SetQuestObjectiveData(qInfo, obj.StorageIndex, curKillCount + addKillCount);
- SendQuestUpdateAddPlayer(qInfo, curKillCount + addKillCount, obj.Amount);
+ SendQuestUpdateAddPlayer(qInfo, curKillCount + addKillCount);
}
if (CanCompleteQuest(questid))
@@ -15962,7 +15968,6 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) const
packet.XPReward = xp;
packet.SkillLineIDReward = quest->GetRewardSkillId();
packet.NumSkillUpsReward = quest->GetRewardSkillPoints();
- packet.TalentReward = quest->GetBonusTalents();
// @todo fix these 3
packet.UseQuestReward = true;
@@ -16048,13 +16053,12 @@ void Player::SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, Quest
GetSession()->SendPacket(packet.Write());
}
-void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required) const
+void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const
{
- WorldPacket data(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, (3*4));
- data << uint32(quest->GetQuestId());
- data << uint32(newCount);
- data << uint32(required);
- GetSession()->SendPacket(&data);
+ WorldPackets::Quest::QuestUpdateAddPvPCredit questUpdateAddPvpCredit;
+ questUpdateAddPvpCredit.QuestID = quest->GetQuestId();
+ questUpdateAddPvpCredit.Count = newCount;
+ GetSession()->SendPacket(questUpdateAddPvpCredit.Write());
}
bool Player::HasPvPForcingQuest() const
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index bf1880a1f6e..3969e026aee 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1588,7 +1588,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendQuestConfirmAccept(Quest const* quest, Player* receiver) const;
void SendPushToPartyResponse(Player* player, QuestPushReason reason) const;
void SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, QuestObjective const& obj, uint16 count) const;
- void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required) const;
+ void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const;
ObjectGuid GetDivider() const { return m_divider; }
void SetDivider(ObjectGuid guid) { m_divider = guid; }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 1bfbd85e96b..1466deda61d 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3670,31 +3670,33 @@ void ObjectMgr::LoadQuests()
QueryResult result = WorldDatabase.Query("SELECT "
//0 1 2 3 4 5 6 7 8 9 10
"ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, "
- //11 12 13 14 15 16 17 18 19 20 21
- "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, StartItem, Flags, FlagsEx, "
- //22 23 24 25 26 27 28 29
+ //11 12 13 14 15 16 17 18 19 20 21
+ "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, "
+ //22 23 24 25 26
+ "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, "
+ //27 28 29 30 31 32 33 34
"RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, "
- //30 31 32 33 34 35 36 37
+ //35 36 37 38 39 40 41 42
"RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, "
- //38 39 40 41 42 43
+ //43 44 45 46 47 48
"RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, "
- //44 45 46 47 48 49
+ //49 50 51 52 53 54
"RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, "
- //50 51 52 53 54 55
+ //55 56 57 58 59 60
"RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, "
- //56 57 58 59 60 61 62 63 64 65 66
- "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardTalents, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, "
- //67 68 69 70 71 72
- "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, "
- //73 74 75 76 77 78
- "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, "
- //79 80 81 82
- "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionFlags, "
- //83 84 85 86 87 88 89 90
+ //61 62 63 64 65 66 67 68 69 70
+ "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, "
+ //71 72 73 74 75 76 77 78
+ "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, "
+ //79 80 81 82 83 84 85 86
+ "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, "
+ //87 88 89 90 91
+ "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, "
+ //92 93 94 95 96 97 98 99
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, "
- //91 92 93 94 95
- "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, "
- //96 97 98 99 100 101 102 103 104
+ //100 101 102 103 104 105
+ "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, "
+ //106 107 108 109 110 111 112 113 114
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog"
" FROM quest_template");
if (!result)
@@ -4301,22 +4303,25 @@ void ObjectMgr::LoadQuests()
}
}
- if (qinfo->RewardDisplaySpell)
+ for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
{
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
-
- if (!spellInfo)
+ if (qinfo->RewardDisplaySpell[i])
{
- TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpell` = %u but spell %u does not exist, spell removed as display reward.",
- qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
- qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
- }
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell[i]);
- else if (!SpellMgr::IsSpellValid(spellInfo))
- {
- TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpell` = %u but spell %u is broken, quest will not have a spell reward.",
- qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
- qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
+ if (!spellInfo)
+ {
+ TC_LOG_ERROR("sql.sql", "Quest %u has `RewardDisplaySpell%u` = %u but spell %u does not exist, spell removed as display reward.",
+ qinfo->GetQuestId(), i, qinfo->RewardDisplaySpell[i], qinfo->RewardDisplaySpell[i]);
+ qinfo->RewardDisplaySpell[i] = 0; // no spell reward will display for this quest
+ }
+
+ else if (!SpellMgr::IsSpellValid(spellInfo))
+ {
+ TC_LOG_ERROR("sql.sql", "Quest %u has `RewardDisplaySpell%u` = %u but spell %u is broken, quest will not have a spell reward.",
+ qinfo->GetQuestId(), i, qinfo->RewardDisplaySpell[i], qinfo->RewardDisplaySpell[i]);
+ qinfo->RewardDisplaySpell[i] = 0; // no spell reward will display for this quest
+ }
}
}
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 91a928b7a98..99f95ee7fe4 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -17,6 +17,7 @@
*/
#include "QuestDef.h"
+#include "GameTables.h"
#include "Player.h"
#include "World.h"
#include "QuestPackets.h"
@@ -44,20 +45,25 @@ Quest::Quest(Field* questRecord)
RewardMoneyDifficulty = questRecord[12].GetUInt32();
RewardMoneyMultiplier = questRecord[13].GetFloat();
RewardBonusMoney = questRecord[14].GetUInt32();
- RewardDisplaySpell = questRecord[15].GetUInt32();
- RewardSpell = questRecord[16].GetUInt32();
- RewardHonor = questRecord[17].GetUInt32();
- RewardKillHonor = questRecord[18].GetUInt32();
- SourceItemId = questRecord[19].GetUInt32();
- Flags = questRecord[20].GetUInt32();
- FlagsEx = questRecord[21].GetUInt32();
+ for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
+ RewardDisplaySpell[i] = questRecord[15 + i].GetUInt32();
+
+ RewardSpell = questRecord[18].GetUInt32();
+ RewardHonor = questRecord[19].GetUInt32();
+ RewardKillHonor = questRecord[20].GetUInt32();
+ SourceItemId = questRecord[21].GetUInt32();
+ RewardArtifactXPDifficulty = questRecord[22].GetUInt32();
+ RewardArtifactXPMultiplier = questRecord[23].GetFloat();
+ RewardArtifactCategoryID = questRecord[24].GetUInt32();
+ Flags = questRecord[25].GetUInt32();
+ FlagsEx = questRecord[26].GetUInt32();
for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
{
- RewardItemId[i] = questRecord[22+i*4].GetUInt32();
- RewardItemCount[i] = questRecord[23+i*4].GetUInt32();
- ItemDrop[i] = questRecord[24+i*4].GetUInt32();
- ItemDropQuantity[i] = questRecord[25+i*4].GetUInt32();
+ RewardItemId[i] = questRecord[27 + i * 4].GetUInt32();
+ RewardItemCount[i] = questRecord[28 + i * 4].GetUInt32();
+ ItemDrop[i] = questRecord[29 + i * 4].GetUInt32();
+ ItemDropQuantity[i] = questRecord[30 + i * 4].GetUInt32();
if (RewardItemId[i])
++_rewItemsCount;
@@ -65,63 +71,64 @@ Quest::Quest(Field* questRecord)
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
- RewardChoiceItemId[i] = questRecord[38+i*3].GetUInt32();
- RewardChoiceItemCount[i] = questRecord[39+i*3].GetUInt32();
- RewardChoiceItemDisplayId[i] = questRecord[40+i*3].GetUInt32();
+ RewardChoiceItemId[i] = questRecord[43 + i * 3].GetUInt32();
+ RewardChoiceItemCount[i] = questRecord[44 + i * 3].GetUInt32();
+ RewardChoiceItemDisplayId[i] = questRecord[45 + i * 3].GetUInt32();
if (RewardChoiceItemId[i])
++_rewChoiceItemsCount;
}
- POIContinent = questRecord[56].GetUInt32();
- POIx = questRecord[57].GetFloat();
- POIy = questRecord[58].GetFloat();
- POIPriority = questRecord[59].GetUInt32();
+ POIContinent = questRecord[61].GetUInt32();
+ POIx = questRecord[62].GetFloat();
+ POIy = questRecord[63].GetFloat();
+ POIPriority = questRecord[64].GetUInt32();
- RewardTitleId = questRecord[60].GetUInt32();
- RewardTalents = questRecord[61].GetUInt32();
- RewardArenaPoints = questRecord[62].GetUInt32();
- RewardSkillId = questRecord[63].GetUInt32();
- RewardSkillPoints = questRecord[64].GetUInt32();
+ RewardTitleId = questRecord[65].GetUInt32();
+ RewardArenaPoints = questRecord[66].GetUInt32();
+ RewardSkillId = questRecord[67].GetUInt32();
+ RewardSkillPoints = questRecord[68].GetUInt32();
- QuestGiverPortrait = questRecord[65].GetUInt32();
- QuestTurnInPortrait = questRecord[66].GetUInt32();
+ QuestGiverPortrait = questRecord[69].GetUInt32();
+ QuestTurnInPortrait = questRecord[70].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
- RewardFactionId[i] = questRecord[67+i*3].GetUInt32();
- RewardFactionValue[i] = questRecord[68+i*3].GetInt32();
- RewardFactionOverride[i] = questRecord[69+i*3].GetInt32();
+ RewardFactionId[i] = questRecord[71 + i * 4].GetUInt32();
+ RewardFactionValue[i] = questRecord[72 + i * 4].GetInt32();
+ RewardFactionOverride[i] = questRecord[73 + i * 4].GetInt32();
+ RewardFactionCapIn[i] = questRecord[74 + i * 4].GetUInt32();
}
- RewardReputationMask = questRecord[82].GetUInt32();
+ RewardReputationMask = questRecord[91].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
- RewardCurrencyId[i] = questRecord[83+i*2].GetUInt32();
- RewardCurrencyCount[i] = questRecord[84+i*2].GetUInt32();
+ RewardCurrencyId[i] = questRecord[91 + i * 2].GetUInt32();
+ RewardCurrencyCount[i] = questRecord[92 + i * 2].GetUInt32();
if (RewardCurrencyId[i])
++_rewCurrencyCount;
}
- SoundAccept = questRecord[91].GetUInt32();
- SoundTurnIn = questRecord[92].GetUInt32();
- AreaGroupID = questRecord[93].GetUInt32();
- LimitTime = questRecord[94].GetUInt32();
- AllowableRaces = questRecord[95].GetInt32();
-
- LogTitle = questRecord[96].GetString();
- LogDescription = questRecord[97].GetString();
- QuestDescription = questRecord[98].GetString();
- AreaDescription = questRecord[99].GetString();
- PortraitGiverText = questRecord[100].GetString();
- PortraitGiverName = questRecord[101].GetString();
- PortraitTurnInText = questRecord[102].GetString();
- PortraitTurnInName = questRecord[103].GetString();
- QuestCompletionLog = questRecord[104].GetString();
-
- for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ SoundAccept = questRecord[100].GetUInt32();
+ SoundTurnIn = questRecord[101].GetUInt32();
+ AreaGroupID = questRecord[102].GetUInt32();
+ LimitTime = questRecord[103].GetUInt32();
+ AllowableRaces = questRecord[104].GetInt32();
+ QuestRewardID = questRecord[105].GetUInt32();
+
+ LogTitle = questRecord[106].GetString();
+ LogDescription = questRecord[107].GetString();
+ QuestDescription = questRecord[108].GetString();
+ AreaDescription = questRecord[109].GetString();
+ PortraitGiverText = questRecord[110].GetString();
+ PortraitGiverName = questRecord[111].GetString();
+ PortraitTurnInText = questRecord[112].GetString();
+ PortraitTurnInName = questRecord[113].GetString();
+ QuestCompletionLog = questRecord[114].GetString();
+
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
{
DetailsEmote[i] = 0;
DetailsEmoteDelay[i] = 0;
@@ -132,11 +139,11 @@ Quest::Quest(Field* questRecord)
void Quest::LoadQuestDetails(Field* fields)
{
- for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmote[i] = fields[1+i].GetUInt16();
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ DetailsEmote[i] = fields[1 + i].GetUInt16();
- for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmoteDelay[i] = fields[5+i].GetUInt32();
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ DetailsEmoteDelay[i] = fields[5 + i].GetUInt32();
}
void Quest::LoadQuestRequestItems(Field* fields)
@@ -148,14 +155,13 @@ void Quest::LoadQuestRequestItems(Field* fields)
RequestItemsText = fields[5].GetString();
}
-
void Quest::LoadQuestOfferReward(Field* fields)
{
- for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmote[i] = fields[1+i].GetUInt16();
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ OfferRewardEmote[i] = fields[1 + i].GetUInt16();
- for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmoteDelay[i] = fields[5+i].GetUInt32();
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ OfferRewardEmoteDelay[i] = fields[5 + i].GetUInt32();
OfferRewardText = fields[9].GetString();
}
@@ -220,18 +226,22 @@ uint32 Quest::XPValue(uint32 playerLevel) const
{
if (playerLevel)
{
- int32 quest_level = (Level == -1 ? playerLevel : Level);
- const QuestXPEntry* xpentry = sQuestXPStore.LookupEntry(quest_level);
- if (!xpentry)
+ uint32 questLevel = uint32(Level == -1 ? playerLevel : Level);
+ QuestXPEntry const* questXp = sQuestXPStore.LookupEntry(questLevel);
+ if (!questXp || RewardXPDifficulty > 10)
return 0;
- int32 diffFactor = 2 * (quest_level - playerLevel) + 20;
+ float multiplier = 1.0f;
+ if (questLevel != playerLevel)
+ multiplier = sXpGameTable.GetRow(std::min(playerLevel, questLevel))->Divisor / sXpGameTable.GetRow(playerLevel)->Divisor;
+
+ int32 diffFactor = 2 * (questLevel - playerLevel) + 20;
if (diffFactor < 1)
diffFactor = 1;
else if (diffFactor > 10)
diffFactor = 10;
- uint32 xp = diffFactor * xpentry->Exp[RewardXPDifficulty] * RewardXPMultiplier / 10;
+ uint32 xp = diffFactor * questXp->Exp[RewardXPDifficulty] * RewardXPMultiplier / 10 * multiplier;
if (xp <= 100)
xp = 5 * ((xp + 2) / 5);
else if (xp <= 500)
@@ -264,12 +274,14 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player
rewards.Money = player->GetQuestMoneyReward(this);
rewards.XP = player->GetQuestXPReward(this);
rewards.Title = GetRewTitle();
- rewards.Talents = GetBonusTalents();
rewards.FactionFlags = GetRewardReputationMask();
- rewards.SpellCompletionDisplayID = GetRewDisplaySpell();
+ for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
+ rewards.SpellCompletionDisplayID[i] = RewardDisplaySpell[i];
+
rewards.SpellCompletionID = GetRewSpell();
rewards.SkillLineID = GetRewardSkillId();
rewards.NumSkillUps = GetRewardSkillPoints();
+ rewards.RewardID = GetRewardId();
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
@@ -288,6 +300,7 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player
rewards.FactionID[i] = RewardFactionId[i];
rewards.FactionValue[i] = RewardFactionValue[i];
rewards.FactionOverride[i] = RewardFactionOverride[i];
+ rewards.FactionCapIn[i] = RewardFactionCapIn[i];
}
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 03179f53b3f..83cf2a6410a 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -49,6 +49,7 @@ namespace WorldPackets
#define QUEST_REWARD_REPUTATIONS_COUNT 5
#define QUEST_EMOTE_COUNT 4
#define QUEST_REWARD_CURRENCY_COUNT 4
+#define QUEST_REWARD_DISPLAY_SPELL_COUNT 3
enum QuestFailedReason
{
@@ -323,7 +324,6 @@ class TC_GAME_API Quest
int32 GetNextQuestId() const { return NextQuestID; }
int32 GetExclusiveGroup() const { return ExclusiveGroup; }
uint32 GetNextQuestInChain() const { return NextQuestInChain; }
- uint32 GetBonusTalents() const { return RewardTalents; }
int32 GetRewArenaPoints() const {return RewardArenaPoints; }
uint32 GetXPDifficulty() const { return RewardXPDifficulty; }
float GetXPMultiplier() const { return RewardXPMultiplier; }
@@ -346,9 +346,11 @@ class TC_GAME_API Quest
uint32 GetRewMoneyDifficulty() const { return RewardMoneyDifficulty; }
uint32 GetRewHonor() const { return RewardHonor; }
uint32 GetRewKillHonor() const { return RewardKillHonor; }
+ uint32 GetArtifactXPDifficulty() const { return RewardArtifactXPDifficulty; }
+ float GetArtifactXPMultiplier() const { return RewardArtifactXPMultiplier; }
+ uint32 GetArtifactCategoryId() const { return RewardArtifactCategoryID; }
uint32 GetRewMoneyMaxLevel() const; // use in XP calculation at client
uint32 GetRewSpell() const { return RewardSpell; }
- int32 GetRewDisplaySpell() const { return RewardDisplaySpell; }
uint32 GetRewMailTemplateId() const { return RewardMailTemplateId; }
uint32 GetRewMailDelaySecs() const { return RewardMailDelay; }
uint32 GetRewTitle() const { return RewardTitleId; }
@@ -370,6 +372,7 @@ class TC_GAME_API Quest
uint32 GetRewardSkillId() const { return RewardSkillId; }
uint32 GetRewardSkillPoints() const { return RewardSkillPoints; }
uint32 GetRewardReputationMask() const { return RewardReputationMask; }
+ uint32 GetRewardId() const { return QuestRewardID; }
uint32 GetQuestGiverPortrait() const { return QuestGiverPortrait; }
uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; }
bool IsDaily() const { return (Flags & QUEST_FLAGS_DAILY) != 0; }
@@ -415,10 +418,13 @@ class TC_GAME_API Quest
uint32 RewardMoneyDifficulty;
float RewardMoneyMultiplier;
uint32 RewardBonusMoney;
- uint32 RewardDisplaySpell;
+ uint32 RewardDisplaySpell[QUEST_REWARD_DISPLAY_SPELL_COUNT];
uint32 RewardSpell;
uint32 RewardHonor;
uint32 RewardKillHonor;
+ uint32 RewardArtifactXPDifficulty;
+ float RewardArtifactXPMultiplier;
+ uint32 RewardArtifactCategoryID;
uint32 SourceItemId;
uint32 Flags;
uint32 FlagsEx;
@@ -434,7 +440,6 @@ class TC_GAME_API Quest
float POIy;
uint32 POIPriority;
uint32 RewardTitleId;
- uint32 RewardTalents;
int32 RewardArenaPoints;
uint32 RewardSkillId;
uint32 RewardSkillPoints;
@@ -443,6 +448,7 @@ class TC_GAME_API Quest
uint32 RewardFactionId[QUEST_REWARD_REPUTATIONS_COUNT];
int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT];
int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT];
+ uint32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT];
uint32 RewardReputationMask;
uint32 RewardCurrencyId[QUEST_REWARD_CURRENCY_COUNT];
uint32 RewardCurrencyCount[QUEST_REWARD_CURRENCY_COUNT];
@@ -451,6 +457,7 @@ class TC_GAME_API Quest
uint32 AreaGroupID;
uint32 LimitTime;
int32 AllowableRaces;
+ uint32 QuestRewardID;
QuestObjectives Objectives;
std::string LogTitle;
std::string LogDescription;
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index 803da693c95..2b77ad3d8a1 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -77,10 +77,13 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.RewardMoneyDifficulty);
_worldPacket << float(Info.RewardMoneyMultiplier);
_worldPacket << int32(Info.RewardBonusMoney);
- _worldPacket << int32(Info.RewardDisplaySpell);
+ _worldPacket.append(Info.RewardDisplaySpell, QUEST_REWARD_DISPLAY_SPELL_COUNT);
_worldPacket << int32(Info.RewardSpell);
_worldPacket << int32(Info.RewardHonor);
_worldPacket << float(Info.RewardKillHonor);
+ _worldPacket << int32(Info.RewardArtifactXPDifficulty);
+ _worldPacket << float(Info.RewardArtifactXPMultiplier);
+ _worldPacket << int32(Info.RewardArtifactCategoryID);
_worldPacket << int32(Info.StartItem);
_worldPacket << uint32(Info.Flags);
_worldPacket << uint32(Info.FlagsEx);
@@ -106,7 +109,6 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.POIPriority);
_worldPacket << int32(Info.RewardTitle);
- _worldPacket << int32(Info.RewardTalents);
_worldPacket << int32(Info.RewardArenaPoints);
_worldPacket << int32(Info.RewardSkillLineID);
_worldPacket << int32(Info.RewardNumSkillUps);
@@ -117,8 +119,9 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
_worldPacket << int32(Info.RewardFactionID[i]);
- _worldPacket << int32(Info.RewardFactionValue[i]);
_worldPacket << int32(Info.RewardFactionOverride[i]);
+ _worldPacket << int32(Info.RewardFactionValue[i]);
+ _worldPacket << int32(Info.RewardFactionCapIn[i]);
}
_worldPacket << int32(Info.RewardFactionFlags);
@@ -137,6 +140,18 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.Objectives.size());
_worldPacket << int32(Info.AllowableRaces);
+ _worldPacket << int32(Info.QuestRewardID);
+
+ _worldPacket.WriteBits(Info.LogTitle.size(), 9);
+ _worldPacket.WriteBits(Info.LogDescription.size(), 12);
+ _worldPacket.WriteBits(Info.QuestDescription.size(), 12);
+ _worldPacket.WriteBits(Info.AreaDescription.size(), 9);
+ _worldPacket.WriteBits(Info.PortraitGiverText.size(), 10);
+ _worldPacket.WriteBits(Info.PortraitGiverName.size(), 8);
+ _worldPacket.WriteBits(Info.PortraitTurnInText.size(), 10);
+ _worldPacket.WriteBits(Info.PortraitTurnInName.size(), 8);
+ _worldPacket.WriteBits(Info.QuestCompletionLog.size(), 11);
+ _worldPacket.FlushBits();
for (QuestObjective const& questObjective : Info.Objectives)
{
@@ -158,17 +173,6 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket.WriteString(questObjective.Description);
}
- _worldPacket.WriteBits(Info.LogTitle.size(), 9);
- _worldPacket.WriteBits(Info.LogDescription.size(), 12);
- _worldPacket.WriteBits(Info.QuestDescription.size(), 12);
- _worldPacket.WriteBits(Info.AreaDescription.size(), 9);
- _worldPacket.WriteBits(Info.PortraitGiverText.size(), 10);
- _worldPacket.WriteBits(Info.PortraitGiverName.size(), 8);
- _worldPacket.WriteBits(Info.PortraitTurnInText.size(), 10);
- _worldPacket.WriteBits(Info.PortraitTurnInName.size(), 8);
- _worldPacket.WriteBits(Info.QuestCompletionLog.size(), 11);
- _worldPacket.FlushBits();
-
_worldPacket.WriteString(Info.LogTitle);
_worldPacket.WriteString(Info.LogDescription);
_worldPacket.WriteString(Info.QuestDescription);
@@ -205,48 +209,53 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards)
{
- data << questRewards.ChoiceItemCount;
+ data << int32(questRewards.ChoiceItemCount);
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
- data << questRewards.ChoiceItems[i].ItemID;
- data << questRewards.ChoiceItems[i].Quantity;
+ data << int32(questRewards.ChoiceItems[i].ItemID);
+ data << int32(questRewards.ChoiceItems[i].Quantity);
}
- data << questRewards.ItemCount;
+ data << int32(questRewards.ItemCount);
for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
{
- data << questRewards.ItemID[i];
- data << questRewards.ItemQty[i];
+ data << int32(questRewards.ItemID[i]);
+ data << int32(questRewards.ItemQty[i]);
}
- data << questRewards.Money;
- data << questRewards.XP;
- data << questRewards.Title;
- data << questRewards.Talents;
- data << questRewards.FactionFlags;
+ data << int32(questRewards.Money);
+ data << int32(questRewards.XP);
+ data << int32(questRewards.ArtifactXP);
+ data << int32(questRewards.Honor);
+ data << int32(questRewards.Title);
+ data << int32(questRewards.FactionFlags);
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
- data << questRewards.FactionID[i];
- data << questRewards.FactionValue[i];
- data << questRewards.FactionOverride[i];
+ data << int32(questRewards.FactionID[i]);
+ data << int32(questRewards.FactionOverride[i]);
+ data << int32(questRewards.FactionValue[i]);
+ data << int32(questRewards.FactionCapIn[i]);
}
- data << questRewards.SpellCompletionDisplayID;
- data << questRewards.SpellCompletionID;
+ for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
+ data << int32(questRewards.SpellCompletionDisplayID[i]);
+
+ data << int32(questRewards.SpellCompletionID);
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
- data << questRewards.CurrencyID[i];
- data << questRewards.CurrencyQty[i];
+ data << int32(questRewards.CurrencyID[i]);
+ data << int32(questRewards.CurrencyQty[i]);
}
- data << questRewards.SkillLineID;
- data << questRewards.NumSkillUps;
+ data << int32(questRewards.SkillLineID);
+ data << int32(questRewards.NumSkillUps);
+ data << int32(questRewards.RewardID);
- data.WriteBit(false); // Unk
+ data.WriteBit(questRewards.IsBoostSpell);
data.FlushBits();
return data;
@@ -260,8 +269,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew
data << int32(offer.QuestFlags[0]); // Flags
data << int32(offer.QuestFlags[1]); // FlagsEx
data << int32(offer.SuggestedPartyMembers);
- data << offer.Rewards; // WorldPackets::Quest::QuestRewards
-
data << int32(offer.Emotes.size());
for (WorldPackets::Quest::QuestDescEmote const& emote : offer.Emotes)
{
@@ -272,6 +279,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew
data.WriteBit(offer.AutoLaunched);
data.FlushBits();
+ data << offer.Rewards; // WorldPackets::Quest::QuestRewards
+
return data;
}
@@ -310,15 +319,15 @@ void WorldPackets::Quest::QuestGiverChooseReward::Read()
WorldPacket const* WorldPackets::Quest::QuestGiverQuestComplete::Write()
{
_worldPacket << int32(QuestID);
+ _worldPacket << int32(XPReward);
+ _worldPacket << int64(MoneyReward);
_worldPacket << int32(SkillLineIDReward);
- _worldPacket << int32(MoneyReward);
_worldPacket << int32(NumSkillUpsReward);
- _worldPacket << int32(XPReward);
- _worldPacket << int32(TalentReward);
_worldPacket << ItemReward;
-
_worldPacket.WriteBit(UseQuestReward);
_worldPacket.WriteBit(LaunchGossip);
+ _worldPacket.WriteBit(LaunchQuest);
+ _worldPacket.WriteBit(HideChatMessage);
_worldPacket.FlushBits();
return &_worldPacket;
@@ -342,10 +351,11 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
_worldPacket << uint32(QuestFlags[0]); // Flags
_worldPacket << uint32(QuestFlags[1]); // FlagsEx
_worldPacket << int32(PortraitTurnIn);
- _worldPacket << int32(LearnSpells.size());
+ _worldPacket << uint32(LearnSpells.size());
_worldPacket << Rewards; // WorldPackets::Quest::QuestRewards
_worldPacket << int32(DescEmotes.size());
_worldPacket << int32(Objectives.size());
+ _worldPacket << int32(QuestStartItemID);
for (int32 spell : LearnSpells)
_worldPacket << int32(spell);
@@ -374,6 +384,8 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
_worldPacket.WriteBit(DisplayPopup);
_worldPacket.WriteBit(StartCheat);
_worldPacket.WriteBit(AutoLaunched);
+ _worldPacket.WriteBit(CanIgnoreQuest);
+ _worldPacket.WriteBit(IsQuestIgnored);
_worldPacket.FlushBits();
_worldPacket.WriteString(QuestTitle);
@@ -406,6 +418,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write()
{
_worldPacket << int32(obj.ObjectID);
_worldPacket << int32(obj.Amount);
+ _worldPacket << uint32(obj.Flags);
}
for (QuestCurrency const& cur : Currency)
@@ -415,6 +428,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write()
}
_worldPacket.WriteBit(AutoLaunched);
+ _worldPacket.WriteBit(CanIgnoreQuest);
_worldPacket.FlushBits();
_worldPacket.WriteBits(QuestTitle.size(), 9);
@@ -458,6 +472,9 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestList::Write()
_worldPacket << uint32(GreetEmoteDelay);
_worldPacket << uint32(GreetEmoteType);
_worldPacket << uint32(GossipTexts.size());
+ _worldPacket.WriteBits(Greeting.size(), 11);
+ _worldPacket.FlushBits();
+
for (GossipTextData const& gossip : GossipTexts)
{
_worldPacket << uint32(gossip.QuestID);
@@ -466,13 +483,12 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestList::Write()
_worldPacket << uint32(gossip.QuestFlags);
_worldPacket << uint32(gossip.QuestFlagsEx);
_worldPacket.WriteBit(gossip.Repeatable);
+ _worldPacket.WriteBit(gossip.IsQuestIgnored);
_worldPacket.WriteBits(gossip.QuestTitle.size(), 9);
_worldPacket.FlushBits();
_worldPacket.WriteString(gossip.QuestTitle);
}
- _worldPacket.WriteBits(Greeting.size(), 11);
- _worldPacket.FlushBits();
_worldPacket.WriteString(Greeting);
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index b321b4076a5..2585c2f871c 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -121,10 +121,13 @@ namespace WorldPackets
int32 RewardMoneyDifficulty = 0;
float RewardMoneyMultiplier = 1.0f;
int32 RewardBonusMoney = 0;
- int32 RewardDisplaySpell = 0; // reward spell, this spell will be displayed (icon)
+ int32 RewardDisplaySpell[QUEST_REWARD_DISPLAY_SPELL_COUNT] = {}; // reward spell, this spell will be displayed (icon)
int32 RewardSpell = 0;
int32 RewardHonor = 0;
float RewardKillHonor = 0.0f;
+ int32 RewardArtifactXPDifficulty = 0;
+ float RewardArtifactXPMultiplier = 0.0f;
+ int32 RewardArtifactCategoryID = 0;
int32 StartItem = 0;
uint32 Flags = 0;
uint32 FlagsEx = 0;
@@ -138,7 +141,6 @@ namespace WorldPackets
std::string QuestDescription;
std::string AreaDescription;
int32 RewardTitle = 0; // new 2.4.0, player gets this title (id from CharTitles)
- int32 RewardTalents = 0;
int32 RewardArenaPoints = 0;
int32 RewardSkillLineID = 0; // reward skill id
int32 RewardNumSkillUps = 0; // reward skill points
@@ -154,6 +156,7 @@ namespace WorldPackets
int32 CompleteSoundKitID = 0;
int32 AreaGroupID = 0;
int32 TimeAllowed = 0;
+ int32 QuestRewardID = 0;
std::vector<QuestObjective> Objectives;
int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = {};
int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = {};
@@ -163,6 +166,7 @@ namespace WorldPackets
int32 RewardFactionID[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = {};
+ int32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 RewardCurrencyID[QUEST_REWARD_CURRENCY_COUNT] = {};
int32 RewardCurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = {};
};
@@ -217,21 +221,25 @@ namespace WorldPackets
int32 ItemCount = 0;
int32 Money = 0;
int32 XP = 0;
+ int32 ArtifactXP = 0;
+ int32 Honor = 0;
int32 Title = 0;
- int32 Talents = 0;
int32 FactionFlags = 0;
- int32 SpellCompletionDisplayID = 0;
+ int32 SpellCompletionDisplayID[QUEST_REWARD_DISPLAY_SPELL_COUNT] = {};
int32 SpellCompletionID = 0;
int32 SkillLineID = 0;
int32 NumSkillUps = 0;
+ int32 RewardID = 0;
QuestChoiceItem ChoiceItems[QUEST_REWARD_CHOICES_COUNT];
int32 ItemID[QUEST_REWARD_ITEM_COUNT] = {};
int32 ItemQty[QUEST_REWARD_ITEM_COUNT] = {};
int32 FactionID[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 FactionValue[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 FactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = {};
+ int32 FactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = {};
int32 CurrencyID[QUEST_REWARD_CURRENCY_COUNT] = {};
int32 CurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = {};
+ bool IsBoostSpell = false;
};
struct QuestDescEmote
@@ -291,14 +299,15 @@ namespace WorldPackets
WorldPacket const* Write() override;
- bool UseQuestReward = false;
+ int32 QuestID = 0;
+ int32 XPReward = 0;
+ int64 MoneyReward = 0;
int32 SkillLineIDReward = 0;
- int32 MoneyReward = 0;
int32 NumSkillUpsReward = 0;
- int32 XPReward = 0;
- int32 QuestID = 0;
- int32 TalentReward = 0;
- bool LaunchGossip = 0;
+ bool UseQuestReward = false;
+ bool LaunchGossip = false;
+ bool LaunchQuest = false;
+ bool HideChatMessage = false;
WorldPackets::Item::ItemInstance ItemReward;
};
@@ -341,6 +350,7 @@ namespace WorldPackets
std::vector<int32> LearnSpells;
int32 PortraitTurnIn = 0;
int32 PortraitGiver = 0;
+ int32 QuestStartItemID = 0;
std::string PortraitGiverText;
std::string PortraitGiverName;
std::string PortraitTurnInText;
@@ -351,13 +361,16 @@ namespace WorldPackets
bool DisplayPopup = false;
bool StartCheat = false;
bool AutoLaunched = false;
+ bool CanIgnoreQuest = false;
+ bool IsQuestIgnored = false;
};
struct QuestObjectiveCollect
{
- QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0) : ObjectID(objectID), Amount(amount) { }
+ QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0, uint32 flags = 0) : ObjectID(objectID), Amount(amount), Flags(flags) { }
int32 ObjectID;
int32 Amount;
+ uint32 Flags;
};
struct QuestCurrency
@@ -388,6 +401,7 @@ namespace WorldPackets
uint32 QuestFlags[2] = {};
std::string QuestTitle;
std::string CompletionText;
+ bool CanIgnoreQuest = false;
};
class QuestGiverRequestReward final : public ClientPacket
@@ -437,14 +451,15 @@ namespace WorldPackets
struct GossipTextData
{
- GossipTextData(uint32 questID, uint32 questType, uint32 questLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, std::string questTitle) :
- QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestFlags(questFlags), QuestFlagsEx(questFlagsEx), Repeatable(repeatable), QuestTitle(questTitle) { }
+ GossipTextData(uint32 questID, uint32 questType, uint32 questLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, bool ignored, std::string questTitle) :
+ QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestFlags(questFlags), QuestFlagsEx(questFlagsEx), Repeatable(repeatable), IsQuestIgnored(ignored), QuestTitle(questTitle) { }
uint32 QuestID;
uint32 QuestType;
uint32 QuestLevel;
uint32 QuestFlags;
uint32 QuestFlagsEx;
bool Repeatable;
+ bool IsQuestIgnored;
std::string QuestTitle;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index f6a5f035732..811c8eb067d 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1513,19 +1513,19 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PET_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_IGNORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);