diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-06-24 23:12:03 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-06-24 23:12:03 +0200 |
commit | 2ad96f06f03d8319daf4b142f5b343081133e939 (patch) | |
tree | 8006113fe32dfc806dd84a8c8717e45ff6bc601e | |
parent | 103a6998fc2cefa6976ef5b148fac5d38828114f (diff) |
Core/PacketIO: Updated quest packets
-rw-r--r-- | sql/updates/world/2016_xx_xx_xx_world_legion_02.sql | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 69 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.cpp | 141 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 15 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 104 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 41 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 12 |
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); |