aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-10-04 18:50:21 +0200
committerShauren <shauren.trinity@gmail.com>2018-11-05 00:00:34 +0100
commit0a779bd791fb63b2fc1663206279c7eaa9c02c6f (patch)
treecf13cec2eaab909646f278242981dd51349fddfd
parent7512ffb0587eccd8fbb2a2841900d572056dbae3 (diff)
Core/PacketIO: Updated packet structures to 8.0.1
-rw-r--r--sql/updates/hotfixes/master/2018_10_16_00_hotfixes.sql27
-rw-r--r--sql/updates/world/master/2018_10_16_00_world.sql104
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp7
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h4
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp4
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp5
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp16
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h34
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp36
-rw-r--r--src/server/game/DataStores/DB2Stores.h5
-rw-r--r--src/server/game/DataStores/DB2Structure.h17
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp19
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp3
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h12
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp7
-rw-r--r--src/server/game/Entities/Conversation/Conversation.h9
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp8
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp11
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h49
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp161
-rw-r--r--src/server/game/Entities/Object/Object.h31
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp1
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h56
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h23
-rw-r--r--src/server/game/Entities/Player/Player.cpp91
-rw-r--r--src/server/game/Entities/Player/Player.h20
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp80
-rw-r--r--src/server/game/Entities/Unit/Unit.h11
-rw-r--r--src/server/game/Globals/AreaTriggerDataStore.cpp13
-rw-r--r--src/server/game/Globals/ConversationDataStore.cpp7
-rw-r--r--src/server/game/Globals/ConversationDataStore.h3
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp172
-rw-r--r--src/server/game/Globals/ObjectMgr.h17
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp3
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp3
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp6
-rw-r--r--src/server/game/Handlers/DuelHandler.cpp2
-rw-r--r--src/server/game/Handlers/InspectHandler.cpp4
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp29
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp6
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h289
-rw-r--r--src/server/game/Quests/QuestDef.cpp155
-rw-r--r--src/server/game/Quests/QuestDef.h26
-rw-r--r--src/server/game/Scenarios/ScenarioMgr.cpp37
-rw-r--r--src/server/game/Scenarios/ScenarioMgr.h15
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.h2
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.h13
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h3
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp10
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h6
-rw-r--r--src/server/game/Server/Packets/CalendarPackets.cpp73
-rw-r--r--src/server/game/Server/Packets/CalendarPackets.h17
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h25
-rw-r--r--src/server/game/Server/Packets/ChatPackets.cpp17
-rw-r--r--src/server/game/Server/Packets/ChatPackets.h7
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.cpp63
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.h13
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.cpp40
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.h16
-rw-r--r--src/server/game/Server/Packets/CombatPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/CombatPackets.h4
-rw-r--r--src/server/game/Server/Packets/DuelPackets.cpp1
-rw-r--r--src/server/game/Server/Packets/DuelPackets.h1
-rw-r--r--src/server/game/Server/Packets/EquipmentSetPackets.h4
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h2
-rw-r--r--src/server/game/Server/Packets/GuildFinderPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/GuildFinderPackets.h2
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp168
-rw-r--r--src/server/game/Server/Packets/GuildPackets.h12
-rw-r--r--src/server/game/Server/Packets/InspectPackets.cpp18
-rw-r--r--src/server/game/Server/Packets/InspectPackets.h11
-rw-r--r--src/server/game/Server/Packets/InstancePackets.cpp32
-rw-r--r--src/server/game/Server/Packets/InstancePackets.h8
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/LFGPackets.cpp13
-rw-r--r--src/server/game/Server/Packets/LFGPackets.h26
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp3
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h5
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp44
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h12
-rw-r--r--src/server/game/Server/Packets/NPCPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h7
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h5
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp27
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h29
-rw-r--r--src/server/game/Server/Packets/PetPackets.cpp13
-rw-r--r--src/server/game/Server/Packets/PetPackets.h2
-rw-r--r--src/server/game/Server/Packets/PetitionPackets.cpp41
-rw-r--r--src/server/game/Server/Packets/PetitionPackets.h2
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp58
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h32
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp26
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h15
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.h2
-rw-r--r--src/server/game/Server/Packets/ScenarioPackets.cpp3
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp25
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h12
-rw-r--r--src/server/game/Server/Packets/SystemPackets.cpp21
-rw-r--r--src/server/game/Server/Packets/SystemPackets.h21
-rw-r--r--src/server/game/Server/Packets/TalentPackets.cpp30
-rw-r--r--src/server/game/Server/Packets/TalentPackets.h12
-rw-r--r--src/server/game/Server/Packets/TaxiPackets.h2
-rw-r--r--src/server/game/Server/Packets/TicketPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/TicketPackets.h7
-rw-r--r--src/server/game/Server/Packets/TotemPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/TotemPackets.h2
-rw-r--r--src/server/game/Server/Packets/TransmogrificationPackets.cpp4
-rw-r--r--src/server/game/Server/Packets/WhoPackets.cpp4
-rw-r--r--src/server/game/Server/Packets/WorldStatePackets.cpp8
-rw-r--r--src/server/game/Server/Packets/WorldStatePackets.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h6
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/Server/WorldSocket.cpp7
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp11
-rw-r--r--src/server/game/Spells/SpellEffects.cpp3
-rw-r--r--src/server/game/Spells/SpellMgr.h2
-rw-r--r--src/server/shared/Packets/ByteBuffer.h23
127 files changed, 1820 insertions, 1056 deletions
diff --git a/sql/updates/hotfixes/master/2018_10_16_00_hotfixes.sql b/sql/updates/hotfixes/master/2018_10_16_00_hotfixes.sql
new file mode 100644
index 00000000000..88498a167dc
--- /dev/null
+++ b/sql/updates/hotfixes/master/2018_10_16_00_hotfixes.sql
@@ -0,0 +1,27 @@
+--
+-- Table structure for table `animation_data`
+--
+DROP TABLE IF EXISTS `animation_data`;
+CREATE TABLE `animation_data` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Fallback` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `BehaviorTier` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `BehaviorID` int(11) NOT NULL DEFAULT '0',
+ `Flags1` int(11) NOT NULL DEFAULT '0',
+ `Flags2` int(11) NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `num_talents_at_level`
+--
+DROP TABLE IF EXISTS `num_talents_at_level`;
+CREATE TABLE `num_talents_at_level` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `NumTalents` int(11) NOT NULL DEFAULT '0',
+ `NumTalentsDeathKnight` int(11) NOT NULL DEFAULT '0',
+ `NumTalentsDemonHunter` int(11) NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/sql/updates/world/master/2018_10_16_00_world.sql b/sql/updates/world/master/2018_10_16_00_world.sql
new file mode 100644
index 00000000000..8a747a34db2
--- /dev/null
+++ b/sql/updates/world/master/2018_10_16_00_world.sql
@@ -0,0 +1,104 @@
+ALTER TABLE `conversation_template` ADD `TextureKitId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LastLineEndTime`;
+ALTER TABLE `gameobject_template` ADD `Data33` int(11) NOT NULL DEFAULT '0' AFTER `Data32`;
+ALTER TABLE `playerchoice` ADD `KeepOpenAfterChoice` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HideWarboardHeader`;
+ALTER TABLE `playerchoice_response`
+ ADD `Flags` int(11) NOT NULL DEFAULT '0' AFTER `ChoiceArtFileId`,
+ ADD `WidgetSetID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags`,
+ ADD `GroupID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `WidgetSetID`;
+
+ALTER TABLE `quest_poi`
+ ADD `UiMapID` int(11) DEFAULT NULL AFTER `MapID`,
+ CHANGE `WoDUnk1` `SpawnTrackingID` int(11) NOT NULL DEFAULT '0' AFTER `PlayerConditionID`;
+
+ALTER TABLE `quest_template`
+ ADD `ScalingFactionGroup` int(11) NOT NULL DEFAULT '0' AFTER `QuestLevel`,
+ ADD `FlagsEx2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FlagsEx`,
+ ADD `PortraitGiverMount` int(11) NOT NULL DEFAULT '0' AFTER `PortraitGiver`,
+ CHANGE `QuestRewardID` `TreasurePickerID` int(11) NOT NULL DEFAULT '0' AFTER `AllowableRaces`;
+
+ALTER TABLE `scenario_poi` ADD `UiMapID` int(11) DEFAULT NULL AFTER `MapID`;
+
+DROP TABLE IF EXISTS `world_map_area_to_ui_map`;
+CREATE TABLE `world_map_area_to_ui_map` (
+ `WorldMapAreaID` int(11) NOT NULL,
+ `Floor` int(11) NOT NULL,
+ `UiMapID` int(11) DEFAULT NULL,
+ PRIMARY KEY (`WorldMapAreaID`,`Floor`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+INSERT INTO `world_map_area_to_ui_map` VALUES
+(4,0,1),(4,8,2),(4,10,3),(4,11,4),(4,12,5),(4,19,6),(9,0,7),(9,6,8),(9,7,9),(11,0,10),(11,20,11),(13,0,12),(14,0,13),(16,0,14),(17,0,15),(17,18,16),(19,0,17),(20,0,18),(20,13,19),(20,25,20),
+(21,0,21),(22,0,22),(23,0,23),(23,20,24),(24,0,25),(26,0,26),(27,0,27),(27,6,28),(27,7,29),(27,10,30),(27,11,31),(28,0,32),(28,14,33),(28,15,34),(28,16,35),(29,0,36),(30,0,37),(30,1,38),(30,2,39),(30,19,40),
+(30,21,41),(32,0,42),(32,22,43),(32,23,44),(32,24,45),(32,27,46),(34,0,47),(35,0,48),(36,0,49),(37,0,50),(38,0,51),(39,0,52),(39,4,53),(39,5,54),(39,17,55),(40,0,56),(41,0,57),(41,2,58),(41,3,59),(41,4,60),
+(41,5,61),(42,0,62),(43,0,63),(61,0,64),(81,0,65),(101,0,66),(101,21,67),(101,22,68),(121,0,69),(141,0,70),(161,0,71),(161,15,72),(161,16,73),(161,17,74),(161,18,75),(181,0,76),(182,0,77),(201,0,78),(201,14,79),(241,0,80),
+(261,0,81),(261,13,82),(281,0,83),(301,0,84),(321,0,85),(321,1,86),(341,0,87),(362,0,88),(381,0,89),(382,0,90),(401,0,91),(443,0,92),(461,0,93),(462,0,94),(463,0,95),(463,1,96),(464,0,97),(464,2,98),(464,3,99),(465,0,100),
+(466,0,101),(467,0,102),(471,0,103),(473,0,104),(475,0,105),(476,0,106),(477,0,107),(478,0,108),(479,0,109),(480,0,110),(481,0,111),(482,0,112),(485,0,113),(486,0,114),(488,0,115),(490,0,116),(491,0,117),(492,0,118),(493,0,119),(495,0,120),
+(496,0,121),(499,0,122),(501,0,123),(502,0,124),(504,1,125),(504,2,126),(510,0,127),(512,0,128),(520,1,129),(521,0,130),(521,1,131),(522,1,132),(523,1,133),(523,2,134),(523,3,135),(524,1,136),(524,2,137),(525,1,138),(525,2,139),(526,1,140),
+(527,1,141),(528,0,142),(528,1,143),(528,2,144),(528,3,145),(528,4,146),(529,0,147),(529,1,148),(529,2,149),(529,3,150),(529,4,151),(529,5,152),(530,0,153),(530,1,154),(531,0,155),(532,1,156),(533,1,157),(533,2,158),(533,3,159),(534,1,160),
+(534,2,161),(535,1,162),(535,2,163),(535,3,164),(535,4,165),(535,5,166),(535,6,167),(536,1,168),(540,0,169),(541,0,170),(542,1,171),(543,1,172),(543,2,173),(544,0,174),(544,1,175),(544,2,176),(544,3,177),(544,4,178),(545,0,179),(545,1,180),
+(545,2,181),(545,3,182),(601,1,183),(602,0,184),(603,1,185),(604,1,186),(604,2,187),(604,3,188),(604,4,189),(604,5,190),(604,6,191),(604,7,192),(604,8,193),(605,0,194),(605,5,195),(605,6,196),(605,7,197),(606,0,198),(607,0,199),(609,0,200),
+(610,0,201),(611,0,202),(613,0,203),(614,0,204),(615,0,205),(626,0,206),(640,0,207),(640,1,208),(640,2,209),(673,0,210),(680,1,213),(684,0,217),(685,0,218),(686,0,219),(687,1,220),(688,1,221),(688,2,222),(688,3,223),(689,0,224),(690,1,225),
+(691,1,226),(691,2,227),(691,3,228),(691,4,229),(692,1,230),(692,2,231),(696,1,232),(697,0,233),(699,0,234),(699,1,235),(699,2,236),(699,3,237),(699,4,238),(699,5,239),(699,6,240),(700,0,241),(704,1,242),(704,2,243),(708,0,244),(709,0,245),
+(710,1,246),(717,0,247),(718,1,248),(720,0,249),(721,1,250),(721,2,251),(721,3,252),(721,4,253),(721,5,254),(721,6,255),(722,1,256),(722,2,257),(723,1,258),(723,2,259),(724,1,260),(725,1,261),(726,1,262),(727,1,263),(727,2,264),(728,1,265),
+(729,1,266),(730,1,267),(730,2,268),(731,1,269),(731,2,270),(731,3,271),(732,1,272),(733,0,273),(734,0,274),(736,0,275),(737,0,276),(747,0,277),(749,1,279),(750,1,280),(750,2,281),(752,1,282),(753,1,283),(753,2,284),(754,1,285),(754,2,286),
+(755,1,287),(755,2,288),(755,3,289),(755,4,290),(756,1,291),(756,2,292),(757,1,293),(758,1,294),(758,2,295),(758,3,296),(759,1,297),(759,2,298),(759,3,299),(760,1,300),(761,1,301),(762,1,302),(762,2,303),(762,3,304),(762,4,305),(763,1,306),
+(763,2,307),(763,3,308),(763,4,309),(764,1,310),(764,2,311),(764,3,312),(764,4,313),(764,5,314),(764,6,315),(764,7,316),(765,1,317),(765,2,318),(766,1,319),(766,2,320),(766,3,321),(767,1,322),(767,2,323),(768,1,324),(769,1,325),(772,0,327),
+(773,1,328),(775,0,329),(776,1,330),(779,1,331),(780,1,332),(781,0,333),(782,1,334),(789,0,335),(789,1,336),(793,0,337),(795,0,338),(796,0,339),(796,1,340),(796,2,341),(796,3,342),(796,4,343),(796,5,344),(796,6,345),(796,7,346),(797,1,347),
+(798,1,348),(798,2,349),(799,1,350),(799,2,351),(799,3,352),(799,4,353),(799,5,354),(799,6,355),(799,7,356),(799,8,357),(799,9,358),(799,10,359),(799,11,360),(799,12,361),(799,13,362),(799,14,363),(799,15,364),(799,16,365),(799,17,366),(800,0,367),
+(800,1,368),(800,2,369),(803,1,370),(806,0,371),(806,6,372),(806,7,373),(806,15,374),(806,16,375),(807,0,376),(807,14,377),(808,0,378),(809,0,379),(809,8,380),(809,9,381),(809,10,382),(809,11,383),(809,12,384),(809,17,385),(809,20,386),(809,21,387),
+(810,0,388),(810,13,389),(811,0,390),(811,1,391),(811,2,392),(811,3,393),(811,4,394),(811,18,395),(811,19,396),(813,0,397),(816,0,398),(819,0,399),(819,1,400),(820,0,401),(820,1,402),(820,2,403),(820,3,404),(820,4,405),(820,5,406),(823,0,407),
+(823,1,408),(824,0,409),(824,1,410),(824,2,411),(824,3,412),(824,4,413),(824,5,414),(824,6,415),(851,0,416),(856,0,417),(857,0,418),(857,1,419),(857,2,420),(857,3,421),(858,0,422),(860,1,423),(862,0,424),(864,0,425),(864,3,426),(866,0,427),
+(866,9,428),(867,1,429),(867,2,430),(871,1,431),(871,2,432),(873,0,433),(873,5,434),(874,1,435),(874,2,436),(875,1,437),(875,2,438),(876,1,439),(876,2,440),(876,3,441),(876,4,442),(877,0,443),(877,1,444),(877,2,445),(877,3,446),(878,0,447),
+(880,0,448),(881,0,449),(882,0,450),(883,0,451),(884,0,452),(885,1,453),(885,2,454),(885,3,455),(886,0,456),(887,0,457),(887,1,458),(887,2,459),(888,0,460),(889,0,461),(890,0,462),(891,0,463),(891,9,464),(892,0,465),(892,12,466),(893,0,467),
+(894,0,468),(895,0,469),(895,8,470),(896,1,471),(896,2,472),(896,3,473),(897,1,474),(897,2,475),(898,1,476),(898,2,477),(898,3,478),(898,4,479),(899,1,480),(900,1,481),(900,2,482),(906,0,483),(911,0,486),(912,0,487),(914,0,488),(914,1,489),
+(919,0,490),(919,1,491),(919,2,492),(919,3,493),(919,4,494),(919,5,495),(919,6,496),(919,7,497),(920,0,498),(922,1,499),(922,2,500),(924,1,501),(924,2,502),(925,1,503),(928,0,504),(928,1,505),(928,2,506),(929,0,507),(930,1,508),(930,2,509),
+(930,3,510),(930,4,511),(930,5,512),(930,6,513),(930,7,514),(930,8,515),(933,0,516),(933,1,517),(934,1,518),(935,0,519),(937,0,520),(937,1,521),(938,1,522),(939,0,523),(940,0,524),(941,0,525),(941,1,526),(941,2,527),(941,3,528),(941,4,529),
+(941,6,530),(941,7,531),(941,8,532),(941,9,533),(945,0,534),(946,0,535),(946,13,536),(946,14,537),(946,30,538),(947,0,539),(947,15,540),(947,22,541),(948,0,542),(949,0,543),(949,16,544),(949,17,545),(949,18,546),(949,19,547),(949,20,548),(949,21,549),
+(950,0,550),(950,10,551),(950,11,552),(950,12,553),(951,0,554),(951,22,555),(953,0,556),(953,1,557),(953,2,558),(953,3,559),(953,4,560),(953,5,561),(953,6,562),(953,7,563),(953,8,564),(953,9,565),(953,10,566),(953,11,567),(953,12,568),(953,13,569),
+(953,14,570),(955,0,571),(962,0,572),(964,1,573),(969,1,574),(969,2,575),(969,3,576),(970,0,577),(970,1,578),(971,23,579),(971,24,580),(971,25,581),(973,0,582),(976,26,585),(976,27,586),(976,28,587),(978,0,588),(978,29,589),(980,0,590),(983,0,592),
+(984,1,593),(986,0,594),(987,1,595),(988,1,596),(988,2,597),(988,3,598),(988,4,599),(988,5,600),(989,1,601),(989,2,602),(993,1,606),(993,2,607),(993,3,608),(993,4,609),(994,0,610),(994,1,611),(994,2,612),(994,3,613),(994,4,614),(994,5,615),
+(995,1,616),(995,2,617),(995,3,618),(1007,0,619),(1008,0,620),(1008,1,621),(1009,0,622),(1010,0,623),(1011,0,624),(1014,0,625),(1014,4,626),(1014,10,627),(1014,11,628),(1014,12,629),(1015,0,630),(1015,17,631),(1015,18,632),(1015,19,633),(1017,0,634),(1017,1,635),
+(1017,9,636),(1017,25,637),(1017,26,638),(1017,27,639),(1017,28,640),(1018,0,641),(1018,13,642),(1018,14,643),(1018,15,644),(1020,0,645),(1021,0,646),(1021,1,647),(1021,2,648),(1022,0,649),(1024,0,650),
+(1024,5,651),(1024,6,652),(1024,8,653),(1024,16,654),(1024,20,655),(1024,21,656),(1024,29,657),(1024,30,658),(1024,31,659),(1024,40,660),(1026,0,661),(1026,1,662),(1026,2,663),(1026,3,664),(1026,4,665),
+(1026,5,666),(1026,6,667),(1026,7,668),(1026,8,669),(1026,9,670),(1027,0,671),(1028,0,672),(1028,1,673),(1028,2,674),(1028,3,675),(1031,0,676),(1032,1,677),(1032,2,678),(1032,3,679),(1033,0,680),
+(1033,22,681),(1033,23,682),(1033,24,683),(1033,32,684),(1033,33,685),(1033,34,686),(1033,35,687),(1033,36,688),(1033,37,689),(1033,38,690),(1033,39,691),(1033,41,692),(1033,42,693),(1034,0,694),
+(1035,1,695),(1037,0,696),(1038,0,697),(1039,1,698),(1039,2,699),(1039,3,700),(1039,4,701),(1040,1,702),(1041,0,703),(1041,1,704),(1041,2,705),(1042,0,706),(1042,1,707),(1042,2,708),(1044,0,709),
+(1045,1,710),(1045,2,711),(1045,3,712),(1046,0,713),(1047,0,714),(1048,0,715),(1049,1,716),(1050,0,717),(1051,0,718),(1052,0,719),(1052,1,720),(1052,2,721),(1054,1,723),(1056,0,725),(1057,0,726),
+(1059,0,728),(1060,1,729),(1065,0,731),(1066,1,732),(1067,0,733),(1068,1,734),(1068,2,735),(1069,1,736),(1070,1,737),(1071,0,738),(1072,0,739),(1073,1,740),(1073,2,741),(1075,1,742),(1075,2,743),
+(1076,1,744),(1076,2,745),(1076,3,746),(1077,0,747),(1078,0,748),(1079,1,749),(1080,0,750),(1081,1,751),(1081,2,752),(1081,3,753),(1081,4,754),(1081,5,755),(1081,6,756),(1082,0,757),(1084,0,758),
+(1085,1,759),(1086,0,760),(1087,0,761),(1087,1,762),(1087,2,763),(1088,1,764),(1088,2,765),(1088,3,766),(1088,4,767),(1088,5,768),(1088,6,769),(1088,7,770),(1088,8,771),(1088,9,772),(1090,0,773),
+(1090,1,774),(1091,0,775),(1092,0,776),(1094,1,777),(1094,2,778),(1094,3,779),(1094,4,780),(1094,5,781),(1094,6,782),(1094,7,783),(1094,8,784),(1094,9,785),(1094,10,786),(1094,11,787),(1094,12,788),
+(1094,13,789),(1096,0,790),(1097,1,791),(1097,2,792),(1099,0,793),(1100,1,794),(1100,2,795),(1100,3,796),(1100,4,797),(1102,1,798),(1104,0,799),(1104,1,800),(1104,2,801),(1104,3,802),(1104,4,803),
+(1105,1,804),(1105,2,805),(1114,0,806),(1114,1,807),(1114,2,808),(1115,1,809),(1115,2,810),(1115,3,811),(1115,4,812),(1115,5,813),(1115,6,814),(1115,7,815),(1115,8,816),(1115,9,817),(1115,10,818),
+(1115,11,819),(1115,12,820),(1115,13,821),(1115,14,822),(1116,0,823),(1126,0,824),(1127,1,825),(1129,1,826),(1130,1,827),(1131,1,828),(1132,1,829),(1135,0,830),(1135,1,831),(1135,2,832),(1135,7,833),
+(1136,0,834),(1137,1,835),(1137,2,836),(1139,0,837),(1140,0,838),(1142,1,839),(1143,1,840),(1143,2,841),(1143,3,842),(1144,0,843),(1145,0,844),(1146,1,845),(1146,2,846),(1146,3,847),(1146,4,848),
+(1146,5,849),(1147,1,850),(1147,2,851),(1147,3,852),(1147,4,853),(1147,5,854),(1147,6,855),(1147,7,856),(1148,1,857),(1149,0,858),(1150,0,859),(1151,0,860),(1152,0,861),(1153,0,862),(1154,0,863),
+(1155,0,864),(1156,1,865),(1156,2,866),(1157,1,867),(1158,1,868),(1159,1,869),(1159,2,870),(1160,0,871),(1161,0,872),(1161,1,873),(1161,2,874),(1162,0,875),(1163,0,876),(1164,0,877),(1165,0,878),
+(1165,1,879),(1165,2,880),(1166,1,881),(1170,0,882),(1170,3,883),(1170,4,884),(1171,0,885),(1171,5,886),(1171,6,887),(1172,1,888),(1173,1,889),(1173,2,890),(1174,0,891),(1174,1,892),(1174,2,893),
+(1174,3,894),(1175,0,895),(1176,0,896),(1177,0,897),(1177,1,898),(1177,2,899),(1177,3,900),(1177,4,901),(1177,5,902),(1178,0,903),(1183,0,904),(1184,0,905),(1185,0,906),(1186,0,907),(1187,0,908),
+(1188,0,909),(1188,1,910),(1188,2,911),(1188,3,912),(1188,4,913),(1188,5,914),(1188,6,915),(1188,7,916),(1188,8,917),(1188,9,918),(1188,10,919),(1188,11,920),(1190,0,921),(1191,0,922),(1192,0,923),
+(1193,0,924),(1194,0,925),(1195,0,926),(1196,0,927),(1197,0,928),(1198,0,929),(1199,0,930),(1200,0,931),(1201,0,932),(1202,0,933),(1204,1,934),(1204,2,935),(1205,0,936),(1210,0,938),(1211,0,939),
+(1212,1,940),(1212,2,941),(1213,0,942),(1214,0,943),(1215,0,971),(1216,0,972),(1217,1,973),(1219,0,974),(1219,1,975),(1219,2,976),(1219,3,977),(1219,4,978),(1219,5,979),(1219,6,980),(1220,0,981),
+(32,21,42),(974,0,582),(1121,0,646),(992,0,17),(981,0,590),(991,0,582),(990,0,590),(975,0,582),(910,0,418),(910,1,419),(910,2,420),(910,3,421),(907,0,70),(905,4,394),(321,2,85),(510,1,127),(522,0,132);
+
+UPDATE `quest_poi` SET `UiMapID`=(SELECT wma.`UiMapID` FROM `world_map_area_to_ui_map` wma WHERE wma.`WorldMapAreaID`=`quest_poi`.`WorldMapAreaID` AND wma.`Floor`=`quest_poi`.`Floor`);
+UPDATE `scenario_poi` SET `UiMapID`=(SELECT wma.`UiMapID` FROM `world_map_area_to_ui_map` wma WHERE wma.`WorldMapAreaID`=`scenario_poi`.`WorldMapAreaID` AND wma.`Floor`=`scenario_poi`.`Floor`);
+
+DROP TABLE IF EXISTS `world_map_area_to_ui_map`;
+
+DELETE FROM `quest_poi` WHERE `UiMapID` IS NULL;
+DELETE FROM `scenario_poi` WHERE `UiMapID` IS NULL;
+
+ALTER TABLE `quest_poi`
+ CHANGE `UiMapID` `UiMapID` int(11) NOT NULL DEFAULT '0' AFTER `MapID`,
+ DROP `WorldMapAreaID`,
+ DROP `Floor`;
+
+ALTER TABLE `scenario_poi`
+ CHANGE `UiMapID` `UiMapID` int(11) NOT NULL DEFAULT '0' AFTER `MapID`,
+ DROP `WorldMapAreaID`,
+ DROP `Floor`;
+
+ALTER TABLE `spell_areatrigger`
+ ADD `AnimId` int(11) NOT NULL DEFAULT '0' AFTER `FacingCurveId`,
+ ADD `AnimKitId` int(11) NOT NULL DEFAULT '0' AFTER `AnimId`;
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index a0646a0b1c1..967104b65cf 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -36,6 +36,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"Points, Flags, UiOrder, IconFileID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH);
+ // AnimationData.db2
+ PrepareStatement(HOTFIX_SEL_ANIMATION_DATA, "SELECT ID, Fallback, BehaviorTier, BehaviorID, Flags1, Flags2 FROM animation_data ORDER BY ID DESC", CONNECTION_SYNCH);
+
// AnimKit.db2
PrepareStatement(HOTFIX_SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -684,6 +687,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// NamesReservedLocale.db2
PrepareStatement(HOTFIX_SEL_NAMES_RESERVED_LOCALE, "SELECT ID, Name, LocaleMask FROM names_reserved_locale ORDER BY ID DESC", CONNECTION_SYNCH);
+ // NumTalentsAtLevel.db2
+ PrepareStatement(HOTFIX_SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level"
+ " ORDER BY ID DESC", CONNECTION_SYNCH);
+
// OverrideSpellData.db2
PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, Spells1, Spells2, Spells3, Spells4, Spells5, Spells6, Spells7, Spells8, Spells9, "
"Spells10, PlayerActionBarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 655cdc376a6..ce2120cf648 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -34,6 +34,8 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_ACHIEVEMENT,
HOTFIX_SEL_ACHIEVEMENT_LOCALE,
+ HOTFIX_SEL_ANIMATION_DATA,
+
HOTFIX_SEL_ANIM_KIT,
HOTFIX_SEL_AREA_GROUP_MEMBER,
@@ -364,6 +366,8 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_NAMES_RESERVED_LOCALE,
+ HOTFIX_SEL_NUM_TALENTS_AT_LEVEL,
+
HOTFIX_SEL_OVERRIDE_SPELL_DATA,
HOTFIX_SEL_PHASE,
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index b6e6908faad..bef431b367f 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -1787,9 +1787,7 @@ bool CriteriaHandler::AdditionalRequirementsSatisfied(ModifierTreeNode const* tr
return false;
break;
case CRITERIA_ADDITIONAL_CONDITION_PRESTIGE_LEVEL: // 194
- if (!referencePlayer || referencePlayer->GetPrestigeLevel() != reqValue)
- return false;
- break;
+ return false;
default:
break;
}
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 3ddca3a7b33..e63accbb018 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -1289,9 +1289,10 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData&
{
playerData.IsInWorld = true;
playerData.PrimaryTalentTree = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID);
- playerData.PrimaryTalentTreeNameIndex = 0;
+ playerData.Sex = player->getGender();
playerData.Race = player->getRace();
- playerData.Prestige = player->GetPrestigeLevel();
+ playerData.Class = player->getClass();
+ playerData.HonorLevel = player->GetHonorLevel();
}
pvpLogData.Players.push_back(playerData);
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp
index cf4898d8099..73d6c49f7ff 100644
--- a/src/server/game/Calendar/CalendarMgr.cpp
+++ b/src/server/game/Calendar/CalendarMgr.cpp
@@ -463,6 +463,7 @@ void CalendarMgr::SendCalendarEventUpdateAlert(CalendarEvent const& calendarEven
packet.ClearPending = true; // FIXME
packet.Date = calendarEvent.GetDate();
packet.Description = calendarEvent.GetDescription();
+ packet.EventClubID = calendarEvent.GetGuildId();
packet.EventID = calendarEvent.GetEventId();
packet.EventName = calendarEvent.GetTitle();
packet.EventType = calendarEvent.GetType();
@@ -534,18 +535,15 @@ void CalendarMgr::SendCalendarEventInviteAlert(CalendarEvent const& calendarEven
packet.OwnerGuid = calendarEvent.GetOwnerGUID();
packet.Status = invite.GetStatus();
packet.TextureID = calendarEvent.GetTextureId();
-
- Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId());
- packet.EventGuildID = guild ? guild->GetGUID() : ObjectGuid::Empty;
+ packet.EventClubID = calendarEvent.GetGuildId();
if (calendarEvent.IsGuildEvent() || calendarEvent.IsGuildAnnouncement())
{
- if (guild)
+ if (Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId()))
guild->BroadcastPacket(packet.Write());
}
- else
- if (Player* player = ObjectAccessor::FindConnectedPlayer(invite.GetInviteeGUID()))
- player->SendDirectMessage(packet.Write());
+ else if (Player* player = ObjectAccessor::FindConnectedPlayer(invite.GetInviteeGUID()))
+ player->SendDirectMessage(packet.Write());
}
void CalendarMgr::SendCalendarEvent(ObjectGuid guid, CalendarEvent const& calendarEvent, CalendarSendEventType sendType)
@@ -567,9 +565,7 @@ void CalendarMgr::SendCalendarEvent(ObjectGuid guid, CalendarEvent const& calend
packet.LockDate = calendarEvent.GetLockDate(); // Always 0 ?
packet.OwnerGuid = calendarEvent.GetOwnerGUID();
packet.TextureID = calendarEvent.GetTextureId();
-
- Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId());
- packet.EventGuildID = (guild ? guild->GetGUID() : ObjectGuid::Empty);
+ packet.EventClubID = calendarEvent.GetGuildId();
for (auto const& calendarInvite : eventInviteeList)
{
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index bf831521cba..81ba8e1d6df 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -51,6 +51,24 @@ struct AchievementLoadInfo
}
};
+struct AnimationDataLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_SHORT, "Fallback" },
+ { false, FT_BYTE, "BehaviorTier" },
+ { true, FT_INT, "BehaviorID" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AnimationDataMeta::Instance(), HOTFIX_SEL_ANIMATION_DATA);
+ return &loadInfo;
+ }
+};
+
struct AnimKitLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -3384,6 +3402,22 @@ struct NamesReservedLocaleLoadInfo
}
};
+struct NumTalentsAtLevelLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "NumTalents" },
+ { true, FT_INT, "NumTalentsDeathKnight" },
+ { true, FT_INT, "NumTalentsDemonHunter" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, NumTalentsAtLevelMeta::Instance(), HOTFIX_SEL_NUM_TALENTS_AT_LEVEL);
+ return &loadInfo;
+ }
+};
+
struct OverrideSpellDataLoadInfo
{
static DB2LoadInfo const* Instance()
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 0adeac47f51..59b99139d8c 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -37,6 +37,7 @@
#endif
DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementLoadInfo::Instance());
+DB2Storage<AnimationDataEntry> sAnimationDataStore("AnimationData.db2", AnimationDataLoadInfo::Instance());
DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitLoadInfo::Instance());
DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberLoadInfo::Instance());
DB2Storage<AreaTableEntry> sAreaTableStore("AreaTable.db2", AreaTableLoadInfo::Instance());
@@ -182,6 +183,7 @@ DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", Nam
DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityLoadInfo::Instance());
DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedLoadInfo::Instance());
DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleLoadInfo::Instance());
+DB2Storage<NumTalentsAtLevelEntry> sNumTalentsAtLevelStore("NumTalentsAtLevel.db2", NumTalentsAtLevelLoadInfo::Instance());
DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataLoadInfo::Instance());
DB2Storage<PhaseEntry> sPhaseStore("Phase.db2", PhaseLoadInfo::Instance());
DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupLoadInfo::Instance());
@@ -490,6 +492,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale, store)
LOAD_DB2(sAchievementStore);
+ LOAD_DB2(sAnimationDataStore);
LOAD_DB2(sAnimKitStore);
LOAD_DB2(sAreaGroupMemberStore);
LOAD_DB2(sAreaTableStore);
@@ -634,6 +637,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sNamesProfanityStore);
LOAD_DB2(sNamesReservedStore);
LOAD_DB2(sNamesReservedLocaleStore);
+ LOAD_DB2(sNumTalentsAtLevelStore);
LOAD_DB2(sOverrideSpellDataStore);
LOAD_DB2(sPhaseStore);
LOAD_DB2(sPhaseXPhaseGroupStore);
@@ -2102,6 +2106,28 @@ ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant
return CHAR_NAME_SUCCESS;
}
+int32 DB2Manager::GetNumTalentsAtLevel(uint32 level, Classes playerClass)
+{
+ NumTalentsAtLevelEntry const* numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(level);
+ if (!numTalentsAtLevel)
+ numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(sNumTalentsAtLevelStore.GetNumRows() - 1);
+
+ if (numTalentsAtLevel)
+ {
+ switch (playerClass)
+ {
+ case CLASS_DEATH_KNIGHT:
+ return numTalentsAtLevel->NumTalentsDeathKnight;
+ case CLASS_DEMON_HUNTER:
+ return numTalentsAtLevel->NumTalentsDemonHunter;
+ default:
+ return numTalentsAtLevel->NumTalents;
+ }
+ }
+
+ return 0;
+}
+
PVPDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid, uint32 level)
{
PVPDifficultyEntry const* maxEntry = nullptr; // used for level > max listed level case
@@ -2152,6 +2178,16 @@ uint32 DB2Manager::GetRequiredLevelForPvpTalentSlot(uint8 slot, Classes class_)
return 0;
}
+int32 DB2Manager::GetPvpTalentNumSlotsAtLevel(uint32 level, Classes class_) const
+{
+ int32 slots = 0;
+ for (uint8 slot = 0; slot < MAX_PVP_TALENT_SLOTS; ++slot)
+ if (level >= GetRequiredLevelForPvpTalentSlot(slot, class_))
+ ++slots;
+
+ return slots;
+}
+
std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const
{
auto itr = _questPackages.find(questPackageID);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 46a0dee2095..06f8635c908 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -35,6 +35,7 @@
class DB2HotfixGeneratorBase;
TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore;
+TC_GAME_API extern DB2Storage<AnimationDataEntry> sAnimationDataStore;
TC_GAME_API extern DB2Storage<AnimKitEntry> sAnimKitStore;
TC_GAME_API extern DB2Storage<AreaTableEntry> sAreaTableStore;
TC_GAME_API extern DB2Storage<AreaTriggerEntry> sAreaTriggerStore;
@@ -301,12 +302,13 @@ public:
MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr) const;
MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const;
MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) const;
- std::string GetNameGenEntry(uint8 race, uint8 gender) const;
MountEntry const* GetMount(uint32 spellId) const;
MountEntry const* GetMountById(uint32 id) const;
MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const;
MountXDisplayContainer const* GetMountDisplays(uint32 mountId) const;
+ std::string GetNameGenEntry(uint8 race, uint8 gender) const;
ResponseCodes ValidateName(std::wstring const& name, LocaleConstant locale) const;
+ static int32 GetNumTalentsAtLevel(uint32 level, Classes playerClass);
std::vector<uint32> const* GetPhasesForGroup(uint32 group) const;
PowerTypeEntry const* GetPowerTypeEntry(Powers power) const;
PowerTypeEntry const* GetPowerTypeByName(std::string const& name) const;
@@ -314,6 +316,7 @@ public:
static PVPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
static PVPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id);
uint32 GetRequiredLevelForPvpTalentSlot(uint8 slot, Classes class_) const;
+ int32 GetPvpTalentNumSlotsAtLevel(uint32 level, Classes class_) const;
std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const;
std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItemsFallback(uint32 questPackageID) const;
uint32 GetQuestUniqueBitFlag(uint32 questId);
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index fa8aa435673..0c38d0fb213 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -45,6 +45,15 @@ struct AchievementEntry
int16 SharesCriteria; // referenced achievement (counting of all completed criterias)
};
+struct AnimationDataEntry
+{
+ uint32 ID;
+ uint16 Fallback;
+ uint8 BehaviorTier;
+ int32 BehaviorID;
+ int32 Flags[2];
+};
+
struct AnimKitEntry
{
uint32 ID;
@@ -2052,6 +2061,14 @@ struct NamesReservedLocaleEntry
uint8 LocaleMask;
};
+struct NumTalentsAtLevelEntry
+{
+ uint32 ID;
+ int32 NumTalents;
+ int32 NumTalentsDeathKnight;
+ int32 NumTalentsDemonHunter;
+};
+
#define MAX_OVERRIDE_SPELL 10
struct OverrideSpellDataEntry
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index b03bdab76ce..4e4e70e1b0a 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -46,7 +46,8 @@ AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr),
m_objectType |= TYPEMASK_AREATRIGGER;
m_objectTypeId = TYPEID_AREATRIGGER;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_AREATRIGGER;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.AreaTrigger = true;
m_valuesCount = AREATRIGGER_END;
_dynamicValuesCount = AREATRIGGER_DYNAMIC_END;
@@ -142,7 +143,7 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
{
AreaTriggerCircularMovementInfo cmi = GetMiscTemplate()->CircularMovementInfo;
if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED))
- cmi.TargetGUID = target->GetGUID();
+ cmi.PathTarget = target->GetGUID();
else
cmi.Center = pos;
@@ -637,12 +638,12 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> splinePoints, uint32 tim
{
if (_reachedDestination)
{
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
SendMessageToSet(reshape.Write(), true);
}
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
reshape.AreaTriggerSpline = boost::in_place();
reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement();
@@ -664,7 +665,7 @@ bool AreaTrigger::HasSplines() const
void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cmi, uint32 timeToTarget)
{
// Circular movement requires either a center position or an attached unit
- ASSERT(cmi.Center.is_initialized() || cmi.TargetGUID.is_initialized());
+ ASSERT(cmi.Center.is_initialized() || cmi.PathTarget.is_initialized());
// should be sent in object create packets only
m_uint32Values[AREATRIGGER_TIME_TO_TARGET] = timeToTarget;
@@ -676,7 +677,7 @@ void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cm
if (IsInWorld())
{
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
reshape.AreaTriggerCircularMovement = _circularMovementInfo;
@@ -691,11 +692,11 @@ bool AreaTrigger::HasCircularMovement() const
Position const* AreaTrigger::GetCircularMovementCenterPosition() const
{
- if (_circularMovementInfo.is_initialized())
+ if (!_circularMovementInfo.is_initialized())
return nullptr;
- if (_circularMovementInfo->TargetGUID.is_initialized())
- if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *_circularMovementInfo->TargetGUID))
+ if (_circularMovementInfo->PathTarget.is_initialized())
+ if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *_circularMovementInfo->PathTarget))
return center;
if (_circularMovementInfo->Center.is_initialized())
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
index 633988b17b0..431c4cc7d57 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -96,6 +96,9 @@ AreaTriggerMiscTemplate::AreaTriggerMiscTemplate()
MorphCurveId = 0;
FacingCurveId = 0;
+ AnimId = 0;
+ AnimKitId = 0;
+
DecalPropertiesId = 0;
TimeToTarget = 0;
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 35be0f40f7f..2371c65cf09 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -36,10 +36,11 @@ enum AreaTriggerFlags
AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN = 0x00010, // NYI
AREATRIGGER_FLAG_UNK1 = 0x00020,
AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW = 0x00040, // NYI
- AREATRIGGER_FLAG_UNK2 = 0x00080,
+ AREATRIGGER_FLAG_HAS_ANIM_ID = 0x00080,
AREATRIGGER_FLAG_UNK3 = 0x00100,
- AREATRIGGER_FLAG_UNK4 = 0x00200,
- AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400
+ AREATRIGGER_FLAG_HAS_ANIM_KIT_ID = 0x00200,
+ AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400,
+ AREATRIGGER_FLAG_UNK5 = 0x00800,
};
enum AreaTriggerTypes
@@ -96,7 +97,7 @@ struct AreaTriggerScaleInfo
struct AreaTriggerCircularMovementInfo
{
- Optional<ObjectGuid> TargetGUID;
+ Optional<ObjectGuid> PathTarget;
Optional<TaggedPosition<Position::XYZ>> Center;
bool CounterClockwise = false;
bool CanLoop = false;
@@ -190,6 +191,9 @@ public:
uint32 MorphCurveId;
uint32 FacingCurveId;
+ int32 AnimId;
+ int32 AnimKitId;
+
uint32 DecalPropertiesId;
uint32 TimeToTarget;
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp
index 13339f3169f..0445f8ff6bc 100644
--- a/src/server/game/Entities/Conversation/Conversation.cpp
+++ b/src/server/game/Entities/Conversation/Conversation.cpp
@@ -30,7 +30,8 @@ Conversation::Conversation() : WorldObject(false), _duration(0)
m_objectType |= TYPEMASK_CONVERSATION;
m_objectTypeId = TYPEID_CONVERSATION;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Conversation = true;
m_valuesCount = CONVERSATION_END;
_dynamicValuesCount = CONVERSATION_DYNAMIC_END;
@@ -123,13 +124,15 @@ bool Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry,
SetUInt32Value(CONVERSATION_LAST_LINE_END_TIME, conversationTemplate->LastLineEndTime);
_duration = conversationTemplate->LastLineEndTime;
+ _textureKitId = conversationTemplate->TextureKitId;
for (uint16 actorIndex = 0; actorIndex < conversationTemplate->Actors.size(); ++actorIndex)
{
if (ConversationActorTemplate const* actor = conversationTemplate->Actors[actorIndex])
{
ConversationDynamicFieldActor actorField;
- actorField.ActorTemplate = *actor;
+ actorField.ActorTemplate.CreatureId = actor->CreatureId;
+ actorField.ActorTemplate.CreatureModelId = actor->CreatureModelId;
actorField.Type = ConversationDynamicFieldActor::ActorType::CreatureActor;
SetDynamicStructuredValue(CONVERSATION_DYNAMIC_FIELD_ACTORS, actorIndex, &actorField);
}
diff --git a/src/server/game/Entities/Conversation/Conversation.h b/src/server/game/Entities/Conversation/Conversation.h
index 860264b1de8..ddc44ddfea9 100644
--- a/src/server/game/Entities/Conversation/Conversation.h
+++ b/src/server/game/Entities/Conversation/Conversation.h
@@ -47,8 +47,11 @@ struct ConversationDynamicFieldActor
union
{
ObjectGuid ActorGuid;
-
- ConversationActorTemplate ActorTemplate;
+ struct
+ {
+ uint32 CreatureId;
+ uint32 CreatureModelId;
+ } ActorTemplate;
struct
{
@@ -75,6 +78,7 @@ class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversat
void Update(uint32 diff) override;
void Remove();
int32 GetDuration() const { return _duration; }
+ uint32 GetTextureKitId() const { return _textureKitId; }
static Conversation* CreateConversation(uint32 conversationEntry, Unit* creator, Position const& pos, GuidUnorderedSet&& participants, SpellInfo const* spellInfo = nullptr);
bool Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, Map* map, Unit* creator, Position const& pos, GuidUnorderedSet&& participants, SpellInfo const* spellInfo = nullptr);
@@ -95,6 +99,7 @@ class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversat
Position _stationaryPosition;
ObjectGuid _creatorGuid;
uint32 _duration;
+ uint32 _textureKitId;
GuidUnorderedSet _participants;
};
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index a62b2ecbbc1..a2956b61cb3 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -33,7 +33,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES), m_type(type
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
m_valuesCount = CORPSE_END;
_dynamicValuesCount = CORPSE_DYNAMIC_END;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 9d4724417fe..b6d6e44a3fe 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -430,6 +430,8 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/,
SetUInt32Value(OBJECT_DYNAMIC_FLAGS, dynamicFlags);
+ SetUInt32Value(UNIT_FIELD_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
+
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
SetBaseAttackTime(BASE_ATTACK, cInfo->BaseAttackTime);
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 58c77eb63b6..89b553d0792 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -286,6 +286,7 @@ void PlayerMenu::SendPointOfInterest(uint32 id) const
}
WorldPackets::NPC::GossipPOI packet;
+ packet.ID = pointOfInterest->ID;
packet.Name = pointOfInterest->Name;
LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex();
@@ -438,6 +439,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
packet.InformUnit = _session->GetPlayer()->GetDivider();
packet.QuestID = quest->GetQuestId();
packet.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
packet.AutoLaunched = autoLaunched;
packet.DisplayPopup = displayPopup;
@@ -512,6 +514,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.QuestID = quest->GetQuestId();
packet.Info.QuestType = quest->GetQuestType();
packet.Info.QuestLevel = quest->GetQuestLevel();
+ packet.Info.QuestScalingFactionGroup = quest->GetQuestScalingFactionGroup();
packet.Info.QuestMaxScalingLevel = quest->GetQuestMaxScalingLevel();
packet.Info.QuestPackageID = quest->GetQuestPackageID();
packet.Info.QuestMinLevel = quest->GetMinLevel();
@@ -543,12 +546,14 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.StartItem = quest->GetSrcItemId();
packet.Info.Flags = quest->GetFlags();
packet.Info.FlagsEx = quest->GetFlagsEx();
+ packet.Info.FlagsEx2 = quest->GetFlagsEx2();
packet.Info.RewardTitle = quest->GetRewTitle();
packet.Info.RewardArenaPoints = quest->GetRewArenaPoints();
packet.Info.RewardSkillLineID = quest->GetRewardSkillId();
packet.Info.RewardNumSkillUps = quest->GetRewardSkillPoints();
packet.Info.RewardFactionFlags = quest->GetRewardReputationMask();
packet.Info.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.Info.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.Info.PortraitTurnIn = quest->GetQuestTurnInPortrait();
for (uint8 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
@@ -585,7 +590,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.POIPriority = quest->GetPOIPriority();
packet.Info.AllowableRaces = quest->GetAllowableRaces();
- packet.Info.QuestRewardID = quest->GetRewardId();
+ packet.Info.TreasurePickerID = quest->GetTreasurePickerId();
packet.Info.Expansion = quest->GetExpansion();
for (QuestObjective const& questObjective : quest->GetObjectives())
@@ -666,6 +671,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
packet.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.QuestPackageID = quest->GetQuestPackageID();
_session->SendPacket(packet.Write());
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index ed5e3dc043b..8ee595cb179 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -38,7 +38,7 @@ DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
m_valuesCount = DYNAMICOBJECT_END;
_dynamicValuesCount = DYNAMICOBJECT_DYNAMIC_END;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 89b59a11ab2..435ccc5c9a9 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -61,7 +61,8 @@ GameObject::GameObject() : WorldObject(false), MapObject(),
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
- m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION);
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Rotation = true;
m_valuesCount = GAMEOBJECT_END;
_dynamicValuesCount = GAMEOBJECT_DYNAMIC_END;
@@ -238,7 +239,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
else
{
guid = ObjectGuid::Create<HighGuid::Transport>(map->GenerateLowGuid<HighGuid::Transport>());
- m_updateFlag |= UPDATEFLAG_TRANSPORT;
+ m_updateFlag.ServerTime = true;
}
Object::_Create(guid);
@@ -271,7 +272,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
if (m_goTemplateAddon->WorldEffectID)
{
- m_updateFlag |= UPDATEFLAG_GAMEOBJECT;
+ m_updateFlag.GameObject = true;
SetWorldEffectID(m_goTemplateAddon->WorldEffectID);
}
}
@@ -292,6 +293,8 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
SetGoState(goState);
SetGoArtKit(artKit);
+ SetUInt32Value(GAMEOBJECT_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
+
switch (goInfo->type)
{
case GAMEOBJECT_TYPE_FISHINGHOLE:
@@ -376,7 +379,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
if (gameObjectAddon && gameObjectAddon->WorldEffectID)
{
- m_updateFlag |= UPDATEFLAG_GAMEOBJECT;
+ m_updateFlag.GameObject = true;
SetWorldEffectID(gameObjectAddon->WorldEffectID);
}
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index c6411c24f0a..2bf4a423590 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -104,7 +104,7 @@ struct GameObjectTemplate
uint32 usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false
uint32 floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false
uint32 conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0
- int32 xpLevel; // 18 xpLevel, int, Min value: -1, Max value: 123, Default value: 0
+ uint32 XPLevelRange; // 18 XP Level Range, References: ContentTuning, NoValue = 0
uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp
uint32 lootLevel; // 20 lootLevel, int, Min value: 0, Max value: 123, Default value: 0
uint32 GroupXP; // 21 Group XP, enum { false, true, }; Default: false
@@ -119,6 +119,7 @@ struct GameObjectTemplate
uint32 chestPersonalLoot; // 30 chest Personal Loot, References: Treasure, NoValue = 0
uint32 turnpersonallootsecurityoff; // 31 turn personal loot security off, enum { false, true, }; Default: false
uint32 ChestProperties; // 32 Chest Properties, References: ChestProperties, NoValue = 0
+ uint32 chestPushLoot; // 33 chest Push Loot, References: Treasure, NoValue = 0
} chest;
// 4 GAMEOBJECT_TYPE_BINDER
struct
@@ -331,6 +332,7 @@ struct GameObjectTemplate
{
uint32 creatureID; // 0 creatureID, References: Creature, NoValue = 0
uint32 charges; // 1 charges, int, Min value: 0, Max value: 65535, Default value: 1
+ uint32 Preferonlyifinlineofsight; // 2 Prefer only if in line of sight (expensive), enum { false, true, }; Default: false
} guardPost;
// 22 GAMEOBJECT_TYPE_SPELLCASTER
struct
@@ -502,7 +504,10 @@ struct GameObjectTemplate
uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
uint32 BlocksPathsDown; // 3 Blocks Paths Down, enum { false, true, }; Default: false
- uint32 PathBlockerBump; // 4 Path Blocker Bump (ft), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ int32 PathBlockerBump; // 4 Path Blocker Bump (ft), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
+ uint32 InfiniteAOI; // 6 Infinite AOI, enum { false, true, }; Default: false
+ uint32 DoorisOpaque; // 7 Door is Opaque (Disable portal on close), enum { false, true, }; Default: false
} trapdoor;
// 36 GAMEOBJECT_TYPE_NEW_FLAG
struct
@@ -580,7 +585,7 @@ struct GameObjectTemplate
struct
{
int32 SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1
- uint32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ int32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
uint32 DoodadSetA; // 2 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0
uint32 DoodadSetB; // 3 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0
} phaseableMO;
@@ -615,7 +620,7 @@ struct GameObjectTemplate
// 48 GAMEOBJECT_TYPE_UI_LINK
struct
{
- uint32 UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, }; Default: Adventure Journal
+ uint32 UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, Scrapping Machine, }; Default: Adventure Journal
uint32 allowMounted; // 1 allowMounted, enum { false, true, }; Default: false
uint32 GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false
uint32 spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0
@@ -640,7 +645,7 @@ struct GameObjectTemplate
uint32 openTextID; // 9 openTextID, References: BroadcastText, NoValue = 0
uint32 floatingTooltip; // 10 floatingTooltip, enum { false, true, }; Default: false
uint32 conditionID1; // 11 conditionID1, References: PlayerCondition, NoValue = 0
- uint32 xpLevel; // 12 xpLevel, int, Min value: -1, Max value: 123, Default value: 0
+ uint32 XPLevelRange; // 12 XP Level Range, References: ContentTuning, NoValue = 0
uint32 xpDifficulty; // 13 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp
uint32 spell; // 14 spell, References: Spell, NoValue = 0
uint32 GiganticAOI; // 15 Gigantic AOI, enum { false, true, }; Default: false
@@ -649,13 +654,45 @@ struct GameObjectTemplate
uint32 MaxNumberofLoots; // 18 Max Number of Loots, int, Min value: 1, Max value: 40, Default value: 10
uint32 logloot; // 19 log loot, enum { false, true, }; Default: false
uint32 linkedTrap; // 20 linkedTrap, References: GameObjects, NoValue = 0
+ uint32 PlayOpenAnimationonOpening; // 21 Play Open Animation on Opening, enum { false, true, }; Default: false
} gatheringNode;
// 51 GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD
struct
{
uint32 chestLoot; // 0 chestLoot, References: Treasure, NoValue = 0
uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
+ uint32 open; // 2 open, References: Lock_, NoValue = 0
+ uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
} challengeModeReward;
+ // 52 GAMEOBJECT_TYPE_MULTI
+ struct
+ {
+ uint32 MultiProperties; // 0 Multi Properties, References: MultiProperties, NoValue = 0
+ } multi;
+ // 53 GAMEOBJECT_TYPE_SIEGEABLE_MULTI
+ struct
+ {
+ uint32 MultiProperties; // 0 Multi Properties, References: MultiProperties, NoValue = 0
+ uint32 InitialDamage; // 1 Initial Damage, enum { None, Raw, Ratio, }; Default: None
+ } siegeableMulti;
+ // 54 GAMEOBJECT_TYPE_SIEGEABLE_MO
+ struct
+ {
+ uint32 SiegeableProperties; // 0 Siegeable Properties, References: SiegeableProperties, NoValue = 0
+ uint32 DoodadSetA; // 1 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 DoodadSetB; // 2 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 DoodadSetC; // 3 Doodad Set C, int, Min value: 0, Max value: 2147483647, Default value: 0
+ int32 SpawnMap; // 4 Spawn Map, References: Map, NoValue = -1
+ int32 AreaNameSet; // 5 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ } siegeableMO;
+ // 55 GAMEOBJECT_TYPE_PVP_REWARD
+ struct
+ {
+ uint32 chestLoot; // 0 chestLoot, References: Treasure, NoValue = 0
+ uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
+ uint32 open; // 2 open, References: Lock_, NoValue = 0
+ uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
+ } pvpReward;
struct
{
uint32 data[MAX_GAMEOBJECT_DATA];
@@ -708,6 +745,8 @@ struct GameObjectTemplate
case GAMEOBJECT_TYPE_NEW_FLAG_DROP: return newflagdrop.open;
case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.open;
case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.open;
+ case GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD: return challengeModeReward.open;
+ case GAMEOBJECT_TYPE_PVP_REWARD: return pvpReward.open;
default: return 0;
}
}
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index d63d5246d5a..847c3c47c79 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -275,8 +275,6 @@ Item::Item()
m_objectType |= TYPEMASK_ITEM;
m_objectTypeId = TYPEID_ITEM;
- m_updateFlag = 0;
-
m_valuesCount = ITEM_END;
_dynamicValuesCount = ITEM_DYNAMIC_END;
m_slot = 0;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 201f5c1515c..9d8a17ecbd7 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -55,7 +55,7 @@ Object::Object()
{
m_objectTypeId = TYPEID_OBJECT;
m_objectType = TYPEMASK_OBJECT;
- m_updateFlag = UPDATEFLAG_NONE;
+ m_updateFlag.Clear();
m_uint32Values = nullptr;
_dynamicValues = nullptr;
@@ -170,12 +170,19 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (!target)
return;
- uint8 updateType = UPDATETYPE_CREATE_OBJECT;
- uint32 flags = m_updateFlag;
+ uint8 updateType = UPDATETYPE_CREATE_OBJECT;
+ uint8 objectType = m_objectTypeId;
+ uint16 objectTypeMask = m_objectType;
+ CreateObjectBits flags = m_updateFlag;
/** lower flag1 **/
if (target == this) // building packet for yourself
- flags |= UPDATEFLAG_SELF;
+ {
+ flags.ThisIsYou = true;
+ flags.ActivePlayer = true;
+ objectType = TYPEID_ACTIVE_PLAYER;
+ objectTypeMask |= TYPEMASK_ACTIVE_PLAYER;
+ }
switch (GetGUID().GetHigh())
{
@@ -208,15 +215,14 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (WorldObject const* worldObject = dynamic_cast<WorldObject const*>(this))
{
- if (!(flags & UPDATEFLAG_LIVING))
- if (!worldObject->m_movementInfo.transport.guid.IsEmpty())
- flags |= UPDATEFLAG_TRANSPORT_POSITION;
+ if (!flags.MovementUpdate && !worldObject->m_movementInfo.transport.guid.IsEmpty())
+ flags.MovementTransport = true;
if (worldObject->GetAIAnimKitId() || worldObject->GetMovementAnimKitId() || worldObject->GetMeleeAnimKitId())
- flags |= UPDATEFLAG_ANIMKITS;
+ flags.AnimKit = true;
}
- if (flags & UPDATEFLAG_STATIONARY_POSITION)
+ if (flags.Stationary)
{
// UPDATETYPE_CREATE_OBJECT2 for some gameobject types...
if (isType(TYPEMASK_GAMEOBJECT))
@@ -237,12 +243,13 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (Unit const* unit = ToUnit())
if (unit->GetVictim())
- flags |= UPDATEFLAG_HAS_TARGET;
+ flags.CombatVictim = true;
ByteBuffer buf(0x400);
buf << uint8(updateType);
buf << GetGUID();
- buf << uint8(m_objectTypeId);
+ buf << uint8(objectType);
+ buf << uint32(objectTypeMask);
BuildMovementUpdate(&buf, flags);
BuildValuesUpdate(updateType, &buf, target);
@@ -337,25 +344,8 @@ ObjectGuid const& Object::GetGuidValue(uint16 index) const
return *((ObjectGuid*)&(m_uint32Values[index]));
}
-void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
-{
- bool NoBirthAnim = false;
- bool EnablePortals = false;
- bool PlayHoverAnim = false;
- bool HasMovementUpdate = (flags & UPDATEFLAG_LIVING) != 0;
- bool HasMovementTransport = (flags & UPDATEFLAG_TRANSPORT_POSITION) != 0;
- bool Stationary = (flags & UPDATEFLAG_STATIONARY_POSITION) != 0;
- bool CombatVictim = (flags & UPDATEFLAG_HAS_TARGET) != 0;
- bool ServerTime = (flags & UPDATEFLAG_TRANSPORT) != 0;
- bool VehicleCreate = (flags & UPDATEFLAG_VEHICLE) != 0;
- bool AnimKitCreate = (flags & UPDATEFLAG_ANIMKITS) != 0;
- bool Rotation = (flags & UPDATEFLAG_ROTATION) != 0;
- bool HasAreaTrigger = (flags & UPDATEFLAG_AREATRIGGER) != 0;
- bool HasGameObject = (flags & UPDATEFLAG_GAMEOBJECT) != 0;
- bool ThisIsYou = (flags & UPDATEFLAG_SELF) != 0;
- bool SmoothPhasing = false;
- bool SceneObjCreate = false;
- bool PlayerCreateData = GetTypeId() == TYPEID_PLAYER && ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
+void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
+{
std::vector<uint32> const* PauseTimes = nullptr;
uint32 PauseTimesCount = 0;
if (GameObject const* go = ToGameObject())
@@ -367,26 +357,27 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
}
}
- data->WriteBit(NoBirthAnim);
- data->WriteBit(EnablePortals);
- data->WriteBit(PlayHoverAnim);
- data->WriteBit(HasMovementUpdate);
- data->WriteBit(HasMovementTransport);
- data->WriteBit(Stationary);
- data->WriteBit(CombatVictim);
- data->WriteBit(ServerTime);
- data->WriteBit(VehicleCreate);
- data->WriteBit(AnimKitCreate);
- data->WriteBit(Rotation);
- data->WriteBit(HasAreaTrigger);
- data->WriteBit(HasGameObject);
- data->WriteBit(SmoothPhasing);
- data->WriteBit(ThisIsYou);
- data->WriteBit(SceneObjCreate);
- data->WriteBit(PlayerCreateData);
+ data->WriteBit(flags.NoBirthAnim);
+ data->WriteBit(flags.EnablePortals);
+ data->WriteBit(flags.PlayHoverAnim);
+ data->WriteBit(flags.MovementUpdate);
+ data->WriteBit(flags.MovementTransport);
+ data->WriteBit(flags.Stationary);
+ data->WriteBit(flags.CombatVictim);
+ data->WriteBit(flags.ServerTime);
+ data->WriteBit(flags.Vehicle);
+ data->WriteBit(flags.AnimKit);
+ data->WriteBit(flags.Rotation);
+ data->WriteBit(flags.AreaTrigger);
+ data->WriteBit(flags.GameObject);
+ data->WriteBit(flags.SmoothPhasing);
+ data->WriteBit(flags.ThisIsYou);
+ data->WriteBit(flags.SceneObject);
+ data->WriteBit(flags.ActivePlayer);
+ data->WriteBit(flags.Conversation);
data->FlushBits();
- if (HasMovementUpdate)
+ if (flags.MovementUpdate)
{
Unit const* unit = ToUnit();
bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
@@ -457,6 +448,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// *data << uint32(TransportID);
// *data << float(Magnitude);
// data->WriteBits(Type, 2);
+ // data->FlushBits();
//}
if (HasSpline)
@@ -465,7 +457,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(PauseTimesCount);
- if (Stationary)
+ if (flags.Stationary)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << float(self->GetStationaryX());
@@ -474,10 +466,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << float(self->GetStationaryO());
}
- if (CombatVictim)
+ if (flags.CombatVictim)
*data << ToUnit()->GetVictim()->GetGUID(); // CombatVictim
- if (ServerTime)
+ if (flags.ServerTime)
{
GameObject const* go = ToGameObject();
/** @TODO Use IsTransport() to also handle type 11 (TRANSPORT)
@@ -491,14 +483,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(getMSTime());
}
- if (VehicleCreate)
+ if (flags.Vehicle)
{
Unit const* unit = ToUnit();
*data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID
*data << float(unit->GetOrientation()); // InitialRawFacing
}
- if (AnimKitCreate)
+ if (flags.AnimKit)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << uint16(self->GetAIAnimKitId()); // AiID
@@ -506,19 +498,19 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint16(self->GetMeleeAnimKitId()); // MeleeID
}
- if (Rotation)
+ if (flags.Rotation)
*data << uint64(ToGameObject()->GetPackedWorldRotation()); // Rotation
if (PauseTimesCount)
data->append(PauseTimes->data(), PauseTimes->size());
- if (HasMovementTransport)
+ if (flags.MovementTransport)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << self->m_movementInfo.transport;
}
- if (HasAreaTrigger)
+ if (flags.AreaTrigger)
{
AreaTrigger const* areaTrigger = ToAreaTrigger();
AreaTriggerMiscTemplate const* areaTriggerMiscTemplate = areaTrigger->GetMiscTemplate();
@@ -539,9 +531,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
bool hasMorphCurveID = areaTriggerMiscTemplate->MorphCurveId != 0;
bool hasFacingCurveID = areaTriggerMiscTemplate->FacingCurveId != 0;
bool hasMoveCurveID = areaTriggerMiscTemplate->MoveCurveId != 0;
- bool hasUnk2 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK2);
+ bool hasAnimation = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_HAS_ANIM_ID);
bool hasUnk3 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK3);
- bool hasUnk4 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK4);
+ bool hasAnimKitID = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_HAS_ANIM_KIT_ID);
+ bool hasAnimProgress = false;
bool hasAreaTriggerSphere = areaTriggerTemplate->IsSphere();
bool hasAreaTriggerBox = areaTriggerTemplate->IsBox();
bool hasAreaTriggerPolygon = areaTriggerTemplate->IsPolygon();
@@ -560,9 +553,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
data->WriteBit(hasMorphCurveID);
data->WriteBit(hasFacingCurveID);
data->WriteBit(hasMoveCurveID);
- data->WriteBit(hasUnk2);
+ data->WriteBit(hasAnimation);
+ data->WriteBit(hasAnimKitID);
data->WriteBit(hasUnk3);
- data->WriteBit(hasUnk4);
+ data->WriteBit(hasAnimProgress);
data->WriteBit(hasAreaTriggerSphere);
data->WriteBit(hasAreaTriggerBox);
data->WriteBit(hasAreaTriggerPolygon);
@@ -598,10 +592,13 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
if (hasMoveCurveID)
*data << uint32(areaTriggerMiscTemplate->MoveCurveId);
- if (hasUnk2)
- *data << int32(0);
+ if (hasAnimation)
+ *data << int32(areaTriggerMiscTemplate->AnimId);
+
+ if (hasAnimKitID)
+ *data << int32(areaTriggerMiscTemplate->AnimKitId);
- if (hasUnk4)
+ if (hasAnimProgress)
*data << uint32(0);
if (hasAreaTriggerSphere)
@@ -648,7 +645,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << *areaTrigger->GetCircularMovementInfo();
}
- if (HasGameObject)
+ if (flags.GameObject)
{
bool bit8 = false;
uint32 Int1 = 0;
@@ -663,7 +660,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(Int1);
}
- //if (SmoothPhasing)
+ //if (flags.SmoothPhasing)
//{
// data->WriteBit(ReplaceActive);
// data->WriteBit(HasReplaceObject);
@@ -672,7 +669,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// *data << ObjectGuid(ReplaceObject);
//}
- //if (SceneObjCreate)
+ //if (flags.SceneObject)
//{
// data->WriteBit(HasLocalScriptData);
// data->WriteBit(HasPetBattleFullUpdate);
@@ -782,7 +779,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// }
//}
- if (PlayerCreateData)
+ if (flags.ActivePlayer)
{
bool HasSceneInstanceIDs = false;
bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
@@ -809,6 +806,15 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint8((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255);
}
}
+
+ if (flags.Conversation)
+ {
+ Conversation const* self = ToConversation();
+ if (data->WriteBit(self->GetTextureKitId() != 0))
+ *data << uint32(self->GetTextureKitId());
+
+ data->FlushBits();
+ }
}
void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
@@ -842,7 +848,11 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
if (!target)
return;
- std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount);
+ std::size_t valueCount = _dynamicValuesCount;
+ if (target != this && GetTypeId() == TYPEID_PLAYER)
+ valueCount = PLAYER_DYNAMIC_END;
+
+ std::size_t blockCount = UpdateMask::GetBlockCount(valueCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
@@ -851,7 +861,7 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
std::size_t maskPos = data->wpos();
data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
- for (uint16 index = 0; index < _dynamicValuesCount; ++index)
+ for (uint16 index = 0; index < valueCount; ++index)
{
std::vector<uint32> const& values = _dynamicValues[index];
if (_fieldNotifyFlags & flags[index] ||
@@ -931,6 +941,16 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
break;
+ case TYPEID_AZERITE_EMPOWERED_ITEM:
+ flags = AzeriteEmpoweredItemUpdateFieldFlags;
+ if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
+ visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
+ break;
+ case TYPEID_AZERITE_ITEM:
+ flags = AzeriteItemUpdateFieldFlags;
+ if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
+ visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
+ break;
case TYPEID_UNIT:
case TYPEID_PLAYER:
{
@@ -972,6 +992,7 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
flags = ConversationUpdateFieldFlags;
break;
case TYPEID_OBJECT:
+ case TYPEID_ACTIVE_PLAYER:
ABORT();
break;
}
@@ -990,6 +1011,8 @@ uint32 Object::GetDynamicUpdateFieldData(Player const* target, uint32*& flags) c
{
case TYPEID_ITEM:
case TYPEID_CONTAINER:
+ case TYPEID_AZERITE_EMPOWERED_ITEM:
+ case TYPEID_AZERITE_ITEM:
flags = ItemDynamicUpdateFieldFlags;
if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 2ebea15a58d..79420076f5b 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -54,6 +54,33 @@ struct QuaternionData;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
+struct CreateObjectBits
+{
+ bool NoBirthAnim : 1;
+ bool EnablePortals : 1;
+ bool PlayHoverAnim : 1;
+ bool MovementUpdate : 1;
+ bool MovementTransport : 1;
+ bool Stationary : 1;
+ bool CombatVictim : 1;
+ bool ServerTime : 1;
+ bool Vehicle : 1;
+ bool AnimKit : 1;
+ bool Rotation : 1;
+ bool AreaTrigger : 1;
+ bool GameObject : 1;
+ bool SmoothPhasing : 1;
+ bool ThisIsYou : 1;
+ bool SceneObject : 1;
+ bool ActivePlayer : 1;
+ bool Conversation : 1;
+
+ void Clear()
+ {
+ memset(this, 0, sizeof(CreateObjectBits));
+ }
+};
+
namespace UpdateMask
{
typedef uint32 BlockType;
@@ -298,14 +325,14 @@ class TC_GAME_API Object
uint32 GetUpdateFieldData(Player const* target, uint32*& flags) const;
uint32 GetDynamicUpdateFieldData(Player const* target, uint32*& flags) const;
- void BuildMovementUpdate(ByteBuffer* data, uint32 flags) const;
+ void BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const;
virtual void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
virtual void BuildDynamicValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
uint16 m_objectType;
TypeID m_objectTypeId;
- uint32 m_updateFlag;
+ CreateObjectBits m_updateFlag;
union
{
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index d5094aea2b0..f8ee803ed22 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -87,6 +87,7 @@ namespace
SET_GUID_NAME(CommerceObj);
SET_GUID_NAME(ClientSession);
SET_GUID_NAME(Cast);
+ SET_GUID_NAME(ClientConnection);
#undef SET_GUID_NAME
}
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index 941608f9493..0584c0d7262 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -30,35 +30,41 @@
enum TypeID
{
- TYPEID_OBJECT = 0,
- TYPEID_ITEM = 1,
- TYPEID_CONTAINER = 2,
- TYPEID_UNIT = 3,
- TYPEID_PLAYER = 4,
- TYPEID_GAMEOBJECT = 5,
- TYPEID_DYNAMICOBJECT = 6,
- TYPEID_CORPSE = 7,
- TYPEID_AREATRIGGER = 8,
- TYPEID_SCENEOBJECT = 9,
- TYPEID_CONVERSATION = 10
+ TYPEID_OBJECT = 0,
+ TYPEID_ITEM = 1,
+ TYPEID_CONTAINER = 2,
+ TYPEID_AZERITE_EMPOWERED_ITEM = 3,
+ TYPEID_AZERITE_ITEM = 4,
+ TYPEID_UNIT = 5,
+ TYPEID_PLAYER = 6,
+ TYPEID_ACTIVE_PLAYER = 7,
+ TYPEID_GAMEOBJECT = 8,
+ TYPEID_DYNAMICOBJECT = 9,
+ TYPEID_CORPSE = 10,
+ TYPEID_AREATRIGGER = 11,
+ TYPEID_SCENEOBJECT = 12,
+ TYPEID_CONVERSATION = 13
};
-#define NUM_CLIENT_OBJECT_TYPES 11
+#define NUM_CLIENT_OBJECT_TYPES 14
enum TypeMask
{
- TYPEMASK_OBJECT = 0x0001,
- TYPEMASK_ITEM = 0x0002,
- TYPEMASK_CONTAINER = 0x0004,
- TYPEMASK_UNIT = 0x0008,
- TYPEMASK_PLAYER = 0x0010,
- TYPEMASK_GAMEOBJECT = 0x0020,
- TYPEMASK_DYNAMICOBJECT = 0x0040,
- TYPEMASK_CORPSE = 0x0080,
- TYPEMASK_AREATRIGGER = 0x0100,
- TYPEMASK_SCENEOBJECT = 0x0200,
- TYPEMASK_CONVERSATION = 0x0400,
- TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
+ TYPEMASK_OBJECT = 0x0001,
+ TYPEMASK_ITEM = 0x0002,
+ TYPEMASK_CONTAINER = 0x0004,
+ TYPEMASK_AZERITE_EMPOWERED_ITEM = 0x0008,
+ TYPEMASK_AZERITE_ITEM = 0x0010,
+ TYPEMASK_UNIT = 0x0020,
+ TYPEMASK_PLAYER = 0x0040,
+ TYPEMASK_ACTIVE_PLAYER = 0x0080,
+ TYPEMASK_GAMEOBJECT = 0x0100,
+ TYPEMASK_DYNAMICOBJECT = 0x0200,
+ TYPEMASK_CORPSE = 0x0400,
+ TYPEMASK_AREATRIGGER = 0x0800,
+ TYPEMASK_SCENEOBJECT = 0x1000,
+ TYPEMASK_CONVERSATION = 0x2000,
+ TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
enum class HighGuid
@@ -111,6 +117,7 @@ enum class HighGuid
CommerceObj = 45,
ClientSession = 46,
Cast = 47,
+ ClientConnection = 48,
Count,
};
@@ -349,6 +356,7 @@ class TC_GAME_API ObjectGuidGeneratorBase
{
public:
ObjectGuidGeneratorBase(ObjectGuid::LowType start = UI64LIT(1)) : _nextGuid(start) { }
+ virtual ~ObjectGuidGeneratorBase() { }
virtual void Set(uint64 val) { _nextGuid = val; }
virtual ObjectGuid::LowType Generate() = 0;
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h
index 800948c4281..9d438ed625e 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.h
+++ b/src/server/game/Entities/Object/Updates/UpdateData.h
@@ -34,29 +34,6 @@ enum OBJECT_UPDATE_TYPE
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 3,
};
-enum OBJECT_UPDATE_FLAGS
-{
- UPDATEFLAG_NONE = 0x0000,
- UPDATEFLAG_SELF = 0x0001,
- UPDATEFLAG_TRANSPORT = 0x0002,
- UPDATEFLAG_HAS_TARGET = 0x0004,
- UPDATEFLAG_LIVING = 0x0008,
- UPDATEFLAG_STATIONARY_POSITION = 0x0010,
- UPDATEFLAG_VEHICLE = 0x0020,
- UPDATEFLAG_TRANSPORT_POSITION = 0x0040,
- UPDATEFLAG_ROTATION = 0x0080,
- UPDATEFLAG_ANIMKITS = 0x0100,
- UPDATEFLAG_AREATRIGGER = 0x0200,
- UPDATEFLAG_GAMEOBJECT = 0x0400,
- //UPDATEFLAG_REPLACE_ACTIVE = 0x0800,
- //UPDATEFLAG_NO_BIRTH_ANIM = 0x1000,
- //UPDATEFLAG_ENABLE_PORTALS = 0x2000,
- //UPDATEFLAG_PLAY_HOVER_ANIM = 0x4000,
- //UPDATEFLAG_IS_SUPPRESSING_GREETINGS = 0x8000
- //UPDATEFLAG_SCENEOBJECT = 0x10000,
- //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000
-};
-
class UpdateData
{
public:
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 34609ed6698..51db53c9c61 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2419,9 +2419,8 @@ void Player::GiveLevel(uint8 level)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
- uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels;
-
- packet.Cp = std::find(rowLevels, rowLevels + MAX_TALENT_TIERS, level) != (rowLevels + MAX_TALENT_TIERS);
+ packet.NumNewTalents = DB2Manager::GetNumTalentsAtLevel(level, Classes(getClass())) - DB2Manager::GetNumTalentsAtLevel(oldLevel, Classes(getClass()));
+ packet.NumNewPvpTalentSlots = sDB2Manager.GetPvpTalentNumSlotsAtLevel(level, Classes(getClass())) - sDB2Manager.GetPvpTalentNumSlotsAtLevel(oldLevel, Classes(getClass()));
GetSession()->SendPacket(packet.Write());
@@ -2505,7 +2504,7 @@ void Player::InitTalentForLevel()
if (level < MIN_SPECIALIZATION_LEVEL)
ResetTalentSpecialization();
- uint32 talentTiers = CalculateTalentsTiers();
+ uint32 talentTiers = DB2Manager::GetNumTalentsAtLevel(level, Classes(getClass()));
if (level < 15)
{
// Remove all talent points
@@ -14570,6 +14569,38 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source)
/*** QUEST SYSTEM ***/
/*********************************************************/
+int32 Player::GetQuestMinLevel(Quest const* quest) const
+{
+ if (quest->GetQuestLevel() == -1 && quest->GetQuestScalingFactionGroup())
+ {
+ ChrRacesEntry const* race = sChrRacesStore.AssertEntry(getRace());
+ FactionTemplateEntry const* raceFaction = sFactionTemplateStore.LookupEntry(race->FactionID);
+ if (!raceFaction || raceFaction->FactionGroup != quest->GetQuestScalingFactionGroup())
+ return quest->GetQuestMaxScalingLevel();
+ }
+
+ return quest->GetMinLevel();
+}
+
+int32 Player::GetQuestLevel(Quest const* quest) const
+{
+ if (!quest)
+ return 0;
+
+ if (quest->GetQuestLevel() == -1)
+ {
+ int32 minLevel = GetQuestMinLevel(quest);
+ int32 maxLevel = quest->GetQuestMaxScalingLevel();
+ int32 level = getLevel();
+ if (level >= minLevel)
+ return std::min(level, maxLevel);
+
+ return minLevel;
+ }
+
+ return quest->GetQuestLevel();
+}
+
void Player::PrepareQuestMenu(ObjectGuid guid)
{
QuestRelationBounds objectQR;
@@ -14737,7 +14768,7 @@ bool Player::CanSeeStartQuest(Quest const* quest)
SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
{
- return int32(getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF)) >= quest->GetMinLevel();
+ return int32(getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF)) >= GetQuestMinLevel(quest);
}
return false;
@@ -15163,7 +15194,7 @@ void Player::IncompleteQuest(uint32 quest_id)
uint32 Player::GetQuestMoneyReward(Quest const* quest) const
{
- return quest->MoneyValue(getLevel()) * sWorld->getRate(RATE_MONEY_QUEST);
+ return quest->MoneyValue(this) * sWorld->getRate(RATE_MONEY_QUEST);
}
uint32 Player::GetQuestXPReward(Quest const* quest)
@@ -15174,7 +15205,7 @@ uint32 Player::GetQuestXPReward(Quest const* quest)
if (rewarded && !quest->IsDFQuest())
return 0;
- uint32 XP = quest->XPValue(getLevel()) * sWorld->getRate(RATE_XP_QUEST);
+ uint32 XP = quest->XPValue(this) * sWorld->getRate(RATE_XP_QUEST);
// handle SPELL_AURA_MOD_XP_QUEST_PCT auras
Unit::AuraEffectList const& ModXPPctAuras = GetAuraEffectsByType(SPELL_AURA_MOD_XP_QUEST_PCT);
@@ -15570,7 +15601,7 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const
bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) const
{
- if (getLevel() < qInfo->GetMinLevel())
+ if (getLevel() < GetQuestMinLevel(qInfo))
{
if (msg)
{
@@ -19625,7 +19656,7 @@ void Player::SendRaidInfo()
{
InstanceSave* save = itr->second.save;
- WorldPackets::Instance::InstanceLockInfos lockInfos;
+ WorldPackets::Instance::InstanceLock lockInfos;
lockInfos.InstanceID = save->GetInstanceId();
lockInfos.MapID = save->GetMapId();
@@ -22328,6 +22359,8 @@ void Player::InitDisplayIds()
default:
TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), gender);
}
+
+ SetUInt32Value(UNIT_FIELD_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
}
inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int64 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore)
@@ -23999,19 +24032,15 @@ void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo)
break;
case SKILL_RANGE_RANK:
{
- uint16 rank = 1;
- if (getClass() == CLASS_DEATH_KNIGHT && skillId == SKILL_FIRST_AID)
- rank = 4;
-
SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcInfo->SkillTierID);
- uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
+ uint16 maxValue = tier->Value[0];
uint16 skillValue = 1;
if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
skillValue = maxValue;
else if (getClass() == CLASS_DEATH_KNIGHT)
skillValue = std::min(std::max(uint16(1), uint16((getLevel() - 1) * 5)), maxValue);
- SetSkill(skillId, rank, skillValue, maxValue);
+ SetSkill(skillId, 1, skillValue, maxValue);
break;
}
default:
@@ -26496,7 +26525,10 @@ void Player::SendTalentsInfoData()
continue;
}
- groupInfoPkt.PvPTalentIDs.push_back(uint16(pvpTalents[slot]));
+ groupInfoPkt.PvPTalents.emplace_back();
+ WorldPackets::Talent::PvPTalent& pvpTalent = groupInfoPkt.PvPTalents.back();
+ pvpTalent.PvPTalentID = pvpTalents[slot];
+ pvpTalent.Slot = slot;
}
packet.Info.TalentGroups.push_back(groupInfoPkt);
@@ -27517,6 +27549,7 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
displayPlayerChoice.Responses.resize(playerChoice->Responses.size());
displayPlayerChoice.CloseChoiceFrame = false;
displayPlayerChoice.HideWarboardHeader = playerChoice->HideWarboardHeader;
+ displayPlayerChoice.KeepOpenAfterChoice = playerChoice->KeepOpenAfterChoice;
for (std::size_t i = 0; i < playerChoice->Responses.size(); ++i)
{
@@ -27524,6 +27557,9 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
WorldPackets::Quest::PlayerChoiceResponse& playerChoiceResponse = displayPlayerChoice.Responses[i];
playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId;
playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId;
+ playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags;
+ playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID;
+ playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID;
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
playerChoiceResponse.Description = playerChoiceResponseTemplate.Description;
@@ -27848,29 +27884,6 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const
GetSession()->SendPacket(supercededSpells.Write());
}
-uint32 Player::CalculateTalentsTiers() const
-{
- uint32 const* rowLevels;
- switch (getClass())
- {
- case CLASS_DEATH_KNIGHT:
- rowLevels = DKTalentRowLevels;
- break;
- case CLASS_DEMON_HUNTER:
- rowLevels = DHTalentRowLevels;
- break;
- default:
- rowLevels = DefaultTalentRowLevels;
- break;
- }
-
- for (uint32 i = MAX_TALENT_TIERS; i; --i)
- if (getLevel() >= rowLevels[i - 1])
- return i;
-
- return 0;
-}
-
Difficulty Player::GetDifficultyID(MapEntry const* mapEntry) const
{
if (!mapEntry->IsRaid())
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 8f1529db7c5..e3092f0279c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -399,7 +399,7 @@ enum PlayerFlags
PLAYER_FLAGS_GM = 0x00000008,
PLAYER_FLAGS_GHOST = 0x00000010,
PLAYER_FLAGS_RESTING = 0x00000020,
- PLAYER_FLAGS_UNK6 = 0x00000040,
+ PLAYER_FLAGS_VOICE_CHAT = 0x00000040,
PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
PLAYER_FLAGS_IN_PVP = 0x00000200,
@@ -430,7 +430,8 @@ enum PlayerFlags
enum PlayerFlagsEx
{
PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED = 0x0001,
- PLAYER_FLAGS_EX_MERCENARY_MODE = 0x0002
+ PLAYER_FLAGS_EX_MERCENARY_MODE = 0x0002,
+ PLAYER_FLAGS_EX_ARTIFACT_FORGE_CHEAT = 0x0004
};
enum PlayerLocalFlags
@@ -1009,10 +1010,6 @@ enum TalentLearnResult
TALENT_FAILED_REST_AREA = 8
};
-static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 };
-static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 };
-static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 };
-
struct TC_GAME_API SpecializationInfo
{
SpecializationInfo() : ResetTalentsCost(0), ResetTalentsTime(0), PrimarySpecialization(0), ActiveGroup(0)
@@ -1357,13 +1354,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*** QUEST SYSTEM ***/
/*********************************************************/
- int32 GetQuestLevel(Quest const* quest) const
- {
- if (!quest)
- return getLevel();
- return quest->GetQuestLevel() > 0 ? quest->GetQuestLevel() : std::min<int32>(getLevel(), quest->GetQuestMaxScalingLevel());
- }
-
+ int32 GetQuestMinLevel(Quest const* quest) const;
+ int32 GetQuestLevel(Quest const* quest) const;
void PrepareQuestMenu(ObjectGuid guid);
void SendPreparedQuest(WorldObject* source);
bool IsActiveQuest(uint32 quest_id) const;
@@ -1653,7 +1645,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool AddTalent(TalentEntry const* talent, uint8 spec, bool learning);
bool HasTalent(uint32 spell_id, uint8 spec) const;
void RemoveTalent(TalentEntry const* talent);
- uint32 CalculateTalentsTiers() const;
void ResetTalentSpecialization();
TalentLearnResult LearnPvpTalent(uint32 talentID, uint8 slot, int32* spellOnCooldown);
@@ -1993,7 +1984,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void RestoreHealthAfterDuel() { SetHealth(healthBeforeDuel); }
void RestoreManaAfterDuel() { SetPower(POWER_MANA, manaBeforeDuel); }
- uint32 GetPrestigeLevel() const { return 0; }
uint32 GetHonorLevel() const { return GetUInt32Value(PLAYER_FIELD_HONOR_LEVEL); }
void AddHonorXP(uint32 xp);
void SetHonorLevel(uint8 honorLevel);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 50b1897e2c5..6de4ae21027 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -38,7 +38,9 @@ Transport::Transport() : GameObject(),
_triggeredArrivalEvent(false), _triggeredDepartureEvent(false),
_passengerTeleportItr(_passengers.begin()), _delayedAddModel(false), _delayedTeleport(false)
{
- m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION;
+ m_updateFlag.ServerTime = true;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Rotation = true;
}
Transport::~Transport()
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6edf0663547..bb6a3e9dc5d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -111,13 +111,13 @@ bool DispelableAura::RollDispel() const
}
DamageInfo::DamageInfo(Unit* attacker, Unit* victim, uint32 damage, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, DamageEffectType damageType, WeaponAttackType attackType)
- : m_attacker(attacker), m_victim(victim), m_damage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType),
+ : m_attacker(attacker), m_victim(victim), m_damage(damage), m_originalDamage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType),
m_absorb(0), m_resist(0), m_block(0), m_hitMask(0)
{
}
DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo)
- : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)),
+ : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_originalDamage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)),
m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.absorb), m_resist(dmgInfo.resist), m_block(dmgInfo.blocked_amount), m_hitMask(0)
{
switch (dmgInfo.TargetState)
@@ -171,7 +171,7 @@ DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo)
}
DamageInfo::DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType, WeaponAttackType attackType, uint32 hitMask)
- : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage),
+ : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage), m_originalDamage(spellNonMeleeDamage.originalDamage),
m_spellInfo(sSpellMgr->GetSpellInfo(spellNonMeleeDamage.SpellID)), m_schoolMask(SpellSchoolMask(spellNonMeleeDamage.schoolMask)), m_damageType(damageType),
m_attackType(attackType), m_absorb(spellNonMeleeDamage.absorb), m_resist(spellNonMeleeDamage.resist), m_block(spellNonMeleeDamage.blocked), m_hitMask(hitMask)
{
@@ -226,7 +226,7 @@ uint32 DamageInfo::GetHitMask() const
}
HealInfo::HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask)
- : _healer(healer), _target(target), _heal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0)
+ : _healer(healer), _target(target), _heal(heal), _originalHeal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0)
{
}
@@ -279,8 +279,8 @@ SpellSchoolMask ProcEventInfo::GetSchoolMask() const
}
SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _SpellXSpellVisualID, uint32 _schoolMask, ObjectGuid _castId)
- : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), schoolMask(_schoolMask),
- absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth())
+ : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), originalDamage(0),
+ schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth())
{
}
@@ -297,7 +297,7 @@ Unit::Unit(bool isWorldObject) :
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
- m_updateFlag = UPDATEFLAG_LIVING;
+ m_updateFlag.MovementUpdate = true;
for (uint32 i = 0; i < MAX_ATTACK; ++i)
{
@@ -1181,6 +1181,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
damage = 0;
damageInfo->damage = damage;
+ damageInfo->originalDamage = damage;
DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE, BASE_ATTACK, PROC_HIT_NONE);
CalcAbsorbResist(dmgInfo);
damageInfo->absorb = dmgInfo.GetAbsorb();
@@ -1227,6 +1228,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
damageInfo->damageSchoolMask = GetMeleeDamageSchoolMask();
damageInfo->attackType = attackType;
damageInfo->damage = 0;
+ damageInfo->originalDamage = 0;
damageInfo->cleanDamage = 0;
damageInfo->absorb = 0;
damageInfo->resist = 0;
@@ -1295,17 +1297,20 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
case MELEE_HIT_EVADE:
damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND;
damageInfo->TargetState = VICTIMSTATE_EVADES;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->damage = 0;
damageInfo->cleanDamage = 0;
return;
case MELEE_HIT_MISS:
damageInfo->HitInfo |= HITINFO_MISS;
damageInfo->TargetState = VICTIMSTATE_INTACT;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->damage = 0;
damageInfo->cleanDamage = 0;
break;
case MELEE_HIT_NORMAL:
damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->originalDamage = damageInfo->damage;
break;
case MELEE_HIT_CRIT:
{
@@ -1320,21 +1325,26 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
if (mod != 0)
AddPct(damageInfo->damage, mod);
+
+ damageInfo->originalDamage = damageInfo->damage;
break;
}
case MELEE_HIT_PARRY:
damageInfo->TargetState = VICTIMSTATE_PARRY;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->cleanDamage += damageInfo->damage;
damageInfo->damage = 0;
break;
case MELEE_HIT_DODGE:
damageInfo->TargetState = VICTIMSTATE_DODGE;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->cleanDamage += damageInfo->damage;
damageInfo->damage = 0;
break;
case MELEE_HIT_BLOCK:
damageInfo->TargetState = VICTIMSTATE_HIT;
damageInfo->HitInfo |= HITINFO_BLOCK;
+ damageInfo->originalDamage = damageInfo->damage;
// 30% damage blocked, double blocked amount if block is critical
damageInfo->blocked_amount = CalculatePct(damageInfo->damage, damageInfo->target->isBlockCritical() ? damageInfo->target->GetBlockPercent() * 2 : damageInfo->target->GetBlockPercent());
damageInfo->damage -= damageInfo->blocked_amount;
@@ -1344,6 +1354,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
{
damageInfo->HitInfo |= HITINFO_GLANCING;
damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->originalDamage = damageInfo->damage;
int32 leveldif = int32(victim->getLevel()) - int32(getLevel());
if (leveldif > 3)
leveldif = 3;
@@ -1358,6 +1369,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
damageInfo->TargetState = VICTIMSTATE_HIT;
// 150% normal damage
damageInfo->damage += (damageInfo->damage / 2);
+ damageInfo->originalDamage = damageInfo->damage;
break;
default:
break;
@@ -1372,6 +1384,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
resilienceReduction = damageInfo->damage - resilienceReduction;
damageInfo->damage -= resilienceReduction;
damageInfo->cleanDamage += resilienceReduction;
+ damageInfo->originalDamage -= resilienceReduction;
// Calculate absorb resist
if (int32(damageInfo->damage) > 0)
@@ -1514,7 +1527,6 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
DamageInfo damageInfo(this, victim, damage, spellInfo, spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, BASE_ATTACK);
victim->CalcAbsorbResist(damageInfo);
damage = damageInfo.GetDamage();
- // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that
victim->DealDamageMods(this, damage, nullptr);
WorldPackets::CombatLog::SpellDamageShield damageShield;
@@ -1522,6 +1534,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
damageShield.Defender = GetGUID();
damageShield.SpellID = spellInfo->Id;
damageShield.TotalDamage = damage;
+ damageShield.OriginalDamage = damageInfo.GetOriginalDamage();
damageShield.OverKill = std::max(int32(damage) - int32(GetHealth()), 0);
damageShield.SchoolMask = spellInfo->SchoolMask;
damageShield.LogAbsorbed = damageInfo.GetAbsorb();
@@ -1881,6 +1894,7 @@ void Unit::CalcAbsorbResist(DamageInfo& damageInfo)
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
log.damage = splitDamage;
+ log.originalDamage = splitDamage;
log.absorb = split_absorb;
SendSpellNonMeleeDamageLog(&log);
@@ -2016,6 +2030,7 @@ void Unit::FakeAttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BA
damageInfo.damageSchoolMask = GetMeleeDamageSchoolMask();
damageInfo.attackType = attType;
damageInfo.damage = 0;
+ damageInfo.originalDamage = 0;
damageInfo.cleanDamage = 0;
damageInfo.absorb = 0;
damageInfo.resist = 0;
@@ -4985,6 +5000,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log)
packet.CastID = log->castId;
packet.SpellID = log->SpellID;
packet.Damage = log->damage;
+ packet.OriginalDamage = log->originalDamage;
if (log->damage > log->preHitHealth)
packet.Overkill = log->damage - log->preHitHealth;
else
@@ -4997,9 +5013,9 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log)
packet.Periodic = log->periodicLog;
packet.Flags = log->HitInfo;
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
- if (sandboxScalingData.GenerateDataForUnits(log->attacker, log->target))
- packet.SandboxScaling = sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
+ if (contentTuningParams.GenerateDataForUnits(log->attacker, log->target))
+ packet.ContentTuning = contentTuningParams;
SendCombatLogMessage(&packet);
}
@@ -5025,10 +5041,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info)
data.SpellID = aura->GetId();
data.LogData.Initialize(this);
- /// @todo: should send more logs in one packet when multistrike
WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect;
spellLogEffect.Effect = aura->GetAuraType();
spellLogEffect.Amount = info->damage;
+ spellLogEffect.OriginalDamage = info->originalDamage;
spellLogEffect.OverHealOrKill = info->overDamage;
spellLogEffect.SchoolMaskOrPower = aura->GetSpellInfo()->GetSchoolMask();
spellLogEffect.AbsorbedOrAmplitude = info->absorb;
@@ -5036,10 +5052,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info)
spellLogEffect.Crit = info->critical;
/// @todo: implement debug info
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
if (Unit* caster = ObjectAccessor::GetUnit(*this, aura->GetCasterGUID()))
- if (sandboxScalingData.GenerateDataForUnits(caster, this))
- spellLogEffect.SandboxScaling = sandboxScalingData;
+ if (contentTuningParams.GenerateDataForUnits(caster, this))
+ spellLogEffect.ContentTuning = contentTuningParams;
data.Effects.push_back(spellLogEffect);
@@ -5081,6 +5097,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
packet.AttackerGUID = damageInfo->attacker->GetGUID();
packet.VictimGUID = damageInfo->target->GetGUID();
packet.Damage = damageInfo->damage;
+ packet.OriginalDamage = damageInfo->originalDamage;
int32 overkill = damageInfo->damage - damageInfo->target->GetHealth();
packet.OverDamage = (overkill < 0 ? -1 : overkill);
@@ -5096,9 +5113,9 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
packet.LogData.Initialize(damageInfo->attacker);
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
- if (sandboxScalingData.GenerateDataForUnits(damageInfo->attacker, damageInfo->target))
- packet.SandboxScaling = sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
+ if (contentTuningParams.GenerateDataForUnits(damageInfo->attacker, damageInfo->target))
+ packet.ContentTuning = contentTuningParams;
SendCombatLogMessage(&packet);
}
@@ -5110,6 +5127,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType
dmgInfo.attacker = this;
dmgInfo.target = target;
dmgInfo.damage = Damage - AbsorbDamage - Resist - BlockedAmount;
+ dmgInfo.originalDamage = Damage;
dmgInfo.damageSchoolMask = damageSchoolMask;
dmgInfo.absorb = AbsorbDamage;
dmgInfo.resist = Resist;
@@ -6334,32 +6352,12 @@ void Unit::SendHealSpellLog(HealInfo& healInfo, bool critical /*= false*/)
spellHealLog.TargetGUID = healInfo.GetTarget()->GetGUID();
spellHealLog.CasterGUID = healInfo.GetHealer()->GetGUID();
-
spellHealLog.SpellID = healInfo.GetSpellInfo()->Id;
spellHealLog.Health = healInfo.GetHeal();
+ spellHealLog.OriginalHeal = healInfo.GetOriginalHeal();
spellHealLog.OverHeal = int32(healInfo.GetHeal()) - healInfo.GetEffectiveHeal();
spellHealLog.Absorbed = healInfo.GetAbsorb();
-
spellHealLog.Crit = critical;
-
- /// @todo: 6.x Has to be implemented
- /*
- packet.ReadBit("Multistrike");
-
- var hasCritRollMade = packet.ReadBit("HasCritRollMade");
- var hasCritRollNeeded = packet.ReadBit("HasCritRollNeeded");
- var hasLogData = packet.ReadBit("HasLogData");
-
- if (hasCritRollMade)
- packet.ReadSingle("CritRollMade");
-
- if (hasCritRollNeeded)
- packet.ReadSingle("CritRollNeeded");
-
- if (hasLogData)
- SpellParsers.ReadSpellCastLogData(packet);
- */
-
spellHealLog.LogData.Initialize(healInfo.GetTarget());
SendCombatLogMessage(&spellHealLog);
}
@@ -11665,7 +11663,7 @@ bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading /*= fa
return false;
m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
- m_updateFlag |= UPDATEFLAG_VEHICLE;
+ m_updateFlag.Vehicle = true;
m_unitTypeMask |= UNIT_MASK_VEHICLE;
if (!loading)
@@ -11687,7 +11685,7 @@ void Unit::RemoveVehicleKit(bool onRemoveFromWorld /*= false*/)
m_vehicleKit = NULL;
- m_updateFlag &= ~UPDATEFLAG_VEHICLE;
+ m_updateFlag.Vehicle = false;
m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
RemoveFlag64(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK | UNIT_NPC_FLAG_PLAYER_VEHICLE);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 94d2fa06c75..77e23462cd8 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -576,6 +576,7 @@ class TC_GAME_API DamageInfo
Unit* const m_attacker;
Unit* const m_victim;
uint32 m_damage;
+ uint32 const m_originalDamage;
SpellInfo const* const m_spellInfo;
SpellSchoolMask const m_schoolMask;
DamageEffectType const m_damageType;
@@ -601,6 +602,7 @@ class TC_GAME_API DamageInfo
DamageEffectType GetDamageType() const { return m_damageType; }
WeaponAttackType GetAttackType() const { return m_attackType; }
uint32 GetDamage() const { return m_damage; }
+ uint32 GetOriginalDamage() const { return m_originalDamage; }
uint32 GetAbsorb() const { return m_absorb; }
uint32 GetResist() const { return m_resist; }
uint32 GetBlock() const { return m_block; }
@@ -614,6 +616,7 @@ class TC_GAME_API HealInfo
Unit* const _healer;
Unit* const _target;
uint32 _heal;
+ uint32 const _originalHeal;
uint32 _effectiveHeal;
uint32 _absorb;
SpellInfo const* const _spellInfo;
@@ -629,6 +632,7 @@ class TC_GAME_API HealInfo
Unit* GetHealer() const { return _healer; }
Unit* GetTarget() const { return _target; }
uint32 GetHeal() const { return _heal; }
+ uint32 GetOriginalHeal() const { return _originalHeal; }
uint32 GetEffectiveHeal() const { return _effectiveHeal; }
uint32 GetAbsorb() const { return _absorb; }
SpellInfo const* GetSpellInfo() const { return _spellInfo; };
@@ -682,6 +686,7 @@ struct CalcDamageInfo
Unit *target; // Target for damage
uint32 damageSchoolMask;
uint32 damage;
+ uint32 originalDamage;
uint32 absorb;
uint32 resist;
uint32 blocked_amount;
@@ -706,6 +711,7 @@ struct TC_GAME_API SpellNonMeleeDamage
uint32 SpellID;
uint32 SpellXSpellVisualID;
uint32 damage;
+ uint32 originalDamage;
uint32 schoolMask;
uint32 absorb;
uint32 resist;
@@ -720,11 +726,12 @@ struct TC_GAME_API SpellNonMeleeDamage
struct SpellPeriodicAuraLogInfo
{
- SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical)
- : auraEff(_auraEff), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ }
+ SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _originalDamage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical)
+ : auraEff(_auraEff), damage(_damage), originalDamage(_originalDamage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ }
AuraEffect const* auraEff;
uint32 damage;
+ uint32 originalDamage;
uint32 overDamage; // overkill/overheal
uint32 absorb;
uint32 resist;
diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp
index 903525c90f5..ecbaac165a6 100644
--- a/src/server/game/Globals/AreaTriggerDataStore.cpp
+++ b/src/server/game/Globals/AreaTriggerDataStore.cpp
@@ -147,8 +147,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
while (templates->NextRow());
}
- // 0 1 2 3 4 5 6 7 8
- if (QueryResult areatriggerSpellMiscs = WorldDatabase.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`"))
+ // 0 1 2 3 4 5 6 7 8 9 10
+ if (QueryResult areatriggerSpellMiscs = WorldDatabase.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`"))
{
do
{
@@ -182,10 +182,13 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
#undef VALIDATE_AND_SET_CURVE
- miscTemplate.DecalPropertiesId = areatriggerSpellMiscFields[6].GetUInt32();
+ miscTemplate.AnimId = areatriggerSpellMiscFields[6].GetInt32();
+ miscTemplate.AnimKitId = areatriggerSpellMiscFields[7].GetInt32();
- miscTemplate.TimeToTarget = areatriggerSpellMiscFields[7].GetUInt32();
- miscTemplate.TimeToTargetScale = areatriggerSpellMiscFields[8].GetUInt32();
+ miscTemplate.DecalPropertiesId = areatriggerSpellMiscFields[8].GetUInt32();
+
+ miscTemplate.TimeToTarget = areatriggerSpellMiscFields[9].GetUInt32();
+ miscTemplate.TimeToTargetScale = areatriggerSpellMiscFields[10].GetUInt32();
miscTemplate.SplinePoints = std::move(splinesBySpellMisc[miscTemplate.MiscId]);
diff --git a/src/server/game/Globals/ConversationDataStore.cpp b/src/server/game/Globals/ConversationDataStore.cpp
index af2a416e000..9d57f6d0a17 100644
--- a/src/server/game/Globals/ConversationDataStore.cpp
+++ b/src/server/game/Globals/ConversationDataStore.cpp
@@ -150,7 +150,7 @@ void ConversationDataStore::LoadConversationTemplates()
TC_LOG_INFO("server.loading", ">> Loaded 0 Conversation actors. DB table `conversation_actors` is empty.");
}
- if (QueryResult templates = WorldDatabase.Query("SELECT Id, FirstLineId, LastLineEndTime, ScriptName FROM conversation_template"))
+ if (QueryResult templates = WorldDatabase.Query("SELECT Id, FirstLineId, LastLineEndTime, TextureKitId, ScriptName FROM conversation_template"))
{
uint32 oldMSTime = getMSTime();
@@ -162,7 +162,8 @@ void ConversationDataStore::LoadConversationTemplates()
conversationTemplate.Id = fields[0].GetUInt32();
conversationTemplate.FirstLineId = fields[1].GetUInt32();
conversationTemplate.LastLineEndTime = fields[2].GetUInt32();
- conversationTemplate.ScriptId = sObjectMgr->GetScriptId(fields[3].GetString());
+ conversationTemplate.TextureKitId = fields[3].GetUInt32();
+ conversationTemplate.ScriptId = sObjectMgr->GetScriptId(fields[4].GetString());
conversationTemplate.Actors = std::move(actorsByConversation[conversationTemplate.Id]);
conversationTemplate.ActorGuids = std::move(actorGuidsByConversation[conversationTemplate.Id]);
@@ -184,7 +185,7 @@ void ConversationDataStore::LoadConversationTemplates()
currentConversationLine = sConversationLineStore.AssertEntry(currentConversationLine->NextConversationLineID);
}
- _conversationTemplateStore[conversationTemplate.Id] = conversationTemplate;
+ _conversationTemplateStore[conversationTemplate.Id] = std::move(conversationTemplate);
}
while (templates->NextRow());
diff --git a/src/server/game/Globals/ConversationDataStore.h b/src/server/game/Globals/ConversationDataStore.h
index e6e750455d5..d4d53a2cd7d 100644
--- a/src/server/game/Globals/ConversationDataStore.h
+++ b/src/server/game/Globals/ConversationDataStore.h
@@ -28,7 +28,6 @@ enum ConversationLineFlags
CONVERSATION_LINE_FLAG_NOTIFY_STARTED = 0x1 // Client will send CMSG_CONVERSATION_LINE_STARTED when it runs this line
};
-#pragma pack(push, 1)
struct ConversationActorTemplate
{
uint32 Id;
@@ -36,6 +35,7 @@ struct ConversationActorTemplate
uint32 CreatureModelId;
};
+#pragma pack(push, 1)
struct ConversationLineTemplate
{
uint32 Id; // Link to ConversationLine.db2
@@ -52,6 +52,7 @@ struct ConversationTemplate
uint32 Id;
uint32 FirstLineId; // Link to ConversationLine.db2
uint32 LastLineEndTime; // Time in ms after conversation creation the last line fades out
+ uint32 TextureKitId; // Background texture
std::vector<ConversationActorTemplate const*> Actors;
std::vector<ObjectGuid::LowType> ActorGuids;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 6f562ba412e..af49f29b3c1 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -171,30 +171,37 @@ ExtendedPlayerName ExtractExtendedPlayerName(std::string const& name)
LanguageDesc lang_description[LANGUAGES_COUNT] =
{
- { LANG_ADDON, 0, 0 },
- { LANG_UNIVERSAL, 0, 0 },
- { LANG_ORCISH, 669, SKILL_LANG_ORCISH },
- { LANG_DARNASSIAN, 671, SKILL_LANG_DARNASSIAN },
- { LANG_TAURAHE, 670, SKILL_LANG_TAURAHE },
- { LANG_DWARVISH, 672, SKILL_LANG_DWARVEN },
- { LANG_COMMON, 668, SKILL_LANG_COMMON },
- { LANG_DEMONIC, 815, SKILL_LANG_DEMON_TONGUE },
- { LANG_TITAN, 816, SKILL_LANG_TITAN },
- { LANG_THALASSIAN, 813, SKILL_LANG_THALASSIAN },
- { LANG_DRACONIC, 814, SKILL_LANG_DRACONIC },
- { LANG_KALIMAG, 817, SKILL_LANG_OLD_TONGUE },
- { LANG_GNOMISH, 7340, SKILL_LANG_GNOMISH },
- { LANG_TROLL, 7341, SKILL_LANG_TROLL },
- { LANG_GUTTERSPEAK, 17737, SKILL_LANG_FORSAKEN },
- { LANG_DRAENEI, 29932, SKILL_LANG_DRAENEI },
- { LANG_ZOMBIE, 0, 0 },
- { LANG_GNOMISH_BINARY, 0, 0 },
- { LANG_GOBLIN_BINARY, 0, 0 },
- { LANG_WORGEN, 69270, SKILL_LANG_GILNEAN },
- { LANG_GOBLIN, 69269, SKILL_LANG_GOBLIN },
- { LANG_PANDAREN_NEUTRAL, 108127, SKILL_LANG_PANDAREN_NEUTRAL },
- { LANG_PANDAREN_ALLIANCE, 108130, SKILL_LANG_PANDAREN_ALLIANCE },
- { LANG_PANDAREN_HORDE, 108131, SKILL_LANG_PANDAREN_HORDE }
+ { LANG_ADDON, 0, 0 },
+ { LANG_ADDON_LOGGED, 0, 0 },
+ { LANG_UNIVERSAL, 0, 0 },
+ { LANG_ORCISH, 669, SKILL_LANGUAGE_ORCISH },
+ { LANG_DARNASSIAN, 671, SKILL_LANGUAGE_DARNASSIAN },
+ { LANG_TAURAHE, 670, SKILL_LANGUAGE_TAURAHE },
+ { LANG_DWARVISH, 672, SKILL_LANGUAGE_DWARVEN },
+ { LANG_COMMON, 668, SKILL_LANGUAGE_COMMON },
+ { LANG_DEMONIC, 815, SKILL_LANGUAGE_DEMON_TONGUE },
+ { LANG_TITAN, 816, SKILL_LANGUAGE_TITAN },
+ { LANG_THALASSIAN, 813, SKILL_LANGUAGE_THALASSIAN },
+ { LANG_DRACONIC, 814, SKILL_LANGUAGE_DRACONIC },
+ { LANG_KALIMAG, 265462, SKILL_LANGUAGE_OLD_TONGUE },
+ { LANG_GNOMISH, 7340, SKILL_LANGUAGE_GNOMISH },
+ { LANG_TROLL, 7341, SKILL_LANGUAGE_TROLL },
+ { LANG_GUTTERSPEAK, 17737, SKILL_LANGUAGE_FORSAKEN },
+ { LANG_DRAENEI, 29932, SKILL_LANGUAGE_DRAENEI },
+ { LANG_ZOMBIE, 265467, 0 },
+ { LANG_GNOMISH_BINARY, 265460, 0 },
+ { LANG_GOBLIN_BINARY, 265461, 0 },
+ { LANG_WORGEN, 69270, SKILL_LANGUAGE_GILNEAN },
+ { LANG_GOBLIN, 69269, SKILL_LANGUAGE_GOBLIN },
+ { LANG_PANDAREN_NEUTRAL, 108127, SKILL_LANGUAGE_PANDAREN_NEUTRAL },
+ { LANG_PANDAREN_ALLIANCE, 108130, 0 },
+ { LANG_PANDAREN_HORDE, 108131, 0 },
+ { LANG_SPRITE, 265466, 0 },
+ { LANG_SHATH_YAR, 265465, 0 },
+ { LANG_NERGLISH, 265464, 0 },
+ { LANG_MOONKIN, 265463, 0 },
+ { LANG_SHALASSIAN, 262439, SKILL_LANGUAGE_SHALASSIAN },
+ { LANG_THALASSIAN_2, 262454, SKILL_LANGUAGE_THALASSIAN_2 }
};
LanguageDesc const* GetLanguageDescByID(uint32 lang)
@@ -3924,35 +3931,35 @@ void ObjectMgr::LoadQuests()
mExclusiveQuestGroups.clear();
QueryResult result = WorldDatabase.Query("SELECT "
- //0 1 2 3 4 5 6 7 8 9 10 11
- "ID, QuestType, QuestLevel, MaxScalingLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, "
- //12 13 14 15 16 17 18 19 20 21 22
+ //0 1 2 3 4 5 6 7 8 9 10 11 12
+ "ID, QuestType, QuestLevel, ScalingFactionGroup, MaxScalingLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, "
+ //13 14 15 16 17 18 19 20 21 22 23
"RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, "
- //23 24 25 26 27
- "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, "
- //28 29 30 31 32 33 34 35
+ //24 25 26 27 28 29
+ "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, FlagsEx2, "
+ //30 31 32 33 34 35 36 37
"RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, "
- //36 37 38 39 40 41 42 43
+ //38 39 40 41 42 43 44 45
"RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, "
- //44 45 46 47 48 49
+ //46 47 48 49 50 51
"RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, "
- //50 51 52 53 54 55
+ //52 53 54 55 56 57
"RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, "
- //56 57 58 59 60 61
+ //58 59 60 61 62 63
"RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, "
- //62 63 64 65 66 67 68 69 70 71
- "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, "
- //72 73 74 75 76 77 78 79
+ //64 65 66 67 68 69 70 71 72 73 74
+ "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitGiverMount, PortraitTurnIn, "
+ //75 76 77 78 79 80 81 82
"RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, "
- //80 81 82 83 84 85 86 87
+ //83 84 85 86 87 88 89 90
"RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, "
- //88 89 90 91 92
+ //91 92 93 94 95
"RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, "
- //93 94 95 96 97 98 99 100
+ //96 97 98 99 100 101 102 103
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, "
- //101 102 103 104 105 106 107
- "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, Expansion, "
- //108 109 110 111 112 113 114 115 116
+ //104 105 106 107 108 109 110
+ "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, "
+ //111 112 113 114 115 116 117 118 119
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog"
" FROM quest_template");
if (!result)
@@ -7027,8 +7034,8 @@ void ObjectMgr::LoadGameObjectTemplate()
"Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
// 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
"Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, Data24, Data25, Data26, Data27, Data28, "
- // 37 38 39 40 41 42 43
- "Data29, Data30, Data31, Data32, RequiredLevel, AIName, ScriptName "
+ // 37 38 39 40 41 42 43 44
+ "Data29, Data30, Data31, Data32, Data33, RequiredLevel, AIName, ScriptName "
"FROM gameobject_template");
if (!result)
@@ -7058,9 +7065,9 @@ void ObjectMgr::LoadGameObjectTemplate()
for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
got.raw.data[i] = fields[8 + i].GetUInt32();
- got.RequiredLevel = fields[41].GetInt32();
- got.AIName = fields[42].GetString();
- got.ScriptId = GetScriptId(fields[43].GetString());
+ got.RequiredLevel = fields[42].GetInt32();
+ got.AIName = fields[43].GetString();
+ got.ScriptId = GetScriptId(fields[44].GetString());
// Checks
@@ -7696,8 +7703,8 @@ void ObjectMgr::LoadQuestPOI()
uint32 count = 0;
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- QueryResult result = WorldDatabase.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1");
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
+ QueryResult result = WorldDatabase.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, UiMapID, Priority, Flags, WorldEffectID, PlayerConditionID, SpawnTrackingID, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1");
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
@@ -7737,33 +7744,32 @@ void ObjectMgr::LoadQuestPOI()
{
Field* fields = result->Fetch();
- int32 QuestID = fields[0].GetInt32();
- int32 BlobIndex = fields[1].GetInt32();
- int32 Idx1 = fields[2].GetInt32();
- int32 ObjectiveIndex = fields[3].GetInt32();
- int32 QuestObjectiveID = fields[4].GetInt32();
- int32 QuestObjectID = fields[5].GetInt32();
- int32 MapID = fields[6].GetInt32();
- int32 WorldMapAreaId = fields[7].GetInt32();
- int32 Floor = fields[8].GetInt32();
- int32 Priority = fields[9].GetInt32();
- int32 Flags = fields[10].GetInt32();
- int32 WorldEffectID = fields[11].GetInt32();
- int32 PlayerConditionID = fields[12].GetInt32();
- int32 WoDUnk1 = fields[13].GetInt32();
- bool AlwaysAllowMergingBlobs = fields[14].GetBool();
-
- if (!sObjectMgr->GetQuestTemplate(QuestID))
- TC_LOG_ERROR("sql.sql", "`quest_poi` quest id (%u) Idx1 (%u) does not exist in `quest_template`", QuestID, Idx1);
-
- QuestPOI POI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs);
- if (QuestID < int32(POIs.size()) && Idx1 < int32(POIs[QuestID].size()))
- {
- POI.points = POIs[QuestID][Idx1];
- _questPOIStore[QuestID].push_back(POI);
+ int32 questID = fields[0].GetInt32();
+ int32 blobIndex = fields[1].GetInt32();
+ int32 idx1 = fields[2].GetInt32();
+ int32 objectiveIndex = fields[3].GetInt32();
+ int32 questObjectiveID = fields[4].GetInt32();
+ int32 questObjectID = fields[5].GetInt32();
+ int32 mapID = fields[6].GetInt32();
+ int32 uiMapID = fields[7].GetInt32();
+ int32 priority = fields[8].GetInt32();
+ int32 flags = fields[9].GetInt32();
+ int32 worldEffectID = fields[10].GetInt32();
+ int32 playerConditionID = fields[11].GetInt32();
+ int32 spawnTrackingID = fields[12].GetInt32();
+ bool alwaysAllowMergingBlobs = fields[13].GetBool();
+
+ if (!sObjectMgr->GetQuestTemplate(questID))
+ TC_LOG_ERROR("sql.sql", "`quest_poi` quest id (%u) Idx1 (%u) does not exist in `quest_template`", questID, idx1);
+
+ QuestPOI POI(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapID, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, alwaysAllowMergingBlobs);
+ if (questID < int32(POIs.size()) && idx1 < int32(POIs[questID].size()))
+ {
+ POI.points = POIs[questID][idx1];
+ _questPOIStore[questID].push_back(POI);
}
else
- TC_LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest %i POI id %i", QuestID, BlobIndex);
+ TC_LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest %i POI id %i", questID, blobIndex);
++count;
} while (result->NextRow());
@@ -10099,7 +10105,7 @@ void ObjectMgr::LoadPlayerChoices()
uint32 oldMSTime = getMSTime();
_playerChoices.clear();
- QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader FROM playerchoice");
+ QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice");
if (!choices)
{
@@ -10124,10 +10130,11 @@ void ObjectMgr::LoadPlayerChoices()
choice.UiTextureKitId = fields[1].GetInt32();
choice.Question = fields[2].GetString();
choice.HideWarboardHeader = fields[3].GetBool();
+ choice.KeepOpenAfterChoice = fields[4].GetBool();
} while (choices->NextRow());
- if (QueryResult responses = WorldDatabase.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Header, Answer, Description, Confirmation FROM playerchoice_response ORDER BY `Index` ASC"))
+ if (QueryResult responses = WorldDatabase.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, GroupID, Header, Answer, Description, Confirmation FROM playerchoice_response ORDER BY `Index` ASC"))
{
do
{
@@ -10148,10 +10155,13 @@ void ObjectMgr::LoadPlayerChoices()
PlayerChoiceResponse& response = choice->Responses.back();
response.ResponseId = responseId;
response.ChoiceArtFileId = fields[2].GetInt32();
- response.Header = fields[3].GetString();
- response.Answer = fields[4].GetString();
- response.Description = fields[5].GetString();
- response.Confirmation = fields[6].GetString();
+ response.Flags = fields[3].GetInt32();
+ response.WidgetSetID = fields[4].GetUInt32();
+ response.GroupID = fields[5].GetUInt8();
+ response.Header = fields[6].GetString();
+ response.Answer = fields[7].GetString();
+ response.Description = fields[8].GetString();
+ response.Confirmation = fields[9].GetString();
++responseCount;
} while (responses->NextRow());
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4be76f3cf8c..01ce6ee385d 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -710,20 +710,19 @@ struct QuestPOI
int32 QuestObjectiveID;
int32 QuestObjectID;
int32 MapID;
- int32 WorldMapAreaID;
- int32 Floor;
+ int32 UiMapID;
int32 Priority;
int32 Flags;
int32 WorldEffectID;
int32 PlayerConditionID;
- int32 UnkWoD1;
+ int32 SpawnTrackingID;
std::vector<QuestPOIPoint> points;
bool AlwaysAllowMergingBlobs;
- QuestPOI() : BlobIndex(0), ObjectiveIndex(0), QuestObjectiveID(0), QuestObjectID(0), MapID(0), WorldMapAreaID(0), Floor(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0), UnkWoD1(0), AlwaysAllowMergingBlobs(false){ }
- QuestPOI(int32 _BlobIndex, int32 _ObjectiveIndex, int32 _QuestObjectiveID, int32 _QuestObjectID, int32 _MapID, int32 _WorldMapAreaID, int32 _Foor, int32 _Priority, int32 _Flags, int32 _WorldEffectID, int32 _PlayerConditionID, int32 _UnkWoD1, bool _AlwaysAllowMergingBlobs) :
- BlobIndex(_BlobIndex), ObjectiveIndex(_ObjectiveIndex), QuestObjectiveID(_QuestObjectiveID), QuestObjectID(_QuestObjectID), MapID(_MapID), WorldMapAreaID(_WorldMapAreaID),
- Floor(_Foor), Priority(_Priority), Flags(_Flags), WorldEffectID(_WorldEffectID), PlayerConditionID(_PlayerConditionID), UnkWoD1(_UnkWoD1), AlwaysAllowMergingBlobs(_AlwaysAllowMergingBlobs) { }
+ QuestPOI() : BlobIndex(0), ObjectiveIndex(0), QuestObjectiveID(0), QuestObjectID(0), MapID(0), UiMapID(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0), SpawnTrackingID(0), AlwaysAllowMergingBlobs(false){ }
+ QuestPOI(int32 blobIndex, int32 objectiveIndex, int32 questObjectiveID, int32 questObjectID, int32 mapID, int32 uiMapID, int32 priority, int32 flags, int32 worldEffectID, int32 playerConditionID, int32 spawnTrackingID, bool alwaysAllowMergingBlobs) :
+ BlobIndex(blobIndex), ObjectiveIndex(objectiveIndex), QuestObjectiveID(questObjectiveID), QuestObjectID(questObjectID), MapID(mapID), UiMapID(uiMapID),
+ Priority(priority), Flags(flags), WorldEffectID(worldEffectID), PlayerConditionID(playerConditionID), SpawnTrackingID(spawnTrackingID), AlwaysAllowMergingBlobs(alwaysAllowMergingBlobs) { }
};
typedef std::vector<QuestPOI> QuestPOIVector;
@@ -794,6 +793,9 @@ struct PlayerChoiceResponse
{
int32 ResponseId;
int32 ChoiceArtFileId;
+ int32 Flags;
+ uint32 WidgetSetID;
+ uint8 GroupID;
std::string Header;
std::string Answer;
std::string Description;
@@ -808,6 +810,7 @@ struct PlayerChoice
std::string Question;
std::vector<PlayerChoiceResponse> Responses;
bool HideWarboardHeader;
+ bool KeepOpenAfterChoice;
PlayerChoiceResponse const* GetResponse(int32 responseId) const
{
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index 296bf506edc..251708cb48d 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -98,6 +98,9 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
features.BpayStoreDisabledByParentalControls = false;
features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED);
features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED);
+ features.MaxCharactersPerRealm = sWorld->getIntConfig(CONFIG_CHARACTERS_PER_REALM);
+ features.MinimumExpansionLevel = EXPANSION_CLASSIC;
+ features.MaximumExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION);
SendPacket(features.Write());
}
diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index 887bc6b4742..43de963bda4 100644
--- a/src/server/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
@@ -79,8 +79,7 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet
WorldPackets::Calendar::CalendarSendCalendarEventInfo eventInfo;
eventInfo.EventID = event->GetEventId();
eventInfo.Date = event->GetDate();
- Guild* guild = sGuildMgr->GetGuildById(event->GetGuildId());
- eventInfo.EventGuildID = guild ? guild->GetGUID() : ObjectGuid::Empty;
+ eventInfo.EventClubID = event->GetGuildId();
eventInfo.EventName = event->GetTitle();
eventInfo.EventType = event->GetType();
eventInfo.Flags = event->GetFlags();
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index bc3fb563a57..c5b4e0487ff 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -349,6 +349,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result)
while (result->NextRow());
}
+ charEnum.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter;
charEnum.IsDemonHunterCreationAllowed = GetAccountExpansion() >= EXPANSION_LEGION || canAlwaysCreateDemonHunter;
charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH;
@@ -733,7 +734,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
LoginDatabase.CommitTransaction(trans);
- SendCharCreate(CHAR_CREATE_SUCCESS);
+ SendCharCreate(CHAR_CREATE_SUCCESS, newChar.GetGUID());
TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Create Character: %s %s", GetAccountId(), GetRemoteAddress().c_str(), createInfo->Name.c_str(), newChar.GetGUID().ToString().c_str());
sScriptMgr->OnPlayerCreate(&newChar);
@@ -2476,10 +2477,11 @@ void WorldSession::HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCha
}));
}
-void WorldSession::SendCharCreate(ResponseCodes result)
+void WorldSession::SendCharCreate(ResponseCodes result, ObjectGuid const& guid /*= ObjectGuid::Empty*/)
{
WorldPackets::Character::CreateChar response;
response.Code = result;
+ response.Guid = guid;
SendPacket(response.Write());
}
diff --git a/src/server/game/Handlers/DuelHandler.cpp b/src/server/game/Handlers/DuelHandler.cpp
index 41892196367..c017617f507 100644
--- a/src/server/game/Handlers/DuelHandler.cpp
+++ b/src/server/game/Handlers/DuelHandler.cpp
@@ -49,7 +49,7 @@ void WorldSession::HandleCanDuel(WorldPackets::Duel::CanDuel& packet)
void WorldSession::HandleDuelResponseOpcode(WorldPackets::Duel::DuelResponse& duelResponse)
{
- if (duelResponse.Accepted)
+ if (duelResponse.Accepted && !duelResponse.Forfeited)
HandleDuelAccepted();
else
HandleDuelCancelled();
diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp
index 598f00c519f..1121fd4647d 100644
--- a/src/server/game/Handlers/InspectHandler.cpp
+++ b/src/server/game/Handlers/InspectHandler.cpp
@@ -62,6 +62,10 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect)
if (v.second != PLAYERSPELL_REMOVED)
inspectResult.Talents.push_back(v.first);
}
+
+ PlayerPvpTalentMap const& pvpTalents = player->GetPvpTalentMap(player->GetActiveTalentGroup());
+ for (std::size_t i = 0; i < pvpTalents.size(); ++i)
+ inspectResult.PvpTalents[i] = pvpTalents[i];
}
if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId()))
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 273bf287821..0e0a9f4ac43 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -95,10 +95,22 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe
for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i)
stats.ProxyCreatureID[i] = creatureInfo->KillCredit[i];
- stats.CreatureDisplayID[0] = creatureInfo->Modelid1;
- stats.CreatureDisplayID[1] = creatureInfo->Modelid2;
- stats.CreatureDisplayID[2] = creatureInfo->Modelid3;
- stats.CreatureDisplayID[3] = creatureInfo->Modelid4;
+ // TEMPORARY, PR #22567
+ auto addModel = [&](uint32 modelId)
+ {
+ if (modelId)
+ {
+ stats.Display.TotalProbability += 1.0f;
+ stats.Display.CreatureDisplay.emplace_back();
+ WorldPackets::Query::CreatureXDisplay& display = stats.Display.CreatureDisplay.back();
+ display.CreatureDisplayID = modelId;
+ }
+ };
+
+ addModel(creatureInfo->Modelid1);
+ addModel(creatureInfo->Modelid2);
+ addModel(creatureInfo->Modelid3);
+ addModel(creatureInfo->Modelid4);
stats.HpMulti = creatureInfo->ModHealth;
stats.EnergyMulti = creatureInfo->ModMana;
@@ -107,14 +119,14 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe
stats.RequiredExpansion = creatureInfo->RequiredExpansion;
stats.HealthScalingExpansion = creatureInfo->HealthScalingExpansion;
stats.VignetteID = creatureInfo->VignetteID;
+ stats.Class = creatureInfo->unit_class;
stats.Title = creatureInfo->SubName;
stats.TitleAlt = creatureInfo->TitleAlt;
stats.CursorName = creatureInfo->IconName;
if (std::vector<uint32> const* items = sObjectMgr->GetCreatureQuestItemList(packet.CreatureID))
- for (uint32 item : *items)
- stats.QuestItems.push_back(item);
+ stats.QuestItems.insert(stats.QuestItems.begin(), items->begin(), items->end());
LocaleConstant localeConstant = GetSessionDbLocaleIndex();
if (localeConstant != LOCALE_enUS)
@@ -368,13 +380,12 @@ void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& quest
questPOIBlobData.QuestObjectiveID = data->QuestObjectiveID;
questPOIBlobData.QuestObjectID = data->QuestObjectID;
questPOIBlobData.MapID = data->MapID;
- questPOIBlobData.WorldMapAreaID = data->WorldMapAreaID;
- questPOIBlobData.Floor = data->Floor;
+ questPOIBlobData.UiMapID = data->UiMapID;
questPOIBlobData.Priority = data->Priority;
questPOIBlobData.Flags = data->Flags;
questPOIBlobData.WorldEffectID = data->WorldEffectID;
questPOIBlobData.PlayerConditionID = data->PlayerConditionID;
- questPOIBlobData.UnkWoD1 = data->UnkWoD1;
+ questPOIBlobData.SpawnTrackingID = data->SpawnTrackingID;
questPOIBlobData.AlwaysAllowMergingBlobs = data->AlwaysAllowMergingBlobs;
for (QuestPOIPoint const& point : data->points)
diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index d7af3a34737..1d95689d761 100644
--- a/src/server/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
@@ -55,14 +55,14 @@ void WorldSession::HandleLearnPvpTalentsOpcode(WorldPackets::Talent::LearnPvpTal
{
WorldPackets::Talent::LearnPvpTalentsFailed learnPvpTalentsFailed;
bool anythingLearned = false;
- for (uint32 talentId : packet.Talents)
+ for (WorldPackets::Talent::PvPTalent pvpTalent : packet.Talents)
{
- if (TalentLearnResult result = _player->LearnPvpTalent(talentId, 0, &learnPvpTalentsFailed.SpellID))
+ if (TalentLearnResult result = _player->LearnPvpTalent(pvpTalent.PvPTalentID, pvpTalent.Slot, &learnPvpTalentsFailed.SpellID))
{
if (!learnPvpTalentsFailed.Reason)
learnPvpTalentsFailed.Reason = result;
- learnPvpTalentsFailed.Talents.push_back(talentId);
+ learnPvpTalentsFailed.Talents.push_back(pvpTalent);
}
else
anythingLearned = true;
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index bb427b5903c..86e801d1b2a 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -994,6 +994,7 @@ enum CharacterFlags4 : uint32
{
CHARACTER_FLAG_4_TRIAL_BOOST = 0x00000080,
CHARACTER_FLAG_4_TRIAL_BOOST_LOCKED = 0x00040000,
+ CHARACTER_FLAG_4_EXPANSION_TRIAL = 0x00080000,
};
#define PLAYER_CUSTOM_DISPLAY_SIZE 3
@@ -1048,11 +1049,17 @@ enum Language
LANG_PANDAREN_NEUTRAL = 42,
LANG_PANDAREN_ALLIANCE = 43,
LANG_PANDAREN_HORDE = 44,
- LANG_RIKKITUN = 168,
- LANG_ADDON = 0xFFFFFFFF // used by addons, in 2.4.0 not exist, replaced by messagetype?
+ LANG_SPRITE = 168,
+ LANG_SHATH_YAR = 178,
+ LANG_NERGLISH = 179,
+ LANG_MOONKIN = 180,
+ LANG_SHALASSIAN = 181,
+ LANG_THALASSIAN_2 = 182,
+ LANG_ADDON = 183,
+ LANG_ADDON_LOGGED = 184
};
-#define LANGUAGES_COUNT 25
+#define LANGUAGES_COUNT 31
enum TeamId
{
@@ -2426,11 +2433,15 @@ enum GameobjectTypes : uint8
GAMEOBJECT_TYPE_UI_LINK = 48,
GAMEOBJECT_TYPE_KEYSTONE_RECEPTACLE = 49,
GAMEOBJECT_TYPE_GATHERING_NODE = 50,
- GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD = 51
+ GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD = 51,
+ GAMEOBJECT_TYPE_MULTI = 52,
+ GAMEOBJECT_TYPE_SIEGEABLE_MULTI = 53,
+ GAMEOBJECT_TYPE_SIEGEABLE_MO = 54,
+ GAMEOBJECT_TYPE_PVP_REWARD = 55,
};
-#define MAX_GAMEOBJECT_TYPE 52 // sending to client this or greater value can crash client.
-#define MAX_GAMEOBJECT_DATA 33 // Max number of uint32 vars in gameobject_template data field
+#define MAX_GAMEOBJECT_TYPE 56 // sending to client this or greater value can crash client.
+#define MAX_GAMEOBJECT_DATA 34 // Max number of uint32 vars in gameobject_template data field
enum GameObjectFlags
{
@@ -4218,23 +4229,22 @@ enum SkillType
SKILL_MACES = 54,
SKILL_TWO_HANDED_SWORDS = 55,
SKILL_DEFENSE = 95,
- SKILL_LANG_COMMON = 98,
+ SKILL_LANGUAGE_COMMON = 98,
SKILL_RACIAL_DWARF = 101,
- SKILL_LANG_ORCISH = 109,
- SKILL_LANG_DWARVEN = 111,
- SKILL_LANG_DARNASSIAN = 113,
- SKILL_LANG_TAURAHE = 115,
+ SKILL_LANGUAGE_ORCISH = 109,
+ SKILL_LANGUAGE_DWARVEN = 111,
+ SKILL_LANGUAGE_DARNASSIAN = 113,
+ SKILL_LANGUAGE_TAURAHE = 115,
SKILL_DUAL_WIELD = 118,
SKILL_RACIAL_TAUREN = 124,
SKILL_RACIAL_ORC = 125,
SKILL_RACIAL_NIGHT_ELF = 126,
- SKILL_FIRST_AID = 129,
SKILL_STAVES = 136,
- SKILL_LANG_THALASSIAN = 137,
- SKILL_LANG_DRACONIC = 138,
- SKILL_LANG_DEMON_TONGUE = 139,
- SKILL_LANG_TITAN = 140,
- SKILL_LANG_OLD_TONGUE = 141,
+ SKILL_LANGUAGE_THALASSIAN = 137,
+ SKILL_LANGUAGE_DRACONIC = 138,
+ SKILL_LANGUAGE_DEMON_TONGUE = 139,
+ SKILL_LANGUAGE_TITAN = 140,
+ SKILL_LANGUAGE_OLD_TONGUE = 141,
SKILL_SURVIVAL = 142,
SKILL_HORSE_RIDING = 148,
SKILL_WOLF_RIDING = 149,
@@ -4279,8 +4289,8 @@ enum SkillType
SKILL_PET_TURTLE = 251,
SKILL_PET_GENERIC_HUNTER = 270,
SKILL_PLATE_MAIL = 293,
- SKILL_LANG_GNOMISH = 313,
- SKILL_LANG_TROLL = 315,
+ SKILL_LANGUAGE_GNOMISH = 313,
+ SKILL_LANGUAGE_TROLL = 315,
SKILL_ENCHANTING = 333,
SKILL_FISHING = 356,
SKILL_SKINNING = 393,
@@ -4296,7 +4306,7 @@ enum SkillType
SKILL_PET_HYENA = 654,
SKILL_PET_BIRD_OF_PREY = 655,
SKILL_PET_WIND_SERPENT = 656,
- SKILL_LANG_FORSAKEN = 673,
+ SKILL_LANGUAGE_FORSAKEN = 673,
SKILL_KODO_RIDING = 713,
SKILL_RACIAL_TROLL = 733,
SKILL_RACIAL_GNOME = 753,
@@ -4304,7 +4314,7 @@ enum SkillType
SKILL_JEWELCRAFTING = 755,
SKILL_RACIAL_BLOOD_ELF = 756,
SKILL_PET_EVENT_REMOTE_CONTROL = 758,
- SKILL_LANG_DRAENEI = 759,
+ SKILL_LANGUAGE_DRAENEI = 759,
SKILL_RACIAL_DRAENEI = 760,
SKILL_PET_FELGUARD = 761,
SKILL_RIDING = 762,
@@ -4330,8 +4340,8 @@ enum SkillType
SKILL_PET_EXOTIC_SPIRIT_BEAST = 788,
SKILL_RACIAL_WORGEN = 789,
SKILL_RACIAL_GOBLIN = 790,
- SKILL_LANG_GILNEAN = 791,
- SKILL_LANG_GOBLIN = 792,
+ SKILL_LANGUAGE_GILNEAN = 791,
+ SKILL_LANGUAGE_GOBLIN = 792,
SKILL_ARCHAEOLOGY = 794,
SKILL_HUNTER = 795,
SKILL_DEATH_KNIGHT = 796,
@@ -4343,7 +4353,7 @@ enum SkillType
SKILL_ALL_GLYPHS = 810,
SKILL_PET_DOG = 811,
SKILL_PET_MONKEY = 815,
- SKILL_PET_SHALE_SPIDER = 817,
+ SKILL_PET_EXOTIC_SHALE_SPIDER = 817,
SKILL_BEETLE = 818,
SKILL_ALL_GUILD_PERKS = 821,
SKILL_PET_HYDRA = 824,
@@ -4352,9 +4362,7 @@ enum SkillType
SKILL_WARLOCK = 849,
SKILL_RACIAL_PANDAREN = 899,
SKILL_MAGE = 904,
- SKILL_LANG_PANDAREN_NEUTRAL = 905,
- SKILL_LANG_PANDAREN_ALLIANCE = 906,
- SKILL_LANG_PANDAREN_HORDE = 907,
+ SKILL_LANGUAGE_PANDAREN_NEUTRAL = 905,
SKILL_ROGUE = 921,
SKILL_SHAMAN = 924,
SKILL_FEL_IMP = 927,
@@ -4374,17 +4382,16 @@ enum SkillType
SKILL_WAY_OF_THE_BREW = 980,
SKILL_APPRENTICE_COOKING = 981,
SKILL_JOURNEYMAN_COOKBOOK = 982,
- SKILL_PORCUPINE = 983,
- SKILL_CRANE = 984,
- SKILL_WATER_STRIDER = 985,
+ SKILL_PET_RODENT = 983,
+ SKILL_PET_CRANE = 984,
+ SKILL_PET_WATER_STRIDER = 985,
SKILL_PET_EXOTIC_QUILEN = 986,
SKILL_PET_GOAT = 987,
- SKILL_BASILISK = 988,
+ SKILL_PET_BASILISK = 988,
SKILL_NO_PLAYERS = 999,
- SKILL_DIREHORN = 1305,
+ SKILL_PET_DIREHORN = 1305,
SKILL_PET_PRIMAL_STORM_ELEMENTAL = 1748,
SKILL_PET_WATER_ELEMENTAL_MINOR_TALENT_VERSION = 1777,
- SKILL_PET_EXOTIC_RYLAK = 1818,
SKILL_PET_RIVERBEAST = 1819,
SKILL_UNUSED = 1830,
SKILL_DEMON_HUNTER = 1848,
@@ -4396,6 +4403,127 @@ enum SkillType
SKILL_WARGLAIVES = 2152,
SKILL_PET_MECHANICAL = 2189,
SKILL_PET_ABOMINATION = 2216,
+ SKILL_PET_OXEN = 2279,
+ SKILL_PET_SCALEHIDE = 2280,
+ SKILL_PET_FEATHERMANE = 2361,
+ SKILL_RACIAL_NIGHTBORNE = 2419,
+ SKILL_RACIAL_HIGHMOUNTAIN_TAUREN = 2420,
+ SKILL_RACIAL_LIGHTFORGED_DRAENEI = 2421,
+ SKILL_RACIAL_VOID_ELF = 2423,
+ SKILL_KUL_TIRAN_BLACKSMITHING = 2437,
+ SKILL_LEGION_BLACKSMITHING = 2454,
+ SKILL_LANGUAGE_SHALASSIAN = 2464,
+ SKILL_LANGUAGE_THALASSIAN_2 = 2465,
+ SKILL_DRAENOR_BLACKSMITHING = 2472,
+ SKILL_PANDARIA_BLACKSMITHING = 2473,
+ SKILL_CATACLYSM_BLACKSMITHING = 2474,
+ SKILL_NORTHREND_BLACKSMITHING = 2475,
+ SKILL_OUTLAND_BLACKSMITHING = 2476,
+ SKILL_BLACKSMITHING_2 = 2477,
+ SKILL_KUL_TIRAN_ALCHEMY = 2478,
+ SKILL_LEGION_ALCHEMY = 2479,
+ SKILL_DRAENOR_ALCHEMY = 2480,
+ SKILL_PANDARIA_ALCHEMY = 2481,
+ SKILL_CATACLYSM_ALCHEMY = 2482,
+ SKILL_NORTHREND_ALCHEMY = 2483,
+ SKILL_OUTLAND_ALCHEMY = 2484,
+ SKILL_ALCHEMY_2 = 2485,
+ SKILL_KUL_TIRAN_ENCHANTING = 2486,
+ SKILL_LEGION_ENCHANTING = 2487,
+ SKILL_DRAENOR_ENCHANTING = 2488,
+ SKILL_PANDARIA_ENCHANTING = 2489,
+ SKILL_CATACLYSM_ENCHANTING = 2491,
+ SKILL_NORTHREND_ENCHANTING = 2492,
+ SKILL_OUTLAND_ENCHANTING = 2493,
+ SKILL_ENCHANTING_2 = 2494,
+ SKILL_KUL_TIRAN_ENGINEERING = 2499,
+ SKILL_LEGION_ENGINEERING = 2500,
+ SKILL_DRAENOR_ENGINEERING = 2501,
+ SKILL_PANDARIA_ENGINEERING = 2502,
+ SKILL_CATACLYSM_ENGINEERING = 2503,
+ SKILL_NORTHREND_ENGINEERING = 2504,
+ SKILL_OUTLAND_ENGINEERING = 2505,
+ SKILL_ENGINEERING_2 = 2506,
+ SKILL_KUL_TIRAN_INSCRIPTION = 2507,
+ SKILL_LEGION_INSCRIPTION = 2508,
+ SKILL_DRAENOR_INSCRIPTION = 2509,
+ SKILL_PANDARIA_INSCRIPTION = 2510,
+ SKILL_CATACLYSM_INSCRIPTION = 2511,
+ SKILL_NORTHREND_INSCRIPTION = 2512,
+ SKILL_OUTLAND_INSCRIPTION = 2513,
+ SKILL_INSCRIPTION_2 = 2514,
+ SKILL_KUL_TIRAN_JEWELCRAFTING = 2517,
+ SKILL_LEGION_JEWELCRAFTING = 2518,
+ SKILL_DRAENOR_JEWELCRAFTING = 2519,
+ SKILL_PANDARIA_JEWELCRAFTING = 2520,
+ SKILL_CATACLYSM_JEWELCRAFTING = 2521,
+ SKILL_NORTHREND_JEWELCRAFTING = 2522,
+ SKILL_OUTLAND_JEWELCRAFTING = 2523,
+ SKILL_JEWELCRAFTING_2 = 2524,
+ SKILL_KUL_TIRAN_LEATHERWORKING = 2525,
+ SKILL_LEGION_LEATHERWORKING = 2526,
+ SKILL_DRAENOR_LEATHERWORKING = 2527,
+ SKILL_PANDARIA_LEATHERWORKING = 2528,
+ SKILL_CATACLYSM_LEATHERWORKING = 2529,
+ SKILL_NORTHREND_LEATHERWORKING = 2530,
+ SKILL_OUTLAND_LEATHERWORKING = 2531,
+ SKILL_LEATHERWORKING_2 = 2532,
+ SKILL_KUL_TIRAN_TAILORING = 2533,
+ SKILL_LEGION_TAILORING = 2534,
+ SKILL_DRAENOR_TAILORING = 2535,
+ SKILL_PANDARIA_TAILORING = 2536,
+ SKILL_CATACLYSM_TAILORING = 2537,
+ SKILL_NORTHREND_TAILORING = 2538,
+ SKILL_OUTLAND_TAILORING = 2539,
+ SKILL_TAILORING_2 = 2540,
+ SKILL_KUL_TIRAN_COOKING = 2541,
+ SKILL_LEGION_COOKING = 2542,
+ SKILL_DRAENOR_COOKING = 2543,
+ SKILL_PANDARIA_COOKING = 2544,
+ SKILL_CATACLYSM_COOKING = 2545,
+ SKILL_NORTHREND_COOKING = 2546,
+ SKILL_OUTLAND_COOKING = 2547,
+ SKILL_COOKING_2 = 2548,
+ SKILL_KUL_TIRAN_HERBALISM = 2549,
+ SKILL_LEGION_HERBALISM = 2550,
+ SKILL_DRAENOR_HERBALISM = 2551,
+ SKILL_PANDARIA_HERBALISM = 2552,
+ SKILL_CATACLYSM_HERBALISM = 2553,
+ SKILL_NORTHREND_HERBALISM = 2554,
+ SKILL_OUTLAND_HERBALISM = 2555,
+ SKILL_HERBALISM_2 = 2556,
+ SKILL_KUL_TIRAN_SKINNING = 2557,
+ SKILL_LEGION_SKINNING = 2558,
+ SKILL_DRAENOR_SKINNING = 2559,
+ SKILL_PANDARIA_SKINNING = 2560,
+ SKILL_CATACLYSM_SKINNING = 2561,
+ SKILL_NORTHREND_SKINNING = 2562,
+ SKILL_OUTLAND_SKINNING = 2563,
+ SKILL_SKINNING_2 = 2564,
+ SKILL_KUL_TIRAN_MINING = 2565,
+ SKILL_LEGION_MINING = 2566,
+ SKILL_DRAENOR_MINING = 2567,
+ SKILL_PANDARIA_MINING = 2568,
+ SKILL_CATACLYSM_MINING = 2569,
+ SKILL_NORTHREND_MINING = 2570,
+ SKILL_OUTLAND_MINING = 2571,
+ SKILL_MINING_2 = 2572,
+ SKILL_KUL_TIRAN_FISHING = 2585,
+ SKILL_LEGION_FISHING = 2586,
+ SKILL_DRAENOR_FISHING = 2587,
+ SKILL_PANDARIA_FISHING = 2588,
+ SKILL_CATACLYSM_FISHING = 2589,
+ SKILL_NORTHREND_FISHING = 2590,
+ SKILL_OUTLAND_FISHING = 2591,
+ SKILL_FISHING_2 = 2592,
+ SKILL_RACIAL_DARK_IRON_DWARF = 2597,
+ SKILL_RACIAL_MAG_HAR_ORC = 2598,
+ SKILL_PET_LIZARD = 2703,
+ SKILL_PET_HORSE = 2704,
+ SKILL_PET_EXOTIC_PTERRORDAX = 2705,
+ SKILL_PET_TOAD = 2706,
+ SKILL_PET_EXOTIC_KROLUSK = 2707,
+ SKILL_SECOND_PET_HUNTER = 2716
};
inline SkillType SkillByLockType(LockType locktype)
@@ -4425,7 +4553,6 @@ inline uint32 SkillByQuestSort(int32 QuestSort)
case QUEST_SORT_ENGINEERING: return SKILL_ENGINEERING;
case QUEST_SORT_TAILORING: return SKILL_TAILORING;
case QUEST_SORT_COOKING: return SKILL_COOKING;
- case QUEST_SORT_FIRST_AID: return SKILL_FIRST_AID;
case QUEST_SORT_JEWELCRAFTING: return SKILL_JEWELCRAFTING;
case QUEST_SORT_INSCRIPTION: return SKILL_INSCRIPTION;
case QUEST_SORT_ARCHAEOLOGY: return SKILL_ARCHAEOLOGY;
@@ -4772,52 +4899,54 @@ enum ResponseCodes
CHAR_CREATE_THROTTLE = 49,
CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT = 50,
CHAR_CREATE_LEVEL_REQUIREMENT_DEMON_HUNTER = 51,
-
- CHAR_DELETE_IN_PROGRESS = 52,
- CHAR_DELETE_SUCCESS = 53,
- CHAR_DELETE_FAILED = 54,
- CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 55,
- CHAR_DELETE_FAILED_GUILD_LEADER = 56,
- CHAR_DELETE_FAILED_ARENA_CAPTAIN = 57,
- CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 58,
- CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 59,
- CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 60,
- CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 61,
-
- CHAR_LOGIN_IN_PROGRESS = 62,
- CHAR_LOGIN_SUCCESS = 63,
- CHAR_LOGIN_NO_WORLD = 64,
- CHAR_LOGIN_DUPLICATE_CHARACTER = 65,
- CHAR_LOGIN_NO_INSTANCES = 66,
- CHAR_LOGIN_FAILED = 67,
- CHAR_LOGIN_DISABLED = 68,
- CHAR_LOGIN_NO_CHARACTER = 69,
- CHAR_LOGIN_LOCKED_FOR_TRANSFER = 70,
- CHAR_LOGIN_LOCKED_BY_BILLING = 71,
- CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 72,
- CHAR_LOGIN_TEMPORARY_GM_LOCK = 73,
- CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 74,
- CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 75,
- CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 76,
- CHAR_LOGIN_LOCKED_BY_RESTRICTION = 77,
-
- CHAR_NAME_SUCCESS = 78,
- CHAR_NAME_FAILURE = 79,
- CHAR_NAME_NO_NAME = 80,
- CHAR_NAME_TOO_SHORT = 81,
- CHAR_NAME_TOO_LONG = 82,
- CHAR_NAME_INVALID_CHARACTER = 83,
- CHAR_NAME_MIXED_LANGUAGES = 84,
- CHAR_NAME_PROFANE = 85,
- CHAR_NAME_RESERVED = 86,
- CHAR_NAME_INVALID_APOSTROPHE = 87,
- CHAR_NAME_MULTIPLE_APOSTROPHES = 88,
- CHAR_NAME_THREE_CONSECUTIVE = 89,
- CHAR_NAME_INVALID_SPACE = 90,
- CHAR_NAME_CONSECUTIVE_SPACES = 91,
- CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 92,
- CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 93,
- CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 94
+ CHAR_CREATE_CHARACTER_IN_COMMUNITY = 52,
+
+ CHAR_DELETE_IN_PROGRESS = 53,
+ CHAR_DELETE_SUCCESS = 54,
+ CHAR_DELETE_FAILED = 55,
+ CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 56,
+ CHAR_DELETE_FAILED_GUILD_LEADER = 57,
+ CHAR_DELETE_FAILED_ARENA_CAPTAIN = 58,
+ CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 59,
+ CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 60,
+ CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 61,
+ CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 62,
+ CHAR_DELETE_FAILED_COMMUNITY_OWNER = 63,
+
+ CHAR_LOGIN_IN_PROGRESS = 64,
+ CHAR_LOGIN_SUCCESS = 65,
+ CHAR_LOGIN_NO_WORLD = 66,
+ CHAR_LOGIN_DUPLICATE_CHARACTER = 67,
+ CHAR_LOGIN_NO_INSTANCES = 68,
+ CHAR_LOGIN_FAILED = 69,
+ CHAR_LOGIN_DISABLED = 70,
+ CHAR_LOGIN_NO_CHARACTER = 71,
+ CHAR_LOGIN_LOCKED_FOR_TRANSFER = 72,
+ CHAR_LOGIN_LOCKED_BY_BILLING = 73,
+ CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 74,
+ CHAR_LOGIN_TEMPORARY_GM_LOCK = 75,
+ CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 76,
+ CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 77,
+ CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 78,
+ CHAR_LOGIN_LOCKED_BY_RESTRICTION = 79,
+
+ CHAR_NAME_SUCCESS = 80,
+ CHAR_NAME_FAILURE = 81,
+ CHAR_NAME_NO_NAME = 82,
+ CHAR_NAME_TOO_SHORT = 83,
+ CHAR_NAME_TOO_LONG = 84,
+ CHAR_NAME_INVALID_CHARACTER = 85,
+ CHAR_NAME_MIXED_LANGUAGES = 86,
+ CHAR_NAME_PROFANE = 87,
+ CHAR_NAME_RESERVED = 88,
+ CHAR_NAME_INVALID_APOSTROPHE = 89,
+ CHAR_NAME_MULTIPLE_APOSTROPHES = 90,
+ CHAR_NAME_THREE_CONSECUTIVE = 91,
+ CHAR_NAME_INVALID_SPACE = 92,
+ CHAR_NAME_CONSECUTIVE_SPACES = 93,
+ CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 94,
+ CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 95,
+ CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 96
};
enum CharacterUndeleteResult
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 6a71256a77b..1a6f95244a9 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -37,38 +37,40 @@ Quest::Quest(Field* questRecord)
ID = questRecord[0].GetUInt32();
Type = questRecord[1].GetUInt8();
Level = questRecord[2].GetInt32();
- MaxScalingLevel = questRecord[3].GetInt32();
- PackageID = questRecord[4].GetUInt32();
- MinLevel = questRecord[5].GetInt32();
- QuestSortID = questRecord[6].GetInt16();
- QuestInfoID = questRecord[7].GetUInt16();
- SuggestedPlayers = questRecord[8].GetUInt8();
- NextQuestInChain = questRecord[9].GetUInt32();
- RewardXPDifficulty = questRecord[10].GetUInt32();
- RewardXPMultiplier = questRecord[11].GetFloat();
- RewardMoney = questRecord[12].GetUInt32();
- RewardMoneyDifficulty = questRecord[13].GetUInt32();
- RewardMoneyMultiplier = questRecord[14].GetFloat();
- RewardBonusMoney = questRecord[15].GetUInt32();
+ ScalingFactionGroup = questRecord[3].GetInt32();
+ MaxScalingLevel = questRecord[4].GetInt32();
+ PackageID = questRecord[5].GetUInt32();
+ MinLevel = questRecord[6].GetInt32();
+ QuestSortID = questRecord[7].GetInt16();
+ QuestInfoID = questRecord[8].GetUInt16();
+ SuggestedPlayers = questRecord[9].GetUInt8();
+ NextQuestInChain = questRecord[10].GetUInt32();
+ RewardXPDifficulty = questRecord[11].GetUInt32();
+ RewardXPMultiplier = questRecord[12].GetFloat();
+ RewardMoney = questRecord[13].GetUInt32();
+ RewardMoneyDifficulty = questRecord[14].GetUInt32();
+ RewardMoneyMultiplier = questRecord[15].GetFloat();
+ RewardBonusMoney = questRecord[16].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i)
- RewardDisplaySpell[i] = questRecord[16 + i].GetUInt32();
-
- RewardSpell = questRecord[19].GetUInt32();
- RewardHonor = questRecord[20].GetUInt32();
- RewardKillHonor = questRecord[21].GetUInt32();
- SourceItemId = questRecord[22].GetUInt32();
- RewardArtifactXPDifficulty = questRecord[23].GetUInt32();
- RewardArtifactXPMultiplier = questRecord[24].GetFloat();
- RewardArtifactCategoryID = questRecord[25].GetUInt32();
- Flags = questRecord[26].GetUInt32();
- FlagsEx = questRecord[27].GetUInt32();
+ RewardDisplaySpell[i] = questRecord[17 + i].GetUInt32();
+
+ RewardSpell = questRecord[20].GetUInt32();
+ RewardHonor = questRecord[21].GetUInt32();
+ RewardKillHonor = questRecord[22].GetUInt32();
+ SourceItemId = questRecord[23].GetUInt32();
+ RewardArtifactXPDifficulty = questRecord[24].GetUInt32();
+ RewardArtifactXPMultiplier = questRecord[25].GetFloat();
+ RewardArtifactCategoryID = questRecord[26].GetUInt32();
+ Flags = questRecord[27].GetUInt32();
+ FlagsEx = questRecord[28].GetUInt32();
+ FlagsEx2 = questRecord[29].GetUInt32();
for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
{
- RewardItemId[i] = questRecord[28 + i * 4].GetUInt32();
- RewardItemCount[i] = questRecord[29 + i * 4].GetUInt32();
- ItemDrop[i] = questRecord[30 + i * 4].GetUInt32();
- ItemDropQuantity[i] = questRecord[31 + i * 4].GetUInt32();
+ RewardItemId[i] = questRecord[30 + i * 4].GetUInt32();
+ RewardItemCount[i] = questRecord[31 + i * 4].GetUInt32();
+ ItemDrop[i] = questRecord[32 + i * 4].GetUInt32();
+ ItemDropQuantity[i] = questRecord[33 + i * 4].GetUInt32();
if (RewardItemId[i])
++_rewItemsCount;
@@ -76,63 +78,64 @@ Quest::Quest(Field* questRecord)
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
- RewardChoiceItemId[i] = questRecord[44 + i * 3].GetUInt32();
- RewardChoiceItemCount[i] = questRecord[45 + i * 3].GetUInt32();
- RewardChoiceItemDisplayId[i] = questRecord[46 + i * 3].GetUInt32();
+ RewardChoiceItemId[i] = questRecord[46 + i * 3].GetUInt32();
+ RewardChoiceItemCount[i] = questRecord[47 + i * 3].GetUInt32();
+ RewardChoiceItemDisplayId[i] = questRecord[48 + i * 3].GetUInt32();
if (RewardChoiceItemId[i])
++_rewChoiceItemsCount;
}
- POIContinent = questRecord[62].GetUInt32();
- POIx = questRecord[63].GetFloat();
- POIy = questRecord[64].GetFloat();
- POIPriority = questRecord[65].GetUInt32();
+ POIContinent = questRecord[64].GetUInt32();
+ POIx = questRecord[65].GetFloat();
+ POIy = questRecord[66].GetFloat();
+ POIPriority = questRecord[67].GetUInt32();
- RewardTitleId = questRecord[66].GetUInt32();
- RewardArenaPoints = questRecord[67].GetUInt32();
- RewardSkillId = questRecord[68].GetUInt32();
- RewardSkillPoints = questRecord[69].GetUInt32();
+ RewardTitleId = questRecord[68].GetUInt32();
+ RewardArenaPoints = questRecord[69].GetUInt32();
+ RewardSkillId = questRecord[70].GetUInt32();
+ RewardSkillPoints = questRecord[71].GetUInt32();
- QuestGiverPortrait = questRecord[70].GetUInt32();
- QuestTurnInPortrait = questRecord[71].GetUInt32();
+ QuestGiverPortrait = questRecord[72].GetUInt32();
+ QuestGiverPortraitMount = questRecord[73].GetUInt32();
+ QuestTurnInPortrait = questRecord[74].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
- RewardFactionId[i] = questRecord[72 + i * 4].GetUInt32();
- RewardFactionValue[i] = questRecord[73 + i * 4].GetInt32();
- RewardFactionOverride[i] = questRecord[74 + i * 4].GetInt32();
- RewardFactionCapIn[i] = questRecord[75 + i * 4].GetUInt32();
+ RewardFactionId[i] = questRecord[75 + i * 4].GetUInt32();
+ RewardFactionValue[i] = questRecord[76 + i * 4].GetInt32();
+ RewardFactionOverride[i] = questRecord[77 + i * 4].GetInt32();
+ RewardFactionCapIn[i] = questRecord[78 + i * 4].GetUInt32();
}
- RewardReputationMask = questRecord[92].GetUInt32();
+ RewardReputationMask = questRecord[95].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
- RewardCurrencyId[i] = questRecord[93 + i * 2].GetUInt32();
- RewardCurrencyCount[i] = questRecord[94 + i * 2].GetUInt32();
+ RewardCurrencyId[i] = questRecord[96 + i * 2].GetUInt32();
+ RewardCurrencyCount[i] = questRecord[97 + i * 2].GetUInt32();
if (RewardCurrencyId[i])
++_rewCurrencyCount;
}
- SoundAccept = questRecord[101].GetUInt32();
- SoundTurnIn = questRecord[102].GetUInt32();
- AreaGroupID = questRecord[103].GetUInt32();
- LimitTime = questRecord[104].GetUInt32();
- AllowableRaces = questRecord[105].GetUInt64();
- QuestRewardID = questRecord[106].GetUInt32();
- Expansion = questRecord[107].GetInt32();
-
- LogTitle = questRecord[108].GetString();
- LogDescription = questRecord[109].GetString();
- QuestDescription = questRecord[110].GetString();
- AreaDescription = questRecord[111].GetString();
- PortraitGiverText = questRecord[112].GetString();
- PortraitGiverName = questRecord[113].GetString();
- PortraitTurnInText = questRecord[114].GetString();
- PortraitTurnInName = questRecord[115].GetString();
- QuestCompletionLog = questRecord[116].GetString();
+ SoundAccept = questRecord[104].GetUInt32();
+ SoundTurnIn = questRecord[105].GetUInt32();
+ AreaGroupID = questRecord[106].GetUInt32();
+ LimitTime = questRecord[107].GetUInt32();
+ AllowableRaces = questRecord[108].GetUInt64();
+ TreasurePickerID = questRecord[109].GetInt32();
+ Expansion = questRecord[110].GetInt32();
+
+ LogTitle = questRecord[111].GetString();
+ LogDescription = questRecord[112].GetString();
+ QuestDescription = questRecord[113].GetString();
+ AreaDescription = questRecord[114].GetString();
+ PortraitGiverText = questRecord[115].GetString();
+ PortraitGiverName = questRecord[116].GetString();
+ PortraitTurnInText = questRecord[117].GetString();
+ PortraitTurnInName = questRecord[118].GetString();
+ QuestCompletionLog = questRecord[119].GetString();
for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
{
@@ -255,20 +258,20 @@ void Quest::LoadQuestObjectiveVisualEffect(Field* fields)
}
}
-uint32 Quest::XPValue(uint32 playerLevel) const
+uint32 Quest::XPValue(Player const* player) const
{
- if (playerLevel)
+ if (player)
{
- uint32 questLevel = uint32(Level == -1 ? playerLevel : Level);
+ uint32 questLevel = player->GetQuestLevel(this);
QuestXPEntry const* questXp = sQuestXPStore.LookupEntry(questLevel);
if (!questXp || RewardXPDifficulty >= 10)
return 0;
float multiplier = 1.0f;
- if (questLevel != playerLevel)
- multiplier = sXpGameTable.GetRow(std::min(playerLevel, questLevel))->Divisor / sXpGameTable.GetRow(playerLevel)->Divisor;
+ if (questLevel != player->getLevel())
+ multiplier = sXpGameTable.GetRow(std::min<int32>(player->getLevel(), questLevel))->Divisor / sXpGameTable.GetRow(player->getLevel())->Divisor;
- int32 diffFactor = 2 * (questLevel - playerLevel) + 20;
+ int32 diffFactor = 2 * (questLevel + (Level == -1 ? 0 : 5) - player->getLevel()) + 10;
if (diffFactor < 1)
diffFactor = 1;
else if (diffFactor > 10)
@@ -290,11 +293,9 @@ uint32 Quest::XPValue(uint32 playerLevel) const
return 0;
}
-uint32 Quest::MoneyValue(uint8 playerLevel) const
+uint32 Quest::MoneyValue(Player const* player) const
{
- uint8 level = Level == -1 ? playerLevel : Level;
-
- if (QuestMoneyRewardEntry const* money = sQuestMoneyRewardStore.LookupEntry(level))
+ if (QuestMoneyRewardEntry const* money = sQuestMoneyRewardStore.LookupEntry(player->GetQuestLevel(this)))
return money->Difficulty[GetRewMoneyDifficulty()] * GetMoneyMultiplier();
else
return 0;
@@ -315,11 +316,11 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player
rewards.SpellCompletionID = GetRewSpell();
rewards.SkillLineID = GetRewardSkillId();
rewards.NumSkillUps = GetRewardSkillPoints();
- rewards.RewardID = GetRewardId();
+ rewards.TreasurePickerID = GetTreasurePickerId();
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
- rewards.ChoiceItems[i].ItemID = RewardChoiceItemId[i];
+ rewards.ChoiceItems[i].Item.ItemID = RewardChoiceItemId[i];
rewards.ChoiceItems[i].Quantity = RewardChoiceItemCount[i];
}
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index adbec0efd6c..a8d2d5a701c 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -200,6 +200,11 @@ enum QuestFlagsEx : uint32
QUEST_FLAGS_EX_CLEAR_PROGRESS_OF_CRITERIA_TREE_OBJECTIVES_ON_ACCEPT = 0x1000000
};
+enum QuestFlagsEx2 : uint32
+{
+ QUEST_FLAGS_EX2_NO_WAR_MODE_BONUS = 0x2
+};
+
enum QuestSpecialFlags
{
QUEST_SPECIAL_FLAGS_NONE = 0x000,
@@ -348,17 +353,16 @@ class TC_GAME_API Quest
void LoadQuestObjective(Field* fields);
void LoadQuestObjectiveVisualEffect(Field* fields);
- uint32 XPValue(uint32 playerLevel) const;
- uint32 MoneyValue(uint8 playerLevel) const;
+ uint32 XPValue(Player const* player) const;
+ uint32 MoneyValue(Player const* player) const;
- bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; }
- void SetFlag(uint32 flag) { Flags |= flag; }
+ bool HasFlag(QuestFlags flag) const { return (Flags & uint32(flag)) != 0; }
+ bool HasFlagEx(QuestFlagsEx flag) const { return (FlagsEx & uint32(flag)) != 0; }
+ bool HasFlagEx2(QuestFlagsEx2 flag) const { return (FlagsEx2 & uint32(flag)) != 0; }
bool HasSpecialFlag(uint32 flag) const { return (SpecialFlags & flag) != 0; }
void SetSpecialFlag(uint32 flag) { SpecialFlags |= flag; }
- bool HasFlagEx(QuestFlagsEx flag) const { return (FlagsEx & uint32(flag)) != 0; }
-
// table data accessors:
uint32 GetQuestId() const { return ID; }
uint32 GetQuestType() const { return Type; }
@@ -367,6 +371,7 @@ class TC_GAME_API Quest
int32 GetMinLevel() const { return MinLevel; }
uint32 GetMaxLevel() const { return MaxLevel; }
int32 GetQuestLevel() const { return Level; }
+ int32 GetQuestScalingFactionGroup() const { return ScalingFactionGroup; }
int32 GetQuestMaxScalingLevel() const { return MaxScalingLevel; }
uint32 GetQuestInfoID() const { return QuestInfoID; }
uint32 GetAllowableClasses() const { return AllowableClasses; }
@@ -427,15 +432,17 @@ class TC_GAME_API Quest
bool IsAutoComplete() const;
uint32 GetFlags() const { return Flags; }
uint32 GetFlagsEx() const { return FlagsEx; }
+ uint32 GetFlagsEx2() const { return FlagsEx2; }
uint32 GetSpecialFlags() const { return SpecialFlags; }
uint32 GetScriptId() const { return ScriptId; }
uint32 GetAreaGroupID() const { return AreaGroupID; }
uint32 GetRewardSkillId() const { return RewardSkillId; }
uint32 GetRewardSkillPoints() const { return RewardSkillPoints; }
uint32 GetRewardReputationMask() const { return RewardReputationMask; }
- uint32 GetRewardId() const { return QuestRewardID; }
+ int32 GetTreasurePickerId() const { return TreasurePickerID; }
int32 GetExpansion() const { return Expansion; }
uint32 GetQuestGiverPortrait() const { return QuestGiverPortrait; }
+ int32 GetQuestGiverPortraitMount() const { return QuestGiverPortraitMount; }
uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; }
bool IsDaily() const { return (Flags & QUEST_FLAGS_DAILY) != 0; }
bool IsWeekly() const { return (Flags & QUEST_FLAGS_WEEKLY) != 0; }
@@ -469,6 +476,7 @@ class TC_GAME_API Quest
uint32 ID;
uint32 Type;
int32 Level;
+ int32 ScalingFactionGroup;
int32 MaxScalingLevel;
uint32 PackageID;
int32 MinLevel;
@@ -492,6 +500,7 @@ class TC_GAME_API Quest
uint32 SourceItemId;
uint32 Flags;
uint32 FlagsEx;
+ uint32 FlagsEx2;
uint32 RewardItemId[QUEST_REWARD_ITEM_COUNT];
uint32 RewardItemCount[QUEST_REWARD_ITEM_COUNT];
uint32 ItemDrop[QUEST_ITEM_DROP_COUNT];
@@ -508,6 +517,7 @@ class TC_GAME_API Quest
uint32 RewardSkillId;
uint32 RewardSkillPoints;
uint32 QuestGiverPortrait;
+ int32 QuestGiverPortraitMount;
uint32 QuestTurnInPortrait;
uint32 RewardFactionId[QUEST_REWARD_REPUTATIONS_COUNT];
int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT];
@@ -521,7 +531,7 @@ class TC_GAME_API Quest
uint32 AreaGroupID;
uint32 LimitTime;
uint64 AllowableRaces;
- uint32 QuestRewardID;
+ int32 TreasurePickerID;
int32 Expansion;
QuestObjectives Objectives;
std::string LogTitle;
diff --git a/src/server/game/Scenarios/ScenarioMgr.cpp b/src/server/game/Scenarios/ScenarioMgr.cpp
index c70e560efd7..1fb6dc4d18b 100644
--- a/src/server/game/Scenarios/ScenarioMgr.cpp
+++ b/src/server/game/Scenarios/ScenarioMgr.cpp
@@ -147,8 +147,8 @@ void ScenarioMgr::LoadScenarioPOI()
uint32 count = 0;
- // 0 1 2 6 7 8 9 10 11 12
- QueryResult result = WorldDatabase.Query("SELECT CriteriaTreeID, BlobIndex, Idx1, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID FROM scenario_poi ORDER BY CriteriaTreeID, Idx1");
+ // 0 1 2 3 4 5 6 7 8
+ QueryResult result = WorldDatabase.Query("SELECT CriteriaTreeID, BlobIndex, Idx1, MapID, UiMapID, Priority, Flags, WorldEffectID, PlayerConditionID FROM scenario_poi ORDER BY CriteriaTreeID, Idx1");
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 scenario POI definitions. DB table `scenario_poi` is empty.");
@@ -188,24 +188,23 @@ void ScenarioMgr::LoadScenarioPOI()
{
Field* fields = result->Fetch();
- int32 CriteriaTreeID = fields[0].GetInt32();
- int32 BlobIndex = fields[1].GetInt32();
- int32 Idx1 = fields[2].GetInt32();
- int32 MapID = fields[3].GetInt32();
- int32 WorldMapAreaId = fields[4].GetInt32();
- int32 Floor = fields[5].GetInt32();
- int32 Priority = fields[6].GetInt32();
- int32 Flags = fields[7].GetInt32();
- int32 WorldEffectID = fields[8].GetInt32();
- int32 PlayerConditionID = fields[9].GetInt32();
-
- if (!sCriteriaMgr->GetCriteriaTree(CriteriaTreeID))
- TC_LOG_ERROR("sql.sql", "`scenario_poi` CriteriaTreeID (%u) Idx1 (%u) does not correspond to a valid criteria tree", CriteriaTreeID, Idx1);
-
- if (CriteriaTreeID < int32(POIs.size()) && Idx1 < int32(POIs[CriteriaTreeID].size()))
- _scenarioPOIStore[CriteriaTreeID].emplace_back(BlobIndex, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, POIs[CriteriaTreeID][Idx1]);
+ int32 criteriaTreeID = fields[0].GetInt32();
+ int32 blobIndex = fields[1].GetInt32();
+ int32 idx1 = fields[2].GetInt32();
+ int32 mapID = fields[3].GetInt32();
+ int32 uiMapID = fields[4].GetInt32();
+ int32 priority = fields[5].GetInt32();
+ int32 flags = fields[6].GetInt32();
+ int32 worldEffectID = fields[7].GetInt32();
+ int32 playerConditionID = fields[8].GetInt32();
+
+ if (!sCriteriaMgr->GetCriteriaTree(criteriaTreeID))
+ TC_LOG_ERROR("sql.sql", "`scenario_poi` CriteriaTreeID (%u) Idx1 (%u) does not correspond to a valid criteria tree", criteriaTreeID, idx1);
+
+ if (criteriaTreeID < int32(POIs.size()) && idx1 < int32(POIs[criteriaTreeID].size()))
+ _scenarioPOIStore[criteriaTreeID].emplace_back(blobIndex, mapID, uiMapID, priority, flags, worldEffectID, playerConditionID, POIs[criteriaTreeID][idx1]);
else
- TC_LOG_ERROR("server.loading", "Table scenario_poi references unknown scenario poi points for criteria tree id %i POI id %i", CriteriaTreeID, BlobIndex);
+ TC_LOG_ERROR("server.loading", "Table scenario_poi references unknown scenario poi points for criteria tree id %i POI id %i", criteriaTreeID, blobIndex);
++count;
} while (result->NextRow());
diff --git a/src/server/game/Scenarios/ScenarioMgr.h b/src/server/game/Scenarios/ScenarioMgr.h
index 93a1f3a320f..932d4decce9 100644
--- a/src/server/game/Scenarios/ScenarioMgr.h
+++ b/src/server/game/Scenarios/ScenarioMgr.h
@@ -74,23 +74,22 @@ struct ScenarioPOI
{
int32 BlobIndex;
int32 MapID;
- int32 WorldMapAreaID;
- int32 Floor;
+ int32 UiMapID;
int32 Priority;
int32 Flags;
int32 WorldEffectID;
int32 PlayerConditionID;
std::vector<ScenarioPOIPoint> Points;
- ScenarioPOI() : BlobIndex(0), MapID(0), WorldMapAreaID(0), Floor(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0) { }
+ ScenarioPOI() : BlobIndex(0), MapID(0), UiMapID(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0) { }
- ScenarioPOI(int32 _BlobIndex, int32 _MapID, int32 _WorldMapAreaID, int32 _Floor, int32 _Priority, int32 _Flags, int32 _WorldEffectID,
- int32 _PlayerConditionID, std::vector<ScenarioPOIPoint> points) :
- BlobIndex(_BlobIndex), MapID(_MapID), WorldMapAreaID(_WorldMapAreaID), Floor(_Floor), Priority(_Priority), Flags(_Flags), WorldEffectID(_WorldEffectID),
- PlayerConditionID(_PlayerConditionID), Points(std::move(points)) { }
+ ScenarioPOI(int32 blobIndex, int32 mapID, int32 uiMapID, int32 priority, int32 flags, int32 worldEffectID,
+ int32 playerConditionID, std::vector<ScenarioPOIPoint> points) :
+ BlobIndex(blobIndex), MapID(mapID), UiMapID(uiMapID), Priority(priority), Flags(flags), WorldEffectID(worldEffectID),
+ PlayerConditionID(playerConditionID), Points(std::move(points)) { }
ScenarioPOI(ScenarioPOI&& scenarioPOI) :
- BlobIndex(scenarioPOI.BlobIndex), MapID(scenarioPOI.MapID), WorldMapAreaID(scenarioPOI.WorldMapAreaID), Floor(scenarioPOI.Floor), Priority(scenarioPOI.Priority),
+ BlobIndex(scenarioPOI.BlobIndex), MapID(scenarioPOI.MapID), UiMapID(scenarioPOI.UiMapID), Priority(scenarioPOI.Priority),
Flags(scenarioPOI.Flags), WorldEffectID(scenarioPOI.WorldEffectID), PlayerConditionID(scenarioPOI.PlayerConditionID), Points(std::move(scenarioPOI.Points)) { }
};
diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h
index b6e346aaefe..69262eae72f 100644
--- a/src/server/game/Server/Packets/AchievementPackets.h
+++ b/src/server/game/Server/Packets/AchievementPackets.h
@@ -101,7 +101,7 @@ namespace WorldPackets
class AchievementDeleted final : public ServerPacket
{
public:
- AchievementDeleted() : ServerPacket(SMSG_ACHIEVEMENT_DELETED, 4) { }
+ AchievementDeleted() : ServerPacket(SMSG_ACHIEVEMENT_DELETED, 8) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
index f99d9831f91..6b4047d0995 100644
--- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
@@ -33,7 +33,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerS
ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerCircularMovementInfo const& areaTriggerCircularMovement)
{
- data.WriteBit(areaTriggerCircularMovement.TargetGUID.is_initialized());
+ data.WriteBit(areaTriggerCircularMovement.PathTarget.is_initialized());
data.WriteBit(areaTriggerCircularMovement.Center.is_initialized());
data.WriteBit(areaTriggerCircularMovement.CounterClockwise);
data.WriteBit(areaTriggerCircularMovement.CanLoop);
@@ -46,8 +46,8 @@ ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerCircularMovementInfo const&
data << float(areaTriggerCircularMovement.InitialAngle);
data << float(areaTriggerCircularMovement.ZOffset);
- if (areaTriggerCircularMovement.TargetGUID)
- data << *areaTriggerCircularMovement.TargetGUID;
+ if (areaTriggerCircularMovement.PathTarget)
+ data << *areaTriggerCircularMovement.PathTarget;
if (areaTriggerCircularMovement.Center)
data << *areaTriggerCircularMovement.Center;
@@ -74,14 +74,6 @@ WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerDenied::Write()
WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerRePath::Write()
{
_worldPacket << TriggerGUID;
- _worldPacket << AreaTriggerSpline;
-
- return &_worldPacket;
-}
-
-WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerReShape::Write()
-{
- _worldPacket << TriggerGUID;
_worldPacket.WriteBit(AreaTriggerSpline.is_initialized());
_worldPacket.WriteBit(AreaTriggerCircularMovement.is_initialized());
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h
index e3872493481..b3abf08c5d9 100644
--- a/src/server/game/Server/Packets/AreaTriggerPackets.h
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.h
@@ -68,18 +68,7 @@ namespace WorldPackets
class AreaTriggerRePath final : public ServerPacket
{
public:
- AreaTriggerRePath() : ServerPacket(SMSG_AREA_TRIGGER_RE_PATH, 50) { }
-
- WorldPacket const* Write() override;
-
- AreaTriggerSplineInfo AreaTriggerSpline;
- ObjectGuid TriggerGUID;
- };
-
- class AreaTriggerReShape final : public ServerPacket
- {
- public:
- AreaTriggerReShape() : ServerPacket(SMSG_AREA_TRIGGER_RE_SHAPE, 17) { }
+ AreaTriggerRePath() : ServerPacket(SMSG_AREA_TRIGGER_RE_PATH, 17) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index c28b8281ede..44e9608bddd 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -84,8 +84,6 @@ void WorldPackets::Auth::AuthSession::Read()
uint32 realmJoinTicketSize;
_worldPacket >> DosResponse;
- _worldPacket >> Build;
- _worldPacket >> BuildType;
_worldPacket >> RegionID;
_worldPacket >> BattlegroupID;
_worldPacket >> RealmID;
@@ -145,6 +143,7 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket.WriteBit(SuccessInfo->ForceCharacterTemplate);
_worldPacket.WriteBit(SuccessInfo->NumPlayersHorde.is_initialized());
_worldPacket.WriteBit(SuccessInfo->NumPlayersAlliance.is_initialized());
+ _worldPacket.WriteBit(SuccessInfo->ExpansionTrialExpiration.is_initialized());
_worldPacket.FlushBits();
{
@@ -164,6 +163,9 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
if (SuccessInfo->NumPlayersAlliance)
_worldPacket << uint16(*SuccessInfo->NumPlayersAlliance);
+ if (SuccessInfo->ExpansionTrialExpiration)
+ _worldPacket << int32(*SuccessInfo->ExpansionTrialExpiration);
+
for (VirtualRealmInfo const& virtualRealm : SuccessInfo->VirtualRealms)
_worldPacket << virtualRealm;
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index 97662944f09..7b0e50844bb 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -83,8 +83,6 @@ namespace WorldPackets
Digest.fill(0);
}
- uint16 Build = 0;
- int8 BuildType = 0;
uint32 RegionID = 0;
uint32 BattlegroupID = 0;
uint32 RealmID = 0;
@@ -159,6 +157,7 @@ namespace WorldPackets
bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement
Optional<uint16> NumPlayersHorde; ///< number of horde players in this realm. @todo implement
Optional<uint16> NumPlayersAlliance; ///< number of alliance players in this realm. @todo implement
+ Optional<int32> ExpansionTrialExpiration; ///< expansion trial expiration unix timestamp
};
AuthResponse();
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp
index 05851fb1dfd..14ae46e105a 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.cpp
+++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp
@@ -67,9 +67,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData:
data << uint32(playerData.HealingDone);
data << uint32(playerData.Stats.size());
data << int32(playerData.PrimaryTalentTree);
- data << int32(playerData.PrimaryTalentTreeNameIndex);
+ data << int32(playerData.Sex);
data << int32(playerData.Race);
- data << uint32(playerData.Prestige);
+ data << int32(playerData.Class);
+ data << int32(playerData.CreatureID);
+ data << int32(playerData.HonorLevel);
if (!playerData.Stats.empty())
data.append(playerData.Stats.data(), playerData.Stats.size());
@@ -89,13 +91,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData:
data << uint32(*playerData.PreMatchRating);
if (playerData.RatingChange)
- data << uint32(*playerData.RatingChange);
+ data << int32(*playerData.RatingChange);
if (playerData.PreMatchMMR)
data << uint32(*playerData.PreMatchMMR);
if (playerData.MmrChange)
- data << uint32(*playerData.MmrChange);
+ data << int32(*playerData.MmrChange);
return data;
}
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h
index 7340d8d7fc9..14ebc283cb5 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.h
+++ b/src/server/game/Server/Packets/BattlegroundPackets.h
@@ -122,9 +122,11 @@ namespace WorldPackets
Optional<int32> MmrChange;
std::vector<int32> Stats;
int32 PrimaryTalentTree = 0;
- int32 PrimaryTalentTreeNameIndex = 0; // controls which name field from ChrSpecialization.dbc will be sent to lua
+ int32 Sex = 0;
int32 Race = 0;
- uint32 Prestige = 0;
+ int32 Class = 0;
+ int32 CreatureID = 0;
+ int32 HonorLevel = 0;
};
Optional<uint8> Winner;
diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp
index 45812c01ca6..7c82bd9d377 100644
--- a/src/server/game/Server/Packets/CalendarPackets.cpp
+++ b/src/server/game/Server/Packets/CalendarPackets.cpp
@@ -24,7 +24,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCal
data.AppendPackedTime(eventInfo.Date);
data << uint32(eventInfo.Flags);
data << int32(eventInfo.TextureID);
- data << eventInfo.EventGuildID;
+ data << uint64(eventInfo.EventClubID);
data << eventInfo.OwnerGuid;
data.WriteBits(eventInfo.EventName.size(), 8);
@@ -82,6 +82,7 @@ void WorldPackets::Calendar::CalendarGetEvent::Read()
void WorldPackets::Calendar::CalendarCommunityFilter::Read()
{
+ _worldPacket >> ClubID;
_worldPacket >> MinLevel;
_worldPacket >> MaxLevel;
_worldPacket >> MaxRankOrder;
@@ -92,26 +93,45 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Calendar::CalendarAddEv
buffer >> invite.Guid;
buffer >> invite.Status;
buffer >> invite.Moderator;
+ if (buffer.ReadBit())
+ invite.Unused_801_1 = boost::in_place();
+
+ if (buffer.ReadBit())
+ invite.Unused_801_2 = boost::in_place();
+
+ if (buffer.ReadBit())
+ invite.Unused_801_3 = boost::in_place();
+
+ if (invite.Unused_801_1)
+ buffer >> *invite.Unused_801_1;
+
+ if (invite.Unused_801_2)
+ buffer >> *invite.Unused_801_2;
+
+ if (invite.Unused_801_3)
+ buffer >> *invite.Unused_801_3;
+
return buffer;
}
ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Calendar::CalendarAddEventInfo& addEventInfo)
{
- uint8 titleLength = buffer.ReadBits(8);
- uint16 descriptionLength = buffer.ReadBits(11);
-
+ buffer >> addEventInfo.ClubID;
buffer >> addEventInfo.EventType;
buffer >> addEventInfo.TextureID;
addEventInfo.Time = buffer.ReadPackedTime();
buffer >> addEventInfo.Flags;
addEventInfo.Invites.resize(buffer.read<uint32>());
- addEventInfo.Title = buffer.ReadString(titleLength);
- addEventInfo.Description = buffer.ReadString(descriptionLength);
+ uint8 titleLength = buffer.ReadBits(8);
+ uint16 descriptionLength = buffer.ReadBits(11);
for (WorldPackets::Calendar::CalendarAddEventInviteInfo& invite : addEventInfo.Invites)
buffer >> invite;
+ addEventInfo.Title = buffer.ReadString(titleLength);
+ addEventInfo.Description = buffer.ReadString(descriptionLength);
+
return buffer;
}
@@ -121,20 +141,28 @@ void WorldPackets::Calendar::CalendarAddEvent::Read()
_worldPacket >> MaxSize;
}
-void WorldPackets::Calendar::CalendarUpdateEvent::Read()
+ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Calendar::CalendarUpdateEventInfo& updateEventInfo)
{
- _worldPacket >> EventInfo.EventID;
- _worldPacket >> EventInfo.ModeratorID;
- _worldPacket >> EventInfo.EventType;
- _worldPacket >> EventInfo.TextureID;
- EventInfo.Time = _worldPacket.ReadPackedTime();
- _worldPacket >> EventInfo.Flags;
+ buffer >> updateEventInfo.ClubID;
+ buffer >> updateEventInfo.EventID;
+ buffer >> updateEventInfo.ModeratorID;
+ buffer >> updateEventInfo.EventType;
+ buffer >> updateEventInfo.TextureID;
+ updateEventInfo.Time = buffer.ReadPackedTime();
+ buffer >> updateEventInfo.Flags;
- uint8 titleLen = _worldPacket.ReadBits(8);
- uint16 descLen = _worldPacket.ReadBits(11);
+ uint8 titleLen = buffer.ReadBits(8);
+ uint16 descLen = buffer.ReadBits(11);
- EventInfo.Title = _worldPacket.ReadString(titleLen);
- EventInfo.Description = _worldPacket.ReadString(descLen);
+ updateEventInfo.Title = buffer.ReadString(titleLen);
+ updateEventInfo.Description = buffer.ReadString(descLen);
+
+ return buffer;
+}
+
+void WorldPackets::Calendar::CalendarUpdateEvent::Read()
+{
+ _worldPacket >> EventInfo;
_worldPacket >> MaxSize;
}
@@ -142,6 +170,7 @@ void WorldPackets::Calendar::CalendarRemoveEvent::Read()
{
_worldPacket >> EventID;
_worldPacket >> ModeratorID;
+ _worldPacket >> ClubID;
_worldPacket >> Flags;
}
@@ -149,6 +178,7 @@ void WorldPackets::Calendar::CalendarCopyEvent::Read()
{
_worldPacket >> EventID;
_worldPacket >> ModeratorID;
+ _worldPacket >> EventClubID;
Date = _worldPacket.ReadPackedTime();
}
@@ -163,6 +193,7 @@ void WorldPackets::Calendar::CalendarEventInvite::Read()
{
_worldPacket >> EventID;
_worldPacket >> ModeratorID;
+ _worldPacket >> ClubID;
uint16 nameLen = _worldPacket.ReadBits(9);
Creating = _worldPacket.ReadBit();
@@ -174,6 +205,7 @@ void WorldPackets::Calendar::CalendarEventInvite::Read()
void WorldPackets::Calendar::CalendarEventSignUp::Read()
{
_worldPacket >> EventID;
+ _worldPacket >> ClubID;
Tentative = _worldPacket.ReadBit();
}
@@ -255,7 +287,7 @@ WorldPacket const* WorldPackets::Calendar::CalendarSendEvent::Write()
_worldPacket << uint32(Flags);
_worldPacket.AppendPackedTime(Date);
_worldPacket << uint32(LockDate);
- _worldPacket << EventGuildID;
+ _worldPacket << uint64(EventClubID);
_worldPacket << uint32(Invites.size());
_worldPacket.WriteBits(EventName.size(), 8);
_worldPacket.WriteBits(Description.size(), 11);
@@ -277,7 +309,7 @@ WorldPacket const* WorldPackets::Calendar::CalendarEventInviteAlert::Write()
_worldPacket << uint32(Flags);
_worldPacket << uint8(EventType);
_worldPacket << int32(TextureID);
- _worldPacket << EventGuildID;
+ _worldPacket << uint64(EventClubID);
_worldPacket << uint64(InviteID);
_worldPacket << uint8(Status);
_worldPacket << uint8(ModeratorStatus);
@@ -344,6 +376,7 @@ WorldPacket const* WorldPackets::Calendar::CalendarEventInviteRemovedAlert::Writ
WorldPacket const* WorldPackets::Calendar::CalendarEventUpdatedAlert::Write()
{
+ _worldPacket << uint64(EventClubID);
_worldPacket << uint64(EventID);
_worldPacket.AppendPackedTime(OriginalDate);
@@ -462,8 +495,8 @@ WorldPacket const* WorldPackets::Calendar::CalendarEventInviteNotes::Write()
_worldPacket << InviteGuid;
_worldPacket << uint64(EventID);
- _worldPacket.WriteBits(Notes.size(), 8);
_worldPacket.WriteBit(ClearPending);
+ _worldPacket.WriteBits(Notes.size(), 8);
_worldPacket.FlushBits();
_worldPacket.WriteString(Notes);
diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h
index 6219c1a6878..7757e51144b 100644
--- a/src/server/game/Server/Packets/CalendarPackets.h
+++ b/src/server/game/Server/Packets/CalendarPackets.h
@@ -52,6 +52,7 @@ namespace WorldPackets
void Read() override;
+ uint64 ClubID = 0;
uint8 MinLevel = 1;
uint8 MaxLevel = 100;
uint8 MaxRankOrder = 0;
@@ -62,10 +63,14 @@ namespace WorldPackets
ObjectGuid Guid;
uint8 Status = 0;
uint8 Moderator = 0;
+ Optional<ObjectGuid> Unused_801_1;
+ Optional<uint64> Unused_801_2;
+ Optional<uint64> Unused_801_3;
};
struct CalendarAddEventInfo
{
+ uint64 ClubID = 0;
std::string Title;
std::string Description;
uint8 EventType = 0;
@@ -88,6 +93,7 @@ namespace WorldPackets
struct CalendarUpdateEventInfo
{
+ uint64 ClubID = 0;
uint64 EventID = 0;
uint64 ModeratorID = 0;
std::string Title;
@@ -118,6 +124,7 @@ namespace WorldPackets
uint64 ModeratorID = 0;
uint64 EventID = 0;
+ uint64 ClubID = 0;
uint32 Flags = 0;
};
@@ -130,6 +137,7 @@ namespace WorldPackets
uint64 ModeratorID = 0;
uint64 EventID = 0;
+ uint64 EventClubID = 0;
time_t Date = time_t(0);
};
@@ -176,7 +184,7 @@ namespace WorldPackets
time_t Date = time_t(0);
uint32 Flags = 0;
int32 TextureID = 0;
- ObjectGuid EventGuildID;
+ uint64 EventClubID = 0;
ObjectGuid OwnerGuid;
};
@@ -213,7 +221,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid OwnerGuid;
- ObjectGuid EventGuildID;
+ uint64 EventClubID = 0;
uint64 EventID = 0;
time_t Date = time_t(0);
time_t LockDate = time_t(0);
@@ -234,7 +242,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid OwnerGuid;
- ObjectGuid EventGuildID;
+ uint64 EventClubID = 0;
ObjectGuid InvitedByGuid;
uint64 InviteID = 0;
uint64 EventID = 0;
@@ -258,6 +266,7 @@ namespace WorldPackets
bool IsSignUp = false;
bool Creating = true;
uint64 EventID = 0;
+ uint64 ClubID = 0;
std::string Name;
};
@@ -343,6 +352,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ uint64 EventClubID = 0;
uint64 EventID = 0;
time_t Date = time_t(0);
uint32 Flags = 0;
@@ -395,6 +405,7 @@ namespace WorldPackets
bool Tentative = false;
uint64 EventID = 0;
+ uint64 ClubID = 0;
};
class CalendarRemoveInvite final : public ClientPacket
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index 538a2c7e1d5..3973c55cf0e 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -140,6 +140,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::CharacterInfo const& charInfo)
{
data << charInfo.Guid;
+ data << uint64(charInfo.GuildClubMemberID);
data << uint8(charInfo.ListPosition);
data << uint8(charInfo.Race);
data << uint8(charInfo.Class);
@@ -201,9 +202,9 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write()
_worldPacket.WriteBit(Success);
_worldPacket.WriteBit(IsDeletedCharacters);
- _worldPacket.WriteBit(IsDemonHunterCreationAllowed);
+ _worldPacket.WriteBit(IsTestDemonHunterCreationAllowed);
_worldPacket.WriteBit(HasDemonHunterOnRealm);
- _worldPacket.WriteBit(Unknown7x);
+ _worldPacket.WriteBit(IsDemonHunterCreationAllowed);
_worldPacket.WriteBit(DisabledClassesMask.is_initialized());
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket << uint32(Characters.size());
@@ -227,6 +228,7 @@ void WorldPackets::Character::CreateCharacter::Read()
CreateInfo.reset(new CharacterCreateInfo());
uint32 nameLength = _worldPacket.ReadBits(6);
bool const hasTemplateSet = _worldPacket.ReadBit();
+ CreateInfo->IsTrialBoost = _worldPacket.ReadBit();
_worldPacket >> CreateInfo->Race;
_worldPacket >> CreateInfo->Class;
@@ -246,6 +248,7 @@ void WorldPackets::Character::CreateCharacter::Read()
WorldPacket const* WorldPackets::Character::CreateChar::Write()
{
_worldPacket << uint8(Code);
+ _worldPacket << Guid;
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index 1f4ce11621a..fb5984efc8a 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -56,6 +56,7 @@ namespace WorldPackets
std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { };
uint8 OutfitId = 0;
Optional<int32> TemplateSet;
+ bool IsTrialBoost = false;
std::string Name;
/// Server side data
@@ -121,6 +122,7 @@ namespace WorldPackets
CharacterInfo(Field* fields);
ObjectGuid Guid;
+ uint64 GuildClubMemberID = 0; ///< same as bgs.protocol.club.v1.MemberId.unique_id, guessed basing on SMSG_QUERY_PLAYER_NAME_RESPONSE (that one is known)
std::string Name;
uint8 ListPosition = 0; ///< Order of the characters in list
uint8 Race = 0;
@@ -170,22 +172,22 @@ namespace WorldPackets
struct RaceUnlock
{
- int32 RaceID;
- bool HasExpansion;
- bool HasAchievement;
- bool HasHeritageArmor;
+ int32 RaceID = 0;
+ bool HasExpansion = false;
+ bool HasAchievement = false;
+ bool HasHeritageArmor = false;
};
EnumCharactersResult() : ServerPacket(SMSG_ENUM_CHARACTERS_RESULT) { }
WorldPacket const* Write() override;
- bool Success = false; ///<
- bool IsDeletedCharacters = false; ///< used for character undelete list
- bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access
- bool HasDemonHunterOnRealm = false;
- bool Unknown7x = false;
- bool IsAlliedRacesCreationAllowed = false;
+ bool Success = false; ///<
+ bool IsDeletedCharacters = false; ///< used for character undelete list
+ bool IsTestDemonHunterCreationAllowed = false; ///< allows client to skip 1 per realm and level 70 requirements
+ bool HasDemonHunterOnRealm = false;
+ bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access
+ bool IsAlliedRacesCreationAllowed = false;
int32 MaxCharacterLevel = 1;
Optional<uint32> DisabledClassesMask;
@@ -225,6 +227,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint8 Code = 0; ///< Result code @see enum ResponseCodes
+ ObjectGuid Guid;
};
class CharDelete final : public ClientPacket
@@ -537,7 +540,7 @@ namespace WorldPackets
class InitialSetup final : public ServerPacket
{
public:
- InitialSetup() : ServerPacket(SMSG_INITIAL_SETUP, 1 + 1 + 4 + 4) { }
+ InitialSetup() : ServerPacket(SMSG_INITIAL_SETUP, 1 + 1) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp
index 1200caaa1be..044fe086f48 100644
--- a/src/server/game/Server/Packets/ChatPackets.cpp
+++ b/src/server/game/Server/Packets/ChatPackets.cpp
@@ -70,6 +70,7 @@ void WorldPackets::Chat::ChatAddonMessageTargeted::Read()
_worldPacket.ResetBitPos();
_worldPacket >> Params;
+ Target = _worldPacket.ReadString(targetLen);
}
void WorldPackets::Chat::ChatMessageDND::Read()
@@ -159,17 +160,17 @@ void WorldPackets::Chat::Chat::SetReceiver(WorldObject const* receiver, LocaleCo
WorldPacket const* WorldPackets::Chat::Chat::Write()
{
- _worldPacket << SlashCmd;
- _worldPacket << _Language;
+ _worldPacket << uint8(SlashCmd);
+ _worldPacket << uint32(_Language);
_worldPacket << SenderGUID;
_worldPacket << SenderGuildGUID;
_worldPacket << SenderAccountGUID;
_worldPacket << TargetGUID;
- _worldPacket << TargetVirtualAddress;
- _worldPacket << SenderVirtualAddress;
+ _worldPacket << uint32(TargetVirtualAddress);
+ _worldPacket << uint32(SenderVirtualAddress);
_worldPacket << PartyGUID;
- _worldPacket << AchievementID;
- _worldPacket << DisplayTime;
+ _worldPacket << uint32(AchievementID);
+ _worldPacket << float(DisplayTime);
_worldPacket.WriteBits(SenderName.length(), 11);
_worldPacket.WriteBits(TargetName.length(), 11);
_worldPacket.WriteBits(Prefix.length(), 5);
@@ -178,6 +179,7 @@ WorldPacket const* WorldPackets::Chat::Chat::Write()
_worldPacket.WriteBits(_ChatFlags, 11);
_worldPacket.WriteBit(HideChatLog);
_worldPacket.WriteBit(FakeSenderName);
+ _worldPacket.WriteBit(Unused_801.is_initialized());
_worldPacket.FlushBits();
_worldPacket.WriteString(SenderName);
@@ -186,6 +188,9 @@ WorldPacket const* WorldPackets::Chat::Chat::Write()
_worldPacket.WriteString(_Channel);
_worldPacket.WriteString(ChatText);
+ if (Unused_801)
+ _worldPacket << uint32(*Unused_801);
+
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h
index 9bc47589574..cbb9da156b0 100644
--- a/src/server/game/Server/Packets/ChatPackets.h
+++ b/src/server/game/Server/Packets/ChatPackets.h
@@ -53,7 +53,7 @@ namespace WorldPackets
class ChatMessageWhisper final : public ClientPacket
{
public:
- ChatMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+ ChatMessageWhisper(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_MESSAGE_WHISPER, std::move(packet)) { }
void Read() override;
@@ -66,7 +66,7 @@ namespace WorldPackets
class ChatMessageChannel final : public ClientPacket
{
public:
- ChatMessageChannel(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+ ChatMessageChannel(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_MESSAGE_CHANNEL, std::move(packet)) { }
void Read() override;
@@ -150,7 +150,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint8 SlashCmd = 0; ///< @see enum ChatMsg
- uint8 _Language = LANG_UNIVERSAL;
+ uint32 _Language = LANG_UNIVERSAL;
ObjectGuid SenderGUID;
ObjectGuid SenderGuildGUID;
ObjectGuid SenderAccountGUID;
@@ -166,6 +166,7 @@ namespace WorldPackets
uint32 AchievementID = 0;
uint8 _ChatFlags = 0; ///< @see enum ChatFlags
float DisplayTime = 0.0f;
+ Optional<uint32> Unused_801;
bool HideChatLog = false;
bool FakeSenderName = false;
};
diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp
index 22196336960..243a7fd6e43 100644
--- a/src/server/game/Server/Packets/CombatLogPackets.cpp
+++ b/src/server/game/Server/Packets/CombatLogPackets.cpp
@@ -26,6 +26,7 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write()
*this << int32(SpellID);
*this << int32(SpellXSpellVisualID);
*this << int32(Damage);
+ *this << int32(OriginalDamage);
*this << int32(Overkill);
*this << uint8(SchoolMask);
*this << int32(Absorbed);
@@ -35,11 +36,11 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write()
WriteBits(Flags, 7);
WriteBit(false); // Debug info
WriteLogDataBit();
- WriteBit(SandboxScaling.is_initialized());
+ WriteBit(ContentTuning.is_initialized());
FlushBits();
WriteLogData();
- if (SandboxScaling)
- *this << *SandboxScaling;
+ if (ContentTuning)
+ *this << *ContentTuning;
return &_worldPacket;
}
@@ -61,12 +62,12 @@ WorldPacket const* WorldPackets::CombatLog::EnvironmentalDamageLog::Write()
WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write()
{
*this << Caster;
- *this << SpellID;
+ *this << int32(SpellID);
*this << uint32(Effects.size());
for (SpellLogEffect const& effect : Effects)
{
- *this << effect.Effect;
+ *this << int32(effect.Effect);
*this << uint32(effect.PowerDrainTargets.size());
*this << uint32(effect.ExtraAttacksTargets.size());
@@ -78,32 +79,32 @@ WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write()
for (SpellLogEffectPowerDrainParams const& powerDrainTarget : effect.PowerDrainTargets)
{
*this << powerDrainTarget.Victim;
- *this << powerDrainTarget.Points;
- *this << powerDrainTarget.PowerType;
- *this << powerDrainTarget.Amplitude;
+ *this << uint32(powerDrainTarget.Points);
+ *this << uint32(powerDrainTarget.PowerType);
+ *this << float(powerDrainTarget.Amplitude);
}
for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : effect.ExtraAttacksTargets)
{
*this << extraAttacksTarget.Victim;
- *this << extraAttacksTarget.NumAttacks;
+ *this << uint32(extraAttacksTarget.NumAttacks);
}
for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : effect.DurabilityDamageTargets)
{
*this << durabilityDamageTarget.Victim;
- *this << durabilityDamageTarget.ItemID;
- *this << durabilityDamageTarget.Amount;
+ *this << int32(durabilityDamageTarget.ItemID);
+ *this << int32(durabilityDamageTarget.Amount);
}
for (SpellLogEffectGenericVictimParams const& genericVictimTarget : effect.GenericVictimTargets)
*this << genericVictimTarget.Victim;
for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : effect.TradeSkillTargets)
- *this << tradeSkillTarget.ItemID;
+ *this << int32(tradeSkillTarget.ItemID);
for (SpellLogEffectFeedPetParams const& feedPetTarget : effect.FeedPetTargets)
- *this << feedPetTarget.ItemID;
+ *this << int32(feedPetTarget.ItemID);
}
WriteLogDataBit();
@@ -119,13 +120,14 @@ WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write()
*this << CasterGUID;
*this << int32(SpellID);
*this << int32(Health);
+ *this << int32(OriginalHeal);
*this << int32(OverHeal);
*this << int32(Absorbed);
WriteBit(Crit);
WriteBit(CritRollMade.is_initialized());
WriteBit(CritRollNeeded.is_initialized());
WriteLogDataBit();
- WriteBit(SandboxScaling.is_initialized());
+ WriteBit(ContentTuning.is_initialized());
FlushBits();
WriteLogData();
@@ -136,8 +138,8 @@ WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write()
if (CritRollNeeded)
*this << *CritRollNeeded;
- if (SandboxScaling)
- *this << *SandboxScaling;
+ if (ContentTuning)
+ *this << *ContentTuning;
return &_worldPacket;
}
@@ -155,24 +157,24 @@ WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write()
{
*this << int32(effect.Effect);
*this << int32(effect.Amount);
+ *this << int32(effect.OriginalDamage);
*this << int32(effect.OverHealOrKill);
*this << int32(effect.SchoolMaskOrPower);
*this << int32(effect.AbsorbedOrAmplitude);
*this << int32(effect.Resisted);
WriteBit(effect.Crit);
WriteBit(effect.DebugInfo.is_initialized());
- WriteBit(effect.SandboxScaling.is_initialized());
+ WriteBit(effect.ContentTuning.is_initialized());
FlushBits();
- if (effect.SandboxScaling)
- *this << *effect.SandboxScaling;
+ if (effect.ContentTuning)
+ *this << *effect.ContentTuning;
if (effect.DebugInfo)
{
*this << float(effect.DebugInfo->CritRollMade);
*this << float(effect.DebugInfo->CritRollNeeded);
}
-
}
WriteLogData();
@@ -280,6 +282,7 @@ WorldPacket const* WorldPackets::CombatLog::SpellDamageShield::Write()
*this << Defender;
*this << int32(SpellID);
*this << int32(TotalDamage);
+ *this << int32(OriginalDamage);
*this << int32(OverKill);
*this << int32(SchoolMask);
*this << int32(LogAbsorbed);
@@ -297,6 +300,7 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write()
attackRoundInfo << AttackerGUID;
attackRoundInfo << VictimGUID;
attackRoundInfo << int32(Damage);
+ attackRoundInfo << int32(OriginalDamage);
attackRoundInfo << int32(OverDamage);
attackRoundInfo << uint8(SubDmg.is_initialized());
if (SubDmg)
@@ -338,15 +342,16 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write()
if (HitInfo & (HITINFO_BLOCK | HITINFO_UNK12))
attackRoundInfo << float(Unk);
- attackRoundInfo << uint8(SandboxScaling.Type);
- attackRoundInfo << uint8(SandboxScaling.TargetLevel);
- attackRoundInfo << uint8(SandboxScaling.Expansion);
- attackRoundInfo << uint8(SandboxScaling.Class);
- attackRoundInfo << uint8(SandboxScaling.TargetMinScalingLevel);
- attackRoundInfo << uint8(SandboxScaling.TargetMaxScalingLevel);
- attackRoundInfo << int16(SandboxScaling.PlayerLevelDelta);
- attackRoundInfo << int8(SandboxScaling.TargetScalingLevelDelta);
- attackRoundInfo << uint16(SandboxScaling.PlayerItemLevel);
+ attackRoundInfo << uint8(ContentTuning.Type);
+ attackRoundInfo << uint8(ContentTuning.TargetLevel);
+ attackRoundInfo << uint8(ContentTuning.Expansion);
+ attackRoundInfo << uint8(ContentTuning.TargetMinScalingLevel);
+ attackRoundInfo << uint8(ContentTuning.TargetMaxScalingLevel);
+ attackRoundInfo << int16(ContentTuning.PlayerLevelDelta);
+ attackRoundInfo << int8(ContentTuning.TargetScalingLevelDelta);
+ attackRoundInfo << uint16(ContentTuning.PlayerItemLevel);
+ attackRoundInfo << uint16(ContentTuning.ScalingHealthItemLevelCurveID);
+ attackRoundInfo << uint8(ContentTuning.ScalesWithItemLevel ? 1 : 0);
WriteLogDataBit();
FlushBits();
diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h
index 88a427ac962..4f3d1361796 100644
--- a/src/server/game/Server/Packets/CombatLogPackets.h
+++ b/src/server/game/Server/Packets/CombatLogPackets.h
@@ -39,6 +39,7 @@ namespace WorldPackets
int32 SpellID = 0;
int32 SpellXSpellVisualID = 0;
int32 Damage = 0;
+ int32 OriginalDamage = 0;
int32 Overkill = -1;
uint8 SchoolMask = 0;
int32 ShieldBlock = 0;
@@ -47,7 +48,7 @@ namespace WorldPackets
int32 Absorbed = 0;
int32 Flags = 0;
// Optional<SpellNonMeleeDamageLogDebugInfo> DebugInfo;
- Optional<Spells::SandboxScalingData> SandboxScaling;
+ Optional<Spells::ContentTuningParams> ContentTuning;
};
class EnvironmentalDamageLog final : public CombatLogServerPacket
@@ -99,12 +100,13 @@ namespace WorldPackets
ObjectGuid TargetGUID;
int32 SpellID = 0;
int32 Health = 0;
+ int32 OriginalHeal = 0;
int32 OverHeal = 0;
int32 Absorbed = 0;
bool Crit = false;
Optional<float> CritRollMade;
Optional<float> CritRollNeeded;
- Optional<Spells::SandboxScalingData> SandboxScaling;
+ Optional<Spells::ContentTuningParams> ContentTuning;
};
class SpellPeriodicAuraLog final : public CombatLogServerPacket
@@ -120,13 +122,14 @@ namespace WorldPackets
{
int32 Effect = 0;
int32 Amount = 0;
+ int32 OriginalDamage = 0;
int32 OverHealOrKill = 0;
int32 SchoolMaskOrPower = 0;
int32 AbsorbedOrAmplitude = 0;
int32 Resisted = 0;
bool Crit = false;
Optional<PeriodicalAuraLogEffectDebugInfo> DebugInfo;
- Optional<Spells::SandboxScalingData> SandboxScaling;
+ Optional<Spells::ContentTuningParams> ContentTuning;
};
SpellPeriodicAuraLog() : CombatLogServerPacket(SMSG_SPELL_PERIODIC_AURA_LOG, 16 + 16 + 4 + 4 + 1) { }
@@ -267,6 +270,7 @@ namespace WorldPackets
ObjectGuid Defender;
int32 SpellID = 0;
int32 TotalDamage = 0;
+ int32 OriginalDamage = 0;
int32 OverKill = 0;
int32 SchoolMask = 0;
int32 LogAbsorbed = 0;
@@ -308,6 +312,7 @@ namespace WorldPackets
ObjectGuid AttackerGUID;
ObjectGuid VictimGUID;
int32 Damage = 0;
+ int32 OriginalDamage = 0;
int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive
Optional<SubDamage> SubDmg;
uint8 VictimState = 0;
@@ -317,7 +322,7 @@ namespace WorldPackets
int32 RageGained = 0;
UnkAttackerState UnkState;
float Unk = 0.0f;
- Spells::SandboxScalingData SandboxScaling;
+ Spells::ContentTuningParams ContentTuning;
};
}
}
diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
index 532779af445..b1e22a3746f 100644
--- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
+++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp
@@ -27,6 +27,7 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit)
Health = unit->GetHealth();
AttackPower = unit->GetTotalAttackPowerValue(unit->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK);
SpellPower = unit->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL);
+ Armor = unit->GetArmor();
PowerData.emplace_back(int32(unit->GetPowerType()), unit->GetPower(unit->GetPowerType()), int32(0));
}
@@ -35,6 +36,7 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Spell const* spell)
Health = spell->GetCaster()->GetHealth();
AttackPower = spell->GetCaster()->GetTotalAttackPowerValue(spell->GetCaster()->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK);
SpellPower = spell->GetCaster()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL);
+ Armor = spell->GetCaster()->GetArmor();
Powers primaryPowerType = spell->GetCaster()->GetPowerType();
bool primaryPowerAdded = false;
for (SpellPowerCost const& cost : spell->GetPowerCost())
@@ -53,22 +55,22 @@ namespace WorldPackets
namespace Spells
{
template<class T, class U>
- bool SandboxScalingData::GenerateDataForUnits(T* /*attacker*/, U* /*target*/)
+ bool ContentTuningParams::GenerateDataForUnits(T* /*attacker*/, U* /*target*/)
{
return false;
}
template<>
- bool SandboxScalingData::GenerateDataForUnits<Creature, Player>(Creature* attacker, Player* target)
+ bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attacker, Player* target)
{
CreatureTemplate const* creatureTemplate = attacker->GetCreatureTemplate();
Type = TYPE_CREATURE_TO_PLAYER_DAMAGE;
PlayerLevelDelta = target->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA);
PlayerItemLevel = target->GetAverageItemLevel();
+ ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID);
TargetLevel = target->getLevel();
Expansion = creatureTemplate->RequiredExpansion;
- Class = creatureTemplate->unit_class;
TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel);
TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel);
TargetScalingLevelDelta = int8(attacker->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA));
@@ -76,16 +78,16 @@ namespace WorldPackets
}
template<>
- bool SandboxScalingData::GenerateDataForUnits<Player, Creature>(Player* attacker, Creature* target)
+ bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacker, Creature* target)
{
CreatureTemplate const* creatureTemplate = target->GetCreatureTemplate();
Type = TYPE_PLAYER_TO_CREATURE_DAMAGE;
PlayerLevelDelta = attacker->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA);
PlayerItemLevel = attacker->GetAverageItemLevel();
+ ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID);
TargetLevel = target->getLevel();
Expansion = creatureTemplate->RequiredExpansion;
- Class = creatureTemplate->unit_class;
TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel);
TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel);
TargetScalingLevelDelta = int8(target->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA));
@@ -93,7 +95,7 @@ namespace WorldPackets
}
template<>
- bool SandboxScalingData::GenerateDataForUnits<Creature, Creature>(Creature* attacker, Creature* target)
+ bool ContentTuningParams::GenerateDataForUnits<Creature, Creature>(Creature* attacker, Creature* target)
{
Creature* accessor = target->HasScalableLevels() ? target : attacker;
CreatureTemplate const* creatureTemplate = accessor->GetCreatureTemplate();
@@ -103,7 +105,6 @@ namespace WorldPackets
PlayerItemLevel = 0;
TargetLevel = target->getLevel();
Expansion = creatureTemplate->RequiredExpansion;
- Class = creatureTemplate->unit_class;
TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel);
TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel);
TargetScalingLevelDelta = int8(accessor->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA));
@@ -111,7 +112,7 @@ namespace WorldPackets
}
template<>
- bool SandboxScalingData::GenerateDataForUnits<Unit, Unit>(Unit* attacker, Unit* target)
+ bool ContentTuningParams::GenerateDataForUnits<Unit, Unit>(Unit* attacker, Unit* target)
{
if (Player* playerAttacker = attacker->ToPlayer())
{
@@ -152,6 +153,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData
data << int64(spellCastLogData.Health);
data << int32(spellCastLogData.AttackPower);
data << int32(spellCastLogData.SpellPower);
+ data << int32(spellCastLogData.Armor);
data.WriteBits(spellCastLogData.PowerData.size(), 9);
data.FlushBits();
@@ -165,16 +167,18 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& sandboxScalingData)
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningParams const& contentTuningParams)
{
- data.WriteBits(sandboxScalingData.Type, 4);
- data << int16(sandboxScalingData.PlayerLevelDelta);
- data << uint16(sandboxScalingData.PlayerItemLevel);
- data << uint8(sandboxScalingData.TargetLevel);
- data << uint8(sandboxScalingData.Expansion);
- data << uint8(sandboxScalingData.Class);
- data << uint8(sandboxScalingData.TargetMinScalingLevel);
- data << uint8(sandboxScalingData.TargetMaxScalingLevel);
- data << int8(sandboxScalingData.TargetScalingLevelDelta);
+ data << int16(contentTuningParams.PlayerLevelDelta);
+ data << uint16(contentTuningParams.PlayerItemLevel);
+ data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID);
+ data << uint8(contentTuningParams.TargetLevel);
+ data << uint8(contentTuningParams.Expansion);
+ data << uint8(contentTuningParams.TargetMinScalingLevel);
+ data << uint8(contentTuningParams.TargetMaxScalingLevel);
+ data << int8(contentTuningParams.TargetScalingLevelDelta);
+ data.WriteBits(contentTuningParams.Type, 4);
+ data.WriteBit(contentTuningParams.ScalesWithItemLevel);
+ data.FlushBits();
return data;
}
diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h
index 172f94e7031..ea3589ce4f7 100644
--- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h
+++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h
@@ -41,31 +41,33 @@ namespace WorldPackets
int64 Health = 0;
int32 AttackPower = 0;
int32 SpellPower = 0;
+ int32 Armor = 0;
std::vector<SpellLogPowerData> PowerData;
void Initialize(Unit const* unit);
void Initialize(Spell const* spell);
};
- struct SandboxScalingData
+ struct ContentTuningParams
{
- enum SandboxScalingDataType : uint32
+ enum ContentTuningType : uint32
{
- TYPE_PLAYER_TO_PLAYER = 1, // NYI
- TYPE_CREATURE_TO_PLAYER_DAMAGE = 2,
- TYPE_PLAYER_TO_CREATURE_DAMAGE = 3,
+ TYPE_PLAYER_TO_PLAYER = 7, // NYI
+ TYPE_CREATURE_TO_PLAYER_DAMAGE = 1,
+ TYPE_PLAYER_TO_CREATURE_DAMAGE = 2,
TYPE_CREATURE_TO_CREATURE_DAMAGE = 4
};
uint32 Type = 0;
int16 PlayerLevelDelta = 0;
uint16 PlayerItemLevel = 0;
+ uint16 ScalingHealthItemLevelCurveID = 0;
uint8 TargetLevel = 0;
uint8 Expansion = 0;
- uint8 Class = 0;
uint8 TargetMinScalingLevel = 0;
uint8 TargetMaxScalingLevel = 0;
int8 TargetScalingLevelDelta = 0;
+ bool ScalesWithItemLevel = false;
template<class T, class U>
bool GenerateDataForUnits(T* attacker, U* target);
@@ -126,6 +128,6 @@ namespace WorldPackets
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& sandboxScalingData);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningParams const& contentTuningParams);
#endif // CombatLogPacketsCommon_h__
diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp
index 5048595314c..63fc4ac1ed1 100644
--- a/src/server/game/Server/Packets/CombatPackets.cpp
+++ b/src/server/game/Server/Packets/CombatPackets.cpp
@@ -96,7 +96,7 @@ WorldPacket const* WorldPackets::Combat::AIReaction::Write()
WorldPacket const* WorldPackets::Combat::AttackSwingError::Write()
{
- _worldPacket.WriteBits(Reason, 2);
+ _worldPacket.WriteBits(Reason, 3);
_worldPacket.FlushBits();
return &_worldPacket;
}
@@ -107,8 +107,8 @@ WorldPacket const* WorldPackets::Combat::PowerUpdate::Write()
_worldPacket << uint32(Powers.size());
for (PowerUpdatePower const& power : Powers)
{
- _worldPacket << power.Power;
- _worldPacket << power.PowerType;
+ _worldPacket << int32(power.Power);
+ _worldPacket << uint8(power.PowerType);
}
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h
index 446d9f5453b..313d573eae1 100644
--- a/src/server/game/Server/Packets/CombatPackets.h
+++ b/src/server/game/Server/Packets/CombatPackets.h
@@ -41,9 +41,9 @@ namespace WorldPackets
public:
enum AttackSwingErr : uint8
{
- CantAttack = 0,
+ NotInRange = 0,
BadFacing = 1,
- NotInRange = 2,
+ CantAttack = 2,
DeadTarget = 3
};
diff --git a/src/server/game/Server/Packets/DuelPackets.cpp b/src/server/game/Server/Packets/DuelPackets.cpp
index f76ccecaa89..ccee13b731a 100644
--- a/src/server/game/Server/Packets/DuelPackets.cpp
+++ b/src/server/game/Server/Packets/DuelPackets.cpp
@@ -59,6 +59,7 @@ void WorldPackets::Duel::DuelResponse::Read()
{
_worldPacket >> ArbiterGUID;
Accepted = _worldPacket.ReadBit();
+ Forfeited = _worldPacket.ReadBit();
}
WorldPacket const* WorldPackets::Duel::DuelWinner::Write()
diff --git a/src/server/game/Server/Packets/DuelPackets.h b/src/server/game/Server/Packets/DuelPackets.h
index b45a8b42ba7..efa2701741a 100644
--- a/src/server/game/Server/Packets/DuelPackets.h
+++ b/src/server/game/Server/Packets/DuelPackets.h
@@ -103,6 +103,7 @@ namespace WorldPackets
ObjectGuid ArbiterGUID;
bool Accepted = false;
+ bool Forfeited = false;
};
class DuelWinner final : public ServerPacket
diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h
index 1dd7040ec32..5c17fdc3cae 100644
--- a/src/server/game/Server/Packets/EquipmentSetPackets.h
+++ b/src/server/game/Server/Packets/EquipmentSetPackets.h
@@ -28,7 +28,7 @@ namespace WorldPackets
class EquipmentSetID final : public ServerPacket
{
public:
- EquipmentSetID() : ServerPacket(SMSG_EQUIPMENT_SET_ID, 8 + 4) { }
+ EquipmentSetID() : ServerPacket(SMSG_EQUIPMENT_SET_ID, 8 + 4 + 4) { }
WorldPacket const* Write() override;
@@ -89,7 +89,7 @@ namespace WorldPackets
class UseEquipmentSetResult final : public ServerPacket
{
public:
- UseEquipmentSetResult() : ServerPacket(SMSG_USE_EQUIPMENT_SET_RESULT, 1) { }
+ UseEquipmentSetResult() : ServerPacket(SMSG_USE_EQUIPMENT_SET_RESULT, 8 + 1) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h
index a7bd016909c..bf83f006b1e 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.h
+++ b/src/server/game/Server/Packets/GarrisonPackets.h
@@ -249,7 +249,7 @@ namespace WorldPackets
class GarrisonLearnBlueprintResult final : public ServerPacket
{
public:
- GarrisonLearnBlueprintResult() : ServerPacket(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, 4 + 4) { }
+ GarrisonLearnBlueprintResult() : ServerPacket(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, 4 + 4 + 4) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/GuildFinderPackets.cpp b/src/server/game/Server/Packets/GuildFinderPackets.cpp
index ac8bcfea9df..2ce269fbdcb 100644
--- a/src/server/game/Server/Packets/GuildFinderPackets.cpp
+++ b/src/server/game/Server/Packets/GuildFinderPackets.cpp
@@ -108,7 +108,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::GuildFinder::GuildPostDat
data << int32(post.Availability);
data << int32(post.ClassRoles);
data << int32(post.LevelRange);
- data << uint32(post.SecondsRemaining);
+ data << int32(post.SecondsRemaining);
data.WriteString(post.Comment);
return data;
}
diff --git a/src/server/game/Server/Packets/GuildFinderPackets.h b/src/server/game/Server/Packets/GuildFinderPackets.h
index 1fe3183156a..94084934fc1 100644
--- a/src/server/game/Server/Packets/GuildFinderPackets.h
+++ b/src/server/game/Server/Packets/GuildFinderPackets.h
@@ -157,7 +157,7 @@ namespace WorldPackets
int32 Availability = 0;
int32 ClassRoles = 0;
int32 LevelRange = 0;
- time_t SecondsRemaining = time_t(0);
+ int32 SecondsRemaining = 0;
std::string Comment;
};
diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
index 777891b3cef..2a3739f2470 100644
--- a/src/server/game/Server/Packets/GuildPackets.cpp
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -63,9 +63,9 @@ WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
WorldPacket const* WorldPackets::Guild::GuildRoster::Write()
{
- _worldPacket << NumAccounts;
+ _worldPacket << int32(NumAccounts);
_worldPacket.AppendPackedTime(CreateDate);
- _worldPacket << GuildFlags;
+ _worldPacket << int32(GuildFlags);
_worldPacket << uint32(MemberData.size());
_worldPacket.WriteBits(WelcomeText.length(), 10);
_worldPacket.WriteBits(InfoText.length(), 11);
@@ -98,8 +98,8 @@ void WorldPackets::Guild::GuildUpdateMotdText::Read()
WorldPacket const* WorldPackets::Guild::GuildCommandResult::Write()
{
- _worldPacket << Result;
- _worldPacket << Command;
+ _worldPacket << int32(Result);
+ _worldPacket << int32(Command);
_worldPacket.WriteBits(Name.length(), 8);
_worldPacket.FlushBits();
@@ -127,17 +127,17 @@ WorldPacket const* WorldPackets::Guild::GuildInvite::Write()
_worldPacket.WriteBits(OldGuildName.length(), 7);
_worldPacket.FlushBits();
- _worldPacket << InviterVirtualRealmAddress;
- _worldPacket << GuildVirtualRealmAddress;
+ _worldPacket << uint32(InviterVirtualRealmAddress);
+ _worldPacket << uint32(GuildVirtualRealmAddress);
_worldPacket << GuildGUID;
- _worldPacket << OldGuildVirtualRealmAddress;
+ _worldPacket << uint32(OldGuildVirtualRealmAddress);
_worldPacket << OldGuildGUID;
- _worldPacket << EmblemStyle;
- _worldPacket << EmblemColor;
- _worldPacket << BorderStyle;
- _worldPacket << BorderColor;
- _worldPacket << Background;
- _worldPacket << AchievementPoints;
+ _worldPacket << uint32(EmblemStyle);
+ _worldPacket << uint32(EmblemColor);
+ _worldPacket << uint32(BorderStyle);
+ _worldPacket << uint32(BorderColor);
+ _worldPacket << uint32(Background);
+ _worldPacket << int32(AchievementPoints);
_worldPacket.WriteString(InviterName);
_worldPacket.WriteString(GuildName);
@@ -148,9 +148,9 @@ WorldPacket const* WorldPackets::Guild::GuildInvite::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterProfessionData const& rosterProfessionData)
{
- data << rosterProfessionData.DbID;
- data << rosterProfessionData.Rank;
- data << rosterProfessionData.Step;
+ data << int32(rosterProfessionData.DbID);
+ data << int32(rosterProfessionData.Rank);
+ data << int32(rosterProfessionData.Step);
return data;
}
@@ -158,20 +158,20 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterProfess
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberData const& rosterMemberData)
{
data << rosterMemberData.Guid;
- data << rosterMemberData.RankID;
- data << rosterMemberData.AreaID;
- data << rosterMemberData.PersonalAchievementPoints;
- data << rosterMemberData.GuildReputation;
- data << rosterMemberData.LastSave;
+ data << int32(rosterMemberData.RankID);
+ data << int32(rosterMemberData.AreaID);
+ data << int32(rosterMemberData.PersonalAchievementPoints);
+ data << int32(rosterMemberData.GuildReputation);
+ data << float(rosterMemberData.LastSave);
for (uint8 i = 0; i < 2; i++)
data << rosterMemberData.Profession[i];
- data << rosterMemberData.VirtualRealmAddress;
- data << rosterMemberData.Status;
- data << rosterMemberData.Level;
- data << rosterMemberData.ClassID;
- data << rosterMemberData.Gender;
+ data << uint32(rosterMemberData.VirtualRealmAddress);
+ data << uint8(rosterMemberData.Status);
+ data << uint8(rosterMemberData.Level);
+ data << uint8(rosterMemberData.ClassID);
+ data << uint8(rosterMemberData.Gender);
data.WriteBits(rosterMemberData.Name.length(), 6);
data.WriteBits(rosterMemberData.Note.length(), 8);
@@ -190,7 +190,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberD
WorldPacket const* WorldPackets::Guild::GuildEventPresenceChange::Write()
{
_worldPacket << Guid;
- _worldPacket << VirtualRealmAddress;
+ _worldPacket << uint32(VirtualRealmAddress);
_worldPacket.WriteBits(Name.length(), 6);
_worldPacket.WriteBit(LoggedOn);
@@ -215,7 +215,7 @@ WorldPacket const* WorldPackets::Guild::GuildEventMotd::Write()
WorldPacket const* WorldPackets::Guild::GuildEventPlayerJoined::Write()
{
_worldPacket << Guid;
- _worldPacket << VirtualRealmAddress;
+ _worldPacket << uint32(VirtualRealmAddress);
_worldPacket.WriteBits(Name.length(), 6);
_worldPacket.FlushBits();
@@ -249,9 +249,9 @@ WorldPacket const* WorldPackets::Guild::GuildEventLogQueryResults::Write()
{
_worldPacket << entry.PlayerGUID;
_worldPacket << entry.OtherGUID;
- _worldPacket << entry.TransactionType;
- _worldPacket << entry.RankID;
- _worldPacket << entry.TransactionDate;
+ _worldPacket << uint8(entry.TransactionType);
+ _worldPacket << uint8(entry.RankID);
+ _worldPacket << uint32(entry.TransactionDate);
}
return &_worldPacket;
@@ -269,12 +269,12 @@ WorldPacket const* WorldPackets::Guild::GuildEventPlayerLeft::Write()
_worldPacket.FlushBits();
_worldPacket << RemoverGUID;
- _worldPacket << RemoverVirtualRealmAddress;
+ _worldPacket << uint32(RemoverVirtualRealmAddress);
_worldPacket.WriteString(RemoverName);
}
_worldPacket << LeaverGUID;
- _worldPacket << LeaverVirtualRealmAddress;
+ _worldPacket << uint32(LeaverVirtualRealmAddress);
_worldPacket.WriteString(LeaverName);
return &_worldPacket;
@@ -282,16 +282,16 @@ WorldPacket const* WorldPackets::Guild::GuildEventPlayerLeft::Write()
WorldPacket const* WorldPackets::Guild::GuildPermissionsQueryResults::Write()
{
- _worldPacket << RankID;
- _worldPacket << WithdrawGoldLimit;
- _worldPacket << Flags;
- _worldPacket << NumTabs;
+ _worldPacket << uint32(RankID);
+ _worldPacket << int32(WithdrawGoldLimit);
+ _worldPacket << int32(Flags);
+ _worldPacket << int32(NumTabs);
_worldPacket << uint32(Tab.size());
for (GuildRankTabPermissions const& tab : Tab)
{
- _worldPacket << tab.Flags;
- _worldPacket << tab.WithdrawItemLimit;
+ _worldPacket << int32(tab.Flags);
+ _worldPacket << int32(tab.WithdrawItemLimit);
}
return &_worldPacket;
@@ -325,9 +325,9 @@ WorldPacket const* WorldPackets::Guild::GuildEventNewLeader::Write()
_worldPacket.FlushBits();
_worldPacket << OldLeaderGUID;
- _worldPacket << OldLeaderVirtualRealmAddress;
+ _worldPacket << uint32(OldLeaderVirtualRealmAddress);
_worldPacket << NewLeaderGUID;
- _worldPacket << NewLeaderVirtualRealmAddress;
+ _worldPacket << uint32(NewLeaderVirtualRealmAddress);
_worldPacket.WriteString(OldLeaderName);
_worldPacket.WriteString(NewLeaderName);
@@ -337,7 +337,7 @@ WorldPacket const* WorldPackets::Guild::GuildEventNewLeader::Write()
WorldPacket const* WorldPackets::Guild::GuildEventTabModified::Write()
{
- _worldPacket << Tab;
+ _worldPacket << int32(Tab);
_worldPacket.WriteBits(Name.length(), 7);
_worldPacket.WriteBits(Icon.length(), 9);
@@ -358,15 +358,15 @@ WorldPacket const* WorldPackets::Guild::GuildEventTabTextChanged::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRankData const& rankData)
{
- data << rankData.RankID;
- data << rankData.RankOrder;
- data << rankData.Flags;
- data << rankData.WithdrawGoldLimit;
+ data << uint32(rankData.RankID);
+ data << uint32(rankData.RankOrder);
+ data << uint32(rankData.Flags);
+ data << uint32(rankData.WithdrawGoldLimit);
for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; i++)
{
- data << rankData.TabFlags[i];
- data << rankData.TabWithdrawItemLimit[i];
+ data << uint32(rankData.TabFlags[i]);
+ data << uint32(rankData.TabWithdrawItemLimit[i]);
}
data.WriteBits(rankData.RankName.length(), 7);
@@ -416,7 +416,7 @@ WorldPacket const* WorldPackets::Guild::GuildSendRankChange::Write()
{
_worldPacket << Officer;
_worldPacket << Other;
- _worldPacket << RankID;
+ _worldPacket << uint32(RankID);
_worldPacket.WriteBit(Promote);
_worldPacket.FlushBits();
@@ -499,25 +499,25 @@ WorldPacket const* WorldPackets::Guild::GuildPartyState::Write()
_worldPacket.WriteBit(InGuildParty);
_worldPacket.FlushBits();
- _worldPacket << NumMembers;
- _worldPacket << NumRequired;
- _worldPacket << GuildXPEarnedMult;
+ _worldPacket << int32(NumMembers);
+ _worldPacket << int32(NumRequired);
+ _worldPacket << float(GuildXPEarnedMult);
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRewardItem const& rewardItem)
{
- data << rewardItem.ItemID;
- data << rewardItem.Unk4;
+ data << uint32(rewardItem.ItemID);
+ data << uint32(rewardItem.Unk4);
data << uint32(rewardItem.AchievementsRequired.size());
data << uint64(rewardItem.RaceMask);
- data << rewardItem.MinGuildLevel;
- data << rewardItem.MinGuildRep;
- data << rewardItem.Cost;
+ data << int32(rewardItem.MinGuildLevel);
+ data << int32(rewardItem.MinGuildRep);
+ data << uint64(rewardItem.Cost);
- for (uint8 i = 0; i < rewardItem.AchievementsRequired.size(); i++)
- data << rewardItem.AchievementsRequired[i];
+ for (std::size_t i = 0; i < rewardItem.AchievementsRequired.size(); i++)
+ data << uint32(rewardItem.AchievementsRequired[i]);
return data;
}
@@ -529,7 +529,7 @@ void WorldPackets::Guild::RequestGuildRewardsList::Read()
WorldPacket const* WorldPackets::Guild::GuildRewardList::Write()
{
- _worldPacket << Version;
+ _worldPacket << int32(Version);
_worldPacket << uint32(RewardItems.size());
for (GuildRewardItem const& item : RewardItems)
@@ -592,9 +592,9 @@ void WorldPackets::Guild::GuildBankWithdrawMoney::Read()
WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
{
- _worldPacket << Money;
- _worldPacket << Tab;
- _worldPacket << WithdrawalsRemaining;
+ _worldPacket << uint64(Money);
+ _worldPacket << int32(Tab);
+ _worldPacket << int32(WithdrawalsRemaining);
_worldPacket << uint32(TabInfo.size());
_worldPacket << uint32(ItemInfo.size());
_worldPacket.WriteBit(FullUpdate);
@@ -602,7 +602,7 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
for (GuildBankTabInfo const& tab : TabInfo)
{
- _worldPacket << tab.TabIndex;
+ _worldPacket << int32(tab.TabIndex);
_worldPacket.WriteBits(tab.Name.length(), 7);
_worldPacket.WriteBits(tab.Icon.length(), 9);
_worldPacket.FlushBits();
@@ -613,12 +613,12 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
for (GuildBankItemInfo const& item : ItemInfo)
{
- _worldPacket << item.Slot;
- _worldPacket << item.Count;
- _worldPacket << item.EnchantmentID;
- _worldPacket << item.Charges;
- _worldPacket << item.OnUseEnchantmentID;
- _worldPacket << item.Flags;
+ _worldPacket << int32(item.Slot);
+ _worldPacket << int32(item.Count);
+ _worldPacket << int32(item.EnchantmentID);
+ _worldPacket << int32(item.Charges);
+ _worldPacket << int32(item.OnUseEnchantmentID);
+ _worldPacket << int32(item.Flags);
_worldPacket << item.Item;
_worldPacket.WriteBits(item.SocketEnchant.size(), 2);
_worldPacket.WriteBit(item.Locked);
@@ -658,7 +658,7 @@ void WorldPackets::Guild::GuildBankLogQuery::Read()
WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
{
- _worldPacket << Tab;
+ _worldPacket << int32(Tab);
_worldPacket << uint32(Entry.size());
_worldPacket.WriteBit(WeeklyBonusMoney.is_initialized());
_worldPacket.FlushBits();
@@ -666,8 +666,8 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
for (GuildBankLogEntry const& logEntry : Entry)
{
_worldPacket << logEntry.PlayerGUID;
- _worldPacket << logEntry.TimeOffset;
- _worldPacket << logEntry.EntryType;
+ _worldPacket << uint32(logEntry.TimeOffset);
+ _worldPacket << int8(logEntry.EntryType);
_worldPacket.WriteBit(logEntry.Money.is_initialized());
_worldPacket.WriteBit(logEntry.ItemID.is_initialized());
@@ -676,20 +676,20 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
_worldPacket.FlushBits();
if (logEntry.Money.is_initialized())
- _worldPacket << *logEntry.Money;
+ _worldPacket << uint64(*logEntry.Money);
if (logEntry.ItemID.is_initialized())
- _worldPacket << *logEntry.ItemID;
+ _worldPacket << int32(*logEntry.ItemID);
if (logEntry.Count.is_initialized())
- _worldPacket << *logEntry.Count;
+ _worldPacket << int32(*logEntry.Count);
if (logEntry.OtherTab.is_initialized())
- _worldPacket << *logEntry.OtherTab;
+ _worldPacket << int8(*logEntry.OtherTab);
}
if (WeeklyBonusMoney)
- _worldPacket << *WeeklyBonusMoney;
+ _worldPacket << uint64(*WeeklyBonusMoney);
return &_worldPacket;
}
@@ -701,7 +701,7 @@ void WorldPackets::Guild::GuildBankTextQuery::Read()
WorldPacket const* WorldPackets::Guild::GuildBankTextQueryResult::Write()
{
- _worldPacket << Tab;
+ _worldPacket << int32(Tab);
_worldPacket.WriteBits(Text.length(), 14);
_worldPacket.FlushBits();
@@ -724,13 +724,13 @@ void WorldPackets::Guild::GuildQueryNews::Read()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildNewsEvent const& newsEvent)
{
- data << newsEvent.Id;
+ data << int32(newsEvent.Id);
data.AppendPackedTime(newsEvent.CompletedDate);
- data << newsEvent.Type;
- data << newsEvent.Flags;
+ data << int32(newsEvent.Type);
+ data << int32(newsEvent.Flags);
- for (uint8 i = 0; i < 2; i++)
- data << newsEvent.Data[i];
+ for (std::size_t i = 0; i < newsEvent.Data.size(); ++i)
+ data << int32(newsEvent.Data[i]);
data << newsEvent.MemberGuid;
data << uint32(newsEvent.MemberList.size());
diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h
index c68b76e5b95..844dba91f5c 100644
--- a/src/server/game/Server/Packets/GuildPackets.h
+++ b/src/server/game/Server/Packets/GuildPackets.h
@@ -432,11 +432,11 @@ namespace WorldPackets
int32 RankID = 0;
int32 RankOrder = 0;
- int32 WithdrawGoldLimit = 0;
+ uint32 WithdrawGoldLimit = 0;
uint32 Flags = 0;
uint32 OldFlags = 0;
- int32 TabFlags[GUILD_BANK_MAX_TABS];
- int32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS];
+ uint32 TabFlags[GUILD_BANK_MAX_TABS];
+ uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS];
std::string RankName;
};
@@ -687,7 +687,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
std::vector<GuildRewardItem> RewardItems;
- uint32 Version = 0;
+ int32 Version = 0;
};
class GuildBankActivate final : public ClientPacket
@@ -918,9 +918,9 @@ namespace WorldPackets
uint32 CompletedDate = 0;
int32 Type = 0;
int32 Flags = 0;
- int32 Data[2];
+ std::array<int32, 2> Data;
ObjectGuid MemberGuid;
- GuidList MemberList;
+ std::vector<ObjectGuid> MemberList;
Optional<Item::ItemInstance> Item;
};
diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp
index df9b540e164..04fc01ad669 100644
--- a/src/server/game/Server/Packets/InspectPackets.cpp
+++ b/src/server/game/Server/Packets/InspectPackets.cpp
@@ -35,6 +35,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData
{
data << itemData.CreatorGUID;
data << uint8(itemData.Index);
+ data << uint32(itemData.AzeritePowers.size());
+ if (!itemData.AzeritePowers.empty())
+ data.append(itemData.AzeritePowers.data(), itemData.AzeritePowers.size());
+
data << itemData.Item;
data.WriteBit(itemData.Usable);
data.WriteBits(itemData.Enchants.size(), 4);
@@ -76,10 +80,11 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
{
if (gemData.ItemId)
{
- WorldPackets::Item::ItemGemData gem;
+ Gems.emplace_back();
+
+ WorldPackets::Item::ItemGemData& gem = Gems.back();
gem.Slot = i;
gem.Item.Initialize(&gemData);
- Gems.push_back(gem);
}
++i;
}
@@ -103,6 +108,7 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
_worldPacket.append(PvpTalents.data(), PvpTalents.size());
_worldPacket.WriteBit(GuildData.is_initialized());
+ _worldPacket.WriteBit(AzeriteLevel.is_initialized());
_worldPacket.FlushBits();
for (size_t i = 0; i < Items.size(); ++i)
@@ -111,6 +117,9 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
if (GuildData)
_worldPacket << *GuildData;
+ if (AzeriteLevel)
+ _worldPacket << int32(*AzeriteLevel);
+
return &_worldPacket;
}
@@ -138,6 +147,7 @@ void WorldPackets::Inspect::InspectPVPRequest::Read()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket)
{
+ data << uint8(bracket.Bracket);
data << int32(bracket.Rating);
data << int32(bracket.Rank);
data << int32(bracket.WeeklyPlayed);
@@ -146,7 +156,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData c
data << int32(bracket.SeasonWon);
data << int32(bracket.WeeklyBestRating);
data << int32(bracket.Unk710);
- data << uint8(bracket.Bracket);
+ data << int32(bracket.Unk801_1);
+ data.WriteBit(bracket.Unk801_2);
+ data.FlushBits();
return data;
}
diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h
index 7bf6b0baa2a..c6437f182f7 100644
--- a/src/server/game/Server/Packets/InspectPackets.h
+++ b/src/server/game/Server/Packets/InspectPackets.h
@@ -56,6 +56,7 @@ namespace WorldPackets
bool Usable = false;
std::vector<InspectEnchantData> Enchants;
std::vector<Item::ItemGemData> Gems;
+ std::vector<int32> AzeritePowers;
};
struct InspectGuildData
@@ -68,7 +69,10 @@ namespace WorldPackets
class InspectResult final : public ServerPacket
{
public:
- InspectResult() : ServerPacket(SMSG_INSPECT_RESULT, 45) { }
+ InspectResult() : ServerPacket(SMSG_INSPECT_RESULT, 45)
+ {
+ PvpTalents.fill(0);
+ }
WorldPacket const* Write() override;
@@ -76,11 +80,12 @@ namespace WorldPackets
std::vector<InspectItemData> Items;
std::vector<uint16> Glyphs;
std::vector<uint16> Talents;
- std::vector<uint16> PvpTalents;
+ std::array<uint16, MAX_PVP_TALENT_SLOTS> PvpTalents;
int32 ClassID = CLASS_NONE;
int32 GenderID = GENDER_NONE;
Optional<InspectGuildData> GuildData;
int32 SpecializationID = 0;
+ Optional<int32> AzeriteLevel;
};
class RequestHonorStats final : public ClientPacket
@@ -128,7 +133,9 @@ namespace WorldPackets
int32 SeasonWon = 0;
int32 WeeklyBestRating = 0;
int32 Unk710 = 0;
+ int32 Unk801_1 = 0;
uint8 Bracket = 0;
+ bool Unk801_2 = false;
};
class InspectPVPResponse final : public ServerPacket
diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp
index 0a6e29e6838..258aa24bd1f 100644
--- a/src/server/game/Server/Packets/InstancePackets.cpp
+++ b/src/server/game/Server/Packets/InstancePackets.cpp
@@ -31,23 +31,13 @@ WorldPacket const* WorldPackets::Instance::UpdateInstanceOwnership::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Instance::InstanceInfo::Write()
-{
- _worldPacket << int32(LockList.size());
-
- for (InstanceLockInfos const& lockInfos : LockList)
- _worldPacket << lockInfos;
-
- return &_worldPacket;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Instance::InstanceLockInfos const& lockInfos)
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Instance::InstanceLock const& lockInfos)
{
- data << lockInfos.MapID;
- data << lockInfos.DifficultyID;
- data << lockInfos.InstanceID;
- data << lockInfos.TimeRemaining;
- data << lockInfos.CompletedMask;
+ data << uint32(lockInfos.MapID);
+ data << uint32(lockInfos.DifficultyID);
+ data << uint64(lockInfos.InstanceID);
+ data << uint32(lockInfos.TimeRemaining);
+ data << uint32(lockInfos.CompletedMask);
data.WriteBit(lockInfos.Locked);
data.WriteBit(lockInfos.Extended);
@@ -57,6 +47,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Instance::InstanceLockInf
return data;
}
+WorldPacket const* WorldPackets::Instance::InstanceInfo::Write()
+{
+ _worldPacket << int32(LockList.size());
+
+ for (InstanceLock const& instanceLock : LockList)
+ _worldPacket << instanceLock;
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Instance::InstanceReset::Write()
{
_worldPacket << uint32(MapID);
diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h
index f13e046906e..0869a137926 100644
--- a/src/server/game/Server/Packets/InstancePackets.h
+++ b/src/server/game/Server/Packets/InstancePackets.h
@@ -47,7 +47,7 @@ namespace WorldPackets
// but it has been deperecated in favor of simply checking group leader, being inside an instance or using dungeon finder
};
- struct InstanceLockInfos
+ struct InstanceLock
{
uint64 InstanceID = 0u;
uint32 MapID = 0u;
@@ -66,7 +66,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- std::vector<InstanceLockInfos> LockList;
+ std::vector<InstanceLock> LockList;
};
class ResetInstances final : public ClientPacket
@@ -90,7 +90,7 @@ namespace WorldPackets
class InstanceResetFailed final : public ServerPacket
{
public:
- InstanceResetFailed() : ServerPacket(SMSG_INSTANCE_RESET_FAILED, 4 + 4) { }
+ InstanceResetFailed() : ServerPacket(SMSG_INSTANCE_RESET_FAILED, 4 + 1) { }
WorldPacket const* Write() override;
@@ -248,6 +248,4 @@ namespace WorldPackets
}
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Instance::InstanceLockInfos const& lockInfos);
-
#endif // InstancePackets_h__
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 87599873de5..55f4274eefc 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -280,7 +280,7 @@ WorldPacket const* WorldPackets::Item::ReadItemResultFailed::Write()
{
_worldPacket << Item;
_worldPacket << uint32(Delay);
- _worldPacket.WriteBits(Subcode, 3);
+ _worldPacket.WriteBits(Subcode, 2);
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp
index 5b8d66afd6a..1ec2dec7804 100644
--- a/src/server/game/Server/Packets/LFGPackets.cpp
+++ b/src/server/game/Server/Packets/LFGPackets.cpp
@@ -311,10 +311,15 @@ WorldPacket const* WorldPackets::LFG::LFGQueueStatus::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGPlayerRewards const& lfgPlayerRewards)
{
- data << int32(lfgPlayerRewards.RewardItem);
- data << uint32(lfgPlayerRewards.RewardItemQuantity);
- data << int32(lfgPlayerRewards.BonusCurrency);
- data.WriteBit(lfgPlayerRewards.IsCurrency);
+ data.WriteBit(lfgPlayerRewards.RewardItem.is_initialized());
+ data.WriteBit(lfgPlayerRewards.RewardCurrency.is_initialized());
+ if (lfgPlayerRewards.RewardItem)
+ data << *lfgPlayerRewards.RewardItem;
+
+ data << uint32(lfgPlayerRewards.Quantity);
+ data << int32(lfgPlayerRewards.BonusQuantity);
+ if (lfgPlayerRewards.RewardCurrency)
+ data << int32(*lfgPlayerRewards.RewardCurrency);
return data;
}
diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h
index 9e1c513aece..2b31074094d 100644
--- a/src/server/game/Server/Packets/LFGPackets.h
+++ b/src/server/game/Server/Packets/LFGPackets.h
@@ -20,6 +20,7 @@
#include "Packet.h"
#include "PacketUtilities.h"
+#include "ItemPacketsCommon.h"
#include "LFGPacketsCommon.h"
#include "Optional.h"
@@ -325,13 +326,24 @@ namespace WorldPackets
struct LFGPlayerRewards
{
LFGPlayerRewards() { }
- LFGPlayerRewards(int32 rewardItem, uint32 rewardItemQuantity, int32 bonusCurrency, bool isCurrency)
- : RewardItem(rewardItem), RewardItemQuantity(rewardItemQuantity), BonusCurrency(bonusCurrency), IsCurrency(isCurrency) { }
-
- int32 RewardItem = 0;
- uint32 RewardItemQuantity = 0;
- int32 BonusCurrency = 0;
- bool IsCurrency = false;
+ LFGPlayerRewards(int32 id, uint32 quantity, int32 bonusQuantity, bool isCurrency)
+ : Quantity(quantity), BonusQuantity(bonusQuantity)
+ {
+ if (!isCurrency)
+ {
+ RewardItem = boost::in_place();
+ RewardItem->ItemID = id;
+ }
+ else
+ {
+ RewardCurrency = id;
+ }
+ }
+
+ Optional<Item::ItemInstance> RewardItem;
+ Optional<int32> RewardCurrency;
+ uint32 Quantity = 0;
+ int32 BonusQuantity = 0;
};
class LFGPlayerReward final : public ServerPacket
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index 4399b0d3924..9f98092d091 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -346,7 +346,8 @@ WorldPacket const* WorldPackets::Misc::LevelUpInfo::Write()
for (int32 stat : StatDelta)
_worldPacket << stat;
- _worldPacket << int32(Cp);
+ _worldPacket << int32(NumNewTalents);
+ _worldPacket << int32(NumNewPvpTalentSlots);
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 984e8444b3b..df9c99e063b 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -258,7 +258,7 @@ namespace WorldPackets
void Read() override;
- int32 DifficultyID = 0;
+ uint32 DifficultyID = 0;
};
class SetRaidDifficulty final : public ClientPacket
@@ -480,7 +480,8 @@ namespace WorldPackets
int32 HealthDelta = 0;
std::array<int32, 6> PowerDelta = { };
std::array<int32, MAX_STATS> StatDelta = { };
- int32 Cp = 0;
+ int32 NumNewTalents = 0;
+ int32 NumNewPvpTalentSlots = 0;
};
class PlayMusic final : public ServerPacket
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 38a7f8f68fd..3dd719f46b0 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -213,6 +213,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineSp
data << uint32(spellEffectExtraData.SpellVisualID);
data << uint32(spellEffectExtraData.ProgressCurveID);
data << uint32(spellEffectExtraData.ParabolicCurveID);
+ data << float(spellEffectExtraData.JumpGravity);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineJumpExtraData const& jumpExtraData)
+{
+ data << float(jumpExtraData.JumpGravity);
+ data << uint32(jumpExtraData.StartTime);
+ data << uint32(jumpExtraData.Duration);
return data;
}
@@ -224,8 +234,7 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline
data << uint32(movementSpline.TierTransStartTime);
data << int32(movementSpline.Elapsed);
data << uint32(movementSpline.MoveTime);
- data << float(movementSpline.JumpGravity);
- data << uint32(movementSpline.SpecialTime);
+ data << uint32(movementSpline.FadeObjectTime);
data << uint8(movementSpline.Mode);
data << uint8(movementSpline.VehicleExitVoluntary);
data << movementSpline.TransportGUID;
@@ -235,6 +244,7 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline
data.WriteBits(movementSpline.PackedDeltas.size(), 16);
data.WriteBit(movementSpline.SplineFilter.is_initialized());
data.WriteBit(movementSpline.SpellEffectExtraData.is_initialized());
+ data.WriteBit(movementSpline.JumpExtraData.is_initialized());
data.FlushBits();
if (movementSpline.SplineFilter)
@@ -262,6 +272,9 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline
if (movementSpline.SpellEffectExtraData)
data << *movementSpline.SpellEffectExtraData;
+ if (movementSpline.JumpExtraData)
+ data << *movementSpline.JumpExtraData;
+
return data;
}
@@ -300,12 +313,12 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(::
data << float(1.0f); // DurationModifier
data << float(1.0f); // NextDurationModifier
data.WriteBits(moveSpline.facing.type, 2); // Face
- bool HasJumpGravity = data.WriteBit(moveSpline.splineflags.parabolic || moveSpline.splineflags.animation); // HasJumpGravity
- bool HasSpecialTime = data.WriteBit(moveSpline.splineflags.parabolic && moveSpline.effect_start_time < moveSpline.Duration()); // HasSpecialTime
+ bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.fadeObject && moveSpline.effect_start_time < moveSpline.Duration());
data.WriteBits(moveSpline.getPath().size(), 16);
data.WriteBits(uint8(moveSpline.spline.mode()), 2); // Mode
data.WriteBit(0); // HasSplineFilter
data.WriteBit(moveSpline.spell_effect_extra.is_initialized()); // HasSpellEffectExtraData
+ data.WriteBit(moveSpline.splineflags.parabolic); // HasJumpExtraData
data.FlushBits();
//if (HasSplineFilterKey)
@@ -341,11 +354,8 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(::
break;
}
- if (HasJumpGravity)
- data << float(moveSpline.vertical_acceleration); // JumpGravity
-
- if (HasSpecialTime)
- data << uint32(moveSpline.effect_start_time); // SpecialTime
+ if (hasFadeObjectTime)
+ data << uint32(moveSpline.effect_start_time); // FadeObjectTime
data.append(moveSpline.getPath().data(), moveSpline.getPath().size());
@@ -355,6 +365,14 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(::
data << uint32(moveSpline.spell_effect_extra->SpellVisualId);
data << uint32(moveSpline.spell_effect_extra->ProgressCurveId);
data << uint32(moveSpline.spell_effect_extra->ParabolicCurveId);
+ data << float(moveSpline.vertical_acceleration);
+ }
+
+ if (moveSpline.splineflags.parabolic)
+ {
+ data << float(moveSpline.vertical_acceleration);
+ data << uint32(moveSpline.effect_start_time);
+ data << uint32(0); // Duration (override)
}
}
}
@@ -388,12 +406,13 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS
if (splineFlags.parabolic)
{
- movementSpline.JumpGravity = moveSpline.vertical_acceleration;
- movementSpline.SpecialTime = moveSpline.effect_start_time;
+ movementSpline.JumpExtraData = boost::in_place();
+ movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
+ movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
}
if (splineFlags.fadeObject)
- movementSpline.SpecialTime = moveSpline.effect_start_time;
+ movementSpline.FadeObjectTime = moveSpline.effect_start_time;
if (moveSpline.spell_effect_extra)
{
@@ -402,6 +421,7 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS
movementSpline.SpellEffectExtraData->SpellVisualID = moveSpline.spell_effect_extra->SpellVisualId;
movementSpline.SpellEffectExtraData->ProgressCurveID = moveSpline.spell_effect_extra->ProgressCurveId;
movementSpline.SpellEffectExtraData->ParabolicCurveID = moveSpline.spell_effect_extra->ParabolicCurveId;
+ movementSpline.SpellEffectExtraData->JumpGravity = moveSpline.vertical_acceleration;
}
::Movement::Spline<int32> const& spline = moveSpline.spline;
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index aaa5f770535..e50a8cf6a71 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -75,6 +75,14 @@ namespace WorldPackets
uint32 SpellVisualID = 0;
uint32 ProgressCurveID = 0;
uint32 ParabolicCurveID = 0;
+ float JumpGravity = 0.0f;
+ };
+
+ struct MonsterSplineJumpExtraData
+ {
+ float JumpGravity = 0.0f;
+ uint32 StartTime = 0;
+ uint32 Duration = 0;
};
struct MovementSpline
@@ -85,8 +93,7 @@ namespace WorldPackets
uint32 TierTransStartTime = 0;
int32 Elapsed = 0;
uint32 MoveTime = 0;
- float JumpGravity = 0.0f;
- uint32 SpecialTime = 0;
+ uint32 FadeObjectTime = 0;
std::vector<TaggedPosition<Position::XYZ>> Points; // Spline path
uint8 Mode = 0; // Spline mode - actually always 0 in this packet - Catmullrom mode appears only in SMSG_UPDATE_OBJECT. In this packet it is determined by flags
uint8 VehicleExitVoluntary = 0;
@@ -95,6 +102,7 @@ namespace WorldPackets
std::vector<TaggedPosition<Position::PackedXYZ>> PackedDeltas;
Optional<MonsterSplineFilter> SplineFilter;
Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData;
+ Optional<MonsterSplineJumpExtraData> JumpExtraData;
float FaceDirection = 0.0f;
ObjectGuid FaceGUID;
TaggedPosition<Position::XYZ> FaceSpot;
diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp
index 2b7f9ab7d18..749b4b9a330 100644
--- a/src/server/game/Server/Packets/NPCPackets.cpp
+++ b/src/server/game/Server/Packets/NPCPackets.cpp
@@ -96,19 +96,19 @@ WorldPacket const* WorldPackets::NPC::VendorInventory::Write()
WorldPacket const* WorldPackets::NPC::TrainerList::Write()
{
_worldPacket << TrainerGUID;
- _worldPacket << TrainerType;
- _worldPacket << TrainerID;
+ _worldPacket << uint32(TrainerType);
+ _worldPacket << uint32(TrainerID);
- _worldPacket << int32(Spells.size());
+ _worldPacket << uint32(Spells.size());
for (TrainerListSpell const& spell : Spells)
{
- _worldPacket << spell.SpellID;
- _worldPacket << spell.MoneyCost;
- _worldPacket << spell.ReqSkillLine;
- _worldPacket << spell.ReqSkillRank;
+ _worldPacket << int32(spell.SpellID);
+ _worldPacket << uint32(spell.MoneyCost);
+ _worldPacket << uint32(spell.ReqSkillLine);
+ _worldPacket << uint32(spell.ReqSkillRank);
_worldPacket.append(spell.ReqAbility.data(), spell.ReqAbility.size());
- _worldPacket << spell.Usable;
- _worldPacket << spell.ReqLevel;
+ _worldPacket << uint8(spell.Usable);
+ _worldPacket << uint8(spell.ReqLevel);
}
_worldPacket.WriteBits(Greeting.length(), 11);
@@ -144,11 +144,13 @@ WorldPacket const* WorldPackets::NPC::PlayerTabardVendorActivate::Write()
WorldPacket const* WorldPackets::NPC::GossipPOI::Write()
{
- _worldPacket.WriteBits(Flags, 14);
- _worldPacket.WriteBits(Name.length(), 6);
+ _worldPacket << int32(ID);
_worldPacket << Pos;
_worldPacket << int32(Icon);
_worldPacket << int32(Importance);
+ _worldPacket.WriteBits(Flags, 14);
+ _worldPacket.WriteBits(Name.length(), 6);
+ _worldPacket.FlushBits();
_worldPacket.WriteString(Name);
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h
index a094f25dc22..8148e3aff60 100644
--- a/src/server/game/Server/Packets/NPCPackets.h
+++ b/src/server/game/Server/Packets/NPCPackets.h
@@ -131,9 +131,9 @@ namespace WorldPackets
struct TrainerListSpell
{
int32 SpellID = 0;
- int32 MoneyCost = 0;
- int32 ReqSkillLine = 0;
- int32 ReqSkillRank = 0;
+ uint32 MoneyCost = 0;
+ uint32 ReqSkillLine = 0;
+ uint32 ReqSkillRank = 0;
std::array<int32, 3> ReqAbility = { };
uint8 Usable = 0;
uint8 ReqLevel = 0;
@@ -180,6 +180,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
+ int32 ID = 0;
uint32 Flags = 0;
TaggedPosition<Position::XY> Pos;
int32 Icon = 0;
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index f7913b9c51d..99b214aab36 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -42,6 +42,8 @@ namespace WorldPackets
typedef typename storage_type::value_type value_type;
typedef typename storage_type::size_type size_type;
+ typedef typename storage_type::pointer pointer;
+ typedef typename storage_type::const_pointer const_pointer;
typedef typename storage_type::reference reference;
typedef typename storage_type::const_reference const_reference;
typedef typename storage_type::iterator iterator;
@@ -55,6 +57,9 @@ namespace WorldPackets
iterator end() { return _storage.end(); }
const_iterator end() const { return _storage.end(); }
+ pointer data() { return _storage.data(); }
+ const_pointer data() const { return _storage.data(); }
+
size_type size() const { return _storage.size(); }
bool empty() const { return _storage.empty(); }
diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp
index 939f0a65db1..9251addde38 100644
--- a/src/server/game/Server/Packets/PartyPackets.cpp
+++ b/src/server/game/Server/Packets/PartyPackets.cpp
@@ -33,7 +33,7 @@ WorldPacket const* WorldPackets::Party::PartyCommandResult::Write()
_worldPacket.WriteBits(Command, 4);
_worldPacket.WriteBits(Result, 6);
- _worldPacket << ResultData;
+ _worldPacket << uint32(ResultData);
_worldPacket << ResultGUID;
_worldPacket.WriteString(Name);
@@ -78,12 +78,12 @@ WorldPacket const* WorldPackets::Party::PartyInvite::Write()
_worldPacket << InviterBNetAccountId;
_worldPacket << uint16(Unk1);
_worldPacket << uint32(ProposedRoles);
- _worldPacket << int32(LfgSlots.size());
- _worldPacket << LfgCompletedMask;
+ _worldPacket << uint32(LfgSlots.size());
+ _worldPacket << uint32(LfgCompletedMask);
_worldPacket.WriteString(InviterName);
- for (int32 LfgSlot : LfgSlots)
+ for (uint32 LfgSlot : LfgSlots)
_worldPacket << LfgSlot;
return &_worldPacket;
@@ -212,7 +212,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats c
data << int16(memberStats.PositionY);
data << int16(memberStats.PositionZ);
data << int32(memberStats.VehicleSeat);
- data << int32(memberStats.Auras.size());
+ data << uint32(memberStats.Auras.size());
data << memberStats.Phases;
for (WorldPackets::Party::PartyMemberAuraStates const& aura : memberStats.Auras)
@@ -318,15 +318,13 @@ WorldPacket const* WorldPackets::Party::SendRaidTargetUpdateSingle::Write()
WorldPacket const* WorldPackets::Party::SendRaidTargetUpdateAll::Write()
{
- _worldPacket << PartyIndex;
-
- _worldPacket << int32(TargetIcons.size());
+ _worldPacket << uint8(PartyIndex);
+ _worldPacket << uint32(TargetIcons.size());
- std::map<uint8, ObjectGuid>::const_iterator itr;
- for (itr = TargetIcons.begin(); itr != TargetIcons.end(); itr++)
+ for (auto itr = TargetIcons.begin(); itr != TargetIcons.end(); ++itr)
{
_worldPacket << itr->second;
- _worldPacket << itr->first;
+ _worldPacket << uint8(itr->first);
}
return &_worldPacket;
@@ -420,7 +418,9 @@ WorldPacket const* WorldPackets::Party::GroupNewLeader::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo const& playerInfo)
{
data.WriteBits(playerInfo.Name.size(), 6);
+ data.WriteBits(playerInfo.VoiceStateID.size(), 6);
data.WriteBit(playerInfo.FromSocialQueue);
+ data.WriteBit(playerInfo.VoiceChatSilenced);
data << playerInfo.GUID;
data << uint8(playerInfo.Status);
data << uint8(playerInfo.Subgroup);
@@ -428,6 +428,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo co
data << uint8(playerInfo.RolesAssigned);
data << uint8(playerInfo.Class);
data.WriteString(playerInfo.Name);
+ data.WriteString(playerInfo.VoiceStateID);
return data;
}
@@ -524,8 +525,8 @@ void WorldPackets::Party::ClearRaidMarker::Read()
WorldPacket const* WorldPackets::Party::RaidMarkersChanged::Write()
{
- _worldPacket << PartyIndex;
- _worldPacket << ActiveMarkers;
+ _worldPacket << uint8(PartyIndex);
+ _worldPacket << uint32(ActiveMarkers);
_worldPacket.WriteBits(RaidMarkers.size(), 4);
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h
index f62e61d0990..d0b689ffb04 100644
--- a/src/server/game/Server/Packets/PartyPackets.h
+++ b/src/server/game/Server/Packets/PartyPackets.h
@@ -48,8 +48,8 @@ namespace WorldPackets
void Read() override;
- int8 PartyIndex = 0;
- int32 ProposedRoles = 0;
+ uint8 PartyIndex = 0;
+ uint32 ProposedRoles = 0;
std::string TargetName;
std::string TargetRealm;
ObjectGuid TargetGUID;
@@ -85,9 +85,9 @@ namespace WorldPackets
std::string InviterRealmNameNormalized;
// Lfg
- int32 ProposedRoles = 0;
- int32 LfgCompletedMask = 0;
- std::vector<int32> LfgSlots;
+ uint32 ProposedRoles = 0;
+ uint32 LfgCompletedMask = 0;
+ std::vector<uint32> LfgSlots;
};
class PartyInviteResponse final : public ClientPacket
@@ -97,9 +97,9 @@ namespace WorldPackets
void Read() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
bool Accept = false;
- Optional<int32> RolesDesired;
+ Optional<uint32> RolesDesired;
};
class PartyUninvite final : public ClientPacket
@@ -109,7 +109,7 @@ namespace WorldPackets
void Read() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
ObjectGuid TargetGUID;
std::string Reason;
};
@@ -327,7 +327,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
std::map<uint8, ObjectGuid> TargetIcons;
};
@@ -359,7 +359,7 @@ namespace WorldPackets
void Read() override;
ObjectGuid Target;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
bool Apply = false;
};
@@ -405,7 +405,7 @@ namespace WorldPackets
void Read() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
bool IsReady = false;
};
@@ -486,13 +486,14 @@ namespace WorldPackets
{
ObjectGuid GUID;
std::string Name;
+ std::string VoiceStateID; // same as bgs.protocol.club.v1.MemberVoiceState.id
uint8 Class = 0;
-
uint8 Status = 0u;
uint8 Subgroup = 0u;
uint8 Flags = 0u;
uint8 RolesAssigned = 0u;
bool FromSocialQueue = false;
+ bool VoiceChatSilenced = false;
};
struct PartyLFGInfo
@@ -554,7 +555,7 @@ namespace WorldPackets
void Read() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
bool EveryoneIsAssistant = false;
};
@@ -599,7 +600,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int8 PartyIndex = 0;
+ uint8 PartyIndex = 0;
uint32 ActiveMarkers = 0u;
std::vector<RaidMarker*> RaidMarkers;
diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp
index 06182856bb4..d62ce6840cb 100644
--- a/src/server/game/Server/Packets/PetPackets.cpp
+++ b/src/server/game/Server/Packets/PetPackets.cpp
@@ -65,9 +65,8 @@ WorldPacket const* WorldPackets::Pet::PetStableList::Write()
_worldPacket << int32(pet.CreatureID);
_worldPacket << int32(pet.DisplayID);
_worldPacket << int32(pet.ExperienceLevel);
- _worldPacket << int32(pet.PetFlags);
-
- _worldPacket << int8(pet.PetName.length());
+ _worldPacket << uint8(pet.PetFlags);
+ _worldPacket.WriteBits(pet.PetName.length(), 8);
_worldPacket.WriteString(pet.PetName);
}
@@ -92,21 +91,18 @@ WorldPacket const* WorldPackets::Pet::PetUnlearnedSpells::Write()
WorldPacket const* WorldPackets::Pet::PetNameInvalid::Write()
{
+ _worldPacket << uint8(Result);
_worldPacket << RenameData.PetGUID;
_worldPacket << int32(RenameData.PetNumber);
_worldPacket << uint8(RenameData.NewName.length());
_worldPacket.WriteBit(RenameData.DeclinedNames.is_initialized());
- _worldPacket.FlushBits();
if (RenameData.DeclinedNames)
{
for (int32 i = 0; i < MAX_DECLINED_NAME_CASES; i++)
- {
_worldPacket.WriteBits(RenameData.DeclinedNames->name[i].length(), 7);
- _worldPacket.FlushBits();
- }
for (int32 i = 0; i < MAX_DECLINED_NAME_CASES; i++)
_worldPacket << RenameData.DeclinedNames->name[i];
@@ -121,8 +117,7 @@ void WorldPackets::Pet::PetRename::Read()
_worldPacket >> RenameData.PetGUID;
_worldPacket >> RenameData.PetNumber;
- int8 nameLen = 0;
- _worldPacket >> nameLen;
+ uint8 nameLen = _worldPacket.ReadBits(8);
if (_worldPacket.ReadBit())
{
diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h
index 965dc0b60c4..3f57f0360c9 100644
--- a/src/server/game/Server/Packets/PetPackets.h
+++ b/src/server/game/Server/Packets/PetPackets.h
@@ -125,7 +125,7 @@ namespace WorldPackets
uint32 CreatureID = 0;
uint32 DisplayID = 0;
uint32 ExperienceLevel = 0;
- uint32 PetFlags = 0;
+ uint8 PetFlags = 0;
std::string PetName;
};
diff --git a/src/server/game/Server/Packets/PetitionPackets.cpp b/src/server/game/Server/Packets/PetitionPackets.cpp
index 132494aed46..06823e15204 100644
--- a/src/server/game/Server/Packets/PetitionPackets.cpp
+++ b/src/server/game/Server/Packets/PetitionPackets.cpp
@@ -25,32 +25,31 @@ void WorldPackets::Petition::QueryPetition::Read()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Petition::PetitionInfo const& petitionInfo)
{
- data << petitionInfo.PetitionID;
+ data << int32(petitionInfo.PetitionID);
data << petitionInfo.Petitioner;
-
- data << petitionInfo.MinSignatures;
- data << petitionInfo.MaxSignatures;
- data << petitionInfo.DeadLine;
- data << petitionInfo.IssueDate;
- data << petitionInfo.AllowedGuildID;
- data << petitionInfo.AllowedClasses;
- data << petitionInfo.AllowedRaces;
- data << petitionInfo.AllowedGender;
- data << petitionInfo.AllowedMinLevel;
- data << petitionInfo.AllowedMaxLevel;
- data << petitionInfo.NumChoices;
- data << petitionInfo.StaticType;
- data << petitionInfo.Muid;
+ data << int32(petitionInfo.MinSignatures);
+ data << int32(petitionInfo.MaxSignatures);
+ data << int32(petitionInfo.DeadLine);
+ data << int32(petitionInfo.IssueDate);
+ data << int32(petitionInfo.AllowedGuildID);
+ data << int32(petitionInfo.AllowedClasses);
+ data << int32(petitionInfo.AllowedRaces);
+ data << int16(petitionInfo.AllowedGender);
+ data << int32(petitionInfo.AllowedMinLevel);
+ data << int32(petitionInfo.AllowedMaxLevel);
+ data << int32(petitionInfo.NumChoices);
+ data << int32(petitionInfo.StaticType);
+ data << uint32(petitionInfo.Muid);
data.WriteBits(petitionInfo.Title.length(), 7);
data.WriteBits(petitionInfo.BodyText.length(), 12);
- for (uint8 i = 0; i < 10; i++)
+ for (std::size_t i = 0; i < petitionInfo.Choicetext.size(); ++i)
data.WriteBits(petitionInfo.Choicetext[i].length(), 6);
data.FlushBits();
- for (uint8 i = 0; i < 10; i++)
+ for (std::size_t i = 0; i < petitionInfo.Choicetext.size(); ++i)
data.WriteString(petitionInfo.Choicetext[i]);
data.WriteString(petitionInfo.Title);
@@ -61,7 +60,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Petition::PetitionInfo co
WorldPacket const* WorldPackets::Petition::QueryPetitionResponse::Write()
{
- _worldPacket << PetitionID;
+ _worldPacket << uint32(PetitionID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -102,13 +101,13 @@ WorldPacket const* WorldPackets::Petition::ServerPetitionShowSignatures::Write()
_worldPacket << Item;
_worldPacket << Owner;
_worldPacket << OwnerAccountID;
- _worldPacket << PetitionID;
+ _worldPacket << int32(PetitionID);
_worldPacket << uint32(Signatures.size());
- for (PetitionSignature signature : Signatures)
+ for (PetitionSignature const& signature : Signatures)
{
_worldPacket << signature.Signer;
- _worldPacket << signature.Choice;
+ _worldPacket << int32(signature.Choice);
}
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/PetitionPackets.h b/src/server/game/Server/Packets/PetitionPackets.h
index a5b4e8dca6f..c378c053d84 100644
--- a/src/server/game/Server/Packets/PetitionPackets.h
+++ b/src/server/game/Server/Packets/PetitionPackets.h
@@ -56,7 +56,7 @@ namespace WorldPackets
int32 NumChoices = 0;
int32 StaticType = 0;
uint32 Muid = 0;
- std::string Choicetext[10];
+ std::array<std::string, 10> Choicetext;
};
class QueryPetitionResponse final : public ServerPacket
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index c640394be93..f941c895722 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -29,7 +29,7 @@ void WorldPackets::Query::QueryCreature::Read()
WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
{
- _worldPacket << CreatureID;
+ _worldPacket << uint32(CreatureID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -61,7 +61,16 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
_worldPacket << int32(Stats.CreatureFamily);
_worldPacket << int32(Stats.Classification);
_worldPacket.append(Stats.ProxyCreatureID.data(), Stats.ProxyCreatureID.size());
- _worldPacket.append(Stats.CreatureDisplayID.data(), Stats.CreatureDisplayID.size());
+ _worldPacket << uint32(Stats.Display.CreatureDisplay.size());
+ _worldPacket << float(Stats.Display.TotalProbability);
+
+ for (CreatureXDisplay const& display : Stats.Display.CreatureDisplay)
+ {
+ _worldPacket << uint32(display.CreatureDisplayID);
+ _worldPacket << float(display.Scale);
+ _worldPacket << float(display.Probability);
+ }
+
_worldPacket << float(Stats.HpMulti);
_worldPacket << float(Stats.EnergyMulti);
_worldPacket << uint32(Stats.QuestItems.size());
@@ -69,6 +78,7 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
_worldPacket << int32(Stats.HealthScalingExpansion);
_worldPacket << int32(Stats.RequiredExpansion);
_worldPacket << int32(Stats.VignetteID);
+ _worldPacket << int32(Stats.Class);
if (!Stats.Title.empty())
_worldPacket << Stats.Title;
@@ -79,8 +89,8 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
if (!Stats.CursorName.empty())
_worldPacket << Stats.CursorName;
- for (int32 questItem : Stats.QuestItems)
- _worldPacket << questItem;
+ if (!Stats.QuestItems.empty())
+ _worldPacket.append(Stats.QuestItems.data(), Stats.QuestItems.size());
}
return &_worldPacket;
@@ -162,6 +172,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupDa
data << lookupData.AccountID;
data << lookupData.BnetAccountID;
data << lookupData.GuidActual;
+ data << uint64(lookupData.GuildClubMemberID);
data << uint32(lookupData.VirtualRealmAddress);
data << uint8(lookupData.Race);
data << uint8(lookupData.Sex);
@@ -174,7 +185,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupDa
WorldPacket const* WorldPackets::Query::QueryPlayerNameResponse::Write()
{
- _worldPacket << Result;
+ _worldPacket << uint8(Result);
_worldPacket << Player;
if (Result == RESPONSE_SUCCESS)
@@ -206,7 +217,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::QueryPageTextRespo
WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write()
{
- _worldPacket << PageTextID;
+ _worldPacket << uint32(PageTextID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -229,7 +240,7 @@ void WorldPackets::Query::QueryNPCText::Read()
WorldPacket const* WorldPackets::Query::QueryNPCTextResponse::Write()
{
- _worldPacket << TextID;
+ _worldPacket << uint32(TextID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -238,10 +249,8 @@ WorldPacket const* WorldPackets::Query::QueryNPCTextResponse::Write()
if (Allow)
{
- for (uint32 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i)
- _worldPacket << Probabilities[i];
- for (uint32 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i)
- _worldPacket << BroadcastTextID[i];
+ _worldPacket.append(Probabilities.data(), Probabilities.size());
+ _worldPacket.append(BroadcastTextID.data(), BroadcastTextID.size());
}
return &_worldPacket;
@@ -276,8 +285,8 @@ WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write()
statsData << float(Stats.Size);
statsData << uint8(Stats.QuestItems.size());
- for (int32 questItem : Stats.QuestItems)
- statsData << int32(questItem);
+ if (!Stats.QuestItems.empty())
+ statsData.append(Stats.QuestItems.data(), Stats.QuestItems.size());
statsData << int32(Stats.RequiredLevel);
}
@@ -334,7 +343,7 @@ void WorldPackets::Query::QuestPOIQuery::Read()
{
_worldPacket >> MissingQuestCount;
- for (uint8 i = 0; i < 50; ++i)
+ for (std::size_t i = 0; i < MissingQuestPOIs.size(); ++i)
_worldPacket >> MissingQuestPOIs[i];
}
@@ -356,13 +365,12 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write()
_worldPacket << int32(questPOIBlobData.QuestObjectiveID);
_worldPacket << int32(questPOIBlobData.QuestObjectID);
_worldPacket << int32(questPOIBlobData.MapID);
- _worldPacket << int32(questPOIBlobData.WorldMapAreaID);
- _worldPacket << int32(questPOIBlobData.Floor);
+ _worldPacket << int32(questPOIBlobData.UiMapID);
_worldPacket << int32(questPOIBlobData.Priority);
_worldPacket << int32(questPOIBlobData.Flags);
_worldPacket << int32(questPOIBlobData.WorldEffectID);
_worldPacket << int32(questPOIBlobData.PlayerConditionID);
- _worldPacket << int32(questPOIBlobData.UnkWoD1);
+ _worldPacket << int32(questPOIBlobData.SpawnTrackingID);
_worldPacket << int32(questPOIBlobData.QuestPOIBlobPointStats.size());
for (QuestPOIBlobPoint const& questPOIBlobPoint : questPOIBlobData.QuestPOIBlobPointStats)
@@ -381,13 +389,9 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write()
void WorldPackets::Query::QueryQuestCompletionNPCs::Read()
{
- uint32 questCount = 0;
-
- _worldPacket >> questCount;
- QuestCompletionNPCs.resize(questCount);
-
- for (int32& QuestID : QuestCompletionNPCs)
- _worldPacket >> QuestID;
+ QuestCompletionNPCs.resize(_worldPacket.read<uint32>());
+ if (!QuestCompletionNPCs.empty())
+ _worldPacket.read(QuestCompletionNPCs.data(), QuestCompletionNPCs.size());
}
WorldPacket const* WorldPackets::Query::QuestCompletionNPCResponse::Write()
@@ -396,10 +400,9 @@ WorldPacket const* WorldPackets::Query::QuestCompletionNPCResponse::Write()
for (auto& quest : QuestCompletionNPCs)
{
_worldPacket << int32(quest.QuestID);
-
_worldPacket << uint32(quest.NPCs.size());
- for (int32 const& npc : quest.NPCs)
- _worldPacket << int32(npc);
+ if (!quest.NPCs.empty())
+ _worldPacket.append(quest.NPCs.data(), quest.NPCs.size());
}
return &_worldPacket;
@@ -453,6 +456,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::ItemTextCache cons
WorldPacket const* WorldPackets::Query::QueryItemTextResponse::Write()
{
_worldPacket.WriteBit(Valid);
+ _worldPacket.FlushBits();
_worldPacket << Item;
_worldPacket << Id;
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index 7639f165dae..dfdf3d437a0 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -23,6 +23,7 @@
#include "NPCHandler.h"
#include "ObjectGuid.h"
#include "Position.h"
+#include "QuestDef.h"
#include "SharedDefines.h"
#include "UnitDefines.h"
#include <array>
@@ -43,13 +44,25 @@ namespace WorldPackets
uint32 CreatureID = 0;
};
+ struct CreatureXDisplay
+ {
+ uint32 CreatureDisplayID = 0;
+ float Scale = 1.0f;
+ float Probability = 1.0f;
+ };
+
+ struct CreatureDisplayStats
+ {
+ float TotalProbability = 0.0f;
+ std::vector<CreatureXDisplay> CreatureDisplay;
+ };
+
struct CreatureStats
{
CreatureStats()
{
Flags.fill(0);
ProxyCreatureID.fill(0);
- CreatureDisplayID.fill(0);
}
std::string Title;
@@ -58,6 +71,7 @@ namespace WorldPackets
int32 CreatureType = 0;
int32 CreatureFamily = 0;
int32 Classification = 0;
+ CreatureDisplayStats Display;
float HpMulti = 0.0f;
float EnergyMulti = 0.0f;
bool Leader = false;
@@ -66,9 +80,9 @@ namespace WorldPackets
int32 HealthScalingExpansion = 0;
uint32 RequiredExpansion = 0;
uint32 VignetteID = 0;
+ int32 Class = 0;
std::array<uint32, 2> Flags;
std::array<uint32, 2> ProxyCreatureID;
- std::array<uint32, 4> CreatureDisplayID;
std::array<std::string, 4> Name;
std::array<std::string, 4> NameAlt;
};
@@ -110,6 +124,7 @@ namespace WorldPackets
ObjectGuid BnetAccountID;
ObjectGuid GuidActual;
std::string Name;
+ uint64 GuildClubMemberID = 0; // same as bgs.protocol.club.v1.MemberId.unique_id
uint32 VirtualRealmAddress = 0;
uint8 Race = RACE_NONE;
uint8 Sex = GENDER_NONE;
@@ -182,8 +197,8 @@ namespace WorldPackets
uint32 TextID = 0;
bool Allow = false;
- float Probabilities[MAX_NPC_TEXT_OPTIONS];
- uint32 BroadcastTextID[MAX_NPC_TEXT_OPTIONS];
+ std::array<float, MAX_NPC_TEXT_OPTIONS> Probabilities;
+ std::array<uint32, MAX_NPC_TEXT_OPTIONS> BroadcastTextID;
};
class QueryGameObject final : public ClientPacket
@@ -297,7 +312,7 @@ namespace WorldPackets
void Read() override;
int32 MissingQuestCount = 0;
- int32 MissingQuestPOIs[50];
+ std::array<int32, 100> MissingQuestPOIs;
};
struct QuestPOIBlobPoint
@@ -313,13 +328,12 @@ namespace WorldPackets
int32 QuestObjectiveID = 0;
int32 QuestObjectID = 0;
int32 MapID = 0;
- int32 WorldMapAreaID = 0;
- int32 Floor = 0;
+ int32 UiMapID = 0;
int32 Priority = 0;
int32 Flags = 0;
int32 WorldEffectID = 0;
int32 PlayerConditionID = 0;
- int32 UnkWoD1 = 0;
+ int32 SpawnTrackingID = 0;
std::vector<QuestPOIBlobPoint> QuestPOIBlobPointStats;
bool AlwaysAllowMergingBlobs = false;
};
@@ -347,7 +361,7 @@ namespace WorldPackets
void Read() override;
- std::vector<int32> QuestCompletionNPCs;
+ Array<int32, 100> QuestCompletionNPCs;
};
struct QuestCompletionNPC
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index 20a6539ae1d..0468e170d7c 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -65,6 +65,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.QuestID);
_worldPacket << int32(Info.QuestType);
_worldPacket << int32(Info.QuestLevel);
+ _worldPacket << int32(Info.QuestScalingFactionGroup);
_worldPacket << int32(Info.QuestMaxScalingLevel);
_worldPacket << int32(Info.QuestPackageID);
_worldPacket << int32(Info.QuestMinLevel);
@@ -88,6 +89,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.StartItem);
_worldPacket << uint32(Info.Flags);
_worldPacket << uint32(Info.FlagsEx);
+ _worldPacket << uint32(Info.FlagsEx2);
for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
{
@@ -115,6 +117,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.RewardNumSkillUps);
_worldPacket << int32(Info.PortraitGiver);
+ _worldPacket << int32(Info.PortraitGiverMount);
_worldPacket << int32(Info.PortraitTurnIn);
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
@@ -141,7 +144,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << uint32(Info.Objectives.size());
_worldPacket << uint64(Info.AllowableRaces);
- _worldPacket << int32(Info.QuestRewardID);
+ _worldPacket << int32(Info.TreasurePickerID);
_worldPacket << int32(Info.Expansion);
_worldPacket.WriteBits(Info.LogTitle.size(), 9);
@@ -222,13 +225,6 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write()
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards)
{
data << int32(questRewards.ChoiceItemCount);
-
- for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- {
- data << int32(questRewards.ChoiceItems[i].ItemID);
- data << int32(questRewards.ChoiceItems[i].Quantity);
- }
-
data << int32(questRewards.ItemCount);
for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
@@ -266,7 +262,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const
data << int32(questRewards.SkillLineID);
data << int32(questRewards.NumSkillUps);
- data << int32(questRewards.RewardID);
+ data << int32(questRewards.TreasurePickerID);
+
+ for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
+ {
+ data << questRewards.ChoiceItems[i].Item;
+ data << int32(questRewards.ChoiceItems[i].Quantity);
+ }
data.WriteBit(questRewards.IsBoostSpell);
data.FlushBits();
@@ -302,6 +304,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write()
_worldPacket << QuestData; // WorldPackets::Quest::QuestGiverOfferReward
_worldPacket << int32(QuestPackageID);
_worldPacket << int32(PortraitGiver);
+ _worldPacket << int32(PortraitGiverMount);
_worldPacket << int32(PortraitTurnIn);
_worldPacket.WriteBits(QuestTitle.size(), 9);
@@ -360,6 +363,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
_worldPacket << int32(QuestID);
_worldPacket << int32(QuestPackageID);
_worldPacket << int32(PortraitGiver);
+ _worldPacket << int32(PortraitGiverMount);
_worldPacket << int32(PortraitTurnIn);
_worldPacket << uint32(QuestFlags[0]); // Flags
_worldPacket << uint32(QuestFlags[1]); // FlagsEx
@@ -643,6 +647,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon
{
data << int32(playerChoiceResponse.ResponseID);
data << int32(playerChoiceResponse.ChoiceArtFileID);
+ data << int32(playerChoiceResponse.Flags);
+ data << uint32(playerChoiceResponse.WidgetSetID);
+ data << uint8(playerChoiceResponse.GroupID);
data.WriteBits(playerChoiceResponse.Answer.length(), 9);
data.WriteBits(playerChoiceResponse.Header.length(), 9);
@@ -670,6 +677,7 @@ WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write()
_worldPacket.WriteBits(Question.length(), 8);
_worldPacket.WriteBit(CloseChoiceFrame);
_worldPacket.WriteBit(HideWarboardHeader);
+ _worldPacket.WriteBit(KeepOpenAfterChoice);
_worldPacket.FlushBits();
for (PlayerChoiceResponse const& response : Responses)
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 1dd40e1ccc2..1315a57949c 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -109,6 +109,7 @@ namespace WorldPackets
int32 QuestID = 0;
int32 QuestType = 0; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
int32 QuestLevel = 0; // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client)
+ int32 QuestScalingFactionGroup = 0;
int32 QuestMaxScalingLevel = 255;
int32 QuestPackageID = 0;
int32 QuestMinLevel = 0;
@@ -132,6 +133,7 @@ namespace WorldPackets
int32 StartItem = 0;
uint32 Flags = 0;
uint32 FlagsEx = 0;
+ uint32 FlagsEx2 = 0;
int32 POIContinent = 0;
float POIx = 0.0f;
float POIy = 0.0f;
@@ -146,6 +148,7 @@ namespace WorldPackets
int32 RewardSkillLineID = 0; // reward skill id
int32 RewardNumSkillUps = 0; // reward skill points
int32 PortraitGiver = 0; // quest giver entry ?
+ int32 PortraitGiverMount = 0;
int32 PortraitTurnIn = 0; // quest turn in entry ?
std::string PortraitGiverText;
std::string PortraitGiverName;
@@ -157,7 +160,7 @@ namespace WorldPackets
int32 CompleteSoundKitID = 0;
int32 AreaGroupID = 0;
int32 TimeAllowed = 0;
- int32 QuestRewardID = 0;
+ int32 TreasurePickerID = 0;
int32 Expansion = 0;
std::vector<QuestObjective> Objectives;
int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = { };
@@ -225,7 +228,7 @@ namespace WorldPackets
struct QuestChoiceItem
{
- int32 ItemID = 0;
+ Item::ItemInstance Item;
int32 Quantity = 0;
};
@@ -244,7 +247,7 @@ namespace WorldPackets
int32 SpellCompletionID = 0;
int32 SkillLineID = 0;
int32 NumSkillUps = 0;
- int32 RewardID = 0;
+ int32 TreasurePickerID = 0;
QuestChoiceItem ChoiceItems[QUEST_REWARD_CHOICES_COUNT];
int32 ItemID[QUEST_REWARD_ITEM_COUNT] = { };
int32 ItemQty[QUEST_REWARD_ITEM_COUNT] = { };
@@ -285,6 +288,7 @@ namespace WorldPackets
int32 PortraitTurnIn = 0;
int32 PortraitGiver = 0;
+ int32 PortraitGiverMount = 0;
std::string QuestTitle;
std::string RewardText;
std::string PortraitGiverText;
@@ -365,6 +369,7 @@ namespace WorldPackets
std::vector<int32> LearnSpells;
int32 PortraitTurnIn = 0;
int32 PortraitGiver = 0;
+ int32 PortraitGiverMount = 0;
int32 QuestStartItemID = 0;
std::string PortraitGiverText;
std::string PortraitGiverName;
@@ -663,6 +668,9 @@ namespace WorldPackets
{
int32 ResponseID = 0;
int32 ChoiceArtFileID = 0;
+ int32 Flags = 0;
+ uint32 WidgetSetID = 0;
+ uint8 GroupID = 0;
std::string Answer;
std::string Header;
std::string Description;
@@ -684,6 +692,7 @@ namespace WorldPackets
std::vector<PlayerChoiceResponse> Responses;
bool CloseChoiceFrame = false;
bool HideWarboardHeader = false;
+ bool KeepOpenAfterChoice = false;
};
class ChoiceResponse final : public ClientPacket
diff --git a/src/server/game/Server/Packets/ReputationPackets.cpp b/src/server/game/Server/Packets/ReputationPackets.cpp
index 314dac85c5e..5e4eb54a918 100644
--- a/src/server/game/Server/Packets/ReputationPackets.cpp
+++ b/src/server/game/Server/Packets/ReputationPackets.cpp
@@ -46,8 +46,6 @@ WorldPacket const* WorldPackets::Reputation::SetForcedReactions::Write()
for (ForcedReaction const& reaction : Reactions)
_worldPacket << reaction;
- _worldPacket.FlushBits();
-
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h
index 0156d504491..2046e169ab5 100644
--- a/src/server/game/Server/Packets/ReputationPackets.h
+++ b/src/server/game/Server/Packets/ReputationPackets.h
@@ -30,7 +30,7 @@ namespace WorldPackets
class InitializeFactions final : public ServerPacket
{
public:
- InitializeFactions() : ServerPacket(SMSG_INITIALIZE_FACTIONS, 1312)
+ InitializeFactions() : ServerPacket(SMSG_INITIALIZE_FACTIONS, FactionCount * (4 + 1) + FactionCount / 8)
{
FactionStandings.fill(0);
FactionHasBonus.fill(false);
diff --git a/src/server/game/Server/Packets/ScenarioPackets.cpp b/src/server/game/Server/Packets/ScenarioPackets.cpp
index 38a667980a1..73f5120ee8d 100644
--- a/src/server/game/Server/Packets/ScenarioPackets.cpp
+++ b/src/server/game/Server/Packets/ScenarioPackets.cpp
@@ -109,8 +109,7 @@ WorldPacket const* WorldPackets::Scenario::ScenarioPOIs::Write()
{
_worldPacket << int32(scenarioPOI.BlobIndex);
_worldPacket << int32(scenarioPOI.MapID);
- _worldPacket << int32(scenarioPOI.WorldMapAreaID);
- _worldPacket << int32(scenarioPOI.Floor);
+ _worldPacket << int32(scenarioPOI.UiMapID);
_worldPacket << int32(scenarioPOI.Priority);
_worldPacket << int32(scenarioPOI.Flags);
_worldPacket << int32(scenarioPOI.WorldEffectID);
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index ec6d57f2748..7b3117156fc 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -33,6 +33,7 @@ void WorldPackets::Spells::PetCancelAura::Read()
void WorldPackets::Spells::CancelChannelling::Read()
{
_worldPacket >> ChannelSpell;
+ _worldPacket >> Reason;
}
WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write()
@@ -99,16 +100,17 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraDataInfo cons
data << uint32(auraData.ActiveFlags);
data << uint16(auraData.CastLevel);
data << uint8(auraData.Applications);
+ data << int32(auraData.ContentTuningID);
data.WriteBit(auraData.CastUnit.is_initialized());
data.WriteBit(auraData.Duration.is_initialized());
data.WriteBit(auraData.Remaining.is_initialized());
data.WriteBit(auraData.TimeMod.is_initialized());
data.WriteBits(auraData.Points.size(), 6);
data.WriteBits(auraData.EstimatedPoints.size(), 6);
- data.WriteBit(auraData.SandboxScaling.is_initialized());
+ data.WriteBit(auraData.ContentTuning.is_initialized());
- if (auraData.SandboxScaling)
- data << *auraData.SandboxScaling;
+ if (auraData.ContentTuning)
+ data << *auraData.ContentTuning;
if (auraData.CastUnit)
data << *auraData.CastUnit;
@@ -211,7 +213,7 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastReques
buffer >> request.SpellID;
buffer >> request.SpellXSpellVisualID;
buffer >> request.MissileTrajectory;
- buffer >> request.Charmer;
+ buffer >> request.CraftingNPC;
request.SendCastFlags = buffer.ReadBits(5);
bool hasMoveUpdate = buffer.ReadBit();
request.Weight.resize(buffer.ReadBits(2));
@@ -366,13 +368,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con
data << int32(spellCastData.SpellID);
data << uint32(spellCastData.SpellXSpellVisualID);
data << uint32(spellCastData.CastFlags);
+ data << uint32(spellCastData.CastFlagsEx);
data << uint32(spellCastData.CastTime);
data << spellCastData.MissileTrajectory;
data << int32(spellCastData.Ammo.DisplayID);
data << uint8(spellCastData.DestLocSpellCastIndex);
data << spellCastData.Immunities;
data << spellCastData.Predict;
- data.WriteBits(spellCastData.CastFlagsEx, 23);
data.WriteBits(spellCastData.HitTargets.size(), 16);
data.WriteBits(spellCastData.MissTargets.size(), 16);
data.WriteBits(spellCastData.MissStatus.size(), 16);
@@ -716,6 +718,7 @@ WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write()
_worldPacket << int32(SpellVisualID);
_worldPacket << float(TravelSpeed);
_worldPacket << float(UnkZero);
+ _worldPacket << float(Unk801);
_worldPacket.WriteBit(SpeedAsTime);
_worldPacket.FlushBits();
@@ -726,12 +729,14 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write()
{
_worldPacket << Source;
_worldPacket << Target;
+ _worldPacket << Unk801_1;
_worldPacket << TargetPosition;
- _worldPacket << SpellVisualID;
- _worldPacket << TravelSpeed;
- _worldPacket << MissReason;
- _worldPacket << ReflectStatus;
- _worldPacket << Orientation;
+ _worldPacket << uint32(SpellVisualID);
+ _worldPacket << float(TravelSpeed);
+ _worldPacket << uint16(MissReason);
+ _worldPacket << uint16(ReflectStatus);
+ _worldPacket << float(Orientation);
+ _worldPacket << float(Unk801_2);
_worldPacket.WriteBit(SpeedAsTime);
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index b1230459627..1df8e8772c0 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -57,6 +57,8 @@ namespace WorldPackets
void Read() override;
int32 ChannelSpell = 0;
+ int32 Reason = 0; // 40 = /run SpellStopCasting(), 16 = movement/AURA_INTERRUPT_FLAG_MOVE, 41 = turning/AURA_INTERRUPT_FLAG_TURNING
+ // does not match SpellCastResult enum
};
class CancelGrowthAura final : public ClientPacket
@@ -177,7 +179,8 @@ namespace WorldPackets
uint32 ActiveFlags = 0;
uint16 CastLevel = 1;
uint8 Applications = 1;
- Optional<SandboxScalingData> SandboxScaling;
+ int32 ContentTuningID = 0;
+ Optional<ContentTuningParams> ContentTuning;
Optional<ObjectGuid> CastUnit;
Optional<int32> Duration;
Optional<int32> Remaining;
@@ -245,7 +248,7 @@ namespace WorldPackets
MissileTrajectoryRequest MissileTrajectory;
Optional<MovementInfo> MoveUpdate;
std::vector<SpellWeight> Weight;
- ObjectGuid Charmer;
+ ObjectGuid CraftingNPC;
int32 Misc[2] = { };
};
@@ -613,7 +616,7 @@ namespace WorldPackets
class SetSpellCharges final : public ServerPacket
{
public:
- SetSpellCharges() : ServerPacket(SMSG_SET_SPELL_CHARGES, 1 + 4 + 4) { }
+ SetSpellCharges() : ServerPacket(SMSG_SET_SPELL_CHARGES, 4 + 4 + 1 + 4 + 1) { }
WorldPacket const* Write() override;
@@ -697,6 +700,7 @@ namespace WorldPackets
bool SpeedAsTime = false;
float TravelSpeed = 0.0f;
float UnkZero = 0.0f; // Always zero
+ float Unk801 = 0.0f;
TaggedPosition<Position::XYZ> SourceRotation; // Vector of rotations, Orientation is z
TaggedPosition<Position::XYZ> TargetLocation; // Exclusive with Target
};
@@ -710,6 +714,7 @@ namespace WorldPackets
ObjectGuid Source;
ObjectGuid Target; // Exclusive with TargetPosition
+ ObjectGuid Unk801_1;
uint16 MissReason = 0;
uint32 SpellVisualID = 0;
bool SpeedAsTime = false;
@@ -717,6 +722,7 @@ namespace WorldPackets
float TravelSpeed = 0.0f;
TaggedPosition<Position::XYZ> TargetPosition; // Exclusive with Target
float Orientation = 0.0f;
+ float Unk801_2 = 0.0f;
};
class PlaySpellVisualKit final : public ServerPacket
diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp
index da674178456..71dbce750e7 100644
--- a/src/server/game/Server/Packets/SystemPackets.cpp
+++ b/src/server/game/Server/Packets/SystemPackets.cpp
@@ -37,6 +37,8 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
_worldPacket << uint32(BpayStoreProductDeliveryDelay);
+ _worldPacket << uint32(ClubsPresenceUpdateTimer);
+
_worldPacket.WriteBit(VoiceEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.is_initialized());
_worldPacket.WriteBit(ScrollOfResurrectionEnabled);
@@ -49,16 +51,22 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
_worldPacket.WriteBit(RecruitAFriendSendingEnabled);
_worldPacket.WriteBit(CharUndeleteEnabled);
_worldPacket.WriteBit(RestrictedAccount);
+ _worldPacket.WriteBit(CommerceSystemEnabled);
_worldPacket.WriteBit(TutorialsEnabled);
_worldPacket.WriteBit(NPETutorialsEnabled);
_worldPacket.WriteBit(TwitterEnabled);
- _worldPacket.WriteBit(CommerceSystemEnabled);
_worldPacket.WriteBit(Unk67);
_worldPacket.WriteBit(WillKickFromWorld);
_worldPacket.WriteBit(KioskModeEnabled);
_worldPacket.WriteBit(CompetitiveModeEnabled);
_worldPacket.WriteBit(RaceClassExpansionLevels.is_initialized());
_worldPacket.WriteBit(TokenBalanceEnabled);
+ _worldPacket.WriteBit(WarModeFeatureEnabled);
+ _worldPacket.WriteBit(ClubsEnabled);
+ _worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed);
+ _worldPacket.WriteBit(ClubsCharacterClubTypeAllowed);
+ _worldPacket.WriteBit(VoiceChatDisabledByParentalControl);
+ _worldPacket.WriteBit(VoiceChatMutedByParentalControl);
_worldPacket.FlushBits();
@@ -102,6 +110,12 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
_worldPacket.append(RaceClassExpansionLevels->data(), RaceClassExpansionLevels->size());
}
+ {
+ _worldPacket.WriteBit(VoiceChatManagerSettings.Enabled);
+ _worldPacket << VoiceChatManagerSettings.Unused_801_1;
+ _worldPacket << VoiceChatManagerSettings.Unused_801_2;
+ }
+
if (EuropaTicketSystemStatus)
{
_worldPacket.WriteBit(EuropaTicketSystemStatus->TicketsEnabled);
@@ -141,7 +155,12 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write()
_worldPacket << int32(TokenPollTimeSeconds);
_worldPacket << int32(TokenRedeemIndex);
_worldPacket << int64(TokenBalanceAmount);
+ _worldPacket << int32(MaxCharactersPerRealm);
_worldPacket << uint32(BpayStoreProductDeliveryDelay);
+ _worldPacket << int32(ActiveCharacterUpgradeBoostType);
+ _worldPacket << int32(ActiveClassTrialBoostType);
+ _worldPacket << int32(MinimumExpansionLevel);
+ _worldPacket << int32(MaximumExpansionLevel);
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h
index 74d40bf4e05..8fe1f515590 100644
--- a/src/server/game/Server/Packets/SystemPackets.h
+++ b/src/server/game/Server/Packets/SystemPackets.h
@@ -80,6 +80,13 @@ namespace WorldPackets
float ThrottleDfBestPriority = 0.0f;
};
+ struct VoiceChatProxySettings
+ {
+ bool Enabled = false;
+ ObjectGuid Unused_801_1;
+ ObjectGuid Unused_801_2;
+ };
+
FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 48) { }
WorldPacket const* Write() override;
@@ -103,6 +110,7 @@ namespace WorldPackets
uint32 TokenRedeemIndex = 0;
int64 TokenBalanceAmount = 0;
uint32 BpayStoreProductDeliveryDelay = 0;
+ uint32 ClubsPresenceUpdateTimer = 0;
bool ItemRestorationButtonEnabled = false;
bool CharUndeleteEnabled = false; ///< Implemented
bool BpayStoreDisabledByParentalControls = false;
@@ -110,16 +118,22 @@ namespace WorldPackets
bool CommerceSystemEnabled = false;
bool Unk67 = false;
bool WillKickFromWorld = false;
-
bool RestrictedAccount = false;
bool TutorialsEnabled = false;
bool NPETutorialsEnabled = false;
bool KioskModeEnabled = false;
bool CompetitiveModeEnabled = false;
bool TokenBalanceEnabled = false;
+ bool WarModeFeatureEnabled = false;
+ bool ClubsEnabled = false;
+ bool ClubsBattleNetClubTypeAllowed = false;
+ bool ClubsCharacterClubTypeAllowed = false;
+ bool VoiceChatDisabledByParentalControl = false;
+ bool VoiceChatMutedByParentalControl = false;
Optional<std::vector<uint8>> RaceClassExpansionLevels;
SocialQueueConfig QuickJoinConfig;
+ VoiceChatProxySettings VoiceChatManagerSettings;
};
class FeatureSystemStatusGlueScreen final : public ServerPacket
@@ -147,7 +161,12 @@ namespace WorldPackets
int32 TokenPollTimeSeconds = 0; // NYI
int32 TokenRedeemIndex = 0; // NYI
int64 TokenBalanceAmount = 0; // NYI
+ int32 MaxCharactersPerRealm = 0;
uint32 BpayStoreProductDeliveryDelay = 0; // NYI
+ int32 ActiveCharacterUpgradeBoostType = 0; // NYI
+ int32 ActiveClassTrialBoostType = 0; // NYI
+ int32 MinimumExpansionLevel = 0;
+ int32 MaximumExpansionLevel = 0;
};
class MOTD final : public ServerPacket
diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp
index c5cbb0769a5..3344ef292fc 100644
--- a/src/server/game/Server/Packets/TalentPackets.cpp
+++ b/src/server/game/Server/Packets/TalentPackets.cpp
@@ -17,6 +17,20 @@
#include "TalentPackets.h"
+ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Talent::PvPTalent& pvpTalent)
+{
+ data >> pvpTalent.PvPTalentID;
+ data >> pvpTalent.Slot;
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Talent::PvPTalent const& pvpTalent)
+{
+ data << uint16(pvpTalent.PvPTalentID);
+ data << uint8(pvpTalent.Slot);
+ return data;
+}
+
WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write()
{
_worldPacket << uint8(Info.ActiveGroup);
@@ -27,13 +41,13 @@ WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write()
{
_worldPacket << uint32(talentGroupInfo.SpecID);
_worldPacket << uint32(talentGroupInfo.TalentIDs.size());
- _worldPacket << uint32(talentGroupInfo.PvPTalentIDs.size());
+ _worldPacket << uint32(talentGroupInfo.PvPTalents.size());
- for (uint16 talentID : talentGroupInfo.TalentIDs)
- _worldPacket << uint16(talentID);
+ for (uint16 talent : talentGroupInfo.TalentIDs)
+ _worldPacket << uint16(talent);
- for (uint16 talentID : talentGroupInfo.PvPTalentIDs)
- _worldPacket << uint16(talentID);
+ for (PvPTalent talent : talentGroupInfo.PvPTalents)
+ _worldPacket << talent;
}
return &_worldPacket;
@@ -92,7 +106,7 @@ WorldPacket const* WorldPackets::Talent::ActiveGlyphs::Write()
void WorldPackets::Talent::LearnPvpTalents::Read()
{
- Talents.resize(_worldPacket.ReadBits(6));
+ Talents.resize(_worldPacket.read<uint32>());
for (uint32 i = 0; i < Talents.size(); ++i)
_worldPacket >> Talents[i];
}
@@ -102,8 +116,8 @@ WorldPacket const* WorldPackets::Talent::LearnPvpTalentsFailed::Write()
_worldPacket.WriteBits(Reason, 4);
_worldPacket << int32(SpellID);
_worldPacket << uint32(Talents.size());
- if (!Talents.empty())
- _worldPacket.append(Talents.data(), Talents.size());
+ for (PvPTalent pvpTalent : Talents)
+ _worldPacket << pvpTalent;
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h
index 27db9f99eb5..6cbc8aca057 100644
--- a/src/server/game/Server/Packets/TalentPackets.h
+++ b/src/server/game/Server/Packets/TalentPackets.h
@@ -27,11 +27,17 @@ namespace WorldPackets
{
namespace Talent
{
+ struct PvPTalent
+ {
+ uint16 PvPTalentID = 0;
+ uint8 Slot = 0;
+ };
+
struct TalentGroupInfo
{
uint32 SpecID = 0;
std::vector<uint16> TalentIDs;
- std::vector<uint16> PvPTalentIDs;
+ std::vector<PvPTalent> PvPTalents;
};
struct TalentInfoUpdate
@@ -121,7 +127,7 @@ namespace WorldPackets
void Read() override;
- Array<uint16, 6> Talents;
+ Array<PvPTalent, 4> Talents;
};
class LearnPvpTalentsFailed final : public ServerPacket
@@ -133,7 +139,7 @@ namespace WorldPackets
uint32 Reason = 0;
int32 SpellID = 0;
- std::vector<uint16> Talents;
+ std::vector<PvPTalent> Talents;
};
}
}
diff --git a/src/server/game/Server/Packets/TaxiPackets.h b/src/server/game/Server/Packets/TaxiPackets.h
index 098ed293fbb..9e10f7bd442 100644
--- a/src/server/game/Server/Packets/TaxiPackets.h
+++ b/src/server/game/Server/Packets/TaxiPackets.h
@@ -110,7 +110,7 @@ namespace WorldPackets
class ActivateTaxiReply final : public ServerPacket
{
public:
- ActivateTaxiReply() : ServerPacket(SMSG_ACTIVATE_TAXI_REPLY, 4) { }
+ ActivateTaxiReply() : ServerPacket(SMSG_ACTIVATE_TAXI_REPLY, 1) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp
index cafb723c062..fe74550c77f 100644
--- a/src/server/game/Server/Packets/TicketPackets.cpp
+++ b/src/server/game/Server/Packets/TicketPackets.cpp
@@ -201,9 +201,17 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read()
bool hasGuildInfo = _worldPacket.ReadBit();
bool hasLFGListSearchResult = _worldPacket.ReadBit();
bool hasLFGListApplicant = _worldPacket.ReadBit();
+ bool hasClubMessage = _worldPacket.ReadBit();
_worldPacket.ResetBitPos();
+ if (hasClubMessage)
+ {
+ CommunityMessage = boost::in_place();
+ CommunityMessage->IsPlayerUsingVoice = _worldPacket.ReadBit();
+ _worldPacket.ResetBitPos();
+ }
+
if (hasMailInfo)
_worldPacket >> MailInfo;
diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h
index 6e25f3da4a9..5e7fc20f2eb 100644
--- a/src/server/game/Server/Packets/TicketPackets.h
+++ b/src/server/game/Server/Packets/TicketPackets.h
@@ -178,6 +178,11 @@ namespace WorldPackets
std::string Comment;
};
+ struct SupportTicketCommunityMessage
+ {
+ bool IsPlayerUsingVoice = false;
+ };
+
SupportTicketSubmitComplaint(WorldPacket&& packet) : ClientPacket(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, std::move(packet)) { }
void Read() override;
@@ -193,7 +198,7 @@ namespace WorldPackets
Optional<SupportTicketGuildInfo> GuildInfo;
Optional<SupportTicketLFGListSearchResult> LFGListSearchResult;
Optional<SupportTicketLFGListApplicant> LFGListApplicant;
-
+ Optional<SupportTicketCommunityMessage> CommunityMessage;
};
class Complaint final : public ClientPacket
diff --git a/src/server/game/Server/Packets/TotemPackets.cpp b/src/server/game/Server/Packets/TotemPackets.cpp
index 1bd8f1c915e..a7b042ca19a 100644
--- a/src/server/game/Server/Packets/TotemPackets.cpp
+++ b/src/server/game/Server/Packets/TotemPackets.cpp
@@ -25,7 +25,7 @@ void WorldPackets::Totem::TotemDestroyed::Read()
WorldPacket const* WorldPackets::Totem::TotemCreated::Write()
{
- _worldPacket << Slot;
+ _worldPacket << uint8(Slot);
_worldPacket << Totem;
_worldPacket << int32(Duration);
_worldPacket << int32(SpellID);
diff --git a/src/server/game/Server/Packets/TotemPackets.h b/src/server/game/Server/Packets/TotemPackets.h
index b438109825c..232b26f1cbb 100644
--- a/src/server/game/Server/Packets/TotemPackets.h
+++ b/src/server/game/Server/Packets/TotemPackets.h
@@ -46,7 +46,7 @@ namespace WorldPackets
ObjectGuid Totem;
int32 SpellID = 0;
int32 Duration = 0;
- int8 Slot = 0;
+ uint8 Slot = 0;
float TimeMod = 1.0f;
bool CannotDismiss = false;
};
diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.cpp b/src/server/game/Server/Packets/TransmogrificationPackets.cpp
index 7d50891bc3e..da2c3972b12 100644
--- a/src/server/game/Server/Packets/TransmogrificationPackets.cpp
+++ b/src/server/game/Server/Packets/TransmogrificationPackets.cpp
@@ -41,8 +41,8 @@ WorldPacket const* WorldPackets::Transmogrification::TransmogCollectionUpdate::W
_worldPacket.WriteBit(IsFullUpdate);
_worldPacket.WriteBit(IsSetFavorite);
_worldPacket << uint32(FavoriteAppearances.size());
- for (uint32 itemModifiedAppearanceId : FavoriteAppearances)
- _worldPacket << uint32(itemModifiedAppearanceId);
+ if (!FavoriteAppearances.empty())
+ _worldPacket.append(FavoriteAppearances.data(), FavoriteAppearances.size());
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/WhoPackets.cpp b/src/server/game/Server/Packets/WhoPackets.cpp
index afc6c3bdd28..9cfbc04e488 100644
--- a/src/server/game/Server/Packets/WhoPackets.cpp
+++ b/src/server/game/Server/Packets/WhoPackets.cpp
@@ -117,8 +117,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Who::WhoResponse const& r
data.WriteBits(response.Entries.size(), 6);
data.FlushBits();
- for (size_t i = 0; i < response.Entries.size(); ++i)
- data << response.Entries[i];
+ for (WorldPackets::Who::WhoEntry const& whoEntry : response.Entries)
+ data << whoEntry;
return data;
}
diff --git a/src/server/game/Server/Packets/WorldStatePackets.cpp b/src/server/game/Server/Packets/WorldStatePackets.cpp
index 0c202978de8..8129e2e8af0 100644
--- a/src/server/game/Server/Packets/WorldStatePackets.cpp
+++ b/src/server/game/Server/Packets/WorldStatePackets.cpp
@@ -24,14 +24,14 @@ WorldPacket const* WorldPackets::WorldState::InitWorldStates::Write()
{
_worldPacket.reserve(16 + Worldstates.size() * 8);
- _worldPacket << uint32(MapID);
- _worldPacket << uint32(AreaID);
- _worldPacket << uint32(SubareaID);
+ _worldPacket << int32(MapID);
+ _worldPacket << int32(AreaID);
+ _worldPacket << int32(SubareaID);
_worldPacket << uint32(Worldstates.size());
for (WorldStateInfo const& wsi : Worldstates)
{
- _worldPacket << uint32(wsi.VariableID);
+ _worldPacket << int32(wsi.VariableID);
_worldPacket << int32(wsi.Value);
}
diff --git a/src/server/game/Server/Packets/WorldStatePackets.h b/src/server/game/Server/Packets/WorldStatePackets.h
index ba7aa8fe282..766725fcf66 100644
--- a/src/server/game/Server/Packets/WorldStatePackets.h
+++ b/src/server/game/Server/Packets/WorldStatePackets.h
@@ -29,10 +29,10 @@ namespace WorldPackets
public:
struct WorldStateInfo
{
- WorldStateInfo(uint32 variableID, int32 value)
+ WorldStateInfo(int32 variableID, int32 value)
: VariableID(variableID), Value(value) { }
- uint32 VariableID;
+ int32 VariableID;
int32 Value;
};
@@ -40,9 +40,9 @@ namespace WorldPackets
WorldPacket const* Write() override;
- uint32 AreaID = 0; ///< ZoneId
- uint32 SubareaID = 0; ///< AreaId
- uint32 MapID = 0; ///< MapId
+ int32 AreaID = 0; ///< ZoneId
+ int32 SubareaID = 0; ///< AreaId
+ int32 MapID = 0; ///< MapId
std::vector<WorldStateInfo> Worldstates;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index ec0efbf4446..2f75b82ec74 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -898,7 +898,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CROWD_CONTROL_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1008,7 +1008,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_ACHIEVEMENT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1237,6 +1237,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_TEXT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1520,7 +1521,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PENDING_RAID_LOCK, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1656,7 +1657,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_BRAWL_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_AREA_TRIGGER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index bdf5bc3b9fa..9164e453ad7 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -797,8 +797,8 @@ enum OpcodeServer : uint16
SMSG_AREA_SPIRIT_HEALER_TIME = 0x278A,
SMSG_AREA_TRIGGER_DENIED = 0x26A2,
SMSG_AREA_TRIGGER_NO_CORPSE = 0x275E,
- SMSG_AREA_TRIGGER_RE_PATH = 0x2641,
- SMSG_AREA_TRIGGER_RE_SHAPE = 0x263E,
+ SMSG_AREA_TRIGGER_RE_PATH = 0x263E,
+ SMSG_AREA_TRIGGER_RE_SHAPE = 0x2642,
SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x2650,
SMSG_ARENA_ERROR = 0x271A,
SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2667,
@@ -1136,6 +1136,7 @@ enum OpcodeServer : uint16
SMSG_GOSSIP_COMPLETE = 0x2A96,
SMSG_GOSSIP_MESSAGE = 0x2A97,
SMSG_GOSSIP_POI = 0x27E4,
+ SMSG_GOSSIP_TEXT_UPDATE = 0x2A98,
SMSG_GROUP_ACTION_THROTTLED = 0x259C,
SMSG_GROUP_DECLINE = 0x27DF,
SMSG_GROUP_DESTROYED = 0x27E1,
@@ -1557,7 +1558,6 @@ enum OpcodeServer : uint16
SMSG_REQUEST_PVP_BRAWL_INFO_RESPONSE = 0x25D5,
SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D4,
SMSG_RESEARCH_COMPLETE = 0x2585,
- SMSG_RESET_AREA_TRIGGER = 0x2642,
SMSG_RESET_COMPRESSION_CONTEXT = 0x304F,
SMSG_RESET_FAILED_NOTIFY = 0x26E9,
SMSG_RESET_RANGED_COMBAT_TIMER = 0x271C,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 4442a41a0a2..ecf3dcf5819 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -1127,7 +1127,7 @@ class TC_GAME_API WorldSession
void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result);
void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo);
- void SendCharCreate(ResponseCodes result);
+ void SendCharCreate(ResponseCodes result, ObjectGuid const& guid = ObjectGuid::Empty);
void SendCharDelete(ResponseCodes result);
void SendCharRename(ResponseCodes result, WorldPackets::Character::CharacterRenameInfo const* renameInfo);
void SendCharCustomize(ResponseCodes result, WorldPackets::Character::CharCustomizeInfo const* customizeInfo);
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 974fb7879dc..dd4a75865ac 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -70,8 +70,7 @@ uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3
uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B };
uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F };
-uint8 const ClientTypeSeed_Win[16] = { 0x79, 0x7E, 0xCC, 0x19, 0x66, 0x2D, 0xCB, 0xD5, 0x09, 0x0A, 0x44, 0x81, 0x17, 0x3F, 0x1D, 0x26 };
-uint8 const ClientTypeSeed_Wn64[16] = { 0x6E, 0x21, 0x2D, 0xEF, 0x6A, 0x01, 0x24, 0xA3, 0xD9, 0xAD, 0x07, 0xF5, 0xE3, 0x22, 0xF7, 0xAE };
+uint8 const ClientTypeSeed_Wn64[16] = { 0xDD, 0x62, 0x65, 0x17, 0xCC, 0x6D, 0x31, 0x93, 0x2B, 0x47, 0x99, 0x34, 0xCC, 0xDC, 0x0A, 0xBF };
uint8 const ClientTypeSeed_Mc64[16] = { 0x34, 0x1C, 0xFE, 0xFE, 0x3D, 0x72, 0xAC, 0xA9, 0xA4, 0x40, 0x7D, 0xC5, 0x35, 0xDE, 0xD6, 0x6A };
WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)),
@@ -670,9 +669,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
SHA256Hash digestKeyHash;
digestKeyHash.UpdateData(account.Game.KeyData.data(), account.Game.KeyData.size());
- if (account.Game.OS == "Win")
- digestKeyHash.UpdateData(ClientTypeSeed_Win, 16);
- else if (account.Game.OS == "Wn64")
+ if (account.Game.OS == "Wn64")
digestKeyHash.UpdateData(ClientTypeSeed_Wn64, 16);
else if (account.Game.OS == "Mc64")
digestKeyHash.UpdateData(ClientTypeSeed_Mc64, 16);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 76547257af2..c663a16c270 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -5567,7 +5567,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const
if (overkill < 0)
overkill = 0;
- SpellPeriodicAuraLogInfo pInfo(this, damage, overkill, absorb, resist, 0.0f, crit);
+ SpellPeriodicAuraLogInfo pInfo(this, damage, dmg, overkill, absorb, resist, 0.0f, crit);
caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true);
@@ -5657,6 +5657,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
// SendSpellNonMeleeDamageLog expects non-absorbed/non-resisted damage
SpellNonMeleeDamage log(caster, target, GetId(), GetBase()->GetSpellXSpellVisualId(), GetSpellInfo()->GetSchoolMask(), GetBase()->GetCastGUID());
log.damage = damage;
+ log.originalDamage = dmg;
log.absorb = absorb;
log.resist = resist;
log.periodicLog = true;
@@ -5805,7 +5806,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
caster->CalcHealAbsorb(healInfo);
caster->DealHeal(healInfo);
- SpellPeriodicAuraLogInfo pInfo(this, heal, heal - healInfo.GetEffectiveHeal(), healInfo.GetAbsorb(), 0, 0.0f, crit);
+ SpellPeriodicAuraLogInfo pInfo(this, heal, damage, heal - healInfo.GetEffectiveHeal(), healInfo.GetAbsorb(), 0, 0.0f, crit);
target->SendPeriodicAuraLog(&pInfo);
target->getHostileRefManager().threatAssist(caster, float(healInfo.GetEffectiveHeal()) * 0.5f, GetSpellInfo());
@@ -5849,7 +5850,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con
float gainMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster);
- SpellPeriodicAuraLogInfo pInfo(this, drainedAmount, 0, 0, 0, gainMultiplier, false);
+ SpellPeriodicAuraLogInfo pInfo(this, drainedAmount, drainAmount, 0, 0, 0, gainMultiplier, false);
int32 gainAmount = int32(drainedAmount * gainMultiplier);
int32 gainedAmount = 0;
@@ -5903,7 +5904,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const
TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId());
- SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false);
+ SpellPeriodicAuraLogInfo pInfo(this, amount, amount, 0, 0, 0, 0.0f, false);
int32 gain = target->ModifyPower(powerType, amount);
if (caster)
@@ -5931,7 +5932,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons
// ignore negative values (can be result apply spellmods to aura damage
int32 amount = std::max(m_amount, 0);
- SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false);
+ SpellPeriodicAuraLogInfo pInfo(this, amount, amount, 0, 0, 0, 0.0f, false);
TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId());
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index b6f009b971e..6cfb2764f08 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -410,7 +410,8 @@ void Spell::EffectEnvironmentalDMG(SpellEffIndex /*effIndex*/)
m_caster->CalcAbsorbResist(damageInfo);
SpellNonMeleeDamage log(m_caster, unitTarget, m_spellInfo->Id, m_SpellVisual, m_spellInfo->GetSchoolMask(), m_castId);
- log.damage = damage;
+ log.damage = damageInfo.GetDamage();
+ log.originalDamage = damage;
log.absorb = damageInfo.GetAbsorb();
log.resist = damageInfo.GetResist();
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index 50720cb53a6..690edb8f508 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -561,7 +561,7 @@ bool IsWeaponSkill(uint32 skill);
inline bool IsProfessionSkill(uint32 skill)
{
- return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
+ return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING;
}
inline bool IsProfessionOrRidingSkill(uint32 skill)
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index fdd3667a3a6..c7009028e9c 100644
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -123,9 +123,10 @@ class TC_SHARED_API ByteBuffer
_storage.clear();
}
- template <typename T> void append(T value)
+ template <typename T>
+ void append(T value)
{
- static_assert(std::is_fundamental<T>::value, "append(compound)");
+ static_assert(std::is_trivially_copyable<T>::value, "append(T) must be used with trivially copyable types");
EndianConvert(value);
append((uint8 *)&value, sizeof(value));
}
@@ -210,7 +211,7 @@ class TC_SHARED_API ByteBuffer
template <typename T>
void put(std::size_t pos, T value)
{
- static_assert(std::is_fundamental<T>::value, "append(compound)");
+ static_assert(std::is_trivially_copyable<T>::value, "put(size_t, T) must be used with trivially copyable types");
EndianConvert(value);
put(pos, (uint8 *)&value, sizeof(value));
}
@@ -435,7 +436,8 @@ class TC_SHARED_API ByteBuffer
_rpos += skip;
}
- template <typename T> T read()
+ template <typename T>
+ T read()
{
ResetBitPos();
T r = read<T>(_rpos);
@@ -443,7 +445,8 @@ class TC_SHARED_API ByteBuffer
return r;
}
- template <typename T> T read(size_t pos) const
+ template <typename T>
+ T read(size_t pos) const
{
if (pos + sizeof(T) > size())
throw ByteBufferPositionException(pos, sizeof(T), size());
@@ -452,6 +455,13 @@ class TC_SHARED_API ByteBuffer
return val;
}
+ template<class T>
+ void read(T* dest, size_t count)
+ {
+ static_assert(std::is_trivially_copyable<T>::value, "read(T*, size_t) must be used with trivially copyable types");
+ return read(reinterpret_cast<uint8*>(dest), count * sizeof(T));
+ }
+
void read(uint8 *dest, size_t len)
{
if (_rpos + len > size())
@@ -540,7 +550,8 @@ class TC_SHARED_API ByteBuffer
return append((const uint8 *)src, cnt);
}
- template<class T> void append(const T *src, size_t cnt)
+ template<class T>
+ void append(const T *src, size_t cnt)
{
return append((const uint8 *)src, cnt * sizeof(T));
}