aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--sql/base/auth_database.sql4
-rw-r--r--sql/updates/auth/2014_11_23_00_auth.sql1
-rw-r--r--sql/updates/auth/2014_11_25_00_auth.sql1
-rw-r--r--sql/updates/world/2014_11_16_00_world.sql1
-rw-r--r--sql/updates/world/2014_11_16_01_world.sql249
-rw-r--r--sql/updates/world/2014_11_16_02_world.sql4
-rw-r--r--sql/updates/world/2014_11_16_03_world.sql1
-rw-r--r--sql/updates/world/2014_11_16_04_world.sql19720
-rw-r--r--sql/updates/world/2014_11_16_05_world.sql1
-rw-r--r--sql/updates/world/2014_11_16_06_world.sql1
-rw-r--r--sql/updates/world/2014_11_19_00_world.sql6
-rw-r--r--sql/updates/world/2014_11_19_01_world.sql15
-rw-r--r--sql/updates/world/2014_11_20_00_world.sql42
-rw-r--r--sql/updates/world/2014_11_20_01_world.sql3
-rw-r--r--sql/updates/world/2014_11_20_02_world.sql7
-rw-r--r--src/server/bnetserver/Packets/CachePackets.cpp2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp17
-rw-r--r--src/server/game/Chat/Channels/Channel.cpp660
-rw-r--r--src/server/game/Chat/Channels/Channel.h185
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.cpp53
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.h21
-rw-r--r--src/server/game/Chat/Chat.cpp172
-rw-r--r--src/server/game/Chat/Chat.h10
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp451
-rw-r--r--src/server/game/Conditions/ConditionMgr.h20
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp2
-rw-r--r--src/server/game/DataStores/DB2Structure.h85
-rw-r--r--src/server/game/DataStores/DB2Utility.cpp44
-rw-r--r--src/server/game/DataStores/DB2fmt.h6
-rw-r--r--src/server/game/DataStores/DBCStores.cpp6
-rw-r--r--src/server/game/DataStores/DBCStores.h3
-rw-r--r--src/server/game/DataStores/DBCStructure.h2
-rw-r--r--src/server/game/DataStores/DBCfmt.h2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp11
-rw-r--r--src/server/game/Entities/Creature/Creature.h12
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp64
-rw-r--r--src/server/game/Entities/Item/ItemPrototype.h6
-rw-r--r--src/server/game/Entities/Object/Object.cpp8
-rw-r--r--src/server/game/Entities/Object/Object.h6
-rw-r--r--src/server/game/Entities/Player/Player.cpp538
-rw-r--r--src/server/game/Entities/Player/Player.h128
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp199
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp82
-rw-r--r--src/server/game/Globals/ObjectMgr.h9
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h5
-rw-r--r--src/server/game/Groups/Group.cpp6
-rw-r--r--src/server/game/Groups/Group.h6
-rw-r--r--src/server/game/Guilds/Guild.cpp33
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp2
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp16
-rw-r--r--src/server/game/Handlers/ChannelHandler.cpp103
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp154
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp628
-rw-r--r--src/server/game/Handlers/CombatHandler.cpp12
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp127
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp178
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp2
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp87
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp149
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp35
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp34
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp4
-rw-r--r--src/server/game/Instances/InstanceScript.cpp2
-rw-r--r--src/server/game/Maps/TransportMgr.h1
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h34
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp32
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.cpp146
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.h3
-rw-r--r--src/server/game/Movement/Spline/MovementTypedefs.h8
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp32
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp56
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h4
-rw-r--r--src/server/game/Server/Packets/ChannelPackets.cpp107
-rw-r--r--src/server/game/Server/Packets/ChannelPackets.h137
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp75
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h44
-rw-r--r--src/server/game/Server/Packets/ChatPackets.cpp136
-rw-r--r--src/server/game/Server/Packets/ChatPackets.h199
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.cpp33
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.h39
-rw-r--r--src/server/game/Server/Packets/CombatPackets.cpp142
-rw-r--r--src/server/game/Server/Packets/CombatPackets.h171
-rw-r--r--src/server/game/Server/Packets/EquipmentSetPackets.cpp65
-rw-r--r--src/server/game/Server/Packets/EquipmentSetPackets.h58
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp59
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h58
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp94
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h121
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp350
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h145
-rw-r--r--src/server/game/Server/Packets/NPCPackets.cpp120
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h133
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp120
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h135
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp43
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h80
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.cpp34
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.h48
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp37
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h49
-rw-r--r--src/server/game/Server/Packets/SystemPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/TalentPackets.cpp5
-rw-r--r--src/server/game/Server/Packets/TalentPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp244
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h179
-rw-r--r--src/server/game/Server/WorldSession.cpp42
-rw-r--r--src/server/game/Server/WorldSession.h187
-rw-r--r--src/server/game/Server/WorldSocket.cpp1
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp14
-rw-r--r--src/server/game/Spells/SpellInfo.cpp17
-rw-r--r--src/server/game/Spells/SpellInfo.h5
-rw-r--r--src/server/game/Spells/SpellMgr.cpp26
-rw-r--r--src/server/game/Texts/ChatTextBuilder.h15
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp15
-rw-r--r--src/server/game/Texts/CreatureTextMgr.h27
-rw-r--r--src/server/game/Tools/PlayerDump.cpp8
-rw-r--r--src/server/game/World/World.cpp25
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp10
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp12
-rw-r--r--src/server/scripts/Commands/cs_list.cpp14
-rw-r--r--src/server/scripts/Commands/cs_message.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp10
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp8
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp8
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp5
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp8
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp1
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp38
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h8
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp25
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h6
-rw-r--r--src/server/scripts/World/action_ip_logger.cpp5
-rw-r--r--src/server/shared/Common.h4
-rw-r--r--src/server/shared/Networking/SocketMgr.h11
-rw-r--r--src/server/shared/Packets/ByteBuffer.h6
-rw-r--r--src/server/shared/Utilities/Util.h8
141 files changed, 25408 insertions, 3252 deletions
diff --git a/README.md b/README.md
index 41a81c0d7f9..71c78873b03 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=1310)](https://www.bountysource.com/trackers/1310-trinity-core?utm_source=1310&utm_medium=shield&utm_campaign=TRACKER_BADGE)
`6.x`: [![6.x Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=6.x)](https://travis-ci.org/TrinityCore/TrinityCore)
`4.3.4`: [![4.3.4 Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=4.3.4)](https://travis-ci.org/TrinityCore/TrinityCore)
-`3.3.5`: [![3.3.5 Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=master)](https://travis-ci.org/TrinityCore/TrinityCore)
+`3.3.5`: [![3.3.5 Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=3.3.5)](https://travis-ci.org/TrinityCore/TrinityCore)
## Introduction
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql
index 180597a938e..8d71b47fcab 100644
--- a/sql/base/auth_database.sql
+++ b/sql/base/auth_database.sql
@@ -45,7 +45,7 @@ CREATE TABLE `account` (
`mutereason` varchar(255) NOT NULL DEFAULT '',
`muteby` varchar(50) NOT NULL DEFAULT '',
`locale` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `os` varchar(3) NOT NULL DEFAULT '',
+ `os` varchar(4) NOT NULL DEFAULT '',
`recruiter` int(10) unsigned NOT NULL DEFAULT '0',
`battlenet_account` int(10) unsigned DEFAULT NULL,
`battlenet_index` tinyint(3) unsigned DEFAULT NULL,
@@ -216,7 +216,7 @@ CREATE TABLE `battlenet_accounts` (
`last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`online` tinyint(3) unsigned NOT NULL DEFAULT '0',
`locale` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `os` varchar(3) NOT NULL DEFAULT '',
+ `os` varchar(4) NOT NULL DEFAULT '',
`LastCharacterUndelete` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='Account System';
diff --git a/sql/updates/auth/2014_11_23_00_auth.sql b/sql/updates/auth/2014_11_23_00_auth.sql
new file mode 100644
index 00000000000..1c68d6a8e06
--- /dev/null
+++ b/sql/updates/auth/2014_11_23_00_auth.sql
@@ -0,0 +1 @@
+ALTER TABLE `account` CHANGE `os` `os` VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';
diff --git a/sql/updates/auth/2014_11_25_00_auth.sql b/sql/updates/auth/2014_11_25_00_auth.sql
new file mode 100644
index 00000000000..6594fe0c4fa
--- /dev/null
+++ b/sql/updates/auth/2014_11_25_00_auth.sql
@@ -0,0 +1 @@
+ALTER TABLE `battlenet_accounts` CHANGE `os` `os` VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';
diff --git a/sql/updates/world/2014_11_16_00_world.sql b/sql/updates/world/2014_11_16_00_world.sql
new file mode 100644
index 00000000000..f2483d6aed5
--- /dev/null
+++ b/sql/updates/world/2014_11_16_00_world.sql
@@ -0,0 +1 @@
+TRUNCATE `keychain_db2`;
diff --git a/sql/updates/world/2014_11_16_01_world.sql b/sql/updates/world/2014_11_16_01_world.sql
new file mode 100644
index 00000000000..f9742354fb5
--- /dev/null
+++ b/sql/updates/world/2014_11_16_01_world.sql
@@ -0,0 +1,249 @@
+DELETE FROM `page_text` WHERE `ID` IN (4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4543, 4611, 4612, 4613, 4614, 4615, 4820, 4821, 4822, 4823);
+INSERT INTO `page_text` (`ID`, `Text`, `NextPageID`, `VerifiedBuild`) VALUES
+(4824, 'The Great Turtle
+
+Larger and more sturdy than its cousins seen around the riverbeds of Southshore, the Great Turtle''s shell is a whirl of intricate designs, should one ever get close enough to study.
+
+When frightened, the turtle may lash out with a bite powerful enough to cut a cutlass in half. Should the creature pull its head into its shell, do not think it is to retreat. The men were quite caught off-guard when the shell began to spin madly, severing Ol'' Jim''s hand clean off. We dare not go near the elders off of the coast, which look brutish enough to swallow a man whole.
+
+While the turtles have bequeathed us a spongy, if filling, meat, the men seem more keen on playing with the shells. When thrown, the shell will whirl through the air a distance longer than one would think, often catching one''s napping companion off-guard. Several casualties have resulted.
+
+On a separate note, sailor Wallace was sent back to the Barnacle this morning with a full supply of meats and fruits.', 4825, 19116), -- 4824
+(4825, 'The Spineclaw Crab
+
+We continue to search the island for clues and supplies, and happened upon an unusual species of crab today. Covered in hard, chitinous spines, I would venture to guess that some of these creatures are thousands of years old.
+
+After a diet consisting of meats and fruits, our crew was eager to once again feast on crab legs. Perhaps sensing our intentions, one of the great beasts unleashed a flurry of razor-sharp claw strikes against a young sailor, impaling him dozens of times before he knew what had happened. Though the beast made an attempt to retreat deep into the waters, the men made sure that a good meal would not escape so easily.
+
+Having lost my favorite hat in the storm that took our vessel some days ago, I have taken to wearing one of the brightly-colored crab shells as a makeshift helm. The men have commented on this on more than one occasion, thinking that I may be losing my mind.
+
+Perhaps I am, or perhaps I am simply getting used to this place.', 4826, 19116), -- 4825
+(4826, 'The Spotted Swarmer
+
+By some great fortune, we seem to have found a village. As always, the explorer approaches with caution, lest he or she interfere with the local populace. Surrounding the village are several bright flowering bushes, abuzz with the soft chewing noises of small, spotted silkworms.
+
+Upon approach, the worms will swarm their would-be victim, coating them with a vile toxin. Though small, they are not to be underestimated. My stores of anti-venom are nearly depleted after today.
+
+Upon dissection, I have found that the creature''s silk glands produce a silken cord far more powerful than even the strongest steel. With it, we have begun to fashion a raft of sorts, lashing the nearby tree stalks together with the sticky substance.
+
+It has been nearly a week, and neither Wallace nor the rowboat has returned. The men fear for our ship, as do I.', 4827, 19116), -- 4826
+(4827, 'Spirits of Old Pi''jiu
+
+Today, we ventured even deeper into the old village of Pi''jiu. It did not surprise a seasoned adventurer such as myself that the spirits of the deceased villagers would haunt such a place. Somehow, it would have been even more strange to find the village deserted.
+
+The spirits battle fiercely with martial techniques the likes of which we have never seen, spinning around in a lightning-fast array of kicks, conjuring mists to mend allies, and calling forth a powerful orb of unknown substance to strike at foes. Without the First Mate leading a properly-coordinated battle unit, we would have joined them in their eternal unrest.
+
+I have found a bottle of a strange, ethereal brew in one of the huts. Upon closer inspection, there seems to be a spirit trapped inside. I will leave it closed for now - I have a feeling that it will be of use to me.', 4828, 19116), -- 4827
+(4828, 'The Stalking Tiger
+
+Chasms hem us in on either side, setting the men on edge. We have seen paw prints on the ground around some of the crane nests and today we followed them to a winding path skirted with odd red stones. Lounging in the shade of the few trees that dot the path, we found brutal cats the size of horses.
+
+One of the men brushed up against a red stone, and with a wild look in his eyes charged into battle against a pack of the fierce beasts. With masterful agility he ducked the swipes of monstrous claws the size of his own head, emerging victorious atop a steaming pile of blood-soaked fur.
+
+The luxurious hide and plentiful meat of these primal beasts will sell for much coin back home. Perhaps on some hidden cove of this strange island, a ship awaits us. It is a thought I must entertain if I am to keep my sanity.', 4829, 19116), -- 4828
+(4829, 'The Mighty Cliffdwellers
+
+They can be heard from miles away, and have on more than one occasion woken me up from a sound sleep with the distant rumbling of falling stones. The enormous cliffdwellers, creatures emerged from the very stones we walk upon, pace the run endlessly.
+
+Why they are here, I do not know. Perhaps over the course of many years, stone becomes bored, and uproots itself in search of adventure, or simply a change in scenery.
+
+I do know that even a single footfall can crush a man flat, and more than one man has perished in this fashion. The gem-encrusted hides of the strange creatures glitter in the sun with thousands of untold gems and riches. A fool''s errand.', 4830, 19116), -- 4829
+(4830, 'The Gulp Frog
+
+Today we discovered a small hollow on the eastern shore filled with strange and colorful amphibians. The bloated corpses of many great beasts indicated that, like everything on this island, these creatures were far more than they appeared.
+
+The skin of the frogs is coated with a viscous, toxic substance. Preliminary pokes at one of the smaller specimens resulted in the rapid deterioration of my poking stick.
+
+I procured one of the lily pads that dot the area. Upon inspection, these particular plant species seem to have developed a thick waxy coating in order to protect themselves from the frog toxin. An interesting symbiotic relationship, I shall save one for further study at a later date.
+
+We found little else, and still no means of leaving this island. Personally, I am getting quite used to the tropical atmosphere, and find myself plagued with strange thoughts of staying behind. Perhaps forever.', 4831, 19116), -- 4830
+(4831, 'The Death Adder
+
+One minute Short John was there, and the next he was not. The great serpent slithered back into the dark flora with its meal, and we gave chase.
+
+The great fangs of the beast tore through iron shields and swallowed sharpened battle-axes whole, without a second thought or hint of indigestion.
+
+Surprisingly, when the beast had been thoroughly carved by blade and mace, Short John emerged from the distended stomach, nearly unharmed and chewing on a roasted yak leg he had found inside of the snake.
+
+Now, the question is, who roasted the yak? Surely not the snake... ?', 4832, 19116), -- 4831
+(4832, 'The Jademist Dancer
+
+We have completed our tour of the western shores of the island, finding a misty strand at the pinnacle of our exploration to the northern banks.
+
+Small shapes flitted in and out of the mist, which scalded our exposed skin even at a distance, and we dared not approach further.
+
+Squinting into the ever-surging mists, I believe I caught a glimpse at a small cairn of stones. Something about the stones intrigues me greatly.
+
+I shall have to return to investigate further.', 4833, 19116), -- 4832
+(4833, 'A Strange Cavern - The Foreboding Flame
+
+We have stumbled upon a strange cavern lit by an eerie blue light, not unlike the Singing Bogs in the children''s tales. Just like in the stories, the lights called to my companions and myself, and we delved deep into the cavern.
+
+We were surrounded when the lights took on a menacing illumination, and our skin began to burn with unearthly fire. We screamed, and we ran until we could run no more.
+
+Bonfires, lit by the same blue light, dotted the damp caves, but gave off no warmth. Simply being near them eased our pain, and we fought back the blazing lights.
+
+We told these tales to frighten children away from the dangerous wetlands. Perhaps we should have listened ourselves.
+
+There are only six of us, now.', 4835, 19116), -- 4833
+(4835, 'A Strange Cavern - The Damp Shambler
+
+There was only one way to go - forward. We made our way into the deepest grottos of the dank cavern, followed by the whispers of the spirits of our dead. They would find no rest in this place.
+
+We were greatly surprised when the moss and lichen lining the wall detached itself and began shambling towards us. A choking gas billowed from its many fungal blossoms. The vines and ferns making up its hide regrew rapidly wherever it was struck.
+
+Backed into a corner, we did the only thing we could. When the moss chose its victim, we escaped.
+
+The echoes of his cries will haunt me until the end of my days.', 4836, 19116), -- 4835
+(4836, 'The Ordon - Candlekeeper
+
+When we returned to our camp near the old village, we found it ransacked, and many of our supplies burned on a great pyre. This was no mere animal - something wanted us off of this island.
+
+In the night, they came. Heralded by the blast of a deep battle-horn, great bull-men wielding blazing arms dragged three of our men screaming into the darkness.
+
+With a great breath, one bull-man breathed out a gout of flame that set half of the camp on fire, scattering us into the jungle and covering their escape.
+
+To my great surprise, the spirits of the village awaited us when we returned to the camp. They did not speak, but pointed towards a distant stone arch and nodded. Perhaps it is their intent to aid us?', 4837, 19116), -- 4836
+(4837, 'The Ordon - Fire-Watcher
+
+A great battle, perhaps the greatest I have ever experienced, took place around me as I hid inside one of the crates of the great bull-men. My rifle did little to slow their charge, though the spirits around us fought fiercely, a silent tide of death in the darkness.
+
+The Ordon were not without magical prowess, conjuring great balls of fire that rained down upon those nearby, blackening the ground around them. One such wizard caught one of our men full in the chest with a massive boulder of fire, blasting his torso clear apart from the remainder of his limbs.
+
+In the commotion, I have procured some of the carved symbols and robes of the wizened of the bull-men. With some work, I may be able to fashion a costume of sorts, and perhaps ward others away from my location.', 4838, 19116), -- 4837
+(4838, 'The Ordon - Oathguard
+
+I breathed a sigh of relief as the great warriors of the bull-men let me pass in my makeshift garb. I proceeded further up the mountain, catching a glimpse of a ruined temple in the distance. Perhaps here I will find my eternal salvation.
+
+The great brutish warriors were quite intelligent in combat, when I reflect back upon the battle. When attacked, they would raise heavy shields, deflecting nearly all blows and allowing their brethren to flank foes. When attention was turned to their allies, they would chant a deep, guttural melody, surrounding their allies with a mystical sheathe.
+
+Their cooperation is a bitter reminder of my solitude. I am alone now, save for my thoughts and this journal.', 4839, 19116), -- 4838
+(4839, 'The Ordon - Burning Berserker
+
+I can do little but hide in this ruined tower and watch the world pass around me.
+
+I see more of the bull-men, wielding blazing daggers, gathering herbs and foliage from the rolling hills. I can only surmise that the rapidly-growing underbrush serves to keep their eternal braziers alight.
+
+When pounced upon by one of the great cats, a vicious battle erupted. I questioned which of the two - blazing bull-man or primal tiger - was more animal. The bull-man whirled around, carving deep gashes into the beast, before alighting both daggers on fire and plunging them deep into the creature''s neck.
+
+I am so very hungry. I will not last long if I do not keep moving - but to where?', 4840, 19116), -- 4839
+(4840, 'The Ashleaf Sprites
+
+My salvation came in the dead of night, as a screaming fireball flew overhead.
+
+The woodland creatures that make the trees their home appear to be foes of the great flying serpents and bull-men of the area. As the blast of hot magma arced towards one of the trees, the little wood men formed a shield of leaves, deflecting the fire and warding off the would-be attacker.
+
+The impact of the blazing ball shook several large nuts to the ground. While the little wood men warded their tree against another assault, I snuck in and procured a few of the gourds, as well as some of the leafy berries off of one of the wood men that did not survive.
+
+The nuts were filling and berries heavy with a rejuvenating syrup. I feel nearly strong enough to leave this place now.', 4841, 19116), -- 4840
+(4841, 'The Crimsonscale Firestorm
+
+The strange, and beautiful, serpents seemed to be playing a game with the little wood men. They would circle for hours, then assault one of the wood men''s trees with a burst of fire. The wood men seemed adept at shielding their homes, and the great serpents did not seem to be interested in destroying the men themselves.
+
+It reminded me of my cat, Simon, whom I had left in the care of a friend. Thinking of Simon reminded me that I did not know how long I had been stranded here. Was it days, weeks, years? And what had happened to the Barnacle?
+
+I was broken out of my reverie by a violent battle between two of the great serpents. Breath of fire cut swathes of light through the dark night sky, temporarily blinding me. Pools of blazing magma erupted across the ground. It must have been a territorial dispute, because the victorious serpent seemed uninterested in the charred corpse of his adversary.
+
+Clutched in the burned hands I found a most curious egg.', 4842, 19116), -- 4841
+(4842, 'The Ordon - Molten Guardian
+
+Great golems made of stone and fire bar my way further up the mountain. Do I dare try to pass them as I passed the bull-men before? My costume has gotten better, with twigs and brush propping up the shoulders, giving me the silhouette of a true bull-man. I daresay I could walk right in. What is the harm in trying?
+
+I clutched the egg to my chest protectively as I passed by the guardian. The blazing heat radiated off of it in waves, searing my flesh. Where was I going? I did not know. Up, I suppose.
+
+I found a smoldering kiln that may be used to create the golems. A burned-out husk lay nearby, along with a stone that appeared to blaze without ceasing. Perhaps the stone was used to imbue the creature with life? But where did such stones come from?
+
+At that moment I was grabbed from behind, and the world went black.', 4843, 19116), -- 4842
+(4843, 'The Ordon - Blazebound Chanter
+
+These bull-men, more well-dressed than their brethren and with weaponry carved with intricate runes, carried me to the great pyre at the center of their temple.
+
+I can only assume one of their religious order presided over the initial searing of my flesh. They spoke in an unknown language as they carved into my skin with white-hot daggers. A rain of burning meteors fell around us, obscuring the temple from outsiders while the bull-men performed their tortuous rituals.
+
+When they had finished, the chanter spoke a word of power and called forth a monster of magma and stone.
+
+I could only surmise that my soul would be formed into one of the burning stones, and used to power a lifeless automaton for all time.', 4844, 19116), -- 4843
+(4844, 'The Ordon - Eternal Kilnmaster
+
+The muscular guard thrust his polearm into the ground, conjuring forth an eruption of flames that spread into my obsidian cell. I ceased my wails for a short time.
+
+I did not know what they planned to do to me, but I did know that my journey had come to an end. Despite myself, my curiosity firmly took hold, and I continued to watch them in earnest.
+
+I noticed that then these hulking bull-men came close to their campfire, a cauldron of flames, they seemed empowered by the fire. But I could not think of a way to use this to my advantage, and crumpled into a heap in the corner of my cell to await my fate.', 4845, 19116), -- 4844
+(4845, 'The Ordon - High Priest
+
+I was brought to the center of the bull-men''s great temple once again. Before me stood an imposing figure, a bull-man that radiated such power that I nearly had to close my eyes, lest I be blinded. His hands were charred black, and fur similarly burned in places.
+
+I was led to a great cauldron. In their guttural speech, the word "Ordos" rang out several times with obvious reverence. In the distance, a great figure approached, his mane an ever-burning inferno, his eyes weeping tears of molten magma. A spear in the back pushed me ever closer to the cauldron in front of me.
+
+In desperation, I flung the serpent egg into the cauldron. It was my last, and only, resort. The egg burst open, and a small serpent emerged, shook itself, and rapidly began to ascend.
+
+I leapt, grabbing the tail of the creature as it flew high into the sky. But I could not hold on for long, and soon I found myself plunging into the cold, dark waters far below.', 4846, 19116), -- 4845
+(4846, 'Inside the Great Evermaw
+
+As the icy waves closed around me, I found myself swept up in a powerful current and deposited into a rank hollow.
+
+My surroundings became lit for but a moment as the cavern behind me opened to allow a fresh rush of sea water, and it was then that I realized that I had been swallowed by a great fish.
+
+Before the maw closed again, I took note of my surroundings. The smooth, muscled walls stretched far back into the distance. Deposits of flotsam and jetsam had become lodged in various locations - from the wreckage of ships small and large to the picked-over bones of strange undersea creatures.
+
+Far back in the cavern, I saw a faint light. For some reason, it reminded me of the soothing whispers I had heard on the misty northwestern shore. And thus I found the lantern - a dull, rusted thing, but somehow comforting.
+
+And so here I sit, writing an end to my tale that none will hear.', 4847, 19116), -- 4846
+(4847, 'Final Entry
+
+It has found me! No, no no, I have found it! Yes! It was meant to be, this is where I was always meant to be, a portal to the future, to my future.
+
+The lantern illuminates my scrawling, it helps me find the way. Vazuvius calls.
+
+And so I will answer. I will light the lantern and plunge my head into the stagnant waters, and breathe deep the salty air of my brethren.
+
+AND I WILL JOIN THE DREAD CREW IN ETERNAL PLUNDER.', 0, 19116), -- 4847
+(4543, 'It was at this location ten thousand years ago that Shaohao, the last emperor of Pandaria, sought out the counsel of the Jade Serpent.$b$bFrom the Book of Burdens, Chapter 3:$b$b"Forlorn and without hope, the Last Emperor ascended the sheer slope of Mount Neverest. Daggers of cold sliced through his silken robes, and the biting wind heaped scorn on his journey."$b$b"Only at the very peak of the mountain did the Emperor find quiet and solace, and here he spoke with the Jade Serpent, the spirit of wisdom."$b$bThe Jade Serpent urged Shaohao to divest himself of his burdens, to purify his spirit, and to become one with the land.$b$bThe Emperor was perplexed by the Jade Serpent''s counsel, but no further answers were to be found atop the frigid peak. Dejected, Emperor Shaohao trudged back down the mountain to consult his companion, the Monkey King, and determine his next move.', 0, 19116), -- 4543
+(4611, 'Once, a marauding mogu warlord rose in power to threaten the Jade Forest.$b$b"I will rebuild the mogu empire!" He proclaimed before the gates of the Temple of the Jade Serpent. "And your kind will again be made to serve." $b$bFrom the battlements, a single monk''s voice called down: "How many mogu do you bring to challenge us?" $b$b"I have brought my army of one hundred mogu!" the warlord proudly challenged. $b$b "But behind these walls we have five hundred," spoke the monk with confidence. $b$b The mogu army shuffled and began to question their leader. Doubt filled their hearts and the army ran away.', 4612, 19116), -- 4611
+(4612, 'The Warlord was furious! He left the temple and sought out his mogu allies. After long arguments, threats, promises, and praises, the mogu again raised their army.$b$bBefore the gates of the Temple of the Jade Serpent the mogu warlord called out: "I bring six hundred mogu to challenge your pitiful five hundred defenders."$b$bFrom the battlements, a single monk voice called out: "Did we mention that for each of our monks, we have one full grown, mogu-eating serpent? They are ever so hungry." $b$bAt this the mogu army broke apart again, doubting their resolve and running deep into the land.', 4613, 19116), -- 4612
+(4613, 'Again the Warlord was furious! He tried again to rally his troops. It took many years but he returned, this time with a mighty legion of mogu and quilen and weapons pilfered from the tombs of their ancient emperors. $b$b"Kneel, supplicants!" shouted the Warlord. "I bring one thousand mogu and five hundred quilen to your gates. I have weapons of magic and dark powers to call upon." $b$b From the battlements, a single monk voice responded: "And have you found our spy yet? He is ever so clever."', 4614, 19116), -- 4613
+(4614, 'At this the mogu legion turned on each other violently. Each always suspected someone else of being a traitor or a spy. Among the mogu there is no trust, only strength and force.$b$bWar waged before the temple as the mogu destroyed themselves, unleashing the full weight of their doubt, anger, fear, hatred, violence and despair. $b$bWhen the smoke cleared, only the Warlord remained before the gates. He had slain many of his former allies, and was left with no friends to help him claim his throne.', 4615, 19116), -- 4614
+(4615, 'From the temple a single pandaren monk stepped out, surveyed the battle scene, and began to sweep up the mess. $b$b"Where is your army?" the Warlord demanded. $b$b"You brought it with you," said the monk with a smile. "My friend, if you must strike the first blow, you have already lost."', 0, 19116), -- 4615
+(4820, 'The Barnacle has been stranded in the thick mists for nine days now. The wind is dead, stagnant, almost frozen in place.
+
+What follows are, presumably, the last words of myself, explorer J. M. Harrington, as I have been chosen to accompany a small group of sailors on a rowboat to scout out the mists.
+
+I eagerly await the dragon-sized fish that will undoubtedly swallow our small vessel and save me from the horror of returning to a ship with only one place to relieve oneself.', 4821, 19116), -- 4820
+(4821, 'Land! Glorious landfall!
+
+We have found a small, peculiar island that does not appear to exist on any known map of the area. The sailors were jubilant, and several of the younger men immediately set out in search of the gold and riches that would surely be awaiting them in a skull-covered chest. They have not been seen in several hours.
+
+We begin exploration immediately. If we cannot find food, we will all perish in a matter of days. Though I have my trusty hunting rifle, I fear for my safety. I do not think that humans have set foot on this island in hundreds, perhaps thousands, of years.
+
+I will do my duty as a proper explorer and document all that I see, in the hopes that someday these pages find their way into the hands of another ambitious adventurer with far more courage than sense.', 4822, 19116), -- 4821
+(4822, 'The Windfeather Crane
+
+We have stumbled across a glorious bird species capable of producing brilliant plumage, and highly protective of their nests.
+
+The birds seem to have an affinity with the winds, and can smooth down their feathers, allowing them to strike rapidly at predators. The matriarchs of the species sing a soothing melody, calming the chicks when they are agitated. The males seem particularly fierce, and will ruffle their feathers to sweep a powerful gust of wind at attackers.
+
+We have hunted the Windfeather for their meat in particular, which makes for a savory, if lean, meal. The feathers themselves seem to lighten the men''s spirits, and I must wonder if they have magical properties.
+
+I have, on several occasions, seen rustling eggs amongst the nests. If I am able, I shall procure one to hatch on my own for further investigation.', 4823, 19116), -- 4822
+(4823, 'The Ironfur Yak
+
+A great beast that seems to move and think at a glacial pace, the thick coats of the Ironfur Yaks dwarf any ram hide seen in Alterac.
+
+Powerful horns give the Ironfur a thrusting attack that can send a full-grown sailor off-balance, and more than once have I seen a man''s leg trampled into the dirt as one of the larger bulls charged at us. We have taken to scattering immediately for the nearest tree just as soon as one of the great males begins to paw the ground.
+
+The meat of the Ironfur contains more fat, and is more filling, than that of the Windfeather. With the fruit found abundantly in the trees nearby, we should be able to subsist for many days here, provided the denizens of the island do not kill us first.
+
+I was awoken this morning to a most curious racket. One of the men had somehow found his way atop one of the powerful bulls. I am certain the Ironfur thought that its response - to tear madly across the island - was quite appropriate.', 4824, 19116); -- 4823
+
+UPDATE `page_text` SET `Text`='Arellas Fireleaf
+High Wizard of the Scarlet Crusade
+Citizen of Quel''Thalas
+Locked in eternal combat with the Necromancer Diesalven', `VerifiedBuild`=19116 WHERE `ID`=2151; -- 2151
+UPDATE `page_text` SET `Text`='Holia Sunshield
+Defender of the Scarlet Crusade
+Killed while slaying the Dreadlord Beltheris', `VerifiedBuild`=19116 WHERE `ID`=2174; -- 2174
+UPDATE `page_text` SET `Text`='Invar One-Arm
+The first Chief Assassin of the Scarlet Crusade
+Citizen of Dalaran
+Last seen on the shores of Northrend', `VerifiedBuild`=19116 WHERE `ID`=2175; -- 2175
diff --git a/sql/updates/world/2014_11_16_02_world.sql b/sql/updates/world/2014_11_16_02_world.sql
new file mode 100644
index 00000000000..e8b6f525f6f
--- /dev/null
+++ b/sql/updates/world/2014_11_16_02_world.sql
@@ -0,0 +1,4 @@
+-- Added Readable Text to (Dog-Eared Note)
+DELETE FROM `page_text` WHERE `ID`=4851;
+INSERT INTO `page_text` (`ID`, `Text`, `VerifiedBuild`) VALUES
+(4851, 'Magra, my huntress,\r\n\r\nAnother dull day at Stonefang outpost. As I stare across the flats, I cannot help but think of you. Do you remember the day we met? I hurled my axe at your mount, and you nearly impaled me with a spear.\r\n\r\nIt was love at first sight.\r\n\r\nClans be damned! My mind is made up. I will leave it all to be with you. Choose the place. I will come. We\'ll leave Frostfire and make a life somewhere. I hear Nagrand is beautiful.\r\n\r\nYour future mate,\r\n\r\nKarash\r\n\r\nP.S. I have enclosed Longhowl\'s first-fang. I was wearing it around my neck that day. I hope it will guide me to you once again.', 19116);
diff --git a/sql/updates/world/2014_11_16_03_world.sql b/sql/updates/world/2014_11_16_03_world.sql
new file mode 100644
index 00000000000..939c43f7056
--- /dev/null
+++ b/sql/updates/world/2014_11_16_03_world.sql
@@ -0,0 +1 @@
+UPDATE `smart_scripts` SET `target_type`=5, `target_param1`=0 WHERE `entryorguid`=37662 AND `source_type`=0 AND `id`=0;
diff --git a/sql/updates/world/2014_11_16_04_world.sql b/sql/updates/world/2014_11_16_04_world.sql
new file mode 100644
index 00000000000..0caefd879e9
--- /dev/null
+++ b/sql/updates/world/2014_11_16_04_world.sql
@@ -0,0 +1,19720 @@
+ALTER TABLE `creature_model_info` CHANGE `modelid` `DisplayID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `creature_model_info` CHANGE `bounding_radius` `BoundingRadius` FLOAT NOT NULL DEFAULT '0';
+ALTER TABLE `creature_model_info` CHANGE `combat_reach` `CombatReach` FLOAT NOT NULL DEFAULT '0';
+ALTER TABLE `creature_model_info` CHANGE `modelid_other_gender` `DisplayID_Other_Gender` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `creature_model_info` DROP COLUMN `gender`;
+
+DELETE FROM `creature_model_info` WHERE `DisplayID` IN (18035, 20770, 20870, 28329, 28330, 28331, 28332, 28437, 28458, 28518, 28592, 28608, 28609, 28610, 28613, 28614, 28653, 28812, 29003, 29086, 29097, 29165, 29181, 29196, 29207, 29209, 29248, 29271, 29277, 29305, 29320, 29323, 29364, 29373, 29406, 29407, 29410, 29411, 29417, 29420, 29423, 29433, 29451, 29453, 29460, 29465, 29468, 29469, 29523, 29544, 29548, 29550, 29559, 29594, 29595, 29596, 29597, 29618, 29661, 29674, 29741, 29804, 29811, 29822, 29874, 29875, 29876, 29877, 29930, 29946, 29955, 29963, 29973, 29987, 29992, 29993, 29998, 30002, 30004, 30023, 30029, 30038, 30058, 30062, 30077, 30082, 30118, 30119, 30124, 30125, 30130, 30131, 30133, 30134, 30137, 30139, 30147, 30158, 30161, 30179, 30192, 30195, 30235, 30236, 30241, 30257, 30264, 30265, 30266, 30267, 30279, 30298, 30305, 30307, 30344, 30345, 30361, 30396, 30397, 30398, 30406, 30407, 30410, 30448, 30458, 30493, 30494, 30510, 30519, 30564, 30589, 30627, 30639, 30642, 30655, 30658, 30660, 30661, 30710, 30737, 30765, 30777, 30791, 30811, 30845, 30889, 30905, 30915, 30918, 30919, 30936, 30957, 30985, 30994, 31002, 31003, 31009, 31010, 31032, 31069, 31071, 31075, 31108, 31116, 31118, 31120, 31148, 31149, 31150, 31151, 31152, 31153, 31155, 31157, 31158, 31162, 31172, 31173, 31186, 31189, 31190, 31191, 31199, 31219, 31232, 31233, 31291, 31325, 31341, 31345, 31374, 31381, 31382, 31426, 31427, 31435, 31442, 31444, 31460, 31464, 31466, 31468, 31478, 31479, 31494, 31496, 31497, 31500, 31502, 31503, 31504, 31507, 31529, 31532, 31534, 31537, 31538, 31549, 31557, 31570, 31573, 31575, 31576, 31581, 31582, 31589, 31597, 31603, 31617, 31630, 31631, 31638, 31640, 31644, 31665, 31671, 31672, 31685, 31686, 31700, 31702, 31714, 31715, 31718, 31733, 31759, 31763, 31766, 31767, 31768, 31775, 31776, 31780, 31786, 31791, 31802, 31804, 31815, 31830, 31832, 31844, 31845, 31863, 31887, 31889, 31899, 31900, 31901, 31902, 31908, 31909, 31910, 31921, 31923, 31925, 31937, 31955, 31964, 31969, 31970, 31971, 31980, 31986, 31994, 31995, 31996, 31997, 31998, 31999, 32017, 32026, 32028, 32029, 32030, 32054, 32056, 32058, 32059, 32060, 32061, 32062, 32064, 32065, 32066, 32067, 32068, 32069, 32079, 32125, 32126, 32128, 32131, 32132, 32133, 32134, 32180, 32185, 32191, 32196, 32197, 32200, 32201, 32202, 32204, 32205, 32206, 32216, 32224, 32233, 32241, 32243, 32247, 32249, 32250, 32267, 32278, 32282, 32309, 32315, 32325, 32340, 32342, 32404, 32405, 32406, 32407, 32443, 32471, 32483, 32484, 32485, 32495, 32508, 32509, 32511, 32530, 32531, 32536, 32544, 32548, 32549, 32632, 32633, 32649, 32655, 32682, 32683, 32686, 32689, 32701, 32715, 32723, 32725, 32730, 32779, 32782, 32783, 32788, 32793, 32803, 32804, 32884, 32898, 32912, 32935, 32936, 32937, 32938, 32964, 32966, 32967, 32973, 32974, 32983, 32995, 33000, 33007, 33012, 33038, 33063, 33066, 33067, 33075, 33088, 33173, 33196, 33198, 33200, 33214, 33218, 33223, 33225, 33227, 33229, 33237, 33242, 33251, 33293, 33307, 33309, 33310, 33311, 33317, 33318, 33331, 33332, 33375, 33383, 33385, 33392, 33393, 33423, 33431, 33526, 33592, 33595, 33599, 33603, 33605, 33606, 33607, 33608, 33636, 33644, 33645, 33646, 33648, 33652, 33653, 33654, 33656, 33657, 33658, 33659, 33660, 33662, 33664, 33665, 33667, 33668, 33669, 33677, 33684, 33691, 33695, 33705, 33721, 33723, 33724, 33726, 33727, 33728, 33730, 33734, 33735, 33766, 33772, 33811, 33821, 33825, 33826, 33827, 33859, 33861, 33862, 33900, 33966, 33973, 33975, 33976, 34022, 34027, 34028, 34029, 34031, 34067, 34068, 34128, 34130, 34199, 34200, 34210, 34249, 34255, 34256, 34258, 34270, 34271, 34273, 34306, 34318, 34323, 34325, 34326, 34338, 34341, 34402, 34409, 34411, 34414, 34415, 34416, 34417, 34418, 34425, 34428, 34442, 34445, 34447, 34502, 34514, 34543, 34544, 34545, 34577, 34583, 34603, 34608, 34614, 34618, 34620, 34640, 34684, 34715, 34716, 34720, 34721, 34746, 34749, 34750, 34770, 34772, 34773, 34793, 34807, 34808, 34826, 34836, 34878, 34879, 34881, 34882, 34883, 34884, 34885, 34886, 34889, 34897, 34898, 34901, 34902, 34914, 34915, 34957, 34970, 34981, 34993, 34997, 35000, 35006, 35011, 35055, 35056, 35057, 35058, 35071, 35072, 35084, 35091, 35104, 35110, 35118, 35128, 35129, 35137, 35144, 35151, 35157, 35169, 35197, 35205, 35206, 35245, 35252, 35314, 35319, 35320, 35322, 35326, 35327, 35339, 35343, 35344, 35356, 35358, 35359, 35368, 35376, 35385, 35393, 35394, 35397, 35398, 35403, 35405, 35409, 35410, 35416, 35428, 35437, 35472, 35501, 35518, 35528, 35582, 35638, 35641, 35642, 35646, 35652, 35653, 35676, 35710, 35713, 35762, 35769, 35788, 35789, 35799, 35814, 35817, 35820, 35824, 35835, 35837, 35845, 35851, 35854, 35861, 35903, 35905, 35924, 35946, 35970, 35977, 35994, 36002, 36013, 36016, 36023, 36044, 36053, 36065, 36066, 36067, 36068, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, 36094, 36107, 36113, 36118, 36122, 36127, 36142, 36146, 36149, 36173, 36175, 36179, 36224, 36226, 36228, 36281, 36326, 36327, 36331, 36344, 36345, 36359, 36397, 36398, 36399, 36404, 36405, 36406, 36408, 36409, 36410, 36413, 36414, 36421, 36422, 36430, 36431, 36432, 36433, 36436, 36448, 36490, 36491, 36495, 36500, 36506, 36507, 36508, 36509, 36510, 36523, 36524, 36526, 36543, 36548, 36553, 36554, 36601, 36609, 36635, 36639, 36640, 36641, 36642, 36643, 36645, 36646, 36649, 36658, 36694, 36704, 36705, 36706, 36708, 36709, 36712, 36713, 36715, 36716, 36717, 36718, 36719, 36721, 36739, 36794, 36795, 36796, 36801, 36842, 36876, 36892, 36895, 36897, 36926, 36933, 36939, 37019, 37032, 37033, 37034, 37035, 37036, 37037, 37039, 37040, 37142, 37147, 37150, 37151, 37152, 37153, 37156, 37164, 37165, 37166, 37170, 37173, 37178, 37180, 37184, 37185, 37186, 37187, 37205, 37206, 37208, 37211, 37229, 37230, 37305, 37306, 37309, 37325, 37326, 37363, 37378, 37379, 37380, 37381, 37383, 37384, 37464, 37537, 37542, 37543, 37544, 37547, 37552, 37575, 37582, 37584, 37585, 37586, 37604, 37609, 37614, 37635, 37649, 37651, 37677, 37684, 37689, 37690, 37697, 37727, 37728, 37730, 37734, 37741, 37742, 37751, 37755, 37783, 37784, 37785, 37801, 37807, 37810, 37826, 37828, 37842, 37843, 37847, 37849, 37851, 37869, 37870, 37931, 37933, 37934, 37938, 37940, 37941, 37948, 37951, 37954, 37955, 37986, 37987, 38014, 38016, 38021, 38022, 38026, 38027, 38028, 38033, 38056, 38058, 38067, 38068, 38071, 38073, 38101, 38117, 38145, 38156, 38185, 38188, 38189, 38191, 38192, 38202, 38210, 38211, 38212, 38213, 38215, 38222, 38224, 38228, 38231, 38234, 38235, 38236, 38237, 38242, 38243, 38244, 38245, 38262, 38263, 38278, 38280, 38281, 38283, 38287, 38288, 38304, 38306, 38310, 38313, 38320, 38321, 38329, 38337, 38346, 38348, 38352, 38354, 38355, 38356, 38357, 38365, 38369, 38370, 38374, 38389, 38390, 38403, 38408, 38410, 38411, 38431, 38442, 38444, 38451, 38452, 38456, 38458, 38459, 38461, 38467, 38469, 38476, 38480, 38488, 38492, 38495, 38500, 38509, 38510, 38513, 38515, 38516, 38517, 38535, 38551, 38552, 38553, 38554, 38555, 38556, 38560, 38588, 38609, 38610, 38611, 38612, 38622, 38623, 38632, 38633, 38639, 38640, 38641, 38642, 38643, 38644, 38645, 38655, 38659, 38660, 38661, 38662, 38663, 38664, 38665, 38666, 38667, 38675, 38678, 38682, 38690, 38698, 38700, 38703, 38707, 38708, 38732, 38746, 38750, 38751, 38752, 38753, 38757, 38758, 38759, 38764, 38784, 38785, 38794, 38807, 38808, 38810, 38811, 38826, 38843, 38855, 38856, 38863, 38866, 38868, 38869, 38870, 38871, 38872, 38873, 38875, 38876, 38877, 38878, 38879, 38880, 38881, 38882, 38883, 38884, 38885, 38886, 38887, 38888, 38889, 38890, 38891, 38892, 38901, 38902, 38903, 38906, 38907, 38912, 38913, 38914, 38915, 38917, 38918, 38920, 38921, 38922, 38923, 38924, 38926, 38930, 38933, 38956, 38957, 38958, 38959, 38960, 38966, 38967, 38971, 38973, 38974, 38975, 38976, 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38987, 38988, 38989, 38990, 38993, 38994, 38997, 38998, 38999, 39000, 39003, 39004, 39005, 39006, 39007, 39008, 39010, 39011, 39012, 39013, 39014, 39015, 39016, 39019, 39020, 39022, 39035, 39036, 39037, 39039, 39040, 39041, 39042, 39043, 39044, 39045, 39046, 39047, 39048, 39049, 39053, 39054, 39055, 39057, 39059, 39061, 39062, 39063, 39064, 39068, 39070, 39092, 39098, 39102, 39103, 39106, 39107, 39116, 39117, 39122, 39123, 39124, 39126, 39129, 39130, 39139, 39140, 39141, 39143, 39146, 39147, 39148, 39150, 39153, 39156, 39157, 39158, 39168, 39169, 39170, 39171, 39172, 39173, 39175, 39176, 39178, 39179, 39180, 39181, 39185, 39186, 39188, 39189, 39190, 39191, 39202, 39203, 39204, 39205, 39206, 39207, 39209, 39210, 39212, 39225, 39226, 39227, 39228, 39230, 39231, 39234, 39235, 39236, 39237, 39238, 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39250, 39254, 39255, 39257, 39258, 39262, 39263, 39264, 39267, 39268, 39269, 39270, 39272, 39273, 39274, 39275, 39276, 39278, 39279, 39289, 39290, 39291, 39292, 39293, 39312, 39314, 39315, 39317, 39320, 39334, 39337, 39338, 39339, 39340, 39341, 39342, 39348, 39350, 39351, 39352, 39353, 39356, 39357, 39358, 39360, 39361, 39362, 39366, 39367, 39368, 39370, 39371, 39372, 39376, 39379, 39382, 39383, 39384, 39385, 39387, 39388, 39395, 39396, 39398, 39400, 39401, 39402, 39403, 39404, 39406, 39408, 39409, 39410, 39411, 39412, 39413, 39414, 39416, 39417, 39418, 39420, 39421, 39422, 39423, 39427, 39428, 39430, 39431, 39432, 39433, 39434, 39437, 39439, 39440, 39441, 39442, 39444, 39446, 39448, 39450, 39453, 39454, 39455, 39457, 39458, 39459, 39460, 39461, 39462, 39464, 39465, 39466, 39467, 39468, 39469, 39470, 39471, 39472, 39473, 39475, 39476, 39477, 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, 39498, 39499, 39500, 39502, 39503, 39504, 39505, 39506, 39508, 39510, 39511, 39512, 39513, 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39525, 39527, 39528, 39529, 39534, 39535, 39536, 39537, 39538, 39539, 39540, 39541, 39542, 39551, 39553, 39554, 39555, 39556, 39557, 39558, 39560, 39568, 39569, 39570, 39571, 39572, 39573, 39574, 39576, 39577, 39578, 39579, 39580, 39582, 39583, 39584, 39585, 39587, 39588, 39589, 39590, 39591, 39592, 39593, 39594, 39595, 39596, 39597, 39598, 39601, 39602, 39603, 39608, 39615, 39621, 39625, 39626, 39627, 39631, 39632, 39633, 39634, 39635, 39636, 39637, 39638, 39639, 39640, 39641, 39642, 39643, 39644, 39645, 39646, 39647, 39648, 39649, 39650, 39651, 39652, 39653, 39654, 39655, 39656, 39657, 39658, 39659, 39660, 39661, 39662, 39663, 39664, 39665, 39666, 39667, 39668, 39669, 39670, 39671, 39672, 39673, 39674, 39675, 39676, 39677, 39678, 39679, 39680, 39682, 39683, 39684, 39685, 39686, 39687, 39688, 39693, 39695, 39696, 39697, 39698, 39699, 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, 39710, 39711, 39712, 39713, 39714, 39715, 39716, 39717, 39718, 39719, 39720, 39721, 39722, 39723, 39724, 39725, 39726, 39727, 39728, 39729, 39730, 39731, 39732, 39733, 39734, 39735, 39736, 39737, 39738, 39739, 39740, 39741, 39742, 39743, 39744, 39745, 39746, 39747, 39748, 39752, 39753, 39754, 39755, 39756, 39757, 39758, 39759, 39760, 39761, 39762, 39763, 39764, 39765, 39766, 39767, 39768, 39769, 39770, 39771, 39772, 39777, 39778, 39779, 39784, 39791, 39792, 39793, 39794, 39795, 39796, 39798, 39800, 39801, 39802, 39803, 39804, 39805, 39806, 39807, 39810, 39822, 39826, 39827, 39833, 39834, 39835, 39837, 39860, 39886, 39887, 39888, 39890, 39892, 39895, 39896, 39898, 39899, 39902, 39903, 39904, 39905, 39913, 39915, 39916, 39917, 39919, 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39928, 39929, 39930, 39932, 39933, 39934, 39935, 39936, 39942, 39948, 39950, 39951, 39954, 39955, 39956, 39957, 39958, 39959, 39960, 39961, 39962, 39963, 39964, 39965, 39968, 39969, 39993, 39999, 40000, 40001, 40002, 40003, 40004, 40005, 40006, 40007, 40008, 40009, 40010, 40016, 40017, 40018, 40020, 40021, 40022, 40024, 40025, 40028, 40031, 40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40044, 40045, 40046, 40047, 40050, 40053, 40054, 40059, 40066, 40067, 40069, 40071, 40072, 40073, 40075, 40077, 40078, 40079, 40080, 40081, 40082, 40083, 40084, 40085, 40087, 40088, 40089, 40090, 40092, 40093, 40094, 40095, 40096, 40100, 40106, 40108, 40109, 40110, 40111, 40112, 40113, 40114, 40118, 40119, 40120, 40121, 40122, 40123, 40124, 40125, 40126, 40127, 40128, 40129, 40130, 40131, 40132, 40133, 40135, 40136, 40137, 40138, 40139, 40140, 40141, 40142, 40144, 40145, 40146, 40148, 40149, 40151, 40152, 40153, 40154, 40155, 40156, 40157, 40160, 40161, 40162, 40163, 40166, 40167, 40168, 40169, 40170, 40171, 40172, 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40191, 40192, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, 40203, 40204, 40205, 40207, 40208, 40209, 40210, 40211, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40252, 40253, 40254, 40255, 40256, 40257, 40258, 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, 40289, 40290, 40291, 40293, 40294, 40296, 40297, 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, 40309, 40310, 40311, 40312, 40313, 40314, 40317, 40318, 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, 40349, 40350, 40351, 40352, 40353, 40354, 40357, 40358, 40359, 40360, 40361, 40372, 40386, 40415, 40465, 40506, 40507, 40508, 40509, 40510, 40517, 40518, 40519, 40520, 40521, 40522, 40523, 40524, 40525, 40526, 40527, 40528, 40529, 40530, 40534, 40535, 40539, 40543, 40545, 40546, 40547, 40548, 40549, 40550, 40552, 40553, 40554, 40555, 40557, 40558, 40559, 40560, 40562, 40563, 40564, 40565, 40566, 40567, 40569, 40572, 40573, 40574, 40575, 40576, 40577, 40578, 40579, 40580, 40581, 40583, 40584, 40585, 40586, 40587, 40588, 40589, 40590, 40591, 40592, 40594, 40596, 40597, 40599, 40600, 40601, 40602, 40603, 40604, 40605, 40606, 40607, 40608, 40609, 40610, 40611, 40613, 40615, 40616, 40617, 40618, 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40628, 40629, 40630, 40631, 40632, 40633, 40634, 40635, 40636, 40637, 40638, 40639, 40642, 40644, 40645, 40646, 40647, 40648, 40649, 40650, 40651, 40652, 40653, 40655, 40656, 40657, 40658, 40659, 40661, 40662, 40663, 40664, 40665, 40669, 40670, 40671, 40672, 40673, 40674, 40675, 40677, 40678, 40679, 40680, 40681, 40682, 40683, 40684, 40685, 40686, 40687, 40688, 40689, 40690, 40691, 40692, 40693, 40694, 40695, 40696, 40697, 40698, 40699, 40700, 40701, 40702, 40703, 40704, 40705, 40706, 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40715, 40716, 40717, 40718, 40719, 40720, 40721, 40722, 40723, 40724, 40725, 40726, 40727, 40728, 40729, 40730, 40731, 40732, 40733, 40736, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, 40746, 40747, 40748, 40749, 40750, 40751, 40752, 40753, 40754, 40755, 40756, 40757, 40758, 40759, 40760, 40761, 40762, 40763, 40764, 40765, 40766, 40767, 40768, 40769, 40770, 40771, 40772, 40773, 40775, 40776, 40777, 40778, 40779, 40780, 40781, 40782, 40783, 40784, 40785, 40786, 40787, 40788, 40789, 40790, 40791, 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40831, 40834, 40835, 40836, 40837, 40838, 40839, 40840, 40841, 40842, 40843, 40844, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, 40854, 40855, 40856, 40857, 40858, 40859, 40861, 40862, 40864, 40865, 40866, 40867, 40868, 40869, 40870, 40871, 40872, 40873, 40874, 40875, 40876, 40877, 40878, 40879, 40880, 40881, 40882, 40883, 40884, 40885, 40886, 40887, 40888, 40889, 40890, 40891, 40892, 40893, 40894, 40895, 40896, 40897, 40898, 40899, 40900, 40901, 40902, 40903, 40904, 40905, 40906, 40907, 40908, 40910, 40911, 40913, 40914, 40915, 40916, 40917, 40918, 40919, 40920, 40921, 40922, 40923, 40924, 40925, 40926, 40927, 40928, 40929, 40930, 40931, 40932, 40933, 40934, 40935, 40936, 40937, 40938, 40939, 40940, 40941, 40942, 40943, 40944, 40945, 40946, 40947, 40948, 40949, 40950, 40951, 40953, 40954, 40955, 40956, 40957, 40958, 40959, 40960, 40961, 40962, 40963, 40964, 40965, 40966, 40967, 40968, 40969, 40970, 40971, 40972, 40973, 40974, 40975, 40976, 40977, 40978, 40979, 40980, 40981, 40982, 40983, 40984, 40985, 40986, 40988, 40989, 40990, 40991, 40992, 40993, 40994, 40995, 40996, 40997, 40998, 40999, 41000, 41001, 41002, 41003, 41004, 41005, 41006, 41007, 41008, 41009, 41010, 41011, 41012, 41013, 41014, 41015, 41016, 41017, 41018, 41019, 41020, 41021, 41022, 41023, 41024, 41025, 41026, 41027, 41028, 41029, 41030, 41031, 41032, 41033, 41034, 41035, 41036, 41037, 41038, 41039, 41041, 41042, 41043, 41044, 41046, 41048, 41049, 41050, 41051, 41052, 41053, 41054, 41055, 41056, 41057, 41058, 41059, 41060, 41061, 41062, 41063, 41064, 41065, 41066, 41067, 41068, 41069, 41070, 41072, 41073, 41074, 41075, 41076, 41077, 41078, 41079, 41082, 41083, 41084, 41085, 41086, 41087, 41088, 41089, 41090, 41091, 41092, 41093, 41094, 41095, 41096, 41097, 41098, 41099, 41100, 41101, 41102, 41103, 41104, 41105, 41106, 41107, 41108, 41109, 41110, 41113, 41114, 41115, 41116, 41117, 41118, 41119, 41120, 41121, 41122, 41123, 41124, 41125, 41126, 41127, 41128, 41129, 41130, 41131, 41132, 41133, 41134, 41135, 41136, 41137, 41138, 41139, 41140, 41141, 41142, 41143, 41144, 41145, 41146, 41147, 41148, 41149, 41150, 41151, 41152, 41153, 41154, 41155, 41156, 41157, 41158, 41159, 41160, 41161, 41162, 41163, 41164, 41165, 41166, 41167, 41168, 41169, 41170, 41171, 41172, 41173, 41174, 41175, 41177, 41178, 41179, 41180, 41181, 41182, 41183, 41185, 41187, 41188, 41189, 41190, 41191, 41192, 41193, 41194, 41195, 41196, 41197, 41198, 41199, 41200, 41201, 41202, 41203, 41204, 41205, 41206, 41207, 41208, 41210, 41211, 41212, 41213, 41214, 41215, 41216, 41217, 41218, 41219, 41220, 41221, 41222, 41223, 41224, 41225, 41227, 41228, 41229, 41230, 41231, 41232, 41233, 41234, 41235, 41236, 41238, 41239, 41240, 41241, 41242, 41243, 41244, 41245, 41246, 41247, 41248, 41249, 41250, 41251, 41252, 41253, 41254, 41255, 41256, 41257, 41258, 41259, 41260, 41261, 41262, 41263, 41264, 41265, 41266, 41267, 41268, 41269, 41270, 41271, 41272, 41273, 41274, 41275, 41276, 41277, 41278, 41279, 41280, 41281, 41282, 41283, 41284, 41285, 41286, 41287, 41288, 41289, 41290, 41291, 41292, 41295, 41296, 41297, 41298, 41299, 41300, 41301, 41304, 41305, 41306, 41307, 41308, 41309, 41310, 41311, 41312, 41313, 41314, 41315, 41316, 41317, 41318, 41319, 41320, 41321, 41322, 41323, 41324, 41325, 41326, 41327, 41328, 41329, 41330, 41331, 41332, 41333, 41334, 41335, 41336, 41337, 41338, 41339, 41340, 41341, 41342, 41343, 41344, 41345, 41346, 41347, 41348, 41349, 41350, 41351, 41352, 41353, 41354, 41355, 41356, 41357, 41358, 41359, 41360, 41361, 41362, 41363, 41364, 41365, 41366, 41367, 41368, 41369, 41370, 41371, 41372, 41373, 41374, 41375, 41376, 41377, 41378, 41379, 41380, 41381, 41383, 41384, 41385, 41386, 41387, 41388, 41389, 41390, 41391, 41392, 41393, 41394, 41395, 41396, 41397, 41398, 41399, 41400, 41401, 41402, 41403, 41404, 41405, 41406, 41407, 41408, 41409, 41410, 41411, 41412, 41413, 41414, 41415, 41416, 41417, 41418, 41419, 41420, 41421, 41422, 41423, 41425, 41426, 41427, 41429, 41431, 41432, 41433, 41434, 41435, 41436, 41437, 41438, 41439, 41441, 41442, 41443, 41444, 41445, 41446, 41447, 41448, 41449, 41450, 41453, 41456, 41458, 41459, 41460, 41461, 41462, 41463, 41464, 41467, 41468, 41469, 41470, 41471, 41472, 41473, 41474, 41475, 41476, 41477, 41478, 41479, 41480, 41481, 41482, 41483, 41484, 41485, 41486, 41487, 41488, 41489, 41490, 41491, 41492, 41493, 41494, 41495, 41496, 41497, 41498, 41499, 41500, 41501, 41502, 41503, 41504, 41505, 41506, 41507, 41508, 41509, 41510, 41511, 41512, 41513, 41514, 41515, 41516, 41517, 41518, 41519, 41520, 41521, 41522, 41523, 41524, 41525, 41526, 41527, 41528, 41529, 41530, 41531, 41532, 41533, 41534, 41535, 41538, 41539, 41540, 41541, 41542, 41543, 41544, 41545, 41546, 41547, 41548, 41549, 41550, 41551, 41552, 41553, 41554, 41556, 41558, 41559, 41560, 41561, 41562, 41563, 41564, 41565, 41566, 41567, 41568, 41569, 41570, 41571, 41572, 41573, 41574, 41575, 41576, 41577, 41578, 41579, 41580, 41581, 41582, 41583, 41584, 41585, 41586, 41587, 41589, 41590, 41591, 41592, 41593, 41594, 41595, 41596, 41597, 41598, 41599, 41600, 41601, 41602, 41603, 41604, 41605, 41606, 41607, 41608, 41609, 41610, 41632, 41635, 41636, 41637, 41638, 41639, 41640, 41646, 41647, 41648, 41649, 41650, 41651, 41652, 41653, 41654, 41655, 41656, 41657, 41658, 41659, 41660, 41661, 41662, 41663, 41664, 41665, 41666, 41667, 41668, 41669, 41670, 41671, 41672, 41673, 41674, 41675, 41676, 41677, 41678, 41679, 41680, 41681, 41682, 41683, 41684, 41685, 41686, 41689, 41696, 41697, 41698, 41699, 41700, 41701, 41702, 41703, 41704, 41705, 41706, 41707, 41708, 41709, 41710, 41711, 41712, 41713, 41714, 41715, 41716, 41717, 41718, 41719, 41720, 41721, 41722, 41723, 41724, 41725, 41726, 41727, 41728, 41729, 41730, 41731, 41732, 41733, 41734, 41735, 41736, 41737, 41738, 41739, 41740, 41741, 41742, 41743, 41744, 41745, 41746, 41747, 41748, 41749, 41750, 41751, 41752, 41753, 41754, 41755, 41756, 41757, 41758, 41759, 41760, 41761, 41762, 41763, 41764, 41765, 41766, 41767, 41768, 41769, 41770, 41771, 41772, 41773, 41775, 41776, 41777, 41778, 41779, 41780, 41781, 41782, 41783, 41784, 41785, 41786, 41787, 41788, 41789, 41790, 41791, 41792, 41793, 41794, 41795, 41796, 41797, 41798, 41799, 41800, 41801, 41802, 41803, 41804, 41805, 41806, 41807, 41808, 41809, 41810, 41812, 41813, 41814, 41815, 41816, 41817, 41818, 41819, 41820, 41821, 41822, 41823, 41824, 41825, 41826, 41827, 41828, 41829, 41830, 41831, 41832, 41833, 41834, 41835, 41836, 41837, 41838, 41839, 41840, 41841, 41842, 41843, 41844, 41845, 41846, 41847, 41849, 41851, 41852, 41853, 41854, 41855, 41856, 41857, 41858, 41859, 41860, 41861, 41862, 41863, 41864, 41865, 41866, 41867, 41868, 41869, 41870, 41871, 41872, 41873, 41874, 41875, 41876, 41877, 41878, 41879, 41880, 41881, 41882, 41883, 41884, 41885, 41886, 41887, 41888, 41889, 41890, 41891, 41892, 41893, 41894, 41895, 41896, 41897, 41898, 41899, 41900, 41901, 41902, 41903, 41904, 41905, 41906, 41907, 41908, 41909, 41910, 41911, 41912, 41913, 41914, 41915, 41916, 41917, 41918, 41919, 41920, 41921, 41922, 41923, 41924, 41925, 41926, 41927, 41928, 41929, 41930, 41931, 41932, 41933, 41934, 41935, 41936, 41937, 41938, 41939, 41940, 41941, 41942, 41943, 41944, 41945, 41946, 41947, 41948, 41949, 41950, 41951, 41952, 41953, 41954, 41955, 41956, 41957, 41958, 41959, 41960, 41961, 41962, 41963, 41964, 41965, 41966, 41967, 41968, 41969, 41970, 41971, 41972, 41973, 41974, 41975, 41976, 41977, 41978, 41979, 41980, 41981, 41982, 41983, 41984, 41987, 41988, 41989, 41990, 41991, 41992, 41993, 41994, 41995, 41996, 41997, 41998, 41999, 42000, 42001, 42002, 42003, 42004, 42005, 42006, 42007, 42008, 42009, 42010, 42011, 42012, 42013, 42014, 42015, 42016, 42017, 42018, 42019, 42020, 42021, 42022, 42023, 42024, 42025, 42026, 42027, 42028, 42029, 42030, 42031, 42032, 42033, 42034, 42035, 42036, 42037, 42038, 42039, 42040, 42041, 42042, 42043, 42044, 42045, 42046, 42047, 42048, 42049, 42050, 42051, 42052, 42053, 42054, 42055, 42056, 42058, 42059, 42060, 42061, 42062, 42063, 42064, 42065, 42066, 42067, 42068, 42069, 42070, 42071, 42072, 42073, 42074, 42075, 42076, 42077, 42078, 42079, 42080, 42081, 42082, 42083, 42085, 42086, 42087, 42088, 42089, 42090, 42091, 42092, 42093, 42094, 42095, 42096, 42097, 42098, 42099, 42100, 42101, 42102, 42103, 42105, 42106, 42107, 42108, 42109, 42110, 42111, 42112, 42115, 42118, 42119, 42120, 42121, 42122, 42123, 42124, 42125, 42126, 42127, 42128, 42129, 42130, 42131, 42132, 42133, 42134, 42135, 42136, 42137, 42138, 42139, 42140, 42141, 42142, 42143, 42144, 42145, 42146, 42147, 42148, 42149, 42150, 42151, 42152, 42153, 42154, 42155, 42156, 42157, 42158, 42159, 42160, 42161, 42162, 42163, 42164, 42165, 42166, 42167, 42168, 42169, 42170, 42171, 42172, 42173, 42174, 42175, 42176, 42177, 42178, 42179, 42181, 42182, 42183, 42184, 42185, 42186, 42187, 42188, 42189, 42190, 42191, 42192, 42193, 42194, 42195, 42196, 42197, 42198, 42199, 42200, 42201, 42202, 42203, 42204, 42205, 42206, 42207, 42208, 42209, 42210, 42211, 42212, 42213, 42214, 42215, 42216, 42217, 42218, 42219, 42221, 42222, 42223, 42224, 42225, 42226, 42227, 42228, 42229, 42230, 42231, 42232, 42233, 42234, 42235, 42236, 42237, 42239, 42240, 42241, 42242, 42243, 42244, 42245, 42247, 42248, 42249, 42250, 42251, 42252, 42253, 42254, 42255, 42256, 42257, 42258, 42259, 42260, 42261, 42262, 42263, 42264, 42265, 42269, 42270, 42271, 42272, 42273, 42274, 42275, 42276, 42277, 42278, 42279, 42280, 42281, 42282, 42288, 42289, 42290, 42291, 42292, 42294, 42295, 42296, 42297, 42298, 42299, 42300, 42301, 42302, 42303, 42304, 42305, 42306, 42307, 42308, 42309, 42310, 42311, 42312, 42313, 42314, 42315, 42316, 42317, 42318, 42319, 42320, 42321, 42322, 42323, 42324, 42325, 42326, 42327, 42328, 42329, 42330, 42331, 42332, 42333, 42334, 42335, 42336, 42337, 42341, 42342, 42343, 42344, 42345, 42346, 42348, 42349, 42350, 42351, 42352, 42353, 42354, 42355, 42356, 42357, 42358, 42359, 42360, 42361, 42362, 42363, 42365, 42366, 42367, 42368, 42369, 42370, 42372, 42373, 42374, 42375, 42376, 42377, 42378, 42379, 42380, 42381, 42382, 42383, 42384, 42385, 42386, 42387, 42388, 42389, 42394, 42395, 42396, 42397, 42398, 42399, 42400, 42401, 42402, 42403, 42404, 42405, 42406, 42407, 42408, 42409, 42410, 42411, 42412, 42413, 42414, 42415, 42416, 42417, 42418, 42419, 42420, 42421, 42422, 42423, 42424, 42425, 42426, 42428, 42429, 42430, 42431, 42432, 42433, 42434, 42435, 42436, 42437, 42438, 42439, 42441, 42442, 42443, 42444, 42445, 42446, 42447, 42448, 42449, 42450, 42451, 42452, 42453, 42454, 42455, 42456, 42457, 42458, 42459, 42460, 42461, 42462, 42463, 42464, 42465, 42466, 42467, 42468, 42469, 42470, 42471, 42472, 42473, 42474, 42475, 42476, 42477, 42478, 42479, 42480, 42481, 42482, 42483, 42484, 42485, 42486, 42487, 42488, 42489, 42490, 42491, 42492, 42493, 42494, 42495, 42496, 42497, 42499, 42500, 42501, 42502, 42503, 42504, 42505, 42506, 42507, 42508, 42509, 42511, 42512, 42513, 42514, 42515, 42516, 42517, 42518, 42519, 42520, 42521, 42522, 42523, 42524, 42525, 42526, 42527, 42528, 42529, 42530, 42531, 42532, 42533, 42534, 42535, 42537, 42538, 42539, 42540, 42541, 42542, 42543, 42544, 42545, 42546, 42547, 42548, 42549, 42550, 42551, 42552, 42553, 42554, 42555, 42556, 42557, 42558, 42559, 42560, 42561, 42562, 42563, 42564, 42565, 42566, 42567, 42568, 42569, 42570, 42571, 42572, 42573, 42574, 42575, 42576, 42577, 42578, 42579, 42580, 42581, 42582, 42583, 42584, 42585, 42586, 42587, 42588, 42589, 42590, 42591, 42592, 42593, 42594, 42595, 42596, 42597, 42598, 42599, 42600, 42601, 42602, 42603, 42604, 42605, 42606, 42607, 42608, 42609, 42610, 42611, 42612, 42613, 42614, 42615, 42616, 42617, 42618, 42619, 42621, 42622, 42623, 42624, 42625, 42626, 42627, 42628, 42629, 42630, 42631, 42632, 42633, 42634, 42635, 42636, 42639, 42640, 42641, 42642, 42643, 42644, 42645, 42646, 42647, 42648, 42649, 42650, 42651, 42652, 42653, 42654, 42655, 42656, 42657, 42658, 42659, 42660, 42661, 42662, 42663, 42664, 42665, 42666, 42667, 42668, 42669, 42670, 42671, 42672, 42673, 42674, 42675, 42676, 42677, 42678, 42679, 42680, 42681, 42682, 42683, 42684, 42685, 42686, 42687, 42688, 42689, 42690, 42691, 42692, 42693, 42694, 42695, 42696, 42697, 42698, 42699, 42700, 42701, 42702, 42703, 42704, 42705, 42706, 42707, 42708, 42709, 42710, 42711, 42712, 42713, 42714, 42715, 42716, 42717, 42718, 42719, 42720, 42721, 42722, 42723, 42724, 42725, 42726, 42727, 42728, 42729, 42730, 42731, 42732, 42733, 42734, 42735, 42736, 42737, 42738, 42739, 42740, 42741, 42742, 42743, 42744, 42745, 42746, 42747, 42748, 42749, 42750, 42751, 42752, 42753, 42754, 42755, 42756, 42757, 42758, 42759, 42760, 42761, 42762, 42763, 42764, 42765, 42766, 42767, 42770, 42771, 42772, 42773, 42774, 42775, 42776, 42777, 42778, 42779, 42780, 42781, 42782, 42783, 42784, 42785, 42786, 42787, 42788, 42789, 42790, 42791, 42793, 42794, 42795, 42796, 42797, 42798, 42799, 42800, 42801, 42802, 42803, 42804, 42805, 42806, 42807, 42808, 42809, 42810, 42811, 42812, 42813, 42814, 42815, 42817, 42818, 42819, 42820, 42821, 42822, 42823, 42824, 42825, 42826, 42827, 42828, 42829, 42830, 42831, 42832, 42833, 42834, 42835, 42836, 42837, 42838, 42839, 42840, 42841, 42842, 42843, 42844, 42845, 42846, 42847, 42848, 42849, 42850, 42851, 42852, 42853, 42854, 42855, 42856, 42857, 42858, 42859, 42860, 42861, 42862, 42863, 42864, 42865, 42866, 42867, 42868, 42869, 42870, 42871, 42872, 42873, 42874, 42875, 42876, 42877, 42878, 42879, 42880, 42881, 42882, 42883, 42884, 42885, 42886, 42887, 42888, 42889, 42890, 42891, 42892, 42893, 42894, 42895, 42896, 42897, 42898, 42899, 42900, 42901, 42902, 42903, 42904, 42905, 42906, 42907, 42908, 42909, 42910, 42911, 42912, 42913, 42914, 42915, 42916, 42917, 42918, 42919, 42920, 42921, 42922, 42923, 42924, 42925, 42926, 42927, 42928, 42929, 42930, 42931, 42932, 42933, 42934, 42935, 42936, 42937, 42938, 42939, 42940, 42941, 42942, 42943, 42944, 42945, 42946, 42947, 42949, 42950, 42951, 42952, 42953, 42954, 42955, 42956, 42957, 42958, 42959, 42960, 42961, 42962, 42963, 42964, 42965, 42966, 42967, 42968, 42969, 42970, 42971, 42972, 42973, 42974, 42976, 42978, 42979, 42980, 42981, 42982, 42983, 42984, 42985, 42986, 42987, 42988, 42989, 42990, 42991, 42992, 42993, 42994, 42995, 42996, 42997, 42998, 42999, 43000, 43001, 43002, 43005, 43006, 43007, 43008, 43009, 43010, 43011, 43012, 43013, 43014, 43015, 43016, 43017, 43018, 43019, 43020, 43021, 43022, 43023, 43024, 43025, 43026, 43027, 43028, 43029, 43030, 43031, 43032, 43033, 43034, 43035, 43036, 43037, 43038, 43039, 43040, 43041, 43042, 43043, 43044, 43045, 43046, 43047, 43048, 43049, 43050, 43051, 43052, 43053, 43054, 43055, 43056, 43057, 43058, 43059, 43060, 43061, 43062, 43063, 43064, 43065, 43066, 43067, 43068, 43069, 43070, 43071, 43072, 43073, 43074, 43075, 43076, 43077, 43078, 43079, 43080, 43081, 43082, 43083, 43084, 43085, 43086, 43087, 43088, 43089, 43090, 43091, 43092, 43093, 43094, 43095, 43096, 43097, 43098, 43099, 43100, 43101, 43102, 43103, 43104, 43105, 43106, 43107, 43108, 43109, 43110, 43111, 43113, 43114, 43115, 43116, 43117, 43118, 43119, 43120, 43121, 43122, 43123, 43124, 43125, 43126, 43127, 43128, 43129, 43130, 43131, 43132, 43133, 43134, 43135, 43136, 43137, 43138, 43139, 43140, 43141, 43142, 43143, 43144, 43145, 43146, 43147, 43148, 43149, 43150, 43151, 43152, 43153, 43154, 43155, 43156, 43157, 43158, 43159, 43160, 43161, 43162, 43163, 43164, 43165, 43166, 43167, 43168, 43169, 43170, 43171, 43172, 43173, 43174, 43175, 43176, 43177, 43178, 43179, 43180, 43181, 43182, 43183, 43184, 43185, 43186, 43187, 43188, 43189, 43190, 43191, 43192, 43193, 43194, 43195, 43196, 43197, 43198, 43199, 43200, 43201, 43202, 43203, 43204, 43205, 43206, 43207, 43208, 43209, 43210, 43211, 43212, 43213, 43214, 43215, 43216, 43220, 43221, 43222, 43223, 43224, 43225, 43226, 43227, 43228, 43229, 43230, 43231, 43232, 43233, 43234, 43235, 43236, 43237, 43238, 43239, 43240, 43241, 43242, 43243, 43244, 43245, 43247, 43249, 43250, 43251, 43252, 43253, 43254, 43255, 43256, 43257, 43258, 43259, 43260, 43261, 43262, 43263, 43264, 43265, 43266, 43267, 43268, 43269, 43270, 43271, 43272, 43273, 43274, 43275, 43276, 43277, 43278, 43279, 43280, 43281, 43282, 43283, 43284, 43285, 43286, 43287, 43288, 43289, 43290, 43291, 43292, 43293, 43294, 43295, 43296, 43297, 43298, 43299, 43300, 43301, 43302, 43303, 43304, 43305, 43306, 43307, 43308, 43309, 43310, 43311, 43312, 43313, 43314, 43315, 43316, 43317, 43318, 43319, 43320, 43321, 43322, 43323, 43324, 43325, 43326, 43327, 43328, 43329, 43330, 43331, 43332, 43333, 43334, 43335, 43336, 43337, 43338, 43339, 43340, 43341, 43342, 43343, 43344, 43345, 43346, 43347, 43348, 43349, 43350, 43351, 43352, 43353, 43354, 43355, 43356, 43357, 43358, 43359, 43360, 43361, 43362, 43363, 43364, 43365, 43366, 43367, 43368, 43369, 43370, 43371, 43372, 43373, 43374, 43375, 43376, 43377, 43378, 43379, 43380, 43381, 43382, 43383, 43384, 43385, 43386, 43387, 43388, 43389, 43390, 43391, 43392, 43393, 43394, 43395, 43396, 43397, 43398, 43399, 43400, 43401, 43402, 43403, 43404, 43405, 43406, 43407, 43408, 43409, 43410, 43411, 43412, 43413, 43414, 43415, 43416, 43417, 43418, 43419, 43420, 43421, 43422, 43423, 43424, 43425, 43426, 43427, 43428, 43429, 43430, 43431, 43432, 43433, 43434, 43435, 43436, 43437, 43438, 43439, 43440, 43441, 43442, 43443, 43444, 43445, 43446, 43447, 43448, 43449, 43450, 43451, 43452, 43453, 43454, 43455, 43456, 43457, 43458, 43459, 43460, 43461, 43462, 43463, 43464, 43465, 43466, 43467, 43468, 43469, 43470, 43471, 43472, 43473, 43474, 43475, 43476, 43477, 43478, 43479, 43480, 43481, 43482, 43483, 43484, 43485, 43486, 43487, 43488, 43489, 43490, 43491, 43492, 43493, 43494, 43495, 43496, 43497, 43498, 43499, 43500, 43501, 43502, 43503, 43504, 43505, 43506, 43507, 43508, 43509, 43510, 43511, 43512, 43513, 43514, 43515, 43516, 43517, 43518, 43519, 43520, 43521, 43522, 43523, 43524, 43525, 43526, 43527, 43528, 43529, 43530, 43531, 43532, 43533, 43534, 43535, 43536, 43537, 43538, 43539, 43540, 43541, 43543, 43544, 43545, 43546, 43547, 43548, 43549, 43550, 43551, 43552, 43553, 43554, 43555, 43556, 43557, 43558, 43559, 43560, 43561, 43562, 43563, 43564, 43565, 43566, 43567, 43569, 43570, 43571, 43572, 43573, 43574, 43575, 43576, 43577, 43578, 43579, 43580, 43581, 43582, 43583, 43584, 43585, 43586, 43587, 43588, 43589, 43590, 43591, 43592, 43593, 43594, 43595, 43596, 43597, 43598, 43599, 43600, 43601, 43602, 43603, 43604, 43605, 43609, 43610, 43611, 43612, 43613, 43614, 43615, 43616, 43617, 43618, 43619, 43620, 43621, 43622, 43623, 43624, 43625, 43626, 43627, 43628, 43629, 43630, 43631, 43632, 43633, 43634, 43635, 43636, 43637, 43638, 43639, 43640, 43641, 43642, 43643, 43644, 43645, 43646, 43647, 43648, 43649, 43650, 43651, 43652, 43653, 43654, 43655, 43656, 43657, 43658, 43659, 43660, 43661, 43662, 43664, 43665, 43666, 43667, 43668, 43669, 43670, 43671, 43672, 43673, 43674, 43675, 43676, 43677, 43678, 43679, 43680, 43681, 43682, 43683, 43684, 43685, 43686, 43687, 43688, 43689, 43690, 43691, 43692, 43693, 43694, 43695, 43696, 43697, 43698, 43699, 43700, 43701, 43702, 43703, 43704, 43705, 43706, 43707, 43708, 43709, 43710, 43711, 43712, 43713, 43714, 43715, 43716, 43717, 43718, 43719, 43720, 43721, 43722, 43723, 43724, 43725, 43726, 43727, 43728, 43729, 43730, 43731, 43732, 43733, 43734, 43735, 43736, 43737, 43741, 43742, 43743, 43744, 43745, 43746, 43747, 43748, 43749, 43750, 43751, 43752, 43753, 43754, 43755, 43756, 43757, 43758, 43759, 43760, 43761, 43762, 43763, 43764, 43765, 43766, 43767, 43768, 43769, 43770, 43771, 43772, 43773, 43774, 43775, 43776, 43777, 43778, 43779, 43780, 43781, 43782, 43783, 43784, 43785, 43786, 43787, 43788, 43789, 43790, 43791, 43792, 43793, 43796, 43797, 43798, 43799, 43800, 43801, 43802, 43803, 43804, 43805, 43806, 43807, 43808, 43809, 43810, 43811, 43812, 43813, 43814, 43815, 43816, 43817, 43818, 43819, 43820, 43821, 43822, 43823, 43824, 43825, 43826, 43827, 43828, 43829, 43830, 43831, 43832, 43833, 43834, 43835, 43836, 43837, 43838, 43839, 43840, 43841, 43842, 43843, 43847, 43848, 43849, 43850, 43851, 43852, 43853, 43854, 43861, 43862, 43863, 43864, 43865, 43868, 43869, 43870, 43871, 43873, 43874, 43875, 43876, 43877, 43878, 43879, 43880, 43881, 43882, 43883, 43884, 43885, 43886, 43887, 43888, 43889, 43890, 43891, 43892, 43893, 43894, 43895, 43896, 43897, 43898, 43899, 43900, 43901, 43902, 43903, 43904, 43905, 43906, 43907, 43908, 43909, 43910, 43911, 43912, 43913, 43914, 43915, 43916, 43917, 43918, 43919, 43920, 43921, 43922, 43923, 43924, 43925, 43926, 43927, 43928, 43929, 43930, 43931, 43932, 43933, 43934, 43935, 43936, 43937, 43938, 43939, 43940, 43946, 43948, 43949, 43951, 43952, 43953, 43954, 43955, 43956, 43958, 43959, 43960, 43961, 43962, 43963, 43964, 43965, 43966, 43970, 43971, 43972, 43973, 43974, 43975, 43976, 43977, 43978, 43979, 43980, 43981, 43982, 43983, 43984, 43985, 43986, 43987, 43988, 43989, 43990, 43991, 43992, 43993, 43994, 43995, 43996, 43997, 43998, 43999, 44000, 44001, 44002, 44003, 44004, 44005, 44006, 44007, 44008, 44009, 44010, 44011, 44012, 44013, 44014, 44015, 44016, 44017, 44018, 44019, 44020, 44021, 44022, 44023, 44024, 44025, 44026, 44027, 44028, 44029, 44030, 44031, 44032, 44033, 44034, 44035, 44036, 44037, 44038, 44039, 44040, 44041, 44042, 44043, 44044, 44045, 44046, 44047, 44048, 44049, 44050, 44051, 44052, 44053, 44054, 44055, 44056, 44057, 44058, 44059, 44060, 44061, 44062, 44063, 44064, 44065, 44066, 44067, 44068, 44069, 44070, 44071, 44072, 44073, 44074, 44075, 44076, 44077, 44078, 44079, 44080, 44081, 44082, 44083, 44084, 44085, 44086, 44087, 44088, 44089, 44090, 44091, 44092, 44093, 44094, 44095, 44096, 44097, 44098, 44099, 44100, 44101, 44103, 44104, 44105, 44106, 44107, 44108, 44109, 44110, 44111, 44112, 44113, 44114, 44115, 44116, 44117, 44118, 44119, 44120, 44121, 44122, 44123, 44124, 44125, 44126, 44127, 44128, 44129, 44130, 44132, 44133, 44134, 44135, 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44144, 44145, 44146, 44147, 44148, 44149, 44150, 44151, 44152, 44153, 44154, 44155, 44156, 44157, 44158, 44159, 44160, 44161, 44162, 44163, 44164, 44165, 44166, 44167, 44168, 44169, 44170, 44171, 44173, 44174, 44175, 44176, 44177, 44178, 44179, 44180, 44181, 44182, 44183, 44184, 44185, 44186, 44187, 44188, 44189, 44190, 44191, 44192, 44193, 44194, 44195, 44196, 44197, 44198, 44199, 44200, 44201, 44203, 44204, 44206, 44208, 44210, 44211, 44212, 44213, 44214, 44215, 44216, 44217, 44218, 44219, 44220, 44221, 44222, 44223, 44224, 44225, 44226, 44227, 44228, 44229, 44230, 44231, 44232, 44233, 44234, 44235, 44236, 44237, 44238, 44239, 44240, 44241, 44242, 44243, 44244, 44245, 44246, 44247, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, 44256, 44257, 44258, 44259, 44260, 44261, 44262, 44263, 44264, 44265, 44266, 44267, 44268, 44269, 44270, 44271, 44272, 44273, 44274, 44275, 44276, 44277, 44278, 44279, 44280, 44281, 44282, 44283, 44284, 44285, 44286, 44287, 44288, 44289, 44290, 44291, 44292, 44293, 44294, 44295, 44296, 44297, 44298, 44299, 44300, 44301, 44302, 44303, 44304, 44305, 44306, 44307, 44308, 44309, 44310, 44311, 44312, 44313, 44314, 44315, 44316, 44317, 44318, 44319, 44320, 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44329, 44330, 44331, 44332, 44333, 44334, 44335, 44336, 44337, 44338, 44339, 44340, 44341, 44342, 44343, 44344, 44345, 44346, 44347, 44348, 44349, 44350, 44351, 44352, 44353, 44354, 44355, 44356, 44357, 44358, 44359, 44360, 44361, 44362, 44363, 44364, 44365, 44366, 44367, 44368, 44369, 44370, 44371, 44372, 44373, 44374, 44375, 44378, 44379, 44380, 44381, 44382, 44383, 44384, 44386, 44387, 44388, 44389, 44390, 44391, 44392, 44393, 44394, 44395, 44396, 44397, 44398, 44399, 44400, 44401, 44402, 44403, 44404, 44405, 44406, 44407, 44408, 44409, 44410, 44411, 44412, 44413, 44414, 44415, 44416, 44417, 44418, 44419, 44420, 44421, 44422, 44423, 44424, 44425, 44427, 44428, 44429, 44430, 44431, 44432, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44441, 44442, 44443, 44444, 44445, 44446, 44447, 44448, 44449, 44450, 44451, 44452, 44453, 44454, 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, 44465, 44466, 44467, 44468, 44469, 44470, 44471, 44472, 44473, 44474, 44475, 44476, 44477, 44478, 44479, 44480, 44482, 44483, 44485, 44486, 44487, 44488, 44489, 44490, 44491, 44493, 44494, 44495, 44496, 44497, 44498, 44499, 44500, 44501, 44502, 44503, 44504, 44505, 44506, 44507, 44508, 44509, 44510, 44511, 44512, 44513, 44514, 44515, 44516, 44517, 44518, 44519, 44520, 44521, 44523, 44524, 44525, 44526, 44527, 44529, 44532, 44533, 44536, 44537, 44538, 44539, 44540, 44541, 44542, 44543, 44544, 44545, 44546, 44547, 44548, 44549, 44550, 44551, 44552, 44553, 44554, 44555, 44557, 44558, 44559, 44560, 44561, 44562, 44563, 44564, 44565, 44566, 44567, 44568, 44569, 44570, 44572, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, 44581, 44582, 44583, 44586, 44587, 44588, 44589, 44590, 44591, 44592, 44593, 44594, 44595, 44596, 44597, 44598, 44599, 44600, 44601, 44602, 44603, 44604, 44605, 44606, 44607, 44608, 44609, 44610, 44611, 44612, 44613, 44614, 44615, 44616, 44617, 44618, 44619, 44620, 44621, 44622, 44623, 44624, 44625, 44626, 44627, 44628, 44629, 44630, 44631, 44632, 44633, 44634, 44635, 44636, 44637, 44638, 44639, 44640, 44641, 44642, 44643, 44644, 44645, 44646, 44647, 44648, 44649, 44650, 44651, 44652, 44653, 44654, 44655, 44656, 44657, 44658, 44659, 44660, 44661, 44662, 44663, 44664, 44665, 44666, 44667, 44668, 44669, 44670, 44671, 44672, 44673, 44674, 44675, 44676, 44677, 44678, 44679, 44680, 44681, 44682, 44683, 44684, 44685, 44686, 44687, 44688, 44689, 44690, 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, 44731, 44732, 44733, 44734, 44735, 44737, 44738, 44739, 44740, 44741, 44742, 44743, 44744, 44745, 44746, 44747, 44748, 44749, 44750, 44751, 44752, 44753, 44754, 44755, 44756, 44757, 44758, 44759, 44762, 44764, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, 44774, 44775, 44776, 44777, 44778, 44779, 44780, 44781, 44782, 44783, 44784, 44785, 44786, 44787, 44788, 44789, 44790, 44791, 44792, 44793, 44794, 44795, 44796, 44797, 44798, 44799, 44800, 44801, 44802, 44803, 44804, 44805, 44806, 44807, 44808, 44809, 44810, 44811, 44812, 44813, 44814, 44815, 44816, 44817, 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 44836, 44837, 44838, 44839, 44840, 44841, 44842, 44843, 44844, 44845, 44846, 44847, 44848, 44849, 44850, 44851, 44852, 44853, 44854, 44855, 44856, 44857, 44858, 44859, 44860, 44861, 44862, 44863, 44864, 44865, 44866, 44867, 44868, 44869, 44870, 44871, 44872, 44873, 44874, 44875, 44876, 44877, 44878, 44879, 44880, 44881, 44882, 44883, 44884, 44885, 44886, 44887, 44888, 44889, 44890, 44891, 44892, 44893, 44894, 44895, 44896, 44897, 44898, 44899, 44900, 44901, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, 44920, 44921, 44922, 44923, 44924, 44925, 44926, 44927, 44928, 44929, 44930, 44931, 44932, 44933, 44934, 44935, 44936, 44937, 44938, 44939, 44940, 44941, 44942, 44943, 44944, 44945, 44946, 44947, 44948, 44949, 44950, 44951, 44952, 44953, 44954, 44955, 44956, 44957, 44958, 44959, 44960, 44961, 44962, 44964, 44965, 44966, 44967, 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, 44978, 44979, 44980, 44981, 44982, 44983, 44984, 44985, 44986, 44987, 44988, 44989, 44990, 44991, 44992, 44993, 44994, 44995, 44996, 44997, 44998, 44999, 45000, 45001, 45002, 45003, 45004, 45005, 45006, 45007, 45008, 45009, 45011, 45016, 45017, 45018, 45019, 45020, 45021, 45022, 45023, 45024, 45025, 45026, 45027, 45028, 45029, 45030, 45031, 45032, 45033, 45034, 45035, 45036, 45040, 45041, 45042, 45043, 45044, 45045, 45046, 45047, 45048, 45049, 45050, 45051, 45052, 45054, 45055, 45056, 45057, 45058, 45059, 45060, 45061, 45062, 45063, 45064, 45065, 45066, 45067, 45068, 45069, 45070, 45071, 45072, 45073, 45074, 45075, 45076, 45077, 45078, 45079, 45080, 45081, 45082, 45083, 45084, 45085, 45086, 45087, 45088, 45089, 45090, 45091, 45092, 45093, 45094, 45095, 45096, 45097, 45098, 45099, 45100, 45101, 45102, 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, 45123, 45124, 45125, 45126, 45127, 45128, 45129, 45130, 45131, 45132, 45133, 45134, 45135, 45136, 45137, 45138, 45139, 45140, 45141, 45142, 45143, 45144, 45145, 45146, 45147, 45148, 45149, 45150, 45151, 45152, 45153, 45154, 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, 45175, 45176, 45177, 45178, 45179, 45180, 45181, 45182, 45183, 45184, 45185, 45186, 45187, 45188, 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45196, 45197, 45198, 45199, 45200, 45201, 45202, 45203, 45204, 45205, 45206, 45207, 45208, 45209, 45210, 45211, 45212, 45213, 45214, 45220, 45223, 45224, 45225, 45226, 45227, 45228, 45229, 45230, 45231, 45232, 45233, 45234, 45235, 45236, 45237, 45238, 45239, 45240, 45241, 45242, 45243, 45244, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45252, 45253, 45254, 45255, 45257, 45258, 45259, 45260, 45261, 45262, 45263, 45264, 45265, 45266, 45267, 45268, 45269, 45270, 45271, 45272, 45273, 45274, 45275, 45276, 45277, 45278, 45279, 45280, 45281, 45282, 45283, 45284, 45285, 45286, 45288, 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 45297, 45298, 45299, 45300, 45301, 45302, 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45320, 45321, 45322, 45323, 45324, 45325, 45326, 45327, 45328, 45329, 45330, 45331, 45332, 45333, 45334, 45335, 45336, 45337, 45338, 45339, 45340, 45341, 45342, 45347, 45348, 45349, 45352, 45353, 45354, 45355, 45356, 45357, 45358, 45359, 45360, 45361, 45362, 45363, 45364, 45365, 45366, 45367, 45368, 45369, 45370, 45371, 45372, 45373, 45374, 45375, 45376, 45377, 45378, 45379, 45380, 45381, 45382, 45383, 45384, 45385, 45386, 45389, 45390, 45391, 45392, 45393, 45394, 45395, 45396, 45397, 45398, 45399, 45400, 45401, 45402, 45403, 45404, 45405, 45406, 45407, 45408, 45409, 45410, 45411, 45412, 45413, 45414, 45415, 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, 45426, 45427, 45428, 45429, 45430, 45431, 45432, 45433, 45434, 45435, 45436, 45437, 45439, 45440, 45441, 45442, 45443, 45444, 45445, 45446, 45447, 45448, 45449, 45450, 45451, 45452, 45453, 45454, 45455, 45456, 45457, 45458, 45459, 45460, 45461, 45462, 45463, 45464, 45465, 45466, 45467, 45468, 45469, 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, 45480, 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, 45491, 45492, 45493, 45494, 45495, 45496, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, 45515, 45516, 45517, 45518, 45519, 45520, 45521, 45522, 45523, 45524, 45525, 45526, 45527, 45528, 45529, 45530, 45531, 45532, 45533, 45534, 45535, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45544, 45545, 45546, 45547, 45548, 45549, 45550, 45551, 45552, 45553, 45554, 45555, 45556, 45557, 45558, 45559, 45560, 45561, 45562, 45563, 45564, 45565, 45566, 45567, 45568, 45569, 45570, 45571, 45572, 45573, 45574, 45575, 45576, 45577, 45578, 45579, 45580, 45581, 45582, 45583, 45584, 45585, 45586, 45587, 45588, 45589, 45590, 45591, 45592, 45593, 45594, 45595, 45596, 45597, 45598, 45599, 45600, 45601, 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45620, 45621, 45622, 45623, 45624, 45625, 45626, 45627, 45628, 45629, 45630, 45631, 45632, 45633, 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, 45654, 45655, 45656, 45657, 45658, 45659, 45660, 45661, 45662, 45663, 45664, 45665, 45666, 45667, 45668, 45669, 45670, 45671, 45672, 45673, 45674, 45675, 45676, 45677, 45678, 45679, 45680, 45681, 45682, 45683, 45684, 45685, 45686, 45687, 45688, 45689, 45690, 45691, 45692, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45700, 45701, 45702, 45703, 45704, 45705, 45706, 45707, 45708, 45709, 45710, 45711, 45712, 45713, 45714, 45715, 45716, 45717, 45718, 45719, 45720, 45721, 45722, 45723, 45724, 45725, 45726, 45727, 45728, 45729, 45730, 45731, 45733, 45734, 45735, 45736, 45737, 45738, 45739, 45740, 45741, 45742, 45743, 45744, 45745, 45746, 45747, 45748, 45749, 45750, 45751, 45752, 45753, 45754, 45755, 45756, 45757, 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, 45768, 45769, 45770, 45771, 45772, 45775, 45776, 45777, 45778, 45779, 45780, 45781, 45782, 45783, 45784, 45785, 45786, 45787, 45788, 45789, 45790, 45791, 45792, 45793, 45796, 45797, 45798, 45799, 45800, 45801, 45802, 45803, 45804, 45805, 45806, 45807, 45808, 45809, 45810, 45811, 45812, 45813, 45814, 45815, 45816, 45818, 45819, 45820, 45821, 45822, 45823, 45824, 45825, 45826, 45827, 45828, 45829, 45830, 45831, 45832, 45833, 45834, 45835, 45836, 45837, 45838, 45839, 45840, 45841, 45842, 45843, 45844, 45845, 45846, 45847, 45848, 45849, 45850, 45851, 45852, 45853, 45854, 45855, 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, 45906, 45907, 45908, 45909, 45910, 45911, 45912, 45913, 45914, 45915, 45916, 45917, 45918, 45919, 45920, 45923, 45924, 45925, 45926, 45928, 45929, 45930, 45931, 45932, 45933, 45934, 45935, 45936, 45937, 45938, 45939, 45940, 45941, 45942, 45943, 45944, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45952, 45953, 45954, 45955, 45956, 45957, 45958, 45959, 45960, 45964, 45965, 45966, 45967, 45968, 45969, 45970, 45971, 45972, 45973, 45974, 45975, 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45984, 45985, 45986, 45987, 45988, 45989, 45990, 45991, 45992, 45993, 45994, 45995, 45996, 45997, 45998, 45999, 46000, 46001, 46003, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, 46014, 46015, 46016, 46017, 46018, 46019, 46020, 46021, 46025, 46026, 46027, 46028, 46029, 46030, 46031, 46032, 46033, 46034, 46035, 46036, 46037, 46038, 46039, 46040, 46041, 46042, 46043, 46044, 46045, 46046, 46047, 46048, 46049, 46050, 46051, 46052, 46053, 46054, 46055, 46056, 46057, 46058, 46059, 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46071, 46072, 46073, 46074, 46075, 46076, 46077, 46078, 46079, 46080, 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46089, 46090, 46091, 46092, 46093, 46094, 46095, 46096, 46097, 46098, 46099, 46100, 46101, 46102, 46103, 46104, 46105, 46106, 46107, 46108, 46110, 46111, 46112, 46113, 46114, 46115, 46116, 46118, 46120, 46121, 46122, 46123, 46125, 46126, 46128, 46129, 46130, 46131, 46132, 46133, 46134, 46135, 46136, 46137, 46138, 46139, 46140, 46141, 46142, 46145, 46146, 46147, 46148, 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, 46159, 46160, 46161, 46162, 46163, 46170, 46171, 46172, 46173, 46174, 46175, 46178, 46179, 46180, 46181, 46183, 46184, 46185, 46186, 46187, 46188, 46189, 46190, 46191, 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, 46203, 46204, 46205, 46207, 46208, 46209, 46210, 46211, 46212, 46213, 46214, 46215, 46216, 46217, 46218, 46219, 46220, 46221, 46222, 46224, 46225, 46226, 46227, 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46237, 46238, 46239, 46240, 46241, 46242, 46243, 46244, 46245, 46246, 46247, 46248, 46249, 46250, 46251, 46252, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46261, 46262, 46263, 46264, 46265, 46266, 46267, 46268, 46270, 46272, 46273, 46275, 46276, 46277, 46278, 46279, 46280, 46281, 46282, 46283, 46284, 46285, 46286, 46287, 46288, 46289, 46290, 46291, 46292, 46293, 46294, 46295, 46296, 46297, 46298, 46299, 46300, 46301, 46307, 46308, 46309, 46310, 46311, 46312, 46313, 46315, 46316, 46317, 46318, 46319, 46320, 46321, 46322, 46323, 46324, 46325, 46326, 46327, 46328, 46329, 46330, 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, 46341, 46342, 46343, 46344, 46345, 46346, 46348, 46349, 46350, 46351, 46352, 46353, 46354, 46355, 46356, 46357, 46358, 46359, 46360, 46361, 46362, 46363, 46364, 46365, 46366, 46367, 46368, 46369, 46370, 46371, 46372, 46373, 46374, 46375, 46376, 46377, 46379, 46380, 46381, 46383, 46384, 46385, 46386, 46387, 46388, 46389, 46390, 46391, 46392, 46393, 46394, 46395, 46396, 46397, 46398, 46399, 46400, 46401, 46402, 46403, 46404, 46405, 46406, 46407, 46408, 46409, 46410, 46411, 46412, 46413, 46414, 46415, 46416, 46417, 46418, 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46428, 46429, 46430, 46431, 46432, 46433, 46434, 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 46443, 46444, 46445, 46446, 46447, 46448, 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46496, 46497, 46498, 46499, 46500, 46501, 46502, 46503, 46504, 46505, 46506, 46507, 46508, 46509, 46510, 46511, 46513, 46514, 46515, 46516, 46517, 46518, 46519, 46520, 46521, 46522, 46523, 46524, 46525, 46526, 46527, 46528, 46529, 46530, 46531, 46532, 46533, 46534, 46535, 46536, 46537, 46538, 46539, 46540, 46541, 46542, 46543, 46544, 46545, 46546, 46547, 46548, 46549, 46550, 46551, 46552, 46553, 46554, 46555, 46557, 46558, 46559, 46560, 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, 46571, 46572, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, 46582, 46588, 46589, 46590, 46591, 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, 46602, 46603, 46604, 46605, 46606, 46607, 46608, 46609, 46610, 46611, 46612, 46613, 46614, 46615, 46616, 46617, 46618, 46619, 46620, 46621, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46629, 46630, 46631, 46632, 46633, 46634, 46635, 46636, 46637, 46638, 46639, 46640, 46641, 46642, 46643, 46644, 46645, 46646, 46647, 46652, 46653, 46654, 46655, 46656, 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46664, 46665, 46666, 46667, 46668, 46669, 46671, 46672, 46673, 46674, 46675, 46676, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46688, 46689, 46690, 46691, 46692, 46693, 46694, 46695, 46696, 46697, 46698, 46699, 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, 46710, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46748, 46749, 46750, 46751, 46752, 46753, 46754, 46755, 46756, 46757, 46758, 46759, 46760, 46761, 46762, 46763, 46766, 46767, 46768, 46769, 46770, 46771, 46772, 46773, 46774, 46775, 46776, 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46804, 46805, 46806, 46807, 46808, 46809, 46810, 46811, 46812, 46813, 46814, 46815, 46816, 46818, 46819, 46820, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, 46832, 46833, 46837, 46838, 46839, 46840, 46841, 46862, 46863, 46865, 46866, 46867, 46868, 46869, 46870, 46871, 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, 46882, 46883, 46884, 46885, 46886, 46887, 46888, 46889, 46890, 46891, 46892, 46893, 46894, 46895, 46896, 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46904, 46905, 46906, 46907, 46908, 46909, 46910, 46911, 46912, 46913, 46914, 46915, 46916, 46917, 46918, 46920, 46921, 46922, 46923, 46924, 46925, 46929, 46930, 46931, 46932, 46933, 46934, 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46944, 46945, 46946, 46947, 46948, 46949, 46950, 46951, 46952, 46953, 46954, 46955, 46956, 46957, 46958, 46959, 46960, 46961, 46962, 46963, 46964, 46965, 46966, 46970, 46971, 46972, 46973, 46974, 46975, 46976, 46977, 46978, 46979, 46980, 46981, 46982, 46983, 46984, 46985, 46986, 46987, 46988, 46990, 46991, 46992, 46993, 46994, 46995, 46996, 46997, 46998, 46999, 47000, 47001, 47002, 47003, 47004, 47005, 47006, 47007, 47008, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47016, 47017, 47018, 47019, 47020, 47021, 47022, 47023, 47024, 47025, 47026, 47027, 47028, 47029, 47030, 47031, 47032, 47033, 47034, 47035, 47036, 47037, 47038, 47039, 47040, 47041, 47042, 47043, 47044, 47045, 47046, 47047, 47048, 47049, 47050, 47051, 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 47070, 47071, 47072, 47073, 47074, 47075, 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47084, 47085, 47086, 47087, 47088, 47089, 47090, 47091, 47092, 47093, 47094, 47095, 47096, 47097, 47098, 47099, 47100, 47101, 47102, 47103, 47104, 47105, 47106, 47107, 47108, 47110, 47112, 47113, 47114, 47115, 47116, 47117, 47118, 47119, 47120, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47128, 47129, 47130, 47131, 47132, 47133, 47134, 47135, 47136, 47137, 47138, 47139, 47140, 47141, 47142, 47143, 47144, 47145, 47146, 47147, 47148, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47156, 47157, 47158, 47159, 47160, 47161, 47162, 47163, 47164, 47165, 47166, 47167, 47168, 47169, 47170, 47171, 47172, 47173, 47174, 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, 47185, 47186, 47187, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47196, 47197, 47198, 47199, 47200, 47201, 47202, 47203, 47204, 47205, 47206, 47207, 47208, 47209, 47210, 47211, 47212, 47213, 47214, 47215, 47216, 47217, 47218, 47219, 47220, 47221, 47222, 47223, 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47245, 47246, 47247, 47248, 47249, 47251, 47252, 47253, 47254, 47255, 47256, 47257, 47258, 47259, 47260, 47261, 47262, 47263, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, 47272, 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47280, 47281, 47282, 47283, 47284, 47285, 47286, 47287, 47288, 47289, 47290, 47291, 47292, 47293, 47294, 47295, 47296, 47297, 47298, 47299, 47300, 47301, 47302, 47303, 47304, 47305, 47306, 47307, 47308, 47309, 47310, 47311, 47312, 47313, 47314, 47315, 47316, 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47325, 47326, 47327, 47328, 47329, 47330, 47331, 47332, 47333, 47334, 47335, 47336, 47337, 47338, 47339, 47340, 47341, 47342, 47343, 47344, 47345, 47347, 47348, 47349, 47350, 47351, 47352, 47353, 47354, 47355, 47356, 47357, 47358, 47359, 47361, 47362, 47363, 47364, 47365, 47366, 47367, 47368, 47369, 47370, 47371, 47372, 47373, 47376, 47377, 47378, 47379, 47380, 47381, 47382, 47383, 47384, 47385, 47386, 47387, 47388, 47389, 47390, 47391, 47392, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47420, 47421, 47422, 47423, 47424, 47425, 47426, 47427, 47428, 47429, 47430, 47431, 47432, 47433, 47434, 47435, 47436, 47437, 47438, 47439, 47440, 47441, 47442, 47443, 47444, 47445, 47446, 47447, 47448, 47449, 47450, 47451, 47453, 47456, 47457, 47458, 47459, 47460, 47461, 47462, 47463, 47465, 47466, 47467, 47468, 47469, 47470, 47471, 47472, 47473, 47474, 47475, 47476, 47477, 47478, 47479, 47480, 47481, 47482, 47483, 47484, 47485, 47486, 47487, 47488, 47489, 47490, 47491, 47492, 47493, 47494, 47495, 47496, 47497, 47498, 47499, 47500, 47501, 47502, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 47519, 47520, 47521, 47522, 47523, 47524, 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47532, 47533, 47534, 47535, 47536, 47538, 47539, 47540, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47548, 47549, 47550, 47551, 47552, 47553, 47554, 47555, 47556, 47557, 47558, 47559, 47560, 47561, 47562, 47564, 47565, 47566, 47567, 47568, 47569, 47570, 47571, 47572, 47573, 47574, 47575, 47576, 47577, 47578, 47579, 47580, 47581, 47582, 47583, 47584, 47585, 47586, 47587, 47588, 47589, 47590, 47591, 47592, 47594, 47595, 47596, 47597, 47598, 47599, 47600, 47601, 47602, 47603, 47604, 47605, 47606, 47607, 47608, 47609, 47610, 47611, 47612, 47615, 47616, 47618, 47619, 47620, 47621, 47622, 47623, 47624, 47625, 47626, 47627, 47629, 47630, 47631, 47632, 47633, 47634, 47635, 47636, 47637, 47638, 47639, 47640, 47641, 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, 47672, 47673, 47674, 47675, 47676, 47677, 47678, 47679, 47680, 47681, 47682, 47683, 47684, 47685, 47686, 47687, 47688, 47689, 47690, 47691, 47692, 47693, 47694, 47695, 47696, 47697, 47698, 47699, 47700, 47701, 47702, 47703, 47705, 47706, 47707, 47708, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47716, 47717, 47718, 47719, 47720, 47721, 47722, 47723, 47724, 47725, 47726, 47727, 47728, 47729, 47730, 47731, 47732, 47733, 47734, 47735, 47736, 47737, 47739, 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47747, 47748, 47749, 47751, 47752, 47753, 47754, 47755, 47756, 47757, 47758, 47760, 47761, 47762, 47763, 47764, 47765, 47766, 47767, 47768, 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, 47779, 47780, 47781, 47782, 47783, 47784, 47785, 47786, 47787, 47788, 47789, 47790, 47791, 47792, 47793, 47794, 47795, 47796, 47797, 47798, 47799, 47800, 47801, 47802, 47803, 47804, 47805, 47806, 47807, 47808, 47809, 47810, 47811, 47812, 47813, 47814, 47815, 47816, 47817, 47818, 47819, 47820, 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, 47831, 47832, 47833, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, 47843, 47844, 47845, 47846, 47848, 47849, 47850, 47851, 47852, 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, 47863, 47864, 47865, 47866, 47867, 47868, 47869, 47870, 47871, 47872, 47873, 47874, 47875, 47876, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47885, 47886, 47887, 47888, 47889, 47890, 47891, 47892, 47893, 47894, 47895, 47896, 47897, 47898, 47899, 47900, 47901, 47902, 47903, 47904, 47905, 47906, 47907, 47908, 47909, 47910, 47911, 47912, 47913, 47914, 47915, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, 47924, 47925, 47926, 47927, 47928, 47929, 47930, 47931, 47932, 47933, 47934, 47935, 47936, 47937, 47938, 47941, 47942, 47943, 47944, 47945, 47946, 47947, 47948, 47949, 47950, 47951, 47952, 47953, 47954, 47955, 47956, 47957, 47958, 47959, 47960, 47961, 47962, 47963, 47964, 47965, 47966, 47967, 47968, 47969, 47970, 47971, 47972, 47973, 47974, 47975, 47976, 47977, 47978, 47979, 47980, 47981, 47982, 47983, 47984, 47985, 47986, 47987, 47988, 47989, 47990, 47991, 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, 48002, 48003, 48004, 48005, 48006, 48007, 48008, 48009, 48010, 48011, 48012, 48013, 48014, 48015, 48016, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, 48035, 48036, 48037, 48038, 48039, 48040, 48041, 48042, 48043, 48044, 48045, 48046, 48047, 48048, 48049, 48050, 48051, 48052, 48053, 48054, 48055, 48056, 48057, 48058, 48059, 48060, 48061, 48062, 48063, 48064, 48065, 48066, 48067, 48068, 48069, 48070, 48071, 48072, 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48080, 48081, 48082, 48083, 48084, 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, 48105, 48106, 48108, 48109, 48110, 48111, 48112, 48113, 48114, 48115, 48116, 48117, 48118, 48121, 48122, 48123, 48124, 48125, 48126, 48127, 48128, 48129, 48130, 48131, 48132, 48133, 48134, 48135, 48136, 48137, 48138, 48139, 48140, 48141, 48142, 48143, 48144, 48145, 48147, 48148, 48149, 48150, 48151, 48152, 48153, 48154, 48155, 48156, 48157, 48158, 48159, 48160, 48161, 48162, 48163, 48164, 48165, 48166, 48167, 48168, 48169, 48170, 48171, 48172, 48173, 48174, 48175, 48176, 48177, 48178, 48179, 48180, 48181, 48183, 48184, 48185, 48186, 48187, 48188, 48189, 48190, 48191, 48193, 48194, 48195, 48196, 48197, 48198, 48199, 48200, 48201, 48202, 48203, 48204, 48205, 48206, 48207, 48208, 48209, 48210, 48211, 48212, 48213, 48215, 48216, 48217, 48220, 48221, 48222, 48223, 48224, 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, 48245, 48246, 48247, 48248, 48249, 48250, 48253, 48254, 48255, 48256, 48257, 48258, 48259, 48260, 48261, 48262, 48263, 48264, 48265, 48266, 48267, 48268, 48269, 48270, 48271, 48272, 48273, 48274, 48275, 48276, 48277, 48278, 48279, 48280, 48281, 48282, 48283, 48286, 48287, 48288, 48289, 48290, 48291, 48292, 48293, 48294, 48295, 48296, 48297, 48298, 48299, 48300, 48301, 48302, 48303, 48304, 48305, 48306, 48307, 48308, 48309, 48310, 48311, 48312, 48313, 48314, 48315, 48316, 48317, 48318, 48321, 48322, 48323, 48324, 48375, 48445, 48462, 48463, 48464, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48472, 48473, 48474, 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48484, 48493, 48494, 48495, 48496, 48497, 48498, 48499, 48500, 48501, 48504, 48505, 48506, 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48516, 48517, 48518, 48519, 48520, 48521, 48522, 48523, 48524, 48525, 48526, 48527, 48528, 48529, 48530, 48531, 48532, 48533, 48534, 48535, 48536, 48537, 48538, 48539, 48540, 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48548, 48549, 48550, 48551, 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48560, 48561, 48562, 48563, 48564, 48565, 48566, 48567, 48568, 48569, 48570, 48571, 48572, 48573, 48574, 48575, 48576, 48577, 48578, 48588, 48589, 48590, 48591, 48592, 48593, 48594, 48595, 48596, 48597, 48598, 48599, 48600, 48601, 48602, 48603, 48604, 48605, 48606, 48607, 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48617, 48618, 48619, 48620, 48621, 48622, 48623, 48624, 48625, 48626, 48627, 48628, 48629, 48630, 48631, 48632, 48633, 48634, 48635, 48636, 48637, 48638, 48639, 48640, 48641, 48642, 48643, 48646, 48648, 48649, 48650, 48651, 48652, 48653, 48654, 48655, 48656, 48657, 48658, 48659, 48660, 48661, 48662, 48663, 48664, 48665, 48666, 48667, 48668, 48669, 48670, 48671, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, 48680, 48681, 48682, 48684, 48685, 48686, 48687, 48688, 48689, 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, 48700, 48701, 48702, 48704, 48705, 48706, 48707, 48708, 48709, 48710, 48711, 48712, 48713, 48714, 48715, 48716, 48717, 48718, 48727, 48728, 48729, 48730, 48735, 48736, 48737, 48738, 48739, 48740, 48741, 48742, 48743, 48744, 48747, 48748, 48756, 48757, 48758, 48759, 48760, 48761, 48762, 48763, 48764, 48765, 48766, 48767, 48768, 48769, 48770, 48771, 48772, 48773, 48774, 48775, 48776, 48779, 48780, 48781, 48782, 48783, 48784, 48785, 48786, 48787, 48788, 48804, 48805, 48806, 48807, 48808, 48809, 48810, 48811, 48812, 48813, 48814, 48815, 48816, 48817, 48818, 48821, 48824, 48825, 48826, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, 48844, 48845, 48846, 48847, 48848, 48850, 48851, 48852, 48853, 48854, 48855, 48856, 48857, 48858, 48859, 48860, 48861, 48862, 48863, 48864, 48865, 48867, 48868, 48869, 48870, 48871, 48872, 48873, 48874, 48875, 48876, 48877, 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 48886, 48887, 48888, 48889, 48891, 48892, 48894, 48895, 48896, 48897, 48898, 48899, 48900, 48901, 48902, 48903, 48904, 48905, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, 48915, 48916, 48917, 48918, 48919, 48920, 48921, 48922, 48923, 48924, 48925, 48926, 48927, 48928, 48929, 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48953, 48954, 48955, 48956, 48968, 48989, 48990, 48995, 48996, 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49013, 49014, 49015, 49016, 49021, 49023, 49024, 49025, 49026, 49027, 49028, 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49044, 49045, 49046, 49047, 49048, 49049, 49050, 49051, 49052, 49053, 49054, 49055, 49056, 49059, 49060, 49061, 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, 49072, 49081, 49082, 49083, 49084, 49085, 49086, 49087, 49090, 49091, 49092, 49093, 49094, 49095, 49096, 49097, 49098, 49099, 49100, 49101, 49102, 49103, 49104, 49105, 49106, 49107, 49108, 49109, 49110, 49111, 49112, 49113, 49114, 49115, 49116, 49117, 49118, 49119, 49120, 49121, 49122, 49123, 49124, 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, 49143, 49144, 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, 49165, 49166, 49167, 49169, 49170, 49171, 49172, 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49198, 49199, 49200, 49205, 49219, 49220, 49223, 49224, 49225, 49234, 49235, 49236, 49237, 49238, 49239, 49240, 49241, 49242, 49244, 49245, 49246, 49247, 49248, 49249, 49250, 49251, 49252, 49253, 49254, 49255, 49256, 49257, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 49274, 49275, 49276, 49277, 49278, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, 49290, 49291, 49292, 49293, 49294, 49295, 49296, 49297, 49298, 49299, 49308, 49309, 49310, 49311, 49312, 49313, 49314, 49315, 49316, 49317, 49318, 49319, 49320, 49321, 49322, 49323, 49324, 49325, 49326, 49327, 49328, 49329, 49332, 49333, 49334, 49335, 49336, 49337, 49338, 49339, 49340, 49341, 49344, 49345, 49347, 49348, 49351, 49352, 49354, 49360, 49365, 49366, 49367, 49368, 49371, 49414, 49425, 49428, 49429, 49430, 49508, 49562, 49585, 49602, 49606, 49609, 49624, 49625, 49626, 49627, 49628, 49629, 49630, 49631, 49659, 49670, 49712, 49713, 49724, 49735, 49736, 49763, 49764, 49765, 49766, 49768, 49769, 49770, 49771, 49772, 49773, 49776, 49777, 49778, 49779, 49780, 49781, 49782, 49783, 49788, 49789, 49794, 49805, 49806, 49807, 49808, 49809, 49810, 49819, 49820, 49835, 49836, 49844, 49845, 49846, 49847, 49848, 49849, 49850, 49851, 49852, 49853, 49854, 49855, 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49899, 49900, 49903, 49904, 49905, 49906, 49907, 49908, 49912, 49913, 49914, 49935, 49938, 49939, 49941, 49954, 49962, 49963, 49964, 49975, 49976, 49977, 49986, 49997, 50013, 50014, 50152, 50153, 50154, 50155, 50156, 50157, 50158, 50159, 50160, 50161, 50162, 50163, 50164, 50165, 50166, 50167, 50168, 50169, 50170, 50171, 50172, 50173, 50174, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, 50191, 50192, 50211, 50212, 50229, 50232, 50316, 50326, 50356, 50357, 50358, 50359, 50368, 50369, 50370, 50438, 50470, 50471, 50500, 50501, 50502, 50541, 50575, 50613, 50630, 50640, 50643, 50644, 50649, 50650, 50663, 50666, 50685, 50686, 50687, 50688, 50689, 50690, 50691, 50693, 50694, 50697, 50698, 50701, 50702, 50703, 50704, 50705, 50723, 50725, 50726, 50727, 50728, 50729, 50730, 50742, 50743, 50744, 50745, 50746, 50747, 50748, 50749, 50753, 50754, 50757, 50758, 50759, 50760, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50768, 50769, 50770, 50771, 50772, 50773, 50774, 50776, 50777, 50778, 50779, 50796, 50804, 50805, 50807, 50836, 50845, 50854, 50855, 50876, 50881, 50890, 50891, 50898, 50899, 50900, 50901, 50910, 50911, 50912, 50913, 50914, 50915, 50916, 50917, 50918, 50919, 50920, 50921, 50926, 50928, 50929, 50930, 50931, 50932, 50933, 50944, 50949, 50950, 50951, 50952, 50953, 50954, 50955, 50956, 50957, 50958, 50959, 50961, 50962, 50963, 50964, 50965, 50966, 50967, 50968, 50969, 50970, 50971, 50972, 50973, 50974, 50975, 50976, 50977, 50978, 50979, 50980, 50981, 50982, 50983, 50984, 50985, 50986, 50987, 50988, 50989, 50990, 50991, 50992, 50993, 50994, 50995, 50996, 51000, 51001, 51002, 51004, 51005, 51007, 51008, 51009, 51010, 51011, 51012, 51013, 51014, 51015, 51016, 51018, 51019, 51020, 51021, 51022, 51024, 51025, 51026, 51027, 51028, 51029, 51030, 51031, 51032, 51033, 51034, 51035, 51036, 51037, 51045, 51048, 51049, 51050, 51051, 51052, 51053, 51058, 51061, 51062, 51063, 51064, 51065, 51066, 51067, 51068, 51069, 51070, 51071, 51072, 51073, 51074, 51075, 51076, 51077, 51078, 51079, 51080, 51081, 51082, 51083, 51084, 51085, 51086, 51087, 51088, 51089, 51090, 51091, 51092, 51093, 51094, 51095, 51096, 51097, 51098, 51099, 51100, 51101, 51102, 51103, 51104, 51105, 51106, 51107, 51108, 51109, 51110, 51111, 51112, 51113, 51114, 51115, 51116, 51117, 51118, 51120, 51121, 51122, 51123, 51124, 51125, 51126, 51127, 51128, 51129, 51130, 51131, 51132, 51133, 51134, 51135, 51144, 51145, 51146, 51161, 51162, 51164, 51165, 51166, 51167, 51168, 51169, 51170, 51171, 51172, 51173, 51174, 51175, 51176, 51177, 51178, 51179, 51180, 51181, 51182, 51183, 51186, 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 51195, 51196, 51197, 51198, 51199, 51200, 51201, 51202, 51203, 51204, 51205, 51206, 51207, 51210, 51211, 51212, 51213, 51214, 51215, 51216, 51217, 51218, 51219, 51220, 51221, 51222, 51223, 51224, 51225, 51226, 51227, 51228, 51229, 51230, 51231, 51232, 51233, 51234, 51235, 51236, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51244, 51245, 51246, 51247, 51248, 51249, 51250, 51251, 51252, 51253, 51254, 51255, 51256, 51258, 51259, 51260, 51261, 51262, 51263, 51264, 51265, 51266, 51267, 51268, 51269, 51270, 51271, 51272, 51273, 51274, 51275, 51276, 51277, 51278, 51279, 51280, 51281, 51282, 51283, 51284, 51285, 51286, 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, 51307, 51308, 51309, 51310, 51311, 51312, 51313, 51314, 51315, 51316, 51317, 51318, 51319, 51320, 51321, 51322, 51323, 51324, 51325, 51326, 51327, 51328, 51329, 51330, 51331, 51332, 51333, 51334, 51336, 51337, 51338, 51340, 51342, 51343, 51344, 51345, 51346, 51347, 51348, 51349, 51350, 51351, 51352, 51353, 51354, 51355, 51356, 51357, 51358, 51359, 51360, 51361, 51362, 51363, 51364, 51365, 51366, 51367, 51368, 51369, 51370, 51372, 51373, 51374, 51375, 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, 51386, 51387, 51388, 51389, 51390, 51391, 51392, 51393, 51394, 51395, 51396, 51397, 51398, 51399, 51400, 51401, 51402, 51403, 51404, 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51412, 51413, 51414, 51415, 51416, 51417, 51418, 51419, 51420, 51423, 51424, 51425, 51426, 51427, 51428, 51429, 51430, 51431, 51432, 51441, 51442, 51443, 51444, 51445, 51446, 51447, 51448, 51449, 51450, 51451, 51452, 51453, 51454, 51455, 51456, 51457, 51458, 51459, 51460, 51461, 51463, 51464, 51465, 51466, 51467, 51468, 51469, 51470, 51471, 51472, 51473, 51474, 51475, 51476, 51477, 51478, 51479, 51480, 51481, 51482, 51483, 51484, 51485, 51486, 51487, 51488, 51490, 51491, 51492, 51493, 51495, 51496, 51497, 51498, 51499, 51500, 51501, 51502, 51503, 51504, 51505, 51507, 51510, 51511, 51512, 51517, 51518, 51520, 51525, 51526, 51529, 51530, 51531, 51532, 51533, 51534, 51535, 51536, 51537, 51540, 51541, 51542, 51543, 51548, 51549, 51550, 51551, 51554, 51559, 51568, 51573, 51574, 51575, 51576, 51577, 51578, 51579, 51580, 51582, 51584, 51585, 51586, 51587, 51588, 51589, 51590, 51591, 51592, 51593, 51594, 51595, 51596, 51597, 51599, 51600, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51608, 51609, 51610, 51611, 51612, 51613, 51614, 51615, 51616, 51617, 51618, 51621, 51628, 51629, 51630, 51631, 51632, 51633, 51636, 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, 51647, 51648, 51649, 51650, 51651, 51652, 51655, 51657, 51658, 51659, 51660, 51661, 51662, 51663, 51664, 51665, 51666, 51670, 51671, 51672, 51674, 51675, 51676, 51677, 51678, 51679, 51680, 51681, 51682, 51683, 51684, 51685, 51712, 51713, 51714, 51715, 51716, 51717, 51718, 51719, 51720, 51721, 51722, 51723, 51724, 51733, 51734, 51735, 51736, 51737, 51738, 51739, 51740, 51741, 51742, 51743, 51744, 51745, 51746, 51747, 51755, 51756, 51757, 51758, 51759, 51760, 51761, 51763, 51764, 51766, 51767, 51768, 51769, 51770, 51771, 51772, 51775, 51777, 51778, 51779, 51780, 51781, 51782, 51784, 51787, 51789, 51790, 51791, 51792, 51793, 51794, 51795, 51796, 51797, 51798, 51799, 51800, 51809, 51810, 51811, 51812, 51813, 51814, 51815, 51818, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, 51837, 51848, 51858, 51859, 51860, 51861, 51863, 51864, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, 51877, 51878, 51879, 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51889, 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, 51900, 51901, 51902, 51916, 51919, 51920, 51921, 51922, 51923, 51924, 51925, 51926, 51927, 51928, 51929, 51930, 51931, 51932, 51933, 51934, 51976, 51977, 51978, 51987, 51988, 51989, 51990, 51991, 51992, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52000, 52001, 52002, 52003, 52004, 52005, 52006, 52008, 52009, 52010, 52011, 52012, 52013, 52014, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, 52028, 52029, 52030, 52031, 52032, 52033, 52034, 52035, 52036, 52047, 52048, 52049, 52050, 52055, 52056, 52057, 52058, 52074, 52077, 52078, 52084, 52086, 52095, 52098, 52099, 52100, 52103, 52104, 52106, 52111, 52164, 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52180, 52181, 52182, 52183, 52184, 52185, 52186, 52187, 52188, 52189, 52190, 52191, 52192, 52193, 52194, 52195, 52196, 52199, 52200, 52201, 52202, 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, 52213, 52222, 52223, 52224, 52229, 52230, 52231, 52232, 52233, 52241, 52261, 52262, 52263, 52264, 52265, 52266, 52268, 52269, 52271, 52272, 52273, 52274, 52275, 52276, 52277, 52278, 52279, 52280, 52281, 52282, 52283, 52284, 52285, 52294, 52295, 52296, 52297, 52298, 52299, 52300, 52301, 52302, 52303, 52304, 52305, 52306, 52307, 52308, 52309, 52310, 52313, 52314, 52316, 52317, 52318, 52319, 52320, 52321, 52331, 52332, 52333, 52334, 52335, 52341, 52343, 52344, 52345, 52346, 52347, 52348, 52349, 52350, 52352, 52353, 52354, 52355, 52356, 52357, 52366, 52367, 52368, 52369, 52370, 52371, 52372, 52373, 52374, 52375, 52376, 52377, 52378, 52379, 52380, 52381, 52382, 52383, 52384, 52385, 52386, 52387, 52388, 52389, 52390, 52391, 52392, 52393, 52394, 52395, 52396, 52397, 52398, 52399, 52400, 52401, 52402, 52403, 52404, 52405, 52406, 52407, 52408, 52409, 52410, 52411, 52412, 52413, 52414, 52415, 52416, 52417, 52418, 52422, 52423, 52424, 52425, 52426, 52427, 52428, 52430, 52431, 52432, 52433, 52434, 52435, 52436, 52437, 52438, 52439, 52440, 52441, 52458, 52459, 52460, 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, 52472, 52473, 52474, 52475, 52476, 52477, 52478, 52479, 52480, 52481, 52482, 52483, 52484, 52485, 52486, 52487, 52489, 52490, 52491, 52492, 52493, 52494, 52495, 52496, 52497, 52498, 52499, 52500, 52501, 52502, 52503, 52508, 52509, 52510, 52511, 52512, 52513, 52514, 52515, 52516, 52517, 52518, 52519, 52520, 52521, 52525, 52526, 52527, 52528, 52530, 52531, 52532, 52533, 52534, 52535, 52536, 52537, 52538, 52539, 52540, 52541, 52542, 52543, 52544, 52545, 52546, 52547, 52548, 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, 52569, 52570, 52571, 52572, 52573, 52574, 52575, 52576, 52577, 52578, 52579, 52580, 52581, 52582, 52583, 52584, 52585, 52586, 52587, 52590, 52591, 52592, 52593, 52594, 52595, 52596, 52597, 52598, 52599, 52600, 52601, 52602, 52605, 52606, 52607, 52608, 52609, 52610, 52611, 52612, 52614, 52615, 52621, 52622, 52623, 52624, 52625, 52626, 52627, 52628, 52629, 52630, 52631, 52632, 52633, 52634, 52635, 52636, 52637, 52638, 52639, 52640, 52641, 52642, 52643, 52644, 52645, 52646, 52648, 52652, 52653, 52656, 52657, 52659, 52661, 52668, 52683, 52684, 52685, 52686, 52687, 52688, 52693, 52694, 52695, 52696, 52697, 52698, 52699, 52703, 52705, 52706, 52707, 52710, 52711, 52712, 52713, 52714, 52715, 52716, 52717, 52718, 52719, 52720, 52723, 52724, 52729, 52730, 52731, 52732, 52733, 52734, 52735, 52736, 52737, 52738, 52739, 52740, 52741, 52742, 52743, 52744, 52745, 52746, 52747, 52748, 52749, 52750, 52751, 52752, 52753, 52754, 52756, 52757, 52758, 52759, 52760, 52761, 52762, 52764, 52766, 52767, 52768, 52769, 52770, 52771, 52772, 52773, 52774, 52775, 52776, 52777, 52778, 52779, 52780, 52781, 52782, 52783, 52784, 52785, 52792, 52793, 52794, 52796, 52808, 52809, 52818, 52823, 52824, 52825, 52826, 52827, 52828, 52829, 52830, 52831, 52832, 52833, 52834, 52835, 52837, 52838, 52841, 52843, 52847, 52849, 52850, 52851, 52854, 52856, 52857, 52858, 52859, 52860, 52861, 52862, 52864, 52865, 52867, 52868, 52869, 52870, 52873, 52874, 52875, 52876, 52877, 52878, 52879, 52880, 52881, 52882, 52883, 52884, 52886, 52887, 52888, 52889, 52890, 52891, 52892, 52893, 52894, 52895, 52896, 52897, 52898, 52899, 52900, 52901, 52902, 52903, 52905, 52906, 52907, 52908, 52909, 52910, 52911, 52912, 52913, 52914, 52915, 52916, 52921, 52922, 52923, 52924, 52925, 52926, 52927, 52928, 52929, 52930, 52931, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52953, 52954, 52955, 52956, 52957, 52958, 52960, 52961, 52962, 52963, 52964, 52965, 52966, 52967, 52968, 52969, 52970, 52971, 52972, 52973, 52975, 52976, 52977, 52978, 52981, 52982, 52983, 52984, 52985, 52986, 52987, 52988, 52989, 52990, 52991, 52992, 52993, 52994, 52995, 52996, 52997, 52998, 52999, 53000, 53001, 53002, 53003, 53004, 53005, 53010, 53015, 53016, 53017, 53018, 53019, 53020, 53021, 53022, 53023, 53024, 53025, 53026, 53027, 53028, 53029, 53030, 53031, 53032, 53033, 53036, 53037, 53038, 53039, 53040, 53041, 53042, 53043, 53044, 53045, 53046, 53047, 53048, 53049, 53050, 53051, 53052, 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 53061, 53062, 53063, 53064, 53065, 53066, 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53076, 53077, 53078, 53079, 53086, 53087, 53088, 53089, 53090, 53091, 53092, 53093, 53094, 53095, 53096, 53097, 53098, 53099, 53100, 53101, 53102, 53103, 53104, 53105, 53106, 53107, 53108, 53109, 53110, 53111, 53112, 53113, 53114, 53115, 53116, 53117, 53120, 53121, 53122, 53124, 53125, 53126, 53128, 53129, 53130, 53131, 53132, 53133, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, 53152, 53153, 53154, 53155, 53156, 53157, 53158, 53159, 53160, 53161, 53162, 53163, 53164, 53165, 53166, 53171, 53174, 53175, 53177, 53182, 53183, 53190, 53194, 53195, 53196, 53200, 53201, 53203, 53204, 53205, 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53217, 53218, 53219, 53220, 53221, 53222, 53223, 53224, 53225, 53226, 53227, 53228, 53229, 53230, 53231, 53232, 53233, 53234, 53235, 53236, 53237, 53238, 53239, 53255, 53256, 53257, 53258, 53259, 53260, 53261, 53262, 53263, 53264, 53265, 53266, 53267, 53268, 53269, 53270, 53271, 53272, 53273, 53274, 53275, 53276, 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, 53287, 53288, 53289, 53291, 53292, 53293, 53294, 53295, 53296, 53297, 53299, 53300, 53301, 53302, 53303, 53304, 53305, 53306, 53307, 53308, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53316, 53317, 53318, 53319, 53321, 53322, 53323, 53324, 53325, 53326, 53327, 53328, 53330, 53331, 53332, 53339, 53340, 53341, 53342, 53343, 53344, 53345, 53346, 53347, 53348, 53349, 53350, 53351, 53352, 53353, 53354, 53355, 53356, 53357, 53358, 53359, 53360, 53362, 53363, 53364, 53365, 53366, 53367, 53368, 53369, 53370, 53371, 53372, 53373, 53374, 53375, 53376, 53380, 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, 53391, 53392, 53393, 53394, 53395, 53396, 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, 53407, 53408, 53409, 53410, 53411, 53412, 53413, 53414, 53415, 53416, 53417, 53418, 53419, 53420, 53421, 53422, 53423, 53424, 53425, 53426, 53427, 53428, 53431, 53432, 53433, 53434, 53435, 53436, 53437, 53438, 53439, 53440, 53441, 53442, 53443, 53444, 53445, 53446, 53447, 53448, 53449, 53450, 53451, 53452, 53453, 53454, 53455, 53456, 53457, 53458, 53459, 53460, 53461, 53462, 53463, 53464, 53465, 53466, 53467, 53468, 53469, 53470, 53471, 53472, 53473, 53474, 53475, 53476, 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53489, 53490, 53491, 53492, 53493, 53494, 53495, 53496, 53497, 53498, 53499, 53500, 53501, 53502, 53503, 53504, 53505, 53506, 53507, 53508, 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53517, 53518, 53519, 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, 53530, 53531, 53532, 53533, 53534, 53535, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, 53544, 53546, 53547, 53548, 53549, 53566, 53567, 53569, 53570, 53575, 53576, 53578, 53579, 53580, 53581, 53582, 53587, 53588, 53589, 53590, 53591, 53593, 53597, 53598, 53601, 53602, 53603, 53604, 53605, 53606, 53607, 53608, 53609, 53610, 53611, 53612, 53613, 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, 53624, 53625, 53626, 53627, 53628, 53629, 53630, 53631, 53632, 53633, 53634, 53635, 53636, 53637, 53638, 53639, 53640, 53641, 53642, 53643, 53644, 53645, 53646, 53648, 53649, 53650, 53652, 53656, 53657, 53658, 53659, 53660, 53661, 53662, 53663, 53664, 53665, 53666, 53667, 53668, 53669, 53670, 53671, 53672, 53673, 53674, 53675, 53676, 53677, 53678, 53679, 53680, 53681, 53682, 53683, 53684, 53685, 53686, 53687, 53688, 53689, 53690, 53691, 53692, 53693, 53694, 53695, 53696, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, 53706, 53707, 53708, 53713, 53714, 53715, 53716, 53718, 53719, 53720, 53722, 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, 53733, 53734, 53735, 53737, 53738, 53739, 53740, 53741, 53742, 53744, 53745, 53747, 53748, 53749, 53750, 53751, 53752, 53753, 53754, 53756, 53757, 53758, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 53767, 53768, 53769, 53770, 53771, 53772, 53773, 53774, 53775, 53776, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, 53796, 53800, 53801, 53802, 53803, 53804, 53805, 53806, 53807, 53808, 53809, 53810, 53811, 53812, 53813, 53814, 53815, 53816, 53817, 53818, 53819, 53820, 53821, 53822, 53823, 53824, 53825, 53826, 53827, 53828, 53829, 53830, 53831, 53832, 53833, 53834, 53835, 53836, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53852, 53853, 53854, 53855, 53856, 53857, 53858, 53859, 53860, 53861, 53862, 53863, 53864, 53865, 53866, 53867, 53868, 53869, 53870, 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, 53881, 53888, 53890, 53891, 53892, 53893, 53894, 53895, 53896, 53897, 53898, 53899, 53900, 53901, 53902, 53903, 53904, 53905, 53907, 53908, 53909, 53910, 53911, 53912, 53913, 53914, 53915, 53916, 53917, 53918, 53919, 53920, 53921, 53922, 53923, 53924, 53925, 53926, 53927, 53928, 53929, 53930, 53931, 53932, 53933, 53934, 53935, 53936, 53937, 53938, 53939, 53940, 53941, 53942, 53943, 53944, 53945, 53946, 53947, 53948, 53949, 53950, 53951, 53952, 53953, 53954, 53955, 53956, 53957, 53958, 53959, 53960, 53961, 53962, 53963, 53964, 53965, 53966, 53967, 53968, 53969, 53970, 53971, 53972, 53973, 53974, 53975, 53976, 53977, 53978, 53979, 53980, 53981, 53982, 53983, 53984, 53986, 53987, 53988, 53989, 53990, 53991, 53992, 53993, 53994, 53995, 53997, 53998, 53999, 54000, 54004, 54006, 54007, 54008, 54009, 54014, 54015, 54016, 54019, 54020, 54021, 54022, 54023, 54024, 54025, 54026, 54027, 54028, 54029, 54030, 54031, 54032, 54033, 54034, 54035, 54036, 54037, 54038, 54039, 54040, 54041, 54061, 54062, 54063, 54064, 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54072, 54073, 54074, 54075, 54076, 54077, 54078, 54079, 54086, 54087, 54090, 54091, 54092, 54093, 54094, 54095, 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54104, 54105, 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, 54116, 54119, 54120, 54121, 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54140, 54141, 54142, 54143, 54144, 54145, 54146, 54147, 54148, 54149, 54150, 54151, 54152, 54153, 54154, 54155, 54156, 54157, 54158, 54159, 54160, 54161, 54162, 54163, 54164, 54165, 54166, 54167, 54168, 54169, 54170, 54171, 54172, 54173, 54174, 54176, 54177, 54178, 54179, 54180, 54181, 54182, 54183, 54184, 54185, 54188, 54189, 54190, 54192, 54193, 54194, 54195, 54196, 54201, 54202, 54203, 54204, 54205, 54206, 54207, 54208, 54209, 54210, 54211, 54212, 54213, 54214, 54215, 54216, 54217, 54218, 54219, 54220, 54221, 54222, 54223, 54224, 54225, 54226, 54228, 54229, 54230, 54231, 54232, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54241, 54242, 54243, 54244, 54245, 54246, 54247, 54249, 54250, 54252, 54253, 54254, 54255, 54256, 54257, 54258, 54259, 54260, 54261, 54262, 54263, 54265, 54266, 54267, 54272, 54273, 54274, 54275, 54276, 54282, 54283, 54284, 54285, 54286, 54287, 54288, 54289, 54290, 54291, 54293, 54294, 54295, 54296, 54297, 54298, 54299, 54300, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54321, 54322, 54323, 54324, 54325, 54326, 54327, 54328, 54329, 54330, 54331, 54332, 54337, 54338, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, 54350, 54351, 54352, 54353, 54354, 54355, 54356, 54357, 54362, 54363, 54364, 54365, 54366, 54367, 54368, 54369, 54370, 54371, 54372, 54373, 54374, 54375, 54376, 54377, 54378, 54379, 54380, 54381, 54382, 54383, 54385, 54386, 54387, 54388, 54389, 54390, 54391, 54396, 54397, 54398, 54399, 54400, 54402, 54403, 54404, 54405, 54406, 54407, 54408, 54409, 54410, 54411, 54412, 54413, 54414, 54415, 54416, 54417, 54418, 54419, 54420, 54421, 54422, 54423, 54428, 54429, 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, 54440, 54441, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, 54451, 54452, 54453, 54454, 54455, 54456, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, 54475, 54476, 54477, 54478, 54479, 54480, 54481, 54482, 54483, 54484, 54485, 54486, 54487, 54488, 54490, 54491, 54492, 54493, 54494, 54495, 54496, 54497, 54502, 54503, 54504, 54505, 54506, 54507, 54508, 54509, 54510, 54511, 54512, 54514, 54515, 54516, 54517, 54518, 54519, 54520, 54521, 54522, 54523, 54524, 54525, 54526, 54527, 54528, 54529, 54530, 54532, 54533, 54534, 54535, 54536, 54537, 54539, 54540, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54548, 54549, 54550, 54551, 54552, 54553, 54554, 54555, 54556, 54557, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, 54566, 54569, 54570, 54571, 54572, 54573, 54574, 54575, 54576, 54577, 54578, 54579, 54581, 54582, 54583, 54584, 54585, 54586, 54587, 54588, 54589, 54590, 54591, 54592, 54593, 54594, 54595, 54596, 54597, 54598, 54599, 54600, 54601, 54602, 54603, 54604, 54605, 54606, 54607, 54608, 54609, 54610, 54611, 54612, 54613, 54614, 54615, 54616, 54617, 54618, 54619, 54620, 54621, 54622, 54623, 54624, 54625, 54626, 54627, 54630, 54631, 54632, 54633, 54634, 54635, 54636, 54637, 54638, 54639, 54640, 54641, 54642, 54643, 54644, 54645, 54646, 54647, 54648, 54649, 54650, 54655, 54656, 54657, 54658, 54659, 54660, 54661, 54662, 54663, 54664, 54666, 54667, 54668, 54669, 54670, 54671, 54672, 54673, 54674, 54675, 54676, 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54685, 54686, 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 54696, 54697, 54698, 54699, 54700, 54701, 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, 54722, 54723, 54724, 54725, 54727, 54728, 54729, 54731, 54732, 54733, 54734, 54736, 54739, 54740, 54741, 54744, 54745, 54746, 54747, 54748, 54749, 54750, 54751, 54752, 54753, 54754, 54755, 54756, 54757, 54758, 54759, 54760, 54761, 54762, 54763, 54764, 54765, 54766, 54767, 54768, 54769, 54770, 54771, 54772, 54773, 54774, 54775, 54776, 54777, 54779, 54780, 54781, 54782, 54783, 54784, 54785, 54786, 54787, 54789, 54790, 54791, 54792, 54793, 54794, 54795, 54796, 54798, 54799, 54800, 54801, 54802, 54803, 54804, 54805, 54806, 54807, 54808, 54809, 54810, 54811, 54812, 54814, 54815, 54816, 54817, 54818, 54819, 54820, 54821, 54822, 54823, 54824, 54825, 54826, 54827, 54828, 54829, 54830, 54831, 54832, 54833, 54835, 54836, 54837, 54838, 54839, 54840, 54841, 54842, 54843, 54844, 54845, 54846, 54847, 54848, 54849, 54850, 54851, 54854, 54855, 54856, 54857, 54858, 54859, 54860, 54861, 54862, 54863, 54864, 54865, 54866, 54868, 54869, 54870, 54871, 54872, 54873, 54874, 54876, 54878, 54879, 54880, 54881, 54883, 54886, 54887, 54890, 54891, 54893, 54894, 54895, 54896, 54897, 54898, 54899, 54900, 54901, 54902, 54903, 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 54913, 54914, 54915, 54916, 54917, 54918, 54919, 54920, 54921, 54922, 54923, 54924, 54925, 54926, 54927, 54928, 54929, 54930, 54931, 54932, 54933, 54934, 54935, 54936, 54937, 54938, 54939, 54940, 54941, 54942, 54943, 54944, 54945, 54946, 54947, 54948, 54949, 54950, 54951, 54952, 54953, 54954, 54955, 54956, 54957, 54958, 54959, 54960, 54961, 54962, 54963, 54964, 54965, 54966, 54967, 54968, 54969, 54970, 54971, 54972, 54973, 54974, 54975, 54976, 54977, 54978, 54979, 54980, 54981, 54982, 54983, 54984, 54985, 54986, 54987, 54988, 54989, 54990, 54991, 54992, 54993, 54994, 54995, 54996, 54997, 54998, 54999, 55000, 55001, 55002, 55003, 55004, 55005, 55006, 55007, 55008, 55009, 55015, 55016, 55017, 55018, 55019, 55020, 55021, 55022, 55023, 55024, 55025, 55026, 55027, 55028, 55029, 55030, 55031, 55036, 55037, 55042, 55043, 55044, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, 55054, 55055, 55056, 55057, 55058, 55059, 55060, 55061, 55062, 55063, 55064, 55065, 55066, 55067, 55068, 55069, 55070, 55071, 55072, 55073, 55074, 55075, 55076, 55077, 55078, 55080, 55081, 55082, 55083, 55084, 55085, 55086, 55087, 55088, 55089, 55091, 55092, 55093, 55094, 55095, 55096, 55097, 55098, 55099, 55100, 55101, 55102, 55103, 55104, 55107, 55108, 55110, 55111, 55112, 55113, 55114, 55115, 55116, 55117, 55118, 55119, 55120, 55121, 55122, 55123, 55124, 55125, 55126, 55127, 55128, 55129, 55130, 55131, 55132, 55133, 55134, 55135, 55136, 55137, 55138, 55139, 55140, 55141, 55142, 55143, 55144, 55145, 55146, 55147, 55148, 55149, 55150, 55151, 55152, 55153, 55154, 55155, 55159, 55160, 55161, 55162, 55169, 55170, 55186, 55200, 55201, 55203, 55204, 55205, 55206, 55207, 55208, 55209, 55210, 55211, 55212, 55214, 55217, 55218, 55219, 55220, 55221, 55222, 55223, 55224, 55225, 55226, 55227, 55228, 55229, 55230, 55231, 55232, 55233, 55234, 55235, 55236, 55237, 55238, 55239, 55240, 55241, 55242, 55243, 55244, 55245, 55246, 55247, 55248, 55249, 55250, 55251, 55252, 55253, 55254, 55255, 55256, 55257, 55258, 55259, 55260, 55261, 55262, 55263, 55264, 55265, 55266, 55267, 55268, 55269, 55270, 55271, 55272, 55273, 55274, 55275, 55276, 55277, 55278, 55279, 55280, 55281, 55282, 55283, 55284, 55285, 55286, 55287, 55288, 55289, 55290, 55291, 55292, 55293, 55294, 55295, 55296, 55297, 55298, 55299, 55300, 55301, 55302, 55303, 55306, 55307, 55308, 55309, 55310, 55311, 55312, 55313, 55314, 55315, 55316, 55317, 55318, 55319, 55320, 55321, 55322, 55323, 55324, 55325, 55326, 55327, 55329, 55335, 55340, 55341, 55342, 55343, 55344, 55345, 55346, 55347, 55348, 55349, 55350, 55351, 55352, 55353, 55354, 55355, 55356, 55357, 55358, 55359, 55360, 55361, 55362, 55363, 55364, 55365, 55366, 55367, 55368, 55369, 55370, 55371, 55372, 55373, 55374, 55375, 55376, 55377, 55378, 55380, 55382, 55383, 55384, 55385, 55404, 55406, 55411, 55412, 55413, 55414, 55415, 55416, 55417, 55418, 55419, 55422, 55423, 55424, 55425, 55426, 55427, 55428, 55429, 55431, 55432, 55433, 55434, 55436, 55437, 55438, 55439, 55440, 55441, 55442, 55443, 55445, 55446, 55447, 55448, 55450, 55451, 55452, 55453, 55454, 55455, 55456, 55457, 55458, 55459, 55460, 55461, 55462, 55463, 55464, 55465, 55466, 55467, 55468, 55469, 55470, 55471, 55472, 55473, 55474, 55475, 55476, 55477, 55478, 55479, 55480, 55481, 55482, 55483, 55484, 55485, 55486, 55487, 55488, 55489, 55492, 55493, 55494, 55495, 55496, 55497, 55498, 55499, 55500, 55501, 55502, 55503, 55504, 55505, 55506, 55507, 55508, 55509, 55510, 55511, 55512, 55513, 55514, 55515, 55516, 55517, 55518, 55519, 55520, 55521, 55522, 55523, 55528, 55529, 55530, 55531, 55537, 55538, 55539, 55540, 55541, 55542, 55543, 55544, 55545, 55546, 55547, 55548, 55549, 55550, 55551, 55552, 55553, 55554, 55555, 55556, 55557, 55558, 55559, 55561, 55562, 55563, 55564, 55565, 55566, 55567, 55568, 55569, 55570, 55571, 55572, 55573, 55576, 55577, 55578, 55579, 55580, 55581, 55582, 55583, 55584, 55585, 55586, 55587, 55588, 55589, 55590, 55591, 55592, 55593, 55594, 55595, 55596, 55602, 55603, 55604, 55605, 55606, 55607, 55608, 55609, 55610, 55615, 55616, 55617, 55618, 55619, 55620, 55621, 55622, 55623, 55624, 55625, 55626, 55627, 55628, 55629, 55630, 55631, 55632, 55633, 55634, 55635, 55640, 55641, 55642, 55643, 55644, 55645, 55646, 55647, 55648, 55649, 55650, 55651, 55652, 55653, 55654, 55655, 55656, 55657, 55658, 55659, 55660, 55661, 55662, 55663, 55664, 55665, 55666, 55667, 55668, 55669, 55670, 55671, 55672, 55673, 55674, 55675, 55676, 55677, 55678, 55679, 55680, 55681, 55682, 55683, 55684, 55685, 55686, 55687, 55688, 55689, 55690, 55691, 55692, 55693, 55694, 55695, 55696, 55697, 55698, 55699, 55700, 55701, 55702, 55703, 55704, 55705, 55706, 55707, 55708, 55709, 55710, 55711, 55712, 55713, 55718, 55719, 55720, 55721, 55722, 55723, 55724, 55725, 55726, 55733, 55734, 55735, 55736, 55737, 55738, 55739, 55740, 55741, 55742, 55744, 55745, 55746, 55747, 55748, 55752, 55753, 55754, 55755, 55756, 55757, 55758, 55759, 55760, 55761, 55762, 55763, 55764, 55765, 55766, 55767, 55768, 55769, 55770, 55771, 55772, 55773, 55774, 55775, 55776, 55777, 55778, 55779, 55780, 55781, 55782, 55783, 55784, 55785, 55786, 55787, 55788, 55789, 55792, 55793, 55794, 55795, 55796, 55797, 55798, 55799, 55800, 55801, 55802, 55803, 55804, 55805, 55806, 55807, 55808, 55809, 55810, 55811, 55814, 55815, 55816, 55817, 55818, 55819, 55820, 55821, 55822, 55823, 55824, 55825, 55826, 55827, 55828, 55829, 55830, 55831, 55832, 55833, 55834, 55835, 55836, 55837, 55838, 55839, 55840, 55841, 55842, 55843, 55844, 55845, 55846, 55847, 55849, 55850, 55851, 55852, 55853, 55854, 55855, 55858, 55860, 55861, 55862, 55863, 55864, 55865, 55866, 55867, 55868, 55869, 55870, 55871, 55872, 55877, 55878, 55879, 55880, 55881, 55882, 55883, 55884, 55885, 55886, 55887, 55888, 55889, 55890, 55891, 55892, 55893, 55894, 55895, 55896, 55897, 55898, 55899, 55900, 55901, 55902, 55903, 55904, 55905, 55906, 55907, 55908, 55909, 55910, 55911, 55912, 55913, 55914, 55915, 55916, 55917, 55918, 55919, 55920, 55921, 55922, 55923, 55924, 55925, 55926, 55927, 55928, 55929, 55930, 55931, 55932, 55933, 55934, 55935, 55936, 55937, 55938, 55939, 55940, 55941, 55942, 55943, 55944, 55945, 55946, 55947, 55948, 55949, 55950, 55951, 55952, 55953, 55954, 55955, 55956, 55957, 55958, 55959, 55960, 55961, 55962, 55963, 55964, 55965, 55966, 55967, 55968, 55969, 55971, 55972, 55973, 55974, 55975, 55976, 55977, 55978, 55979, 55980, 55981, 55982, 55983, 55984, 55985, 55986, 55987, 55988, 55989, 55990, 55991, 55992, 55993, 55994, 55995, 55996, 55997, 55998, 55999, 56000, 56001, 56002, 56003, 56004, 56005, 56006, 56007, 56008, 56009, 56014, 56015, 56016, 56017, 56018, 56019, 56020, 56021, 56022, 56023, 56024, 56025, 56026, 56027, 56028, 56029, 56030, 56031, 56032, 56033, 56034, 56035, 56036, 56037, 56038, 56039, 56040, 56041, 56042, 56043, 56044, 56045, 56046, 56047, 56054, 56055, 56056, 56057, 56058, 56059, 56060, 56061, 56062, 56063, 56064, 56065, 56066, 56067, 56068, 56069, 56070, 56071, 56072, 56073, 56074, 56075, 56076, 56077, 56078, 56079, 56080, 56081, 56082, 56083, 56084, 56085, 56086, 56087, 56088, 56089, 56090, 56091, 56092, 56093, 56094, 56095, 56096, 56097, 56098, 56099, 56100, 56105, 56106, 56107, 56108, 56109, 56110, 56111, 56112, 56113, 56114, 56115, 56116, 56117, 56118, 56119, 56120, 56121, 56122, 56123, 56124, 56125, 56126, 56127, 56128, 56129, 56130, 56131, 56132, 56133, 56134, 56135, 56136, 56137, 56138, 56139, 56140, 56141, 56142, 56143, 56144, 56145, 56146, 56147, 56148, 56149, 56150, 56151, 56152, 56153, 56154, 56155, 56156, 56157, 56158, 56159, 56160, 56161, 56162, 56163, 56164, 56165, 56166, 56167, 56168, 56173, 56174, 56175, 56176, 56177, 56178, 56179, 56180, 56181, 56182, 56183, 56184, 56185, 56186, 56187, 56188, 56189, 56190, 56191, 56192, 56193, 56194, 56195, 56196, 56197, 56198, 56199, 56200, 56201, 56202, 56203, 56204, 56205, 56206, 56207, 56208, 56209, 56210, 56211, 56212, 56213, 56214, 56215, 56216, 56217, 56218, 56219, 56220, 56221, 56222, 56223, 56224, 56225, 56226, 56227, 56228, 56229, 56230, 56231, 56232, 56233, 56235, 56236, 56237, 56238, 56239, 56240, 56241, 56242, 56243, 56244, 56245, 56246, 56247, 56248, 56249, 56250, 56251, 56252, 56253, 56254, 56255, 56257, 56258, 56259, 56260, 56261, 56262, 56263, 56264, 56265, 56266, 56267, 56268, 56269, 56270, 56271, 56272, 56273, 56274, 56275, 56276, 56277, 56278, 56279, 56280, 56281, 56282, 56283, 56284, 56285, 56287, 56288, 56289, 56290, 56291, 56292, 56293, 56294, 56295, 56296, 56297, 56298, 56299, 56300, 56301, 56302, 56303, 56304, 56305, 56306, 56307, 56308, 56309, 56310, 56311, 56312, 56313, 56314, 56315, 56316, 56317, 56318, 56319, 56320, 56321, 56322, 56323, 56324, 56325, 56326, 56327, 56328, 56329, 56330, 56332, 56333, 56334, 56335, 56336, 56337, 56338, 56339, 56340, 56341, 56342, 56343, 56344, 56345, 56346, 56347, 56348, 56349, 56350, 56351, 56352, 56353, 56354, 56355, 56356, 56357, 56358, 56359, 56360, 56361, 56362, 56363, 56364, 56365, 56366, 56367, 56368, 56369, 56370, 56371, 56372, 56373, 56374, 56375, 56376, 56381, 56382, 56383, 56384, 56385, 56386, 56387, 56388, 56389, 56390, 56391, 56392, 56393, 56394, 56395, 56396, 56397, 56398, 56399, 56400, 56401, 56402, 56403, 56404, 56405, 56406, 56407, 56408, 56409, 56410, 56411, 56412, 56413, 56414, 56415, 56416, 56417, 56418, 56419, 56421, 56422, 56423, 56424, 56425, 56426, 56427, 56428, 56429, 56430, 56431, 56432, 56433, 56434, 56435, 56436, 56437, 56438, 56439, 56440, 56441, 56442, 56443, 56444, 56445, 56446, 56447, 56448, 56450, 56451, 56452, 56453, 56454, 56455, 56456, 56457, 56458, 56459, 56460, 56461, 56462, 56463, 56464, 56465, 56466, 56467, 56468, 56469, 56470, 56471, 56472, 56473, 56474, 56475, 56476, 56477, 56478, 56479, 56480, 56481, 56482, 56483, 56484, 56485, 56486, 56487, 56488, 56489, 56490, 56491, 56495, 56496, 56497, 56498, 56499, 56500, 56501, 56502, 56503, 56504, 56505, 56506, 56507, 56508, 56509, 56510, 56511, 56512, 56513, 56514, 56515, 56516, 56517, 56518, 56519, 56520, 56521, 56522, 56523, 56524, 56525, 56526, 56527, 56528, 56529, 56530, 56531, 56532, 56533, 56534, 56535, 56536, 56537, 56538, 56539, 56540, 56541, 56542, 56543, 56544, 56545, 56546, 56547, 56548, 56549, 56553, 56554, 56555, 56556, 56557, 56559, 56560, 56561, 56562, 56563, 56564, 56565, 56566, 56567, 56568, 56569, 56570, 56571, 56572, 56573, 56574, 56575, 56576, 56577, 56578, 56579, 56580, 56581, 56582, 56583, 56584, 56585, 56586, 56587, 56588, 56589, 56590, 56591, 56592, 56593, 56594, 56595, 56596, 56597, 56598, 56599, 56600, 56601, 56602, 56603, 56604, 56605, 56606, 56607, 56608, 56609, 56610, 56611, 56612, 56613, 56614, 56615, 56616, 56617, 56618, 56619, 56620, 56621, 56622, 56623, 56624, 56625, 56626, 56627, 56628, 56629, 56630, 56631, 56632, 56633, 56634, 56635, 56636, 56637, 56638, 56639, 56640, 56641, 56642, 56643, 56644, 56645, 56646, 56647, 56648, 56649, 56650, 56651, 56652, 56653, 56654, 56655, 56656, 56657, 56658, 56659, 56660, 56661, 56662, 56663, 56664, 56665, 56666, 56667, 56668, 56669, 56674, 56675, 56676, 56677, 56678, 56679, 56680, 56681, 56682, 56683, 56684, 56685, 56686, 56687, 56688, 56689, 56690, 56691, 56692, 56693, 56694, 56695, 56696, 56697, 56698, 56703, 56704, 56705, 56706, 56707, 56708, 56709, 56710, 56711, 56712, 56713, 56714, 56715, 56716, 56717, 56718, 56719, 56720, 56721, 56722, 56723, 56724, 56725, 56727, 56728, 56729, 56730, 56731, 56732, 56733, 56734, 56735, 56736, 56737, 56738, 56739, 56740, 56741, 56742, 56743, 56744, 56745, 56746, 56747, 56748, 56749, 56750, 56751, 56752, 56753, 56754, 56755, 56756, 56757, 56758, 56759, 56764, 56765, 56766, 56767, 56768, 56769, 56770, 56771, 56772, 56773, 56774, 56775, 56776, 56777, 56778, 56779, 56780, 56781, 56782, 56783, 56784, 56785, 56786, 56787, 56788, 56789, 56790, 56791, 56792, 56793, 56794, 56795, 56796, 56797, 56798, 56799, 56800, 56801, 56802, 56803, 56804, 56805, 56806, 56807, 56808, 56809, 56810, 56811, 56812, 56813, 56814, 56815, 56816, 56817, 56818, 56819, 56820, 56821, 56822, 56823, 56824, 56825, 56826, 56827, 56828, 56829, 56830, 56831, 56832, 56833, 56834, 56835, 56836, 56837, 56838, 56839, 56840, 56841, 56842, 56843, 56845, 56846, 56847, 56848, 56849, 56850, 56851, 56852, 56853, 56854, 56855, 56856, 56857, 56858, 56859, 56860, 56861, 56862, 56863, 56864, 56865, 56868, 56869, 56870, 56871, 56872, 56873, 56874, 56875, 56877, 56878, 56879, 56880, 56881, 56882, 56883, 56884, 56885, 56886, 56887, 56888, 56889, 56890, 56891, 56892, 56893, 56894, 56895, 56896, 56897, 56898, 56899, 56900, 56901, 56902, 56903, 56904, 56905, 56906, 56907, 56908, 56909, 56910, 56911, 56912, 56913, 56914, 56915, 56916, 56917, 56918, 56919, 56920, 56921, 56922, 56923, 56924, 56925, 56926, 56927, 56928, 56929, 56930, 56931, 56932, 56933, 56934, 56935, 56936, 56937, 56938, 56939, 56940, 56941, 56942, 56943, 56944, 56945, 56946, 56947, 56948, 56949, 56950, 56951, 56952, 56953, 56954, 56955, 56956, 56957, 56958, 56959, 56960, 56961, 56962, 56963, 56964, 56965, 56966, 56967, 56968, 56969, 56970, 56971, 56972, 56973, 56974, 56975, 56976, 56977, 56978, 56979, 56980, 56981, 56982, 56983, 56984, 56985, 56986, 56987, 56988, 56989, 56990, 56991, 56992, 56993, 56994, 56995, 56996, 56997, 56998, 56999, 57000, 57001, 57002, 57003, 57004, 57005, 57006, 57007, 57008, 57009, 57010, 57011, 57012, 57013, 57014, 57015, 57016, 57017, 57018, 57019, 57020, 57021, 57022, 57023, 57024, 57025, 57027, 57028, 57029, 57030, 57031, 57032, 57033, 57034, 57035, 57036, 57037, 57039, 57040, 57041, 57042, 57043, 57044, 57045, 57046, 57047, 57048, 57049, 57050, 57051, 57052, 57053, 57054, 57055, 57056, 57057, 57058, 57059, 57060, 57061, 57062, 57063, 57064, 57065, 57066, 57067, 57068, 57069, 57070, 57071, 57072, 57073, 57074, 57075, 57076, 57077, 57078, 57079, 57080, 57081, 57082, 57083, 57084, 57086, 57087, 57088, 57089, 57090, 57091, 57092, 57093, 57094, 57095, 57096, 57097, 57098, 57099, 57100, 57101, 57102, 57103, 57104, 57105, 57106, 57107, 57108, 57109, 57110, 57111, 57112, 57113, 57114, 57115, 57116, 57117, 57118, 57119, 57120, 57121, 57126, 57127, 57128, 57129, 57130, 57131, 57132, 57133, 57134, 57135, 57136, 57137, 57138, 57139, 57140, 57141, 57142, 57143, 57145, 57146, 57147, 57148, 57149, 57150, 57151, 57152, 57153, 57154, 57155, 57156, 57157, 57158, 57159, 57160, 57161, 57162, 57163, 57164, 57165, 57166, 57167, 57168, 57169, 57170, 57171, 57172, 57173, 57174, 57175, 57176, 57177, 57178, 57179, 57180, 57181, 57182, 57183, 57184, 57185, 57186, 57187, 57188, 57189, 57190, 57191, 57192, 57193, 57194, 57195, 57196, 57197, 57198, 57199, 57200, 57201, 57202, 57203, 57204, 57205, 57206, 57207, 57208, 57209, 57210, 57211, 57212, 57213, 57214, 57216, 57217, 57218, 57219, 57220, 57221, 57222, 57223, 57224, 57225, 57226, 57227, 57228, 57229, 57230, 57231, 57232, 57233, 57234, 57235, 57236, 57237, 57238, 57239, 57240, 57241, 57242, 57243, 57244, 57245, 57246, 57247, 57248, 57249, 57250, 57251, 57252, 57253, 57254, 57255, 57256, 57257, 57258, 57259, 57260, 57261, 57262, 57263, 57264, 57265, 57266, 57267, 57268, 57269, 57270, 57271, 57272, 57273, 57274, 57275, 57276, 57277, 57278, 57279, 57280, 57281, 57282, 57283, 57284, 57285, 57286, 57287, 57288, 57289, 57290, 57291, 57292, 57293, 57294, 57295, 57296, 57297, 57298, 57299, 57300, 57301, 57302, 57303, 57304, 57305, 57306, 57307, 57308, 57309, 57310, 57311, 57312, 57313, 57314, 57315, 57316, 57317, 57318, 57319, 57320, 57321, 57322, 57323, 57324, 57325, 57326, 57327, 57328, 57329, 57330, 57331, 57332, 57333, 57334, 57335, 57336, 57337, 57338, 57339, 57340, 57341, 57342, 57343, 57344, 57345, 57346, 57347, 57348, 57349, 57351, 57352, 57353, 57354, 57355, 57356, 57357, 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57417, 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, 57438, 57439, 57440, 57441, 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, 57522, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, 57532, 57533, 57534, 57535, 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, 57626, 57627, 57628, 57629, 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57698, 57699, 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, 57720, 57721, 57722, 57723, 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57732, 57733, 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, 57774, 57775, 57776, 57778, 57779, 57780, 57781, 57782, 57783, 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, 57814, 57815, 57816, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, 57888, 57889, 57890, 57891, 57892, 57894, 57895, 57896, 57897, 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, 57908, 57909, 57910, 57911, 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, 57943, 57944, 57945, 57947, 57948, 57949, 57950, 57951, 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, 58002, 58003, 58004, 58005, 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58025, 58026, 58031, 58032, 58033, 58034, 58035, 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, 58096, 58097, 58098, 58099, 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, 58150, 58155, 58156, 58157, 58158, 58159, 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, 58190, 58191, 58192, 58193, 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, 58284, 58285, 58286, 58287, 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, 58308, 58309, 58310, 58314, 58317, 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, 58378, 58379, 58380, 58381, 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, 58392, 58393, 58394, 58395, 58396, 58398, 58399, 58400, 58401, 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, 58472, 58473, 58474, 58475, 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, 58547, 58548, 58549, 58550, 58552, 58553, 58554, 58555, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58637, 58638, 58639, 58640, 58641, 58642, 58644, 58645, 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, 58656, 58657, 58658, 58659, 58661, 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, 58752, 58753, 58754, 58755, 58756, 58757, 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, 58848, 58849, 58850, 58851, 58852, 58853, 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, 58894, 58895, 58896, 58898, 58899, 58900, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, 58944, 58945, 58946, 58947, 58948, 58949, 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, 59040, 59041, 59042, 59043, 59044, 59045, 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, 59136, 59137, 59138, 59139, 59140, 59141, 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, 59222, 59223, 59224, 59225, 59228, 59229, 59230, 59231, 59232, 59233, 59234, 59235, 59236, 59237, 59238, 59239, 59240, 59241, 59242, 59243, 59244, 59245, 59246, 59247, 59248, 59249, 59250, 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 59284, 59285, 59286, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, 59296, 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, 59307, 59308, 59309, 59310, 59311, 59312, 59313, 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, 59324, 59325, 59326, 59327, 59328, 59329, 59330, 59331, 59332, 59333, 59334, 59335, 59336, 59337, 59338, 59339, 59340, 59341, 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, 59362, 59363, 59364, 59365, 59366, 59367, 59369, 59370, 59371, 59372, 59373, 59374, 59375, 59376, 59377, 59378, 59379, 59380, 59381, 59382, 59383, 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 59393, 59394, 59395, 59396, 59397, 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, 59408, 59409, 59410, 59411, 59412, 59413, 59414, 59415, 59416, 59417, 59418, 59419, 59420, 59421, 59422, 59423, 59424, 59425, 59426, 59427, 59428, 59429, 59430, 59431, 59432, 59433, 59434, 59435, 59436, 59437, 59438, 59439, 59440, 59441, 59442, 59443, 59444, 59445, 59446, 59447, 59448, 59449, 59450, 59451, 59452, 59453, 59454, 59455, 59456, 59457, 59458, 59459, 59460, 59461, 59462, 59463, 59464, 59465, 59466, 59467, 59468, 59469, 59470, 59471, 59472, 59473, 59474, 59475, 59476, 59477, 59478, 59479, 59480, 59481, 59482, 59483, 59484, 59485, 59486, 59487, 59488, 59489, 59490, 59491, 59492, 59493, 59494, 59495, 59496, 59497, 59498, 59499, 59500, 59501, 59502, 59503, 59507, 59508, 59509, 59510, 59511, 59512, 59513, 59514, 59515, 59516, 59517, 59518, 59519, 59520, 59521, 59524, 59525, 59526, 59527, 59528, 59529, 59530, 59531, 59532, 59533, 59534, 59535, 59536, 59537, 59538, 59539, 59540, 59541, 59542, 59543, 59544, 59545, 59546, 59549, 59550, 59551, 59552, 59553, 59554, 59555, 59556, 59560, 59561, 59562, 59563, 59564, 59565, 59566, 59567, 59568, 59569, 59570, 59571, 59572, 59573, 59574, 59575, 59576, 59577, 59578, 59579, 59580, 59581, 59582, 59583, 59584, 59585, 59586, 59587, 59588, 59589, 59590, 59591, 59592, 59596, 59597, 59598, 59599, 59600, 59601, 59602, 59603, 59604, 59605, 59606, 59607, 59608, 59609, 59610, 59611, 59612, 59613, 59614, 59615, 59616, 59618, 59619, 59620, 59621, 59622, 59623, 59624, 59625, 59626, 59627, 59628, 59629, 59630, 59631, 59632, 59633, 59634, 59635, 59636, 59637, 59638, 59639, 59640, 59641, 59642, 59643, 59644, 59645, 59647, 59648, 59649, 59650, 59651, 59652, 59653, 59654, 59655, 59656, 59657, 59658, 59659, 59660, 59661, 59662, 59663, 59664, 59665, 59666, 59667, 59668, 59669, 59670, 59671, 59672, 59673, 59674, 59675, 59676, 59677, 59678, 59679, 59680, 59681, 59682, 59683, 59684, 59686, 59687, 59688, 59689, 59690, 59691, 59692, 59693, 59694, 59695, 59696, 59697, 59698, 59699, 59700, 59701, 59702, 59703, 59704, 59705, 59706, 59707, 59708, 59709, 59710, 59711, 59712, 59713, 59715, 59716, 59717, 59718, 59719, 59720, 59721, 59722, 59723, 59724, 59725, 59726, 59727, 59728, 59729, 59730, 59731, 59732, 59733, 59734, 59735, 59736, 59737, 59738, 59739, 59740, 59741, 59742, 59743, 59744, 59745, 59746, 59747, 59748, 59749, 59750, 59751, 59752, 59753, 59754, 59756, 59757, 59758, 59759, 59760, 59761, 59762, 59763, 59764, 59765, 59766, 59767, 59768, 59769, 59770, 59776, 59777, 59778, 59779, 59780, 59781, 59782, 59783, 59784, 59785, 59786, 59787, 59788, 59789, 59790, 59791, 59792, 59793, 59794, 59795, 59796, 59797, 59798, 59799, 59800, 59801, 59802, 59803, 59804, 59805, 59806, 59807, 59808, 59809, 59810, 59811, 59812, 59813, 59814, 59815, 59816, 59817, 59818, 59820, 59821, 59822, 59823, 59824, 59825, 59826, 59827, 59828, 59829, 59830, 59831, 59832, 59833, 59834, 59835, 59836, 59837, 59838, 59839, 59840, 59841, 59842, 59843, 59844, 59845, 59846, 59847, 59848, 59849, 59850, 59851, 59852, 59853, 59854, 59855, 59856, 59857, 59858, 59859, 59860, 59861, 59862, 59863, 59864, 59865, 59866, 59868, 59869, 59870, 59871, 59872, 59873, 59874, 59875, 59877, 59878, 59879, 59880, 59881, 59882, 59883, 59884, 59885, 59886, 59887, 59888, 59889, 59890, 59891, 59892, 59893, 59894, 59895, 59896, 59897, 59898, 59899, 59900, 59901, 59902, 59903, 59904, 59905, 59906, 59907, 59912, 59913, 59914, 59915, 59916, 59917, 59918, 59919, 59920, 59921, 59922, 59923, 59924, 59925, 59926, 59927, 59928, 59929, 59930, 59931, 59932, 59933, 59934, 59935, 59936, 59937, 59938, 59939, 59940, 59941, 59942, 59943, 59944, 59945, 59946, 59947, 59948, 59949, 59950, 59951, 59952, 59953, 59954, 59955, 59956, 59957, 59958, 59959, 59960, 59961, 59962, 59963, 59964, 59965, 59966, 59967, 59968, 59969, 59970, 59971, 59972, 59973, 59974, 59975, 59976, 59977, 59978, 59979, 59980, 59981, 59982, 59983, 59984, 59985, 59986, 59987, 59988, 59989, 59990, 59991, 59993, 59994, 59995, 59996, 59997, 59998, 59999, 60000, 60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60010, 60011, 60012, 60013, 60014, 60015, 60016, 60017, 60018, 60019, 60020, 60021, 60022, 60023, 60024, 60025, 60026, 60027, 60028, 60029, 60030, 60031, 60032, 60033, 60034, 60035, 60036, 60037, 60038, 60039, 60040, 60041, 60042, 60043, 60044, 60045, 60046, 60047, 60048, 60049, 60050, 60051, 60052, 60053, 60054, 60055, 60056, 60057, 60058, 60059, 60060, 60061, 60062, 60063, 60064, 60065, 60066, 60067, 60068, 60069, 60070, 60071, 60072, 60073, 60074, 60075, 60076, 60077, 60078, 60083, 60084, 60085, 60086, 60091, 60092, 60093, 60094, 60095, 60096, 60097, 60098, 60099, 60100, 60101, 60102, 60103, 60104, 60105, 60106, 60107, 60108, 60109, 60114, 60115, 60116, 60117, 60118, 60119, 60120, 60121, 60122, 60123, 60124, 60125, 60126, 60127, 60128, 60129, 60130, 60131, 60132, 60133, 60134, 60135, 60136, 60137, 60138, 60139, 60140, 60141, 60142, 60143, 60144, 60145, 60146, 60147, 60148, 60149, 60150, 60151, 60152, 60153, 60154, 60155, 60156, 60157, 60159, 60160, 60161, 60162, 60163, 60164, 60165, 60166, 60167, 60168, 60169, 60170, 60171, 60172, 60173, 60174, 60175, 60176, 60177, 60178, 60179, 60180, 60181, 60182, 60183, 60184, 60185, 60186, 60187, 60188, 60189, 60190, 60191, 60192, 60193, 60194, 60195, 60196, 60197, 60198, 60199, 60200, 60201, 60202, 60203, 60204, 60205, 60206, 60207, 60208, 60209, 60210, 60211, 60212, 60213, 60214, 60215, 60216, 60217, 60218, 60219, 60220, 60221, 60222, 60223, 60224, 60225, 60226, 60227, 60228, 60229, 60230, 60231, 60232, 60233, 60234, 60235, 60236, 60237, 60238, 60239, 60240, 60242, 60246, 60247, 60248, 60249, 60250, 60251, 60252, 60253, 60254, 60255, 60256, 60257, 60258, 60259, 60260, 60261, 60262, 60263, 60264, 60265, 60266, 60267, 60268, 60269, 60270, 60271, 60272, 60273, 60274, 60275, 60276, 60277, 60278, 60279, 60280, 60282, 60283, 60284, 60285, 60286, 60287, 60288, 60289, 60290, 60291, 60292, 60293, 60294, 60295, 60296, 60297, 60298, 60299, 60300, 60301, 60302, 60303, 60304, 60305, 60306, 60307, 60308, 60309, 60310, 60311, 60312, 60313, 60314, 60315, 60316, 60317, 60318, 60319, 60320, 60321, 60322, 60323, 60324, 60325, 60326, 60327, 60328, 60329, 60330, 60331, 60332, 60333, 60334, 60335, 60336, 60337, 60338, 60339, 60340, 60341, 60342, 60343, 60344, 60345, 60346, 60347, 60348, 60349, 60350, 60351, 60352, 60353, 60354, 60355, 60356, 60357, 60358, 60359, 60360, 60361, 60362, 60363, 60364, 60365, 60366, 60367, 60368, 60369, 60370, 60371, 60372, 60373, 60374, 60375, 60376, 60377, 60378, 60379, 60380, 60381, 60382, 60383, 60384, 60385, 60386, 60387, 60388, 60389, 60390, 60391, 60392, 60393, 60394, 60395, 60396, 60397, 60398, 60399, 60400, 60401, 60402, 60403, 60404, 60405, 60406, 60407, 60408, 60409, 60410, 60411, 60412, 60413, 60414, 60415, 60416, 60417, 60418, 60419, 60420, 60421, 60422, 60423, 60424, 60425, 60426, 60427, 60428, 60429, 60430, 60431, 60432, 60433, 60434, 60435, 60436, 60437, 60438, 60440, 60441, 60442, 60443, 60444, 60445, 60446, 60448, 60449, 60450, 60451, 60452, 60453, 60454, 60455, 60456, 60457, 60458, 60459, 60460, 60461, 60462, 60463, 60464, 60465, 60466, 60467, 60468, 60469, 60470, 60471, 60472, 60473, 60474, 60475, 60476, 60477, 60478, 60479, 60480, 60481, 60482, 60483, 60484, 60485, 60486, 60487, 60488, 60489, 60490, 60491, 60492, 60493, 60494, 60495, 60496, 60497, 60498, 60499, 60500, 60501, 60502, 60503, 60504, 60505, 60506, 60507, 60508, 60509, 60510, 60511, 60512, 60513, 60514, 60515, 60516, 60517, 60518, 60519, 60520, 60521, 60522, 60523, 60524, 60525, 60526, 60527, 60528, 60529, 60530, 60531, 60532, 60533, 60534, 60535, 60536, 60537, 60538, 60539, 60540, 60541, 60542, 60543, 60544, 60545, 60546, 60547, 60548, 60549, 60551, 60552, 60553, 60554, 60555, 60556, 60557, 60558, 60560, 60561, 60562, 60563, 60564, 60565, 60566, 60567, 60568, 60569, 60570, 60571, 60572, 60573, 60574, 60575, 60576, 60577, 60578, 60579, 60580, 60581, 60582, 60583, 60584, 60585, 60586, 60587, 60588, 60589, 60590, 60591, 60592, 60593, 60594, 60595, 60596, 60597, 60598, 60600, 60601, 60602, 60603, 60604, 60606, 60607, 60608, 60609, 60610, 60611, 60612, 60613, 60615, 60616, 60617, 60618, 60619, 60620, 60621, 60622, 60623, 60624, 60625, 60626, 60627, 60628, 60629, 60630, 60631, 60632, 60633, 60634, 60635, 60636, 60637, 60638, 60639, 60640, 60641, 60642, 60643, 60644, 60645, 60646, 60647, 60648, 60649, 60650, 60651, 60652, 60653, 60654, 60655, 60656, 60657, 60658, 60659, 60660, 60661, 60662, 60663, 60664, 60665, 60666, 60667, 60668, 60669, 60670, 60671, 60672, 60673, 60674, 60675, 60676, 60677, 60678, 60679, 60680, 60681, 60682, 60683, 60684, 60685, 60686, 60687, 60688, 60689, 60690, 60691, 60692, 60693, 60694, 60695, 60696, 60697, 60698, 60699, 60700, 60701, 60702, 60703, 60704, 60705, 60706, 60707, 60708, 60709, 60710, 60711, 60712, 60713, 60714, 60715, 60716, 60717, 60718, 60719, 60720, 60721, 60722, 60723, 60724, 60725, 60726, 60727, 60728, 60729, 60730, 60731, 60732, 60733, 60734, 60735, 60737, 60738, 60739, 60741, 60742, 60744, 60746, 60749, 60753, 60754, 60755, 60756, 60757, 60758, 60759, 60760, 60761, 60762, 60763, 60764, 60765, 60766, 60767, 60768, 60769, 60771, 60772, 60773, 60774, 60775, 60776, 60777, 60778, 60779, 60780, 60781, 60782, 60783, 60784, 60785, 60786, 60787, 60788, 60793, 60794, 60795, 60796, 60797, 60798, 60799, 60800, 60801, 60802, 60803, 60804, 60805, 60806, 60807, 60808, 60809, 60810, 60811, 60812, 60813, 60814, 60815, 60816, 60817, 60818, 60819, 60820, 60821, 60822, 60823, 60824, 60825, 60826, 60827, 60828, 60829, 60830, 60831, 60832, 60833, 60834, 60835, 60836, 60837, 60838, 60839, 60840, 60841, 60842, 60843, 60844, 60846, 60847, 60848, 60849, 60850, 60851, 60852, 60853, 60854, 60855, 60856, 60857, 60858, 60859, 60860, 60861, 60862, 60863, 60864, 60865, 60866, 60867, 60868, 60869, 60870, 60871, 60872, 60873, 60874, 60875, 60876, 60877, 60878, 60879, 60880, 60881, 60882, 60883, 60884, 60885, 60886, 60887, 60888, 60889, 60890, 60891, 60892, 60893, 60894, 60895, 60896, 60897, 60898, 60899, 60900, 60901, 60902, 60903, 60904, 60907, 60908, 60909, 60910, 60911, 60912, 60913, 60914, 60915, 60916, 60917, 60918, 60919, 60920, 60921, 60922, 60923, 60924, 60925, 60926, 60927, 60928, 60929, 60930, 60931, 60932, 60933, 60934, 60935, 60936, 60937, 60938, 60939, 60940, 60941, 60942, 60943, 60944, 60945, 60946, 60947, 60948, 60949, 60950, 60951, 60952, 60953, 60954, 60955, 60956, 60957, 60958, 60959, 60960, 60961, 60962, 60963, 60964, 60965, 60966, 60967, 60968, 60969, 60970, 60971, 60972, 60973, 60974, 60975, 60976, 60977, 60978, 60979, 60980, 60981, 60982, 60983, 60984, 60985, 60986, 60987, 60988, 60989, 60990, 60991, 60992, 60993, 60994, 60995, 60996, 60997, 60998, 60999, 61000, 61001, 61002, 61003, 61004, 61005, 61006, 61007, 61008, 61009, 61010, 61011, 61012, 61013, 61014, 61015, 61016, 61017, 61018, 61019, 61020, 61021, 61022, 61023, 61024, 61025, 61026, 61027, 61028, 61029, 61030, 61031, 61032, 61033, 61034, 61035, 61036, 61037, 61039, 61040, 61041, 61042, 61043, 61045, 61046, 61047, 61048, 61049, 61050, 61051, 61057, 61058, 61059, 61060, 61061, 61062, 61063, 61064, 61065, 61066, 61067, 61070, 61071, 61072, 61073, 61075, 61076, 61077, 61078, 61079, 61080, 61081, 61082, 61083, 61087, 61088, 61090, 61091, 61092, 61093, 61094, 61103, 61104, 61105, 61106, 61107, 61108, 61109, 61110, 61111, 61112, 61113, 61114, 61115, 61116, 61117, 61118, 61119, 61120, 61121, 61124, 61125, 61126, 61127, 61128, 61129, 61132, 61133, 61134, 61135, 61138, 61139, 61140, 61141, 61142, 61143, 61144, 61145, 61146, 61147, 61148, 61149, 61150, 61151, 61152, 61153, 61159, 61160, 61162, 61163, 61164, 61166, 61167, 61169, 61170, 61171, 61172, 61174, 61175, 61176, 61177, 61178, 61179, 61180, 61181, 61182, 61186, 61187, 61188, 61189, 61191, 61192, 61193, 61194, 61195, 61196, 61197, 61198, 61199, 61200, 61201, 61202, 61203, 61204, 61205, 61206, 61207, 61208, 61210, 61211, 61212, 61213, 61214, 61215, 61216, 61217, 61218, 61219, 61220, 61221, 61222, 61223, 61225, 61226, 61227, 61228, 61229, 61230, 61231, 61232, 61233, 61234, 61235, 61236, 61237, 61238, 61239, 61240, 61241, 61242, 61243, 61244, 61245, 61246, 61247, 61248, 61249, 61250, 61251, 61252, 61253, 61254, 61255, 61256, 61257, 61258, 61259, 61260, 61261, 61262, 61263, 61264, 61265, 61266, 61267, 61271, 61272, 61273, 61274, 61275, 61276, 61278, 61279, 61280, 61281, 61282, 61287, 61289, 61290, 61291, 61292, 61293, 61294, 61295, 61296, 61297, 61298, 61299, 61300, 61301, 61302, 61303, 61306, 61307, 61308, 61309, 61310, 61311, 61312, 61313, 61314, 61315, 61317, 61318, 61319, 61320, 61323, 61324, 61329, 61330, 61331, 61332, 61333, 61335, 61336, 61337, 61338, 61340, 61341, 61342, 61343, 61344, 61345, 61346, 61347, 61348, 61349, 61350, 61351, 61353, 61354, 61355, 61356, 61357, 61358, 61359, 61360, 61361, 61362, 61363, 61364, 61365, 61366, 61367, 61368, 61369, 61370, 61371, 61372, 61373, 61374, 61375, 61376, 61377, 61378, 61379, 61380, 61381, 61382, 61383, 61384, 61385, 61386, 61387, 61388, 61389, 61390, 61391, 61392, 61393, 61394, 61395, 61396, 61397, 61398, 61399, 61400, 61402, 61403, 61404, 61405, 61406, 61407, 61408, 61409, 61410, 61411, 61412, 61413, 61414, 61415, 61416, 61417, 61418, 61419, 61420, 61421, 61422, 61423, 61424, 61425, 61426, 61427, 61428, 61429, 61430, 61431, 61432, 61433, 61434, 61435, 61436, 61437, 61438, 61439, 61440, 61441, 61442, 61443, 61444, 61445, 61446, 61447, 61448, 61449, 61450, 61451, 61452, 61453, 61454, 61455, 61456, 61457, 61458, 61459, 61460, 61461, 61462, 61463, 61464, 61465, 61466, 61467, 61468, 61469, 61470, 61471, 61472, 61473, 61474, 61475, 61476, 61477, 61478, 61479, 61480, 61481, 61482, 61483, 61484, 61485, 61486, 61487, 61488, 61489, 61490, 61491, 61492, 61493, 61494, 61495, 61496, 61497, 61498, 61499, 61500, 61501, 61502, 61503, 61504, 61505, 61506, 61507, 61508, 61509, 61510, 61511, 61512, 61513, 61514, 61515, 61516, 61517, 61518, 61519, 61520, 61521, 61522, 61523, 61524, 61525, 61526, 61527, 61528, 61529, 61530, 61531, 61532, 61533, 61534, 61535, 61536, 61537, 61538, 61539, 61540, 61541, 61542, 61543, 61544, 61545, 61546, 61547, 61548, 61549, 61550, 61551, 61552, 61553, 61554, 61555, 61556, 61557, 61558, 61559, 61560, 61561, 61562, 61563, 61564, 61565, 61566, 61567, 61568, 61569, 61570, 61571, 61572, 61573, 61574, 61575, 61576, 61577, 61578, 61579, 61580, 61581, 61582, 61583, 61584, 61585, 61586, 61587, 61588, 61589, 61590, 61591, 61592, 61593, 61594, 61595, 61596, 61597, 61598, 61599, 61600, 61602, 61603, 61604, 61605, 61606, 61607, 61608, 61609, 61610, 61611, 61613, 61614, 61632, 61633, 61634, 61635, 61636, 61637, 61638, 61639, 61643, 61644, 61645, 61646, 61652, 61654, 61655, 61656, 61657, 61658, 61668, 61669, 61670, 61671, 61672, 61673, 61674, 61675, 61676, 61677, 61678, 61679, 61680, 61681, 61682, 61684, 61685, 61686, 61687, 61688, 61689, 61690, 61691, 61727);
+INSERT INTO `creature_model_info` (`DisplayID`) VALUES
+(28329),
+(28330),
+(28331),
+(28332),
+(28437),
+(28458),
+(28518),
+(28592),
+(28608),
+(28609),
+(28610),
+(28613),
+(28614),
+(28653),
+(28812),
+(29003),
+(29086),
+(29097),
+(29165),
+(29181),
+(29196),
+(29207),
+(29209),
+(29248),
+(29271),
+(29277),
+(29305),
+(29320),
+(29323),
+(29364),
+(29373),
+(29406),
+(29407),
+(29410),
+(29411),
+(29417),
+(29420),
+(29423),
+(29433),
+(29451),
+(29453),
+(29460),
+(29465),
+(29468),
+(29469),
+(29523),
+(29544),
+(29548),
+(29550),
+(29559),
+(29594),
+(29595),
+(29596),
+(29597),
+(29618),
+(29661),
+(29674),
+(29741),
+(29804),
+(29811),
+(29822),
+(29874),
+(29875),
+(29876),
+(29877),
+(29930),
+(29946),
+(29955),
+(29963),
+(29973),
+(29987),
+(29992),
+(29993),
+(29998),
+(30002),
+(30004),
+(30023),
+(30029),
+(30038),
+(30058),
+(30062),
+(30077),
+(30082),
+(30118),
+(30119),
+(30124),
+(30125),
+(30130),
+(30131),
+(30133),
+(30134),
+(30137),
+(30139),
+(30147),
+(30158),
+(30161),
+(30179),
+(30192),
+(30195),
+(30235),
+(30236),
+(30241),
+(30257),
+(30264),
+(30265),
+(30266),
+(30267),
+(30279),
+(30298),
+(30305),
+(30307),
+(30344),
+(30345),
+(30361),
+(30396),
+(30397),
+(30398),
+(30406),
+(30407),
+(30410),
+(30448),
+(30458),
+(30493),
+(30494),
+(30510),
+(30519),
+(30564),
+(30589),
+(30627),
+(30639),
+(30642),
+(30655),
+(30658),
+(30660),
+(30661),
+(30710),
+(30737),
+(30765),
+(30777),
+(30791),
+(30811),
+(30845),
+(30889),
+(30905),
+(30915),
+(30918),
+(30919),
+(30936),
+(30957),
+(30985),
+(30994),
+(31002),
+(31003),
+(31009),
+(31010),
+(31032),
+(31069),
+(31071),
+(31075),
+(31108),
+(31116),
+(31118),
+(31120),
+(31148),
+(31149),
+(31150),
+(31151),
+(31152),
+(31153),
+(31155),
+(31157),
+(31158),
+(31162),
+(31172),
+(31173),
+(31186),
+(31189),
+(31190),
+(31191),
+(31199),
+(31219),
+(31232),
+(31233),
+(31291),
+(31325),
+(31341),
+(31345),
+(31374),
+(31381),
+(31382),
+(31426),
+(31427),
+(31435),
+(31442),
+(31444),
+(31460),
+(31464),
+(31466),
+(31468),
+(31478),
+(31479),
+(31494),
+(31496),
+(31497),
+(31500),
+(31502),
+(31503),
+(31504),
+(31507),
+(31529),
+(31532),
+(31534),
+(31537),
+(31538),
+(31549),
+(31557),
+(31570),
+(31573),
+(31575),
+(31576),
+(31581),
+(31582),
+(31589),
+(31597),
+(31603),
+(31617),
+(31630),
+(31631),
+(31638),
+(31640),
+(31644),
+(31665),
+(31671),
+(31672),
+(31685),
+(31686),
+(31700),
+(31702),
+(31714),
+(31715),
+(31718),
+(31733),
+(31759),
+(31763),
+(31766),
+(31767),
+(31768),
+(31775),
+(31776),
+(31780),
+(31786),
+(31791),
+(31802),
+(31804),
+(31815),
+(31830),
+(31832),
+(31844),
+(31845),
+(31863),
+(31887),
+(31889),
+(31899),
+(31900),
+(31901),
+(31902),
+(31908),
+(31909),
+(31910),
+(31921),
+(31923),
+(31925),
+(31937),
+(31955),
+(31964),
+(31969),
+(31970),
+(31971),
+(31980),
+(31986),
+(31994),
+(31995),
+(31996),
+(31997),
+(31998),
+(31999),
+(32017),
+(32026),
+(32028),
+(32029),
+(32030),
+(32054),
+(32056),
+(32058),
+(32059),
+(32060),
+(32061),
+(32062),
+(32064),
+(32065),
+(32066),
+(32067),
+(32068),
+(32069),
+(32079),
+(32125),
+(32126),
+(32128),
+(32131),
+(32132),
+(32133),
+(32134),
+(32180),
+(32185),
+(32191),
+(32196),
+(32197),
+(32200),
+(32201),
+(32202),
+(32204),
+(32205),
+(32206),
+(32216),
+(32224),
+(32233),
+(32241),
+(32243),
+(32247),
+(32249),
+(32250),
+(32267),
+(32278),
+(32282),
+(32309),
+(32315),
+(32325),
+(32340),
+(32342),
+(32404),
+(32405),
+(32406),
+(32407),
+(32443),
+(32471),
+(32483),
+(32484),
+(32485),
+(32495),
+(32508),
+(32509),
+(32511),
+(32530),
+(32531),
+(32536),
+(32544),
+(32548),
+(32549),
+(32632),
+(32633),
+(32649),
+(32655),
+(32682),
+(32683),
+(32686),
+(32689),
+(32701),
+(32715),
+(32723),
+(32725),
+(32730),
+(32779),
+(32782),
+(32783),
+(32788),
+(32793),
+(32803),
+(32804),
+(32884),
+(32898),
+(32912),
+(32935),
+(32936),
+(32937),
+(32938),
+(32964),
+(32966),
+(32967),
+(32973),
+(32974),
+(32983),
+(32995),
+(33000),
+(33007),
+(33012),
+(33038),
+(33063),
+(33066),
+(33067),
+(33075),
+(33088),
+(33173),
+(33196),
+(33198),
+(33200),
+(33214),
+(33218),
+(33223),
+(33225),
+(33227),
+(33229),
+(33237),
+(33242),
+(33251),
+(33293),
+(33307),
+(33309),
+(33310),
+(33311),
+(33317),
+(33318),
+(33331),
+(33332),
+(33375),
+(33383),
+(33385),
+(33392),
+(33393),
+(33423),
+(33431),
+(33526),
+(33592),
+(33595),
+(33599),
+(33603),
+(33605),
+(33606),
+(33607),
+(33608),
+(33636),
+(33644),
+(33645),
+(33646),
+(33648),
+(33652),
+(33653),
+(33654),
+(33656),
+(33657),
+(33658),
+(33659),
+(33660),
+(33662),
+(33664),
+(33665),
+(33667),
+(33668),
+(33669),
+(33677),
+(33684),
+(33691),
+(33695),
+(33705),
+(33721),
+(33723),
+(33724),
+(33726),
+(33727),
+(33728),
+(33730),
+(33734),
+(33735),
+(33766),
+(33772),
+(33811),
+(33821),
+(33825),
+(33826),
+(33827),
+(33859),
+(33861),
+(33862),
+(33900),
+(33966),
+(33973),
+(33975),
+(33976),
+(34022),
+(34027),
+(34028),
+(34029),
+(34031),
+(34067),
+(34068),
+(34128),
+(34130),
+(34199),
+(34200),
+(34210),
+(34249),
+(34255),
+(34256),
+(34258),
+(34270),
+(34271),
+(34273),
+(34306),
+(34318),
+(34323),
+(34325),
+(34326),
+(34338),
+(34341),
+(34402),
+(34409),
+(34411),
+(34414),
+(34415),
+(34416),
+(34417),
+(34418),
+(34425),
+(34428),
+(34442),
+(34445),
+(34447),
+(34502),
+(34514),
+(34543),
+(34544),
+(34545),
+(34577),
+(34583),
+(34603),
+(34608),
+(34614),
+(34618),
+(34620),
+(34640),
+(34684),
+(34715),
+(34716),
+(34720),
+(34721),
+(34746),
+(34749),
+(34750),
+(34770),
+(34772),
+(34773),
+(34793),
+(34807),
+(34808),
+(34826),
+(34836),
+(34878),
+(34879),
+(34881),
+(34882),
+(34883),
+(34884),
+(34885),
+(34886),
+(34889),
+(34897),
+(34898),
+(34901),
+(34902),
+(34914),
+(34915),
+(34957),
+(34970),
+(34981),
+(34993),
+(34997),
+(35000),
+(35006),
+(35011),
+(35055),
+(35056),
+(35057),
+(35058),
+(35071),
+(35072),
+(35084),
+(35091),
+(35104),
+(35110),
+(35118),
+(35128),
+(35129),
+(35137),
+(35144),
+(35151),
+(35157),
+(35169),
+(35197),
+(35205),
+(35206),
+(35245),
+(35252),
+(35314),
+(35319),
+(35320),
+(35322),
+(35326),
+(35327),
+(35339),
+(35343),
+(35344),
+(35356),
+(35358),
+(35359),
+(35368),
+(35376),
+(35385),
+(35393),
+(35394),
+(35397),
+(35398),
+(35403),
+(35405),
+(35409),
+(35410),
+(35416),
+(35428),
+(35437),
+(35472),
+(35501),
+(35518),
+(35528),
+(35582),
+(35638),
+(35641),
+(35642),
+(35646),
+(35652),
+(35653),
+(35676),
+(35710),
+(35713),
+(35762),
+(35769),
+(35788),
+(35789),
+(35799),
+(35814),
+(35817),
+(35820),
+(35824),
+(35835),
+(35837),
+(35845),
+(35851),
+(35854),
+(35861),
+(35903),
+(35905),
+(35924),
+(35946),
+(35970),
+(35977),
+(35994),
+(36002),
+(36013),
+(36016),
+(36023),
+(36044),
+(36053),
+(36065),
+(36066),
+(36067),
+(36068),
+(36086),
+(36087),
+(36088),
+(36089),
+(36090),
+(36091),
+(36092),
+(36093),
+(36094),
+(36107),
+(36113),
+(36118),
+(36122),
+(36127),
+(36142),
+(36146),
+(36149),
+(36173),
+(36175),
+(36179),
+(36224),
+(36226),
+(36228),
+(36281),
+(36326),
+(36327),
+(36331),
+(36344),
+(36345),
+(36359),
+(36397),
+(36398),
+(36399),
+(36404),
+(36405),
+(36406),
+(36408),
+(36409),
+(36410),
+(36413),
+(36414),
+(36421),
+(36422),
+(36430),
+(36431),
+(36432),
+(36433),
+(36436),
+(36448),
+(36490),
+(36491),
+(36495),
+(36500),
+(36506),
+(36507),
+(36508),
+(36509),
+(36510),
+(36523),
+(36524),
+(36526),
+(36543),
+(36548),
+(36553),
+(36554),
+(36601),
+(36609),
+(36635),
+(36639),
+(36640),
+(36641),
+(36642),
+(36643),
+(36645),
+(36646),
+(36649),
+(36658),
+(36694),
+(36704),
+(36705),
+(36706),
+(36708),
+(36709),
+(36712),
+(36713),
+(36715),
+(36716),
+(36717),
+(36718),
+(36719),
+(36721),
+(36739),
+(36794),
+(36795),
+(36796),
+(36801),
+(36842),
+(36876),
+(36892),
+(36895),
+(36897),
+(36926),
+(36933),
+(36939),
+(37019),
+(37032),
+(37033),
+(37034),
+(37035),
+(37036),
+(37037),
+(37039),
+(37040),
+(37142),
+(37147),
+(37150),
+(37151),
+(37152),
+(37153),
+(37156),
+(37164),
+(37165),
+(37166),
+(37170),
+(37173),
+(37178),
+(37180),
+(37184),
+(37185),
+(37186),
+(37187),
+(37205),
+(37206),
+(37208),
+(37211),
+(37229),
+(37230),
+(37305),
+(37306),
+(37309),
+(37325),
+(37326),
+(37363),
+(37378),
+(37379),
+(37380),
+(37381),
+(37383),
+(37384),
+(37464),
+(37537),
+(37542),
+(37543),
+(37544),
+(37547),
+(37552),
+(37575),
+(37582),
+(37584),
+(37585),
+(37586),
+(37604),
+(37609),
+(37614),
+(37635),
+(37649),
+(37651),
+(37677),
+(37684),
+(37689),
+(37690),
+(37697),
+(37727),
+(37728),
+(37730),
+(37734),
+(37741),
+(37742),
+(37751),
+(37755),
+(37783),
+(37784),
+(37785),
+(37801),
+(37807),
+(37810),
+(37826),
+(37828),
+(37842),
+(37843),
+(37847),
+(37849),
+(37851),
+(37869),
+(37870),
+(37931),
+(37933),
+(37934),
+(37938),
+(37940),
+(37941),
+(37948),
+(37951),
+(37954),
+(37955),
+(37986),
+(37987),
+(38014),
+(38016),
+(38021),
+(38022),
+(38026),
+(38027),
+(38028),
+(38033),
+(38056),
+(38058),
+(38067),
+(38068),
+(38071),
+(38073),
+(38101),
+(38117),
+(38145),
+(38156),
+(38185),
+(38188),
+(38189),
+(38191),
+(38192),
+(38202),
+(38210),
+(38211),
+(38212),
+(38213),
+(38215),
+(38222),
+(38224),
+(38228),
+(38231),
+(38234),
+(38235),
+(38236),
+(38237),
+(38242),
+(38243),
+(38244),
+(38245),
+(38262),
+(38263),
+(38278),
+(38280),
+(38281),
+(38283),
+(38287),
+(38288),
+(38304),
+(38306),
+(38310),
+(38313),
+(38320),
+(38321),
+(38329),
+(38337),
+(38346),
+(38348),
+(38352),
+(38354),
+(38355),
+(38356),
+(38357),
+(38365),
+(38369),
+(38370),
+(38374),
+(38389),
+(38390),
+(38403),
+(38408),
+(38410),
+(38411),
+(38431),
+(38442),
+(38444),
+(38451),
+(38452),
+(38456),
+(38458),
+(38459),
+(38461),
+(38467),
+(38469),
+(38476),
+(38480),
+(38488),
+(38492),
+(38495),
+(38500),
+(38509),
+(38510),
+(38513),
+(38515),
+(38516),
+(38517),
+(38535),
+(38551),
+(38552),
+(38553),
+(38554),
+(38555),
+(38556),
+(38560),
+(38588),
+(38609),
+(38610),
+(38611),
+(38612),
+(38622),
+(38623),
+(38632),
+(38633),
+(38639),
+(38640),
+(38641),
+(38642),
+(38643),
+(38644),
+(38645),
+(38655),
+(38659),
+(38660),
+(38661),
+(38662),
+(38663),
+(38664),
+(38665),
+(38666),
+(38667),
+(38675),
+(38678),
+(38682),
+(38690),
+(38698),
+(38700),
+(38703),
+(38707),
+(38708),
+(38732),
+(38746),
+(38750),
+(38751),
+(38752),
+(38753),
+(38757),
+(38758),
+(38759),
+(38764),
+(38784),
+(38785),
+(38794),
+(38807),
+(38808),
+(38810),
+(38811),
+(38826),
+(38843),
+(38855),
+(38856),
+(38863),
+(38866),
+(38868),
+(38869),
+(38870),
+(38871),
+(38872),
+(38873),
+(38875),
+(38876),
+(38877),
+(38878),
+(38879),
+(38880),
+(38881),
+(38882),
+(38883),
+(38884),
+(38885),
+(38886),
+(38887),
+(38888),
+(38889),
+(38890),
+(38891),
+(38892),
+(38901),
+(38902),
+(38903),
+(38906),
+(38907),
+(38912),
+(38913),
+(38914),
+(38915),
+(38917),
+(38918),
+(38920),
+(38921),
+(38922),
+(38923),
+(38924),
+(38926),
+(38930),
+(38933),
+(38956),
+(38957),
+(38958),
+(38959),
+(38960),
+(38966),
+(38967),
+(38971),
+(38973),
+(38974),
+(38975),
+(38976),
+(38977),
+(38978),
+(38979),
+(38980),
+(38981),
+(38982),
+(38983),
+(38984),
+(38985),
+(38987),
+(38988),
+(38989),
+(38990),
+(38993),
+(38994),
+(38997),
+(38998),
+(38999),
+(39000),
+(39003),
+(39004),
+(39005),
+(39006),
+(39007),
+(39008),
+(39010),
+(39011),
+(39012),
+(39013),
+(39014),
+(39015),
+(39016),
+(39019),
+(39020),
+(39022),
+(39035),
+(39036),
+(39037),
+(39039),
+(39040),
+(39041),
+(39042),
+(39043),
+(39044),
+(39045),
+(39046),
+(39047),
+(39048),
+(39049),
+(39053),
+(39054),
+(39055),
+(39057),
+(39059),
+(39061),
+(39062),
+(39063),
+(39064),
+(39068),
+(39070),
+(39092),
+(39098),
+(39102),
+(39103),
+(39106),
+(39107),
+(39116),
+(39117),
+(39122),
+(39123),
+(39124),
+(39126),
+(39129),
+(39130),
+(39139),
+(39140),
+(39141),
+(39143),
+(39146),
+(39147),
+(39148),
+(39150),
+(39153),
+(39156),
+(39157),
+(39158),
+(39168),
+(39169),
+(39170),
+(39171),
+(39172),
+(39173),
+(39175),
+(39176),
+(39178),
+(39179),
+(39180),
+(39181),
+(39185),
+(39186),
+(39188),
+(39189),
+(39190),
+(39191),
+(39202),
+(39203),
+(39204),
+(39205),
+(39206),
+(39207),
+(39209),
+(39210),
+(39212),
+(39225),
+(39226),
+(39227),
+(39228),
+(39230),
+(39231),
+(39234),
+(39235),
+(39236),
+(39237),
+(39238),
+(39239),
+(39240),
+(39241),
+(39242),
+(39243),
+(39244),
+(39245),
+(39246),
+(39247),
+(39250),
+(39254),
+(39255),
+(39257),
+(39258),
+(39262),
+(39263),
+(39264),
+(39267),
+(39268),
+(39269),
+(39270),
+(39272),
+(39273),
+(39274),
+(39275),
+(39276),
+(39278),
+(39279),
+(39289),
+(39290),
+(39291),
+(39292),
+(39293),
+(39312),
+(39314),
+(39315),
+(39317),
+(39320),
+(39334),
+(39337),
+(39338),
+(39339),
+(39340),
+(39341),
+(39342),
+(39348),
+(39350),
+(39351),
+(39352),
+(39353),
+(39356),
+(39357),
+(39358),
+(39360),
+(39361),
+(39362),
+(39366),
+(39367),
+(39368),
+(39370),
+(39371),
+(39372),
+(39376),
+(39379),
+(39382),
+(39383),
+(39384),
+(39385),
+(39387),
+(39388),
+(39395),
+(39396),
+(39398),
+(39400),
+(39401),
+(39402),
+(39403),
+(39404),
+(39406),
+(39408),
+(39409),
+(39410),
+(39411),
+(39412),
+(39413),
+(39414),
+(39416),
+(39417),
+(39418),
+(39420),
+(39421),
+(39422),
+(39423),
+(39427),
+(39428),
+(39430),
+(39431),
+(39432),
+(39433),
+(39434),
+(39437),
+(39439),
+(39440),
+(39441),
+(39442),
+(39444),
+(39446),
+(39448),
+(39450),
+(39453),
+(39454),
+(39455),
+(39457),
+(39458),
+(39459),
+(39460),
+(39461),
+(39462),
+(39464),
+(39465),
+(39466),
+(39467),
+(39468),
+(39469),
+(39470),
+(39471),
+(39472),
+(39473),
+(39475),
+(39476),
+(39477),
+(39478),
+(39479),
+(39480),
+(39481),
+(39482),
+(39483),
+(39484),
+(39485),
+(39486),
+(39487),
+(39488),
+(39489),
+(39490),
+(39491),
+(39492),
+(39493),
+(39494),
+(39495),
+(39496),
+(39497),
+(39498),
+(39499),
+(39500),
+(39502),
+(39503),
+(39504),
+(39505),
+(39506),
+(39508),
+(39510),
+(39511),
+(39512),
+(39513),
+(39514),
+(39515),
+(39516),
+(39517),
+(39518),
+(39519),
+(39520),
+(39525),
+(39527),
+(39528),
+(39529),
+(39534),
+(39535),
+(39536),
+(39537),
+(39538),
+(39539),
+(39540),
+(39541),
+(39542),
+(39551),
+(39553),
+(39554),
+(39555),
+(39556),
+(39557),
+(39558),
+(39560),
+(39568),
+(39569),
+(39570),
+(39571),
+(39572),
+(39573),
+(39574),
+(39576),
+(39577),
+(39578),
+(39579),
+(39580),
+(39582),
+(39583),
+(39584),
+(39585),
+(39587),
+(39588),
+(39589),
+(39590),
+(39591),
+(39592),
+(39593),
+(39594),
+(39595),
+(39596),
+(39597),
+(39598),
+(39601),
+(39602),
+(39603),
+(39608),
+(39615),
+(39621),
+(39625),
+(39626),
+(39627),
+(39631),
+(39632),
+(39633),
+(39634),
+(39635),
+(39636),
+(39637),
+(39638),
+(39639),
+(39640),
+(39641),
+(39642),
+(39643),
+(39644),
+(39645),
+(39646),
+(39647),
+(39648),
+(39649),
+(39650),
+(39651),
+(39652),
+(39653),
+(39654),
+(39655),
+(39656),
+(39657),
+(39658),
+(39659),
+(39660),
+(39661),
+(39662),
+(39663),
+(39664),
+(39665),
+(39666),
+(39667),
+(39668),
+(39669),
+(39670),
+(39671),
+(39672),
+(39673),
+(39674),
+(39675),
+(39676),
+(39677),
+(39678),
+(39679),
+(39680),
+(39682),
+(39683),
+(39684),
+(39685),
+(39686),
+(39687),
+(39688),
+(39693),
+(39695),
+(39696),
+(39697),
+(39698),
+(39699),
+(39700),
+(39701),
+(39702),
+(39703),
+(39704),
+(39705),
+(39706),
+(39707),
+(39708),
+(39709),
+(39710),
+(39711),
+(39712),
+(39713),
+(39714),
+(39715),
+(39716),
+(39717),
+(39718),
+(39719),
+(39720),
+(39721),
+(39722),
+(39723),
+(39724),
+(39725),
+(39726),
+(39727),
+(39728),
+(39729),
+(39730),
+(39731),
+(39732),
+(39733),
+(39734),
+(39735),
+(39736),
+(39737),
+(39738),
+(39739),
+(39740),
+(39741),
+(39742),
+(39743),
+(39744),
+(39745),
+(39746),
+(39747),
+(39748),
+(39752),
+(39753),
+(39754),
+(39755),
+(39756),
+(39757),
+(39758),
+(39759),
+(39760),
+(39761),
+(39762),
+(39763),
+(39764),
+(39765),
+(39766),
+(39767),
+(39768),
+(39769),
+(39770),
+(39771),
+(39772),
+(39777),
+(39778),
+(39779),
+(39784),
+(39791),
+(39792),
+(39793),
+(39794),
+(39795),
+(39796),
+(39798),
+(39800),
+(39801),
+(39802),
+(39803),
+(39804),
+(39805),
+(39806),
+(39807),
+(39810),
+(39822),
+(39826),
+(39827),
+(39833),
+(39834),
+(39835),
+(39837),
+(39860),
+(39886),
+(39887),
+(39888),
+(39890),
+(39892),
+(39895),
+(39896),
+(39898),
+(39899),
+(39902),
+(39903),
+(39904),
+(39905),
+(39913),
+(39915),
+(39916),
+(39917),
+(39919),
+(39920),
+(39921),
+(39922),
+(39923),
+(39924),
+(39925),
+(39926),
+(39928),
+(39929),
+(39930),
+(39932),
+(39933),
+(39934),
+(39935),
+(39936),
+(39942),
+(39948),
+(39950),
+(39951),
+(39954),
+(39955),
+(39956),
+(39957),
+(39958),
+(39959),
+(39960),
+(39961),
+(39962),
+(39963),
+(39964),
+(39965),
+(39968),
+(39969),
+(39993),
+(39999),
+(40000),
+(40001),
+(40002),
+(40003),
+(40004),
+(40005),
+(40006),
+(40007),
+(40008),
+(40009),
+(40010),
+(40016),
+(40017),
+(40018),
+(40020),
+(40021),
+(40022),
+(40024),
+(40025),
+(40028),
+(40031),
+(40032),
+(40033),
+(40034),
+(40035),
+(40036),
+(40037),
+(40038),
+(40039),
+(40040),
+(40041),
+(40042),
+(40044),
+(40045),
+(40046),
+(40047),
+(40050),
+(40053),
+(40054),
+(40059),
+(40066),
+(40067),
+(40069),
+(40071),
+(40072),
+(40073),
+(40075),
+(40077),
+(40078),
+(40079),
+(40080),
+(40081),
+(40082),
+(40083),
+(40084),
+(40085),
+(40087),
+(40088),
+(40089),
+(40090),
+(40092),
+(40093),
+(40094),
+(40095),
+(40096),
+(40100),
+(40106),
+(40108),
+(40109),
+(40110),
+(40111),
+(40112),
+(40113),
+(40114),
+(40118),
+(40119),
+(40120),
+(40121),
+(40122),
+(40123),
+(40124),
+(40125),
+(40126),
+(40127),
+(40128),
+(40129),
+(40130),
+(40131),
+(40132),
+(40133),
+(40135),
+(40136),
+(40137),
+(40138),
+(40139),
+(40140),
+(40141),
+(40142),
+(40144),
+(40145),
+(40146),
+(40148),
+(40149),
+(40151),
+(40152),
+(40153),
+(40154),
+(40155),
+(40156),
+(40157),
+(40160),
+(40161),
+(40162),
+(40163),
+(40166),
+(40167),
+(40168),
+(40169),
+(40170),
+(40171),
+(40172),
+(40173),
+(40174),
+(40175),
+(40176),
+(40177),
+(40178),
+(40179),
+(40180),
+(40181),
+(40182),
+(40183),
+(40184),
+(40185),
+(40186),
+(40187),
+(40188),
+(40189),
+(40191),
+(40192),
+(40194),
+(40195),
+(40196),
+(40197),
+(40198),
+(40199),
+(40200),
+(40201),
+(40202),
+(40203),
+(40204),
+(40205),
+(40207),
+(40208),
+(40209),
+(40210),
+(40211),
+(40215),
+(40216),
+(40217),
+(40218),
+(40219),
+(40220),
+(40221),
+(40222),
+(40223),
+(40224),
+(40225),
+(40226),
+(40227),
+(40228),
+(40229),
+(40230),
+(40231),
+(40232),
+(40233),
+(40234),
+(40235),
+(40236),
+(40237),
+(40238),
+(40239),
+(40240),
+(40241),
+(40242),
+(40243),
+(40244),
+(40245),
+(40246),
+(40247),
+(40248),
+(40249),
+(40250),
+(40252),
+(40253),
+(40254),
+(40255),
+(40256),
+(40257),
+(40258),
+(40259),
+(40260),
+(40261),
+(40262),
+(40263),
+(40264),
+(40265),
+(40266),
+(40267),
+(40268),
+(40269),
+(40270),
+(40271),
+(40272),
+(40273),
+(40274),
+(40275),
+(40276),
+(40277),
+(40278),
+(40279),
+(40280),
+(40281),
+(40282),
+(40283),
+(40284),
+(40285),
+(40286),
+(40287),
+(40288),
+(40289),
+(40290),
+(40291),
+(40293),
+(40294),
+(40296),
+(40297),
+(40299),
+(40300),
+(40301),
+(40302),
+(40303),
+(40304),
+(40305),
+(40306),
+(40307),
+(40308),
+(40309),
+(40310),
+(40311),
+(40312),
+(40313),
+(40314),
+(40317),
+(40318),
+(40319),
+(40320),
+(40321),
+(40322),
+(40323),
+(40324),
+(40325),
+(40326),
+(40327),
+(40328),
+(40329),
+(40330),
+(40331),
+(40332),
+(40333),
+(40334),
+(40335),
+(40336),
+(40337),
+(40338),
+(40339),
+(40340),
+(40341),
+(40342),
+(40343),
+(40344),
+(40345),
+(40346),
+(40347),
+(40348),
+(40349),
+(40350),
+(40351),
+(40352),
+(40353),
+(40354),
+(40357),
+(40358),
+(40359),
+(40360),
+(40361),
+(40372),
+(40386),
+(40415),
+(40465),
+(40506),
+(40507),
+(40508),
+(40509),
+(40510),
+(40517),
+(40518),
+(40519),
+(40520),
+(40521),
+(40522),
+(40523),
+(40524),
+(40525),
+(40526),
+(40527),
+(40528),
+(40529),
+(40530),
+(40534),
+(40535),
+(40539),
+(40543),
+(40545),
+(40546),
+(40547),
+(40548),
+(40549),
+(40550),
+(40552),
+(40553),
+(40554),
+(40555),
+(40557),
+(40558),
+(40559),
+(40560),
+(40562),
+(40563),
+(40564),
+(40565),
+(40566),
+(40567),
+(40569),
+(40572),
+(40573),
+(40574),
+(40575),
+(40576),
+(40577),
+(40578),
+(40579),
+(40580),
+(40581),
+(40583),
+(40584),
+(40585),
+(40586),
+(40587),
+(40588),
+(40589),
+(40590),
+(40591),
+(40592),
+(40594),
+(40596),
+(40597),
+(40599),
+(40600),
+(40601),
+(40602),
+(40603),
+(40604),
+(40605),
+(40606),
+(40607),
+(40608),
+(40609),
+(40610),
+(40611),
+(40613),
+(40615),
+(40616),
+(40617),
+(40618),
+(40619),
+(40620),
+(40621),
+(40622),
+(40623),
+(40624),
+(40625),
+(40628),
+(40629),
+(40630),
+(40631),
+(40632),
+(40633),
+(40634),
+(40635),
+(40636),
+(40637),
+(40638),
+(40639),
+(40642),
+(40644),
+(40645),
+(40646),
+(40647),
+(40648),
+(40649),
+(40650),
+(40651),
+(40652),
+(40653),
+(40655),
+(40656),
+(40657),
+(40658),
+(40659),
+(40661),
+(40662),
+(40663),
+(40664),
+(40665),
+(40669),
+(40670),
+(40671),
+(40672),
+(40673),
+(40674),
+(40675),
+(40677),
+(40678),
+(40679),
+(40680),
+(40681),
+(40682),
+(40683),
+(40684),
+(40685),
+(40686),
+(40687),
+(40688),
+(40689),
+(40690),
+(40691),
+(40692),
+(40693),
+(40694),
+(40695),
+(40696),
+(40697),
+(40698),
+(40699),
+(40700),
+(40701),
+(40702),
+(40703),
+(40704),
+(40705),
+(40706),
+(40707),
+(40708),
+(40709),
+(40710),
+(40711),
+(40712),
+(40713),
+(40714),
+(40715),
+(40716),
+(40717),
+(40718),
+(40719),
+(40720),
+(40721),
+(40722),
+(40723),
+(40724),
+(40725),
+(40726),
+(40727),
+(40728),
+(40729),
+(40730),
+(40731),
+(40732),
+(40733),
+(40736),
+(40737),
+(40739),
+(40740),
+(40741),
+(40742),
+(40743),
+(40744),
+(40745),
+(40746),
+(40747),
+(40748),
+(40749),
+(40750),
+(40751),
+(40752),
+(40753),
+(40754),
+(40755),
+(40756),
+(40757),
+(40758),
+(40759),
+(40760),
+(40761),
+(40762),
+(40763),
+(40764),
+(40765),
+(40766),
+(40767),
+(40768),
+(40769),
+(40770),
+(40771),
+(40772),
+(40773),
+(40775),
+(40776),
+(40777),
+(40778),
+(40779),
+(40780),
+(40781),
+(40782),
+(40783),
+(40784),
+(40785),
+(40786),
+(40787),
+(40788),
+(40789),
+(40790),
+(40791),
+(40792),
+(40793),
+(40794),
+(40795),
+(40796),
+(40797),
+(40798),
+(40799),
+(40800),
+(40801),
+(40802),
+(40803),
+(40804),
+(40805),
+(40806),
+(40807),
+(40808),
+(40809),
+(40810),
+(40811),
+(40813),
+(40814),
+(40815),
+(40816),
+(40817),
+(40818),
+(40819),
+(40820),
+(40821),
+(40823),
+(40824),
+(40825),
+(40826),
+(40827),
+(40828),
+(40829),
+(40830),
+(40831),
+(40834),
+(40835),
+(40836),
+(40837),
+(40838),
+(40839),
+(40840),
+(40841),
+(40842),
+(40843),
+(40844),
+(40845),
+(40846),
+(40847),
+(40848),
+(40849),
+(40850),
+(40851),
+(40852),
+(40853),
+(40854),
+(40855),
+(40856),
+(40857),
+(40858),
+(40859),
+(40861),
+(40862),
+(40864),
+(40865),
+(40866),
+(40867),
+(40868),
+(40869),
+(40870),
+(40871),
+(40872),
+(40873),
+(40874),
+(40875),
+(40876),
+(40877),
+(40878),
+(40879),
+(40880),
+(40881),
+(40882),
+(40883),
+(40884),
+(40885),
+(40886),
+(40887),
+(40888),
+(40889),
+(40890),
+(40891),
+(40892),
+(40893),
+(40894),
+(40895),
+(40896),
+(40897),
+(40898),
+(40899),
+(40900),
+(40901),
+(40902),
+(40903),
+(40904),
+(40905),
+(40906),
+(40907),
+(40908),
+(40910),
+(40911),
+(40913),
+(40914),
+(40915),
+(40916),
+(40917),
+(40918),
+(40919),
+(40920),
+(40921),
+(40922),
+(40923),
+(40924),
+(40925),
+(40926),
+(40927),
+(40928),
+(40929),
+(40930),
+(40931),
+(40932),
+(40933),
+(40934),
+(40935),
+(40936),
+(40937),
+(40938),
+(40939),
+(40940),
+(40941),
+(40942),
+(40943),
+(40944),
+(40945),
+(40946),
+(40947),
+(40948),
+(40949),
+(40950),
+(40951),
+(40953),
+(40954),
+(40955),
+(40956),
+(40957),
+(40958),
+(40959),
+(40960),
+(40961),
+(40962),
+(40963),
+(40964),
+(40965),
+(40966),
+(40967),
+(40968),
+(40969),
+(40970),
+(40971),
+(40972),
+(40973),
+(40974),
+(40975),
+(40976),
+(40977),
+(40978),
+(40979),
+(40980),
+(40981),
+(40982),
+(40983),
+(40984),
+(40985),
+(40986),
+(40988),
+(40989),
+(40990),
+(40991),
+(40992),
+(40993),
+(40994),
+(40995),
+(40996),
+(40997),
+(40998),
+(40999),
+(41000),
+(41001),
+(41002),
+(41003),
+(41004),
+(41005),
+(41006),
+(41007),
+(41008),
+(41009),
+(41010),
+(41011),
+(41012),
+(41013),
+(41014),
+(41015),
+(41016),
+(41017),
+(41018),
+(41019),
+(41020),
+(41021),
+(41022),
+(41023),
+(41024),
+(41025),
+(41026),
+(41027),
+(41028),
+(41029),
+(41030),
+(41031),
+(41032),
+(41033),
+(41034),
+(41035),
+(41036),
+(41037),
+(41038),
+(41039),
+(41041),
+(41042),
+(41043),
+(41044),
+(41046),
+(41048),
+(41049),
+(41050),
+(41051),
+(41052),
+(41053),
+(41054),
+(41055),
+(41056),
+(41057),
+(41058),
+(41059),
+(41060),
+(41061),
+(41062),
+(41063),
+(41064),
+(41065),
+(41066),
+(41067),
+(41068),
+(41069),
+(41070),
+(41072),
+(41073),
+(41074),
+(41075),
+(41076),
+(41077),
+(41078),
+(41079),
+(41082),
+(41083),
+(41084),
+(41085),
+(41086),
+(41087),
+(41088),
+(41089),
+(41090),
+(41091),
+(41092),
+(41093),
+(41094),
+(41095),
+(41096),
+(41097),
+(41098),
+(41099),
+(41100),
+(41101),
+(41102),
+(41103),
+(41104),
+(41105),
+(41106),
+(41107),
+(41108),
+(41109),
+(41110),
+(41113),
+(41114),
+(41115),
+(41116),
+(41117),
+(41118),
+(41119),
+(41120),
+(41121),
+(41122),
+(41123),
+(41124),
+(41125),
+(41126),
+(41127),
+(41128),
+(41129),
+(41130),
+(41131),
+(41132),
+(41133),
+(41134),
+(41135),
+(41136),
+(41137),
+(41138),
+(41139),
+(41140),
+(41141),
+(41142),
+(41143),
+(41144),
+(41145),
+(41146),
+(41147),
+(41148),
+(41149),
+(41150),
+(41151),
+(41152),
+(41153),
+(41154),
+(41155),
+(41156),
+(41157),
+(41158),
+(41159),
+(41160),
+(41161),
+(41162),
+(41163),
+(41164),
+(41165),
+(41166),
+(41167),
+(41168),
+(41169),
+(41170),
+(41171),
+(41172),
+(41173),
+(41174),
+(41175),
+(41177),
+(41178),
+(41179),
+(41180),
+(41181),
+(41182),
+(41183),
+(41185),
+(41187),
+(41188),
+(41189),
+(41190),
+(41191),
+(41192),
+(41193),
+(41194),
+(41195),
+(41196),
+(41197),
+(41198),
+(41199),
+(41200),
+(41201),
+(41202),
+(41203),
+(41204),
+(41205),
+(41206),
+(41207),
+(41208),
+(41210),
+(41211),
+(41212),
+(41213),
+(41214),
+(41215),
+(41216),
+(41217),
+(41218),
+(41219),
+(41220),
+(41221),
+(41222),
+(41223),
+(41224),
+(41225),
+(41227),
+(41228),
+(41229),
+(41230),
+(41231),
+(41232),
+(41233),
+(41234),
+(41235),
+(41236),
+(41238),
+(41239),
+(41240),
+(41241),
+(41242),
+(41243),
+(41244),
+(41245),
+(41246),
+(41247),
+(41248),
+(41249),
+(41250),
+(41251),
+(41252),
+(41253),
+(41254),
+(41255),
+(41256),
+(41257),
+(41258),
+(41259),
+(41260),
+(41261),
+(41262),
+(41263),
+(41264),
+(41265),
+(41266),
+(41267),
+(41268),
+(41269),
+(41270),
+(41271),
+(41272),
+(41273),
+(41274),
+(41275),
+(41276),
+(41277),
+(41278),
+(41279),
+(41280),
+(41281),
+(41282),
+(41283),
+(41284),
+(41285),
+(41286),
+(41287),
+(41288),
+(41289),
+(41290),
+(41291),
+(41292),
+(41295),
+(41296),
+(41297),
+(41298),
+(41299),
+(41300),
+(41301),
+(41304),
+(41305),
+(41306),
+(41307),
+(41308),
+(41309),
+(41310),
+(41311),
+(41312),
+(41313),
+(41314),
+(41315),
+(41316),
+(41317),
+(41318),
+(41319),
+(41320),
+(41321),
+(41322),
+(41323),
+(41324),
+(41325),
+(41326),
+(41327),
+(41328),
+(41329),
+(41330),
+(41331),
+(41332),
+(41333),
+(41334),
+(41335),
+(41336),
+(41337),
+(41338),
+(41339),
+(41340),
+(41341),
+(41342),
+(41343),
+(41344),
+(41345),
+(41346),
+(41347),
+(41348),
+(41349),
+(41350),
+(41351),
+(41352),
+(41353),
+(41354),
+(41355),
+(41356),
+(41357),
+(41358),
+(41359),
+(41360),
+(41361),
+(41362),
+(41363),
+(41364),
+(41365),
+(41366),
+(41367),
+(41368),
+(41369),
+(41370),
+(41371),
+(41372),
+(41373),
+(41374),
+(41375),
+(41376),
+(41377),
+(41378),
+(41379),
+(41380),
+(41381),
+(41383),
+(41384),
+(41385),
+(41386),
+(41387),
+(41388),
+(41389),
+(41390),
+(41391),
+(41392),
+(41393),
+(41394),
+(41395),
+(41396),
+(41397),
+(41398),
+(41399),
+(41400),
+(41401),
+(41402),
+(41403),
+(41404),
+(41405),
+(41406),
+(41407),
+(41408),
+(41409),
+(41410),
+(41411),
+(41412),
+(41413),
+(41414),
+(41415),
+(41416),
+(41417),
+(41418),
+(41419),
+(41420),
+(41421),
+(41422),
+(41423),
+(41425),
+(41426),
+(41427),
+(41429),
+(41431),
+(41432),
+(41433),
+(41434),
+(41435),
+(41436),
+(41437),
+(41438),
+(41439),
+(41441),
+(41442),
+(41443),
+(41444),
+(41445),
+(41446),
+(41447),
+(41448),
+(41449),
+(41450),
+(41453),
+(41456),
+(41458),
+(41459),
+(41460),
+(41461),
+(41462),
+(41463),
+(41464),
+(41467),
+(41468),
+(41469),
+(41470),
+(41471),
+(41472),
+(41473),
+(41474),
+(41475),
+(41476),
+(41477),
+(41478),
+(41479),
+(41480),
+(41481),
+(41482),
+(41483),
+(41484),
+(41485),
+(41486),
+(41487),
+(41488),
+(41489),
+(41490),
+(41491),
+(41492),
+(41493),
+(41494),
+(41495),
+(41496),
+(41497),
+(41498),
+(41499),
+(41500),
+(41501),
+(41502),
+(41503),
+(41504),
+(41505),
+(41506),
+(41507),
+(41508),
+(41509),
+(41510),
+(41511),
+(41512),
+(41513),
+(41514),
+(41515),
+(41516),
+(41517),
+(41518),
+(41519),
+(41520),
+(41521),
+(41522),
+(41523),
+(41524),
+(41525),
+(41526),
+(41527),
+(41528),
+(41529),
+(41530),
+(41531),
+(41532),
+(41533),
+(41534),
+(41535),
+(41538),
+(41539),
+(41540),
+(41541),
+(41542),
+(41543),
+(41544),
+(41545),
+(41546),
+(41547),
+(41548),
+(41549),
+(41550),
+(41551),
+(41552),
+(41553),
+(41554),
+(41556),
+(41558),
+(41559),
+(41560),
+(41561),
+(41562),
+(41563),
+(41564),
+(41565),
+(41566),
+(41567),
+(41568),
+(41569),
+(41570),
+(41571),
+(41572),
+(41573),
+(41574),
+(41575),
+(41576),
+(41577),
+(41578),
+(41579),
+(41580),
+(41581),
+(41582),
+(41583),
+(41584),
+(41585),
+(41586),
+(41587),
+(41589),
+(41590),
+(41591),
+(41592),
+(41593),
+(41594),
+(41595),
+(41596),
+(41597),
+(41598),
+(41599),
+(41600),
+(41601),
+(41602),
+(41603),
+(41604),
+(41605),
+(41606),
+(41607),
+(41608),
+(41609),
+(41610),
+(41632),
+(41635),
+(41636),
+(41637),
+(41638),
+(41639),
+(41640),
+(41646),
+(41647),
+(41648),
+(41649),
+(41650),
+(41651),
+(41652),
+(41653),
+(41654),
+(41655),
+(41656),
+(41657),
+(41658),
+(41659),
+(41660),
+(41661),
+(41662),
+(41663),
+(41664),
+(41665),
+(41666),
+(41667),
+(41668),
+(41669),
+(41670),
+(41671),
+(41672),
+(41673),
+(41674),
+(41675),
+(41676),
+(41677),
+(41678),
+(41679),
+(41680),
+(41681),
+(41682),
+(41683),
+(41684),
+(41685),
+(41686),
+(41689),
+(41696),
+(41697),
+(41698),
+(41699),
+(41700),
+(41701),
+(41702),
+(41703),
+(41704),
+(41705),
+(41706),
+(41707),
+(41708),
+(41709),
+(41710),
+(41711),
+(41712),
+(41713),
+(41714),
+(41715),
+(41716),
+(41717),
+(41718),
+(41719),
+(41720),
+(41721),
+(41722),
+(41723),
+(41724),
+(41725),
+(41726),
+(41727),
+(41728),
+(41729),
+(41730),
+(41731),
+(41732),
+(41733),
+(41734),
+(41735),
+(41736),
+(41737),
+(41738),
+(41739),
+(41740),
+(41741),
+(41742),
+(41743),
+(41744),
+(41745),
+(41746),
+(41747),
+(41748),
+(41749),
+(41750),
+(41751),
+(41752),
+(41753),
+(41754),
+(41755),
+(41756),
+(41757),
+(41758),
+(41759),
+(41760),
+(41761),
+(41762),
+(41763),
+(41764),
+(41765),
+(41766),
+(41767),
+(41768),
+(41769),
+(41770),
+(41771),
+(41772),
+(41773),
+(41775),
+(41776),
+(41777),
+(41778),
+(41779),
+(41780),
+(41781),
+(41782),
+(41783),
+(41784),
+(41785),
+(41786),
+(41787),
+(41788),
+(41789),
+(41790),
+(41791),
+(41792),
+(41793),
+(41794),
+(41795),
+(41796),
+(41797),
+(41798),
+(41799),
+(41800),
+(41801),
+(41802),
+(41803),
+(41804),
+(41805),
+(41806),
+(41807),
+(41808),
+(41809),
+(41810),
+(41812),
+(41813),
+(41814),
+(41815),
+(41816),
+(41817),
+(41818),
+(41819),
+(41820),
+(41821),
+(41822),
+(41823),
+(41824),
+(41825),
+(41826),
+(41827),
+(41828),
+(41829),
+(41830),
+(41831),
+(41832),
+(41833),
+(41834),
+(41835),
+(41836),
+(41837),
+(41838),
+(41839),
+(41840),
+(41841),
+(41842),
+(41843),
+(41844),
+(41845),
+(41846),
+(41847),
+(41849),
+(41851),
+(41852),
+(41853),
+(41854),
+(41855),
+(41856),
+(41857),
+(41858),
+(41859),
+(41860),
+(41861),
+(41862),
+(41863),
+(41864),
+(41865),
+(41866),
+(41867),
+(41868),
+(41869),
+(41870),
+(41871),
+(41872),
+(41873),
+(41874),
+(41875),
+(41876),
+(41877),
+(41878),
+(41879),
+(41880),
+(41881),
+(41882),
+(41883),
+(41884),
+(41885),
+(41886),
+(41887),
+(41888),
+(41889),
+(41890),
+(41891),
+(41892),
+(41893),
+(41894),
+(41895),
+(41896),
+(41897),
+(41898),
+(41899),
+(41900),
+(41901),
+(41902),
+(41903),
+(41904),
+(41905),
+(41906),
+(41907),
+(41908),
+(41909),
+(41910),
+(41911),
+(41912),
+(41913),
+(41914),
+(41915),
+(41916),
+(41917),
+(41918),
+(41919),
+(41920),
+(41921),
+(41922),
+(41923),
+(41924),
+(41925),
+(41926),
+(41927),
+(41928),
+(41929),
+(41930),
+(41931),
+(41932),
+(41933),
+(41934),
+(41935),
+(41936),
+(41937),
+(41938),
+(41939),
+(41940),
+(41941),
+(41942),
+(41943),
+(41944),
+(41945),
+(41946),
+(41947),
+(41948),
+(41949),
+(41950),
+(41951),
+(41952),
+(41953),
+(41954),
+(41955),
+(41956),
+(41957),
+(41958),
+(41959),
+(41960),
+(41961),
+(41962),
+(41963),
+(41964),
+(41965),
+(41966),
+(41967),
+(41968),
+(41969),
+(41970),
+(41971),
+(41972),
+(41973),
+(41974),
+(41975),
+(41976),
+(41977),
+(41978),
+(41979),
+(41980),
+(41981),
+(41982),
+(41983),
+(41984),
+(41987),
+(41988),
+(41989),
+(41990),
+(41991),
+(41992),
+(41993),
+(41994),
+(41995),
+(41996),
+(41997),
+(41998),
+(41999),
+(42000),
+(42001),
+(42002),
+(42003),
+(42004),
+(42005),
+(42006),
+(42007),
+(42008),
+(42009),
+(42010),
+(42011),
+(42012),
+(42013),
+(42014),
+(42015),
+(42016),
+(42017),
+(42018),
+(42019),
+(42020),
+(42021),
+(42022),
+(42023),
+(42024),
+(42025),
+(42026),
+(42027),
+(42028),
+(42029),
+(42030),
+(42031),
+(42032),
+(42033),
+(42034),
+(42035),
+(42036),
+(42037),
+(42038),
+(42039),
+(42040),
+(42041),
+(42042),
+(42043),
+(42044),
+(42045),
+(42046),
+(42047),
+(42048),
+(42049),
+(42050),
+(42051),
+(42052),
+(42053),
+(42054),
+(42055),
+(42056),
+(42058),
+(42059),
+(42060),
+(42061),
+(42062),
+(42063),
+(42064),
+(42065),
+(42066),
+(42067),
+(42068),
+(42069),
+(42070),
+(42071),
+(42072),
+(42073),
+(42074),
+(42075),
+(42076),
+(42077),
+(42078),
+(42079),
+(42080),
+(42081),
+(42082),
+(42083),
+(42085),
+(42086),
+(42087),
+(42088),
+(42089),
+(42090),
+(42091),
+(42092),
+(42093),
+(42094),
+(42095),
+(42096),
+(42097),
+(42098),
+(42099),
+(42100),
+(42101),
+(42102),
+(42103),
+(42105),
+(42106),
+(42107),
+(42108),
+(42109),
+(42110),
+(42111),
+(42112),
+(42115),
+(42118),
+(42119),
+(42120),
+(42121),
+(42122),
+(42123),
+(42124),
+(42125),
+(42126),
+(42127),
+(42128),
+(42129),
+(42130),
+(42131),
+(42132),
+(42133),
+(42134),
+(42135),
+(42136),
+(42137),
+(42138),
+(42139),
+(42140),
+(42141),
+(42142),
+(42143),
+(42144),
+(42145),
+(42146),
+(42147),
+(42148),
+(42149),
+(42150),
+(42151),
+(42152),
+(42153),
+(42154),
+(42155),
+(42156),
+(42157),
+(42158),
+(42159),
+(42160),
+(42161),
+(42162),
+(42163),
+(42164),
+(42165),
+(42166),
+(42167),
+(42168),
+(42169),
+(42170),
+(42171),
+(42172),
+(42173),
+(42174),
+(42175),
+(42176),
+(42177),
+(42178),
+(42179),
+(42181),
+(42182),
+(42183),
+(42184),
+(42185),
+(42186),
+(42187),
+(42188),
+(42189),
+(42190),
+(42191),
+(42192),
+(42193),
+(42194),
+(42195),
+(42196),
+(42197),
+(42198),
+(42199),
+(42200),
+(42201),
+(42202),
+(42203),
+(42204),
+(42205),
+(42206),
+(42207),
+(42208),
+(42209),
+(42210),
+(42211),
+(42212),
+(42213),
+(42214),
+(42215),
+(42216),
+(42217),
+(42218),
+(42219),
+(42221),
+(42222),
+(42223),
+(42224),
+(42225),
+(42226),
+(42227),
+(42228),
+(42229),
+(42230),
+(42231),
+(42232),
+(42233),
+(42234),
+(42235),
+(42236),
+(42237),
+(42239),
+(42240),
+(42241),
+(42242),
+(42243),
+(42244),
+(42245),
+(42247),
+(42248),
+(42249),
+(42250),
+(42251),
+(42252),
+(42253),
+(42254),
+(42255),
+(42256),
+(42257),
+(42258),
+(42259),
+(42260),
+(42261),
+(42262),
+(42263),
+(42264),
+(42265),
+(42269),
+(42270),
+(42271),
+(42272),
+(42273),
+(42274),
+(42275),
+(42276),
+(42277),
+(42278),
+(42279),
+(42280),
+(42281),
+(42282),
+(42288),
+(42289),
+(42290),
+(42291),
+(42292),
+(42294),
+(42295),
+(42296),
+(42297),
+(42298),
+(42299),
+(42300),
+(42301),
+(42302),
+(42303),
+(42304),
+(42305),
+(42306),
+(42307),
+(42308),
+(42309),
+(42310),
+(42311),
+(42312),
+(42313),
+(42314),
+(42315),
+(42316),
+(42317),
+(42318),
+(42319),
+(42320),
+(42321),
+(42322),
+(42323),
+(42324),
+(42325),
+(42326),
+(42327),
+(42328),
+(42329),
+(42330),
+(42331),
+(42332),
+(42333),
+(42334),
+(42335),
+(42336),
+(42337),
+(42341),
+(42342),
+(42343),
+(42344),
+(42345),
+(42346),
+(42348),
+(42349),
+(42350),
+(42351),
+(42352),
+(42353),
+(42354),
+(42355),
+(42356),
+(42357),
+(42358),
+(42359),
+(42360),
+(42361),
+(42362),
+(42363),
+(42365),
+(42366),
+(42367),
+(42368),
+(42369),
+(42370),
+(42372),
+(42373),
+(42374),
+(42375),
+(42376),
+(42377),
+(42378),
+(42379),
+(42380),
+(42381),
+(42382),
+(42383),
+(42384),
+(42385),
+(42386),
+(42387),
+(42388),
+(42389),
+(42394),
+(42395),
+(42396),
+(42397),
+(42398),
+(42399),
+(42400),
+(42401),
+(42402),
+(42403),
+(42404),
+(42405),
+(42406),
+(42407),
+(42408),
+(42409),
+(42410),
+(42411),
+(42412),
+(42413),
+(42414),
+(42415),
+(42416),
+(42417),
+(42418),
+(42419),
+(42420),
+(42421),
+(42422),
+(42423),
+(42424),
+(42425),
+(42426),
+(42428),
+(42429),
+(42430),
+(42431),
+(42432),
+(42433),
+(42434),
+(42435),
+(42436),
+(42437),
+(42438),
+(42439),
+(42441),
+(42442),
+(42443),
+(42444),
+(42445),
+(42446),
+(42447),
+(42448),
+(42449),
+(42450),
+(42451),
+(42452),
+(42453),
+(42454),
+(42455),
+(42456),
+(42457),
+(42458),
+(42459),
+(42460),
+(42461),
+(42462),
+(42463),
+(42464),
+(42465),
+(42466),
+(42467),
+(42468),
+(42469),
+(42470),
+(42471),
+(42472),
+(42473),
+(42474),
+(42475),
+(42476),
+(42477),
+(42478),
+(42479),
+(42480),
+(42481),
+(42482),
+(42483),
+(42484),
+(42485),
+(42486),
+(42487),
+(42488),
+(42489),
+(42490),
+(42491),
+(42492),
+(42493),
+(42494),
+(42495),
+(42496),
+(42497),
+(42499),
+(42500),
+(42501),
+(42502),
+(42503),
+(42504),
+(42505),
+(42506),
+(42507),
+(42508),
+(42509),
+(42511),
+(42512),
+(42513),
+(42514),
+(42515),
+(42516),
+(42517),
+(42518),
+(42519),
+(42520),
+(42521),
+(42522),
+(42523),
+(42524),
+(42525),
+(42526),
+(42527),
+(42528),
+(42529),
+(42530),
+(42531),
+(42532),
+(42533),
+(42534),
+(42535),
+(42537),
+(42538),
+(42539),
+(42540),
+(42541),
+(42542),
+(42543),
+(42544),
+(42545),
+(42546),
+(42547),
+(42548),
+(42549),
+(42550),
+(42551),
+(42552),
+(42553),
+(42554),
+(42555),
+(42556),
+(42557),
+(42558),
+(42559),
+(42560),
+(42561),
+(42562),
+(42563),
+(42564),
+(42565),
+(42566),
+(42567),
+(42568),
+(42569),
+(42570),
+(42571),
+(42572),
+(42573),
+(42574),
+(42575),
+(42576),
+(42577),
+(42578),
+(42579),
+(42580),
+(42581),
+(42582),
+(42583),
+(42584),
+(42585),
+(42586),
+(42587),
+(42588),
+(42589),
+(42590),
+(42591),
+(42592),
+(42593),
+(42594),
+(42595),
+(42596),
+(42597),
+(42598),
+(42599),
+(42600),
+(42601),
+(42602),
+(42603),
+(42604),
+(42605),
+(42606),
+(42607),
+(42608),
+(42609),
+(42610),
+(42611),
+(42612),
+(42613),
+(42614),
+(42615),
+(42616),
+(42617),
+(42618),
+(42619),
+(42621),
+(42622),
+(42623),
+(42624),
+(42625),
+(42626),
+(42627),
+(42628),
+(42629),
+(42630),
+(42631),
+(42632),
+(42633),
+(42634),
+(42635),
+(42636),
+(42639),
+(42640),
+(42641),
+(42642),
+(42643),
+(42644),
+(42645),
+(42646),
+(42647),
+(42648),
+(42649),
+(42650),
+(42651),
+(42652),
+(42653),
+(42654),
+(42655),
+(42656),
+(42657),
+(42658),
+(42659),
+(42660),
+(42661),
+(42662),
+(42663),
+(42664),
+(42665),
+(42666),
+(42667),
+(42668),
+(42669),
+(42670),
+(42671),
+(42672),
+(42673),
+(42674),
+(42675),
+(42676),
+(42677),
+(42678),
+(42679),
+(42680),
+(42681),
+(42682),
+(42683),
+(42684),
+(42685),
+(42686),
+(42687),
+(42688),
+(42689),
+(42690),
+(42691),
+(42692),
+(42693),
+(42694),
+(42695),
+(42696),
+(42697),
+(42698),
+(42699),
+(42700),
+(42701),
+(42702),
+(42703),
+(42704),
+(42705),
+(42706),
+(42707),
+(42708),
+(42709),
+(42710),
+(42711),
+(42712),
+(42713),
+(42714),
+(42715),
+(42716),
+(42717),
+(42718),
+(42719),
+(42720),
+(42721),
+(42722),
+(42723),
+(42724),
+(42725),
+(42726),
+(42727),
+(42728),
+(42729),
+(42730),
+(42731),
+(42732),
+(42733),
+(42734),
+(42735),
+(42736),
+(42737),
+(42738),
+(42739),
+(42740),
+(42741),
+(42742),
+(42743),
+(42744),
+(42745),
+(42746),
+(42747),
+(42748),
+(42749),
+(42750),
+(42751),
+(42752),
+(42753),
+(42754),
+(42755),
+(42756),
+(42757),
+(42758),
+(42759),
+(42760),
+(42761),
+(42762),
+(42763),
+(42764),
+(42765),
+(42766),
+(42767),
+(42770),
+(42771),
+(42772),
+(42773),
+(42774),
+(42775),
+(42776),
+(42777),
+(42778),
+(42779),
+(42780),
+(42781),
+(42782),
+(42783),
+(42784),
+(42785),
+(42786),
+(42787),
+(42788),
+(42789),
+(42790),
+(42791),
+(42793),
+(42794),
+(42795),
+(42796),
+(42797),
+(42798),
+(42799),
+(42800),
+(42801),
+(42802),
+(42803),
+(42804),
+(42805),
+(42806),
+(42807),
+(42808),
+(42809),
+(42810),
+(42811),
+(42812),
+(42813),
+(42814),
+(42815),
+(42817),
+(42818),
+(42819),
+(42820),
+(42821),
+(42822),
+(42823),
+(42824),
+(42825),
+(42826),
+(42827),
+(42828),
+(42829),
+(42830),
+(42831),
+(42832),
+(42833),
+(42834),
+(42835),
+(42836),
+(42837),
+(42838),
+(42839),
+(42840),
+(42841),
+(42842),
+(42843),
+(42844),
+(42845),
+(42846),
+(42847),
+(42848),
+(42849),
+(42850),
+(42851),
+(42852),
+(42853),
+(42854),
+(42855),
+(42856),
+(42857),
+(42858),
+(42859),
+(42860),
+(42861),
+(42862),
+(42863),
+(42864),
+(42865),
+(42866),
+(42867),
+(42868),
+(42869),
+(42870),
+(42871),
+(42872),
+(42873),
+(42874),
+(42875),
+(42876),
+(42877),
+(42878),
+(42879),
+(42880),
+(42881),
+(42882),
+(42883),
+(42884),
+(42885),
+(42886),
+(42887),
+(42888),
+(42889),
+(42890),
+(42891),
+(42892),
+(42893),
+(42894),
+(42895),
+(42896),
+(42897),
+(42898),
+(42899),
+(42900),
+(42901),
+(42902),
+(42903),
+(42904),
+(42905),
+(42906),
+(42907),
+(42908),
+(42909),
+(42910),
+(42911),
+(42912),
+(42913),
+(42914),
+(42915),
+(42916),
+(42917),
+(42918),
+(42919),
+(42920),
+(42921),
+(42922),
+(42923),
+(42924),
+(42925),
+(42926),
+(42927),
+(42928),
+(42929),
+(42930),
+(42931),
+(42932),
+(42933),
+(42934),
+(42935),
+(42936),
+(42937),
+(42938),
+(42939),
+(42940),
+(42941),
+(42942),
+(42943),
+(42944),
+(42945),
+(42946),
+(42947),
+(42949),
+(42950),
+(42951),
+(42952),
+(42953),
+(42954),
+(42955),
+(42956),
+(42957),
+(42958),
+(42959),
+(42960),
+(42961),
+(42962),
+(42963),
+(42964),
+(42965),
+(42966),
+(42967),
+(42968),
+(42969),
+(42970),
+(42971),
+(42972),
+(42973),
+(42974),
+(42976),
+(42978),
+(42979),
+(42980),
+(42981),
+(42982),
+(42983),
+(42984),
+(42985),
+(42986),
+(42987),
+(42988),
+(42989),
+(42990),
+(42991),
+(42992),
+(42993),
+(42994),
+(42995),
+(42996),
+(42997),
+(42998),
+(42999),
+(43000),
+(43001),
+(43002),
+(43005),
+(43006),
+(43007),
+(43008),
+(43009),
+(43010),
+(43011),
+(43012),
+(43013),
+(43014),
+(43015),
+(43016),
+(43017),
+(43018),
+(43019),
+(43020),
+(43021),
+(43022),
+(43023),
+(43024),
+(43025),
+(43026),
+(43027),
+(43028),
+(43029),
+(43030),
+(43031),
+(43032),
+(43033),
+(43034),
+(43035),
+(43036),
+(43037),
+(43038),
+(43039),
+(43040),
+(43041),
+(43042),
+(43043),
+(43044),
+(43045),
+(43046),
+(43047),
+(43048),
+(43049),
+(43050),
+(43051),
+(43052),
+(43053),
+(43054),
+(43055),
+(43056),
+(43057),
+(43058),
+(43059),
+(43060),
+(43061),
+(43062),
+(43063),
+(43064),
+(43065),
+(43066),
+(43067),
+(43068),
+(43069),
+(43070),
+(43071),
+(43072),
+(43073),
+(43074),
+(43075),
+(43076),
+(43077),
+(43078),
+(43079),
+(43080),
+(43081),
+(43082),
+(43083),
+(43084),
+(43085),
+(43086),
+(43087),
+(43088),
+(43089),
+(43090),
+(43091),
+(43092),
+(43093),
+(43094),
+(43095),
+(43096),
+(43097),
+(43098),
+(43099),
+(43100),
+(43101),
+(43102),
+(43103),
+(43104),
+(43105),
+(43106),
+(43107),
+(43108),
+(43109),
+(43110),
+(43111),
+(43113),
+(43114),
+(43115),
+(43116),
+(43117),
+(43118),
+(43119),
+(43120),
+(43121),
+(43122),
+(43123),
+(43124),
+(43125),
+(43126),
+(43127),
+(43128),
+(43129),
+(43130),
+(43131),
+(43132),
+(43133),
+(43134),
+(43135),
+(43136),
+(43137),
+(43138),
+(43139),
+(43140),
+(43141),
+(43142),
+(43143),
+(43144),
+(43145),
+(43146),
+(43147),
+(43148),
+(43149),
+(43150),
+(43151),
+(43152),
+(43153),
+(43154),
+(43155),
+(43156),
+(43157),
+(43158),
+(43159),
+(43160),
+(43161),
+(43162),
+(43163),
+(43164),
+(43165),
+(43166),
+(43167),
+(43168),
+(43169),
+(43170),
+(43171),
+(43172),
+(43173),
+(43174),
+(43175),
+(43176),
+(43177),
+(43178),
+(43179),
+(43180),
+(43181),
+(43182),
+(43183),
+(43184),
+(43185),
+(43186),
+(43187),
+(43188),
+(43189),
+(43190),
+(43191),
+(43192),
+(43193),
+(43194),
+(43195),
+(43196),
+(43197),
+(43198),
+(43199),
+(43200),
+(43201),
+(43202),
+(43203),
+(43204),
+(43205),
+(43206),
+(43207),
+(43208),
+(43209),
+(43210),
+(43211),
+(43212),
+(43213),
+(43214),
+(43215),
+(43216),
+(43220),
+(43221),
+(43222),
+(43223),
+(43224),
+(43225),
+(43226),
+(43227),
+(43228),
+(43229),
+(43230),
+(43231),
+(43232),
+(43233),
+(43234),
+(43235),
+(43236),
+(43237),
+(43238),
+(43239),
+(43240),
+(43241),
+(43242),
+(43243),
+(43244),
+(43245),
+(43247),
+(43249),
+(43250),
+(43251),
+(43252),
+(43253),
+(43254),
+(43255),
+(43256),
+(43257),
+(43258),
+(43259),
+(43260),
+(43261),
+(43262),
+(43263),
+(43264),
+(43265),
+(43266),
+(43267),
+(43268),
+(43269),
+(43270),
+(43271),
+(43272),
+(43273),
+(43274),
+(43275),
+(43276),
+(43277),
+(43278),
+(43279),
+(43280),
+(43281),
+(43282),
+(43283),
+(43284),
+(43285),
+(43286),
+(43287),
+(43288),
+(43289),
+(43290),
+(43291),
+(43292),
+(43293),
+(43294),
+(43295),
+(43296),
+(43297),
+(43298),
+(43299),
+(43300),
+(43301),
+(43302),
+(43303),
+(43304),
+(43305),
+(43306),
+(43307),
+(43308),
+(43309),
+(43310),
+(43311),
+(43312),
+(43313),
+(43314),
+(43315),
+(43316),
+(43317),
+(43318),
+(43319),
+(43320),
+(43321),
+(43322),
+(43323),
+(43324),
+(43325),
+(43326),
+(43327),
+(43328),
+(43329),
+(43330),
+(43331),
+(43332),
+(43333),
+(43334),
+(43335),
+(43336),
+(43337),
+(43338),
+(43339),
+(43340),
+(43341),
+(43342),
+(43343),
+(43344),
+(43345),
+(43346),
+(43347),
+(43348),
+(43349),
+(43350),
+(43351),
+(43352),
+(43353),
+(43354),
+(43355),
+(43356),
+(43357),
+(43358),
+(43359),
+(43360),
+(43361),
+(43362),
+(43363),
+(43364),
+(43365),
+(43366),
+(43367),
+(43368),
+(43369),
+(43370),
+(43371),
+(43372),
+(43373),
+(43374),
+(43375),
+(43376),
+(43377),
+(43378),
+(43379),
+(43380),
+(43381),
+(43382),
+(43383),
+(43384),
+(43385),
+(43386),
+(43387),
+(43388),
+(43389),
+(43390),
+(43391),
+(43392),
+(43393),
+(43394),
+(43395),
+(43396),
+(43397),
+(43398),
+(43399),
+(43400),
+(43401),
+(43402),
+(43403),
+(43404),
+(43405),
+(43406),
+(43407),
+(43408),
+(43409),
+(43410),
+(43411),
+(43412),
+(43413),
+(43414),
+(43415),
+(43416),
+(43417),
+(43418),
+(43419),
+(43420),
+(43421),
+(43422),
+(43423),
+(43424),
+(43425),
+(43426),
+(43427),
+(43428),
+(43429),
+(43430),
+(43431),
+(43432),
+(43433),
+(43434),
+(43435),
+(43436),
+(43437),
+(43438),
+(43439),
+(43440),
+(43441),
+(43442),
+(43443),
+(43444),
+(43445),
+(43446),
+(43447),
+(43448),
+(43449),
+(43450),
+(43451),
+(43452),
+(43453),
+(43454),
+(43455),
+(43456),
+(43457),
+(43458),
+(43459),
+(43460),
+(43461),
+(43462),
+(43463),
+(43464),
+(43465),
+(43466),
+(43467),
+(43468),
+(43469),
+(43470),
+(43471),
+(43472),
+(43473),
+(43474),
+(43475),
+(43476),
+(43477),
+(43478),
+(43479),
+(43480),
+(43481),
+(43482),
+(43483),
+(43484),
+(43485),
+(43486),
+(43487),
+(43488),
+(43489),
+(43490),
+(43491),
+(43492),
+(43493),
+(43494),
+(43495),
+(43496),
+(43497),
+(43498),
+(43499),
+(43500),
+(43501),
+(43502),
+(43503),
+(43504),
+(43505),
+(43506),
+(43507),
+(43508),
+(43509),
+(43510),
+(43511),
+(43512),
+(43513),
+(43514),
+(43515),
+(43516),
+(43517),
+(43518),
+(43519),
+(43520),
+(43521),
+(43522),
+(43523),
+(43524),
+(43525),
+(43526),
+(43527),
+(43528),
+(43529),
+(43530),
+(43531),
+(43532),
+(43533),
+(43534),
+(43535),
+(43536),
+(43537),
+(43538),
+(43539),
+(43540),
+(43541),
+(43543),
+(43544),
+(43545),
+(43546),
+(43547),
+(43548),
+(43549),
+(43550),
+(43551),
+(43552),
+(43553),
+(43554),
+(43555),
+(43556),
+(43557),
+(43558),
+(43559),
+(43560),
+(43561),
+(43562),
+(43563),
+(43564),
+(43565),
+(43566),
+(43567),
+(43569),
+(43570),
+(43571),
+(43572),
+(43573),
+(43574),
+(43575),
+(43576),
+(43577),
+(43578),
+(43579),
+(43580),
+(43581),
+(43582),
+(43583),
+(43584),
+(43585),
+(43586),
+(43587),
+(43588),
+(43589),
+(43590),
+(43591),
+(43592),
+(43593),
+(43594),
+(43595),
+(43596),
+(43597),
+(43598),
+(43599),
+(43600),
+(43601),
+(43602),
+(43603),
+(43604),
+(43605),
+(43609),
+(43610),
+(43611),
+(43612),
+(43613),
+(43614),
+(43615),
+(43616),
+(43617),
+(43618),
+(43619),
+(43620),
+(43621),
+(43622),
+(43623),
+(43624),
+(43625),
+(43626),
+(43627),
+(43628),
+(43629),
+(43630),
+(43631),
+(43632),
+(43633),
+(43634),
+(43635),
+(43636),
+(43637),
+(43638),
+(43639),
+(43640),
+(43641),
+(43642),
+(43643),
+(43644),
+(43645),
+(43646),
+(43647),
+(43648),
+(43649),
+(43650),
+(43651),
+(43652),
+(43653),
+(43654),
+(43655),
+(43656),
+(43657),
+(43658),
+(43659),
+(43660),
+(43661),
+(43662),
+(43664),
+(43665),
+(43666),
+(43667),
+(43668),
+(43669),
+(43670),
+(43671),
+(43672),
+(43673),
+(43674),
+(43675),
+(43676),
+(43677),
+(43678),
+(43679),
+(43680),
+(43681),
+(43682),
+(43683),
+(43684),
+(43685),
+(43686),
+(43687),
+(43688),
+(43689),
+(43690),
+(43691),
+(43692),
+(43693),
+(43694),
+(43695),
+(43696),
+(43697),
+(43698),
+(43699),
+(43700),
+(43701),
+(43702),
+(43703),
+(43704),
+(43705),
+(43706),
+(43707),
+(43708),
+(43709),
+(43710),
+(43711),
+(43712),
+(43713),
+(43714),
+(43715),
+(43716),
+(43717),
+(43718),
+(43719),
+(43720),
+(43721),
+(43722),
+(43723),
+(43724),
+(43725),
+(43726),
+(43727),
+(43728),
+(43729),
+(43730),
+(43731),
+(43732),
+(43733),
+(43734),
+(43735),
+(43736),
+(43737),
+(43741),
+(43742),
+(43743),
+(43744),
+(43745),
+(43746),
+(43747),
+(43748),
+(43749),
+(43750),
+(43751),
+(43752),
+(43753),
+(43754),
+(43755),
+(43756),
+(43757),
+(43758),
+(43759),
+(43760),
+(43761),
+(43762),
+(43763),
+(43764),
+(43765),
+(43766),
+(43767),
+(43768),
+(43769),
+(43770),
+(43771),
+(43772),
+(43773),
+(43774),
+(43775),
+(43776),
+(43777),
+(43778),
+(43779),
+(43780),
+(43781),
+(43782),
+(43783),
+(43784),
+(43785),
+(43786),
+(43787),
+(43788),
+(43789),
+(43790),
+(43791),
+(43792),
+(43793),
+(43796),
+(43797),
+(43798),
+(43799),
+(43800),
+(43801),
+(43802),
+(43803),
+(43804),
+(43805),
+(43806),
+(43807),
+(43808),
+(43809),
+(43810),
+(43811),
+(43812),
+(43813),
+(43814),
+(43815),
+(43816),
+(43817),
+(43818),
+(43819),
+(43820),
+(43821),
+(43822),
+(43823),
+(43824),
+(43825),
+(43826),
+(43827),
+(43828),
+(43829),
+(43830),
+(43831),
+(43832),
+(43833),
+(43834),
+(43835),
+(43836),
+(43837),
+(43838),
+(43839),
+(43840),
+(43841),
+(43842),
+(43843),
+(43847),
+(43848),
+(43849),
+(43850),
+(43851),
+(43852),
+(43853),
+(43854),
+(43861),
+(43862),
+(43863),
+(43864),
+(43865),
+(43868),
+(43869),
+(43870),
+(43871),
+(43873),
+(43874),
+(43875),
+(43876),
+(43877),
+(43878),
+(43879),
+(43880),
+(43881),
+(43882),
+(43883),
+(43884),
+(43885),
+(43886),
+(43887),
+(43888),
+(43889),
+(43890),
+(43891),
+(43892),
+(43893),
+(43894),
+(43895),
+(43896),
+(43897),
+(43898),
+(43899),
+(43900),
+(43901),
+(43902),
+(43903),
+(43904),
+(43905),
+(43906),
+(43907),
+(43908),
+(43909),
+(43910),
+(43911),
+(43912),
+(43913),
+(43914),
+(43915),
+(43916),
+(43917),
+(43918),
+(43919),
+(43920),
+(43921),
+(43922),
+(43923),
+(43924),
+(43925),
+(43926),
+(43927),
+(43928),
+(43929),
+(43930),
+(43931),
+(43932),
+(43933),
+(43934),
+(43935),
+(43936),
+(43937),
+(43938),
+(43939),
+(43940),
+(43946),
+(43948),
+(43949),
+(43951),
+(43952),
+(43953),
+(43954),
+(43955),
+(43956),
+(43958),
+(43959),
+(43960),
+(43961),
+(43962),
+(43963),
+(43964),
+(43965),
+(43966),
+(43970),
+(43971),
+(43972),
+(43973),
+(43974),
+(43975),
+(43976),
+(43977),
+(43978),
+(43979),
+(43980),
+(43981),
+(43982),
+(43983),
+(43984),
+(43985),
+(43986),
+(43987),
+(43988),
+(43989),
+(43990),
+(43991),
+(43992),
+(43993),
+(43994),
+(43995),
+(43996),
+(43997),
+(43998),
+(43999),
+(44000),
+(44001),
+(44002),
+(44003),
+(44004),
+(44005),
+(44006),
+(44007),
+(44008),
+(44009),
+(44010),
+(44011),
+(44012),
+(44013),
+(44014),
+(44015),
+(44016),
+(44017),
+(44018),
+(44019),
+(44020),
+(44021),
+(44022),
+(44023),
+(44024),
+(44025),
+(44026),
+(44027),
+(44028),
+(44029),
+(44030),
+(44031),
+(44032),
+(44033),
+(44034),
+(44035),
+(44036),
+(44037),
+(44038),
+(44039),
+(44040),
+(44041),
+(44042),
+(44043),
+(44044),
+(44045),
+(44046),
+(44047),
+(44048),
+(44049),
+(44050),
+(44051),
+(44052),
+(44053),
+(44054),
+(44055),
+(44056),
+(44057),
+(44058),
+(44059),
+(44060),
+(44061),
+(44062),
+(44063),
+(44064),
+(44065),
+(44066),
+(44067),
+(44068),
+(44069),
+(44070),
+(44071),
+(44072),
+(44073),
+(44074),
+(44075),
+(44076),
+(44077),
+(44078),
+(44079),
+(44080),
+(44081),
+(44082),
+(44083),
+(44084),
+(44085),
+(44086),
+(44087),
+(44088),
+(44089),
+(44090),
+(44091),
+(44092),
+(44093),
+(44094),
+(44095),
+(44096),
+(44097),
+(44098),
+(44099),
+(44100),
+(44101),
+(44103),
+(44104),
+(44105),
+(44106),
+(44107),
+(44108),
+(44109),
+(44110),
+(44111),
+(44112),
+(44113),
+(44114),
+(44115),
+(44116),
+(44117),
+(44118),
+(44119),
+(44120),
+(44121),
+(44122),
+(44123),
+(44124),
+(44125),
+(44126),
+(44127),
+(44128),
+(44129),
+(44130),
+(44132),
+(44133),
+(44134),
+(44135),
+(44136),
+(44137),
+(44138),
+(44139),
+(44140),
+(44141),
+(44142),
+(44143),
+(44144),
+(44145),
+(44146),
+(44147),
+(44148),
+(44149),
+(44150),
+(44151),
+(44152),
+(44153),
+(44154),
+(44155),
+(44156),
+(44157),
+(44158),
+(44159),
+(44160),
+(44161),
+(44162),
+(44163),
+(44164),
+(44165),
+(44166),
+(44167),
+(44168),
+(44169),
+(44170),
+(44171),
+(44173),
+(44174),
+(44175),
+(44176),
+(44177),
+(44178),
+(44179),
+(44180),
+(44181),
+(44182),
+(44183),
+(44184),
+(44185),
+(44186),
+(44187),
+(44188),
+(44189),
+(44190),
+(44191),
+(44192),
+(44193),
+(44194),
+(44195),
+(44196),
+(44197),
+(44198),
+(44199),
+(44200),
+(44201),
+(44203),
+(44204),
+(44206),
+(44208),
+(44210),
+(44211),
+(44212),
+(44213),
+(44214),
+(44215),
+(44216),
+(44217),
+(44218),
+(44219),
+(44220),
+(44221),
+(44222),
+(44223),
+(44224),
+(44225),
+(44226),
+(44227),
+(44228),
+(44229),
+(44230),
+(44231),
+(44232),
+(44233),
+(44234),
+(44235),
+(44236),
+(44237),
+(44238),
+(44239),
+(44240),
+(44241),
+(44242),
+(44243),
+(44244),
+(44245),
+(44246),
+(44247),
+(44248),
+(44249),
+(44250),
+(44251),
+(44252),
+(44253),
+(44254),
+(44255),
+(44256),
+(44257),
+(44258),
+(44259),
+(44260),
+(44261),
+(44262),
+(44263),
+(44264),
+(44265),
+(44266),
+(44267),
+(44268),
+(44269),
+(44270),
+(44271),
+(44272),
+(44273),
+(44274),
+(44275),
+(44276),
+(44277),
+(44278),
+(44279),
+(44280),
+(44281),
+(44282),
+(44283),
+(44284),
+(44285),
+(44286),
+(44287),
+(44288),
+(44289),
+(44290),
+(44291),
+(44292),
+(44293),
+(44294),
+(44295),
+(44296),
+(44297),
+(44298),
+(44299),
+(44300),
+(44301),
+(44302),
+(44303),
+(44304),
+(44305),
+(44306),
+(44307),
+(44308),
+(44309),
+(44310),
+(44311),
+(44312),
+(44313),
+(44314),
+(44315),
+(44316),
+(44317),
+(44318),
+(44319),
+(44320),
+(44321),
+(44322),
+(44323),
+(44324),
+(44325),
+(44326),
+(44327),
+(44328),
+(44329),
+(44330),
+(44331),
+(44332),
+(44333),
+(44334),
+(44335),
+(44336),
+(44337),
+(44338),
+(44339),
+(44340),
+(44341),
+(44342),
+(44343),
+(44344),
+(44345),
+(44346),
+(44347),
+(44348),
+(44349),
+(44350),
+(44351),
+(44352),
+(44353),
+(44354),
+(44355),
+(44356),
+(44357),
+(44358),
+(44359),
+(44360),
+(44361),
+(44362),
+(44363),
+(44364),
+(44365),
+(44366),
+(44367),
+(44368),
+(44369),
+(44370),
+(44371),
+(44372),
+(44373),
+(44374),
+(44375),
+(44378),
+(44379),
+(44380),
+(44381),
+(44382),
+(44383),
+(44384),
+(44386),
+(44387),
+(44388),
+(44389),
+(44390),
+(44391),
+(44392),
+(44393),
+(44394),
+(44395),
+(44396),
+(44397),
+(44398),
+(44399),
+(44400),
+(44401),
+(44402),
+(44403),
+(44404),
+(44405),
+(44406),
+(44407),
+(44408),
+(44409),
+(44410),
+(44411),
+(44412),
+(44413),
+(44414),
+(44415),
+(44416),
+(44417),
+(44418),
+(44419),
+(44420),
+(44421),
+(44422),
+(44423),
+(44424),
+(44425),
+(44427),
+(44428),
+(44429),
+(44430),
+(44431),
+(44432),
+(44433),
+(44434),
+(44435),
+(44436),
+(44437),
+(44438),
+(44439),
+(44441),
+(44442),
+(44443),
+(44444),
+(44445),
+(44446),
+(44447),
+(44448),
+(44449),
+(44450),
+(44451),
+(44452),
+(44453),
+(44454),
+(44455),
+(44456),
+(44457),
+(44458),
+(44459),
+(44460),
+(44461),
+(44462),
+(44463),
+(44464),
+(44465),
+(44466),
+(44467),
+(44468),
+(44469),
+(44470),
+(44471),
+(44472),
+(44473),
+(44474),
+(44475),
+(44476),
+(44477),
+(44478),
+(44479),
+(44480),
+(44482),
+(44483),
+(44485),
+(44486),
+(44487),
+(44488),
+(44489),
+(44490),
+(44491),
+(44493),
+(44494),
+(44495),
+(44496),
+(44497),
+(44498),
+(44499),
+(44500),
+(44501),
+(44502),
+(44503),
+(44504),
+(44505),
+(44506),
+(44507),
+(44508),
+(44509),
+(44510),
+(44511),
+(44512),
+(44513),
+(44514),
+(44515),
+(44516),
+(44517),
+(44518),
+(44519),
+(44520),
+(44521),
+(44523),
+(44524),
+(44525),
+(44526),
+(44527),
+(44529),
+(44532),
+(44533),
+(44536),
+(44537),
+(44538),
+(44539),
+(44540),
+(44541),
+(44542),
+(44543),
+(44544),
+(44545),
+(44546),
+(44547),
+(44548),
+(44549),
+(44550),
+(44551),
+(44552),
+(44553),
+(44554),
+(44555),
+(44557),
+(44558),
+(44559),
+(44560),
+(44561),
+(44562),
+(44563),
+(44564),
+(44565),
+(44566),
+(44567),
+(44568),
+(44569),
+(44570),
+(44572),
+(44573),
+(44574),
+(44575),
+(44576),
+(44577),
+(44578),
+(44579),
+(44580),
+(44581),
+(44582),
+(44583),
+(44586),
+(44587),
+(44588),
+(44589),
+(44590),
+(44591),
+(44592),
+(44593),
+(44594),
+(44595),
+(44596),
+(44597),
+(44598),
+(44599),
+(44600),
+(44601),
+(44602),
+(44603),
+(44604),
+(44605),
+(44606),
+(44607),
+(44608),
+(44609),
+(44610),
+(44611),
+(44612),
+(44613),
+(44614),
+(44615),
+(44616),
+(44617),
+(44618),
+(44619),
+(44620),
+(44621),
+(44622),
+(44623),
+(44624),
+(44625),
+(44626),
+(44627),
+(44628),
+(44629),
+(44630),
+(44631),
+(44632),
+(44633),
+(44634),
+(44635),
+(44636),
+(44637),
+(44638),
+(44639),
+(44640),
+(44641),
+(44642),
+(44643),
+(44644),
+(44645),
+(44646),
+(44647),
+(44648),
+(44649),
+(44650),
+(44651),
+(44652),
+(44653),
+(44654),
+(44655),
+(44656),
+(44657),
+(44658),
+(44659),
+(44660),
+(44661),
+(44662),
+(44663),
+(44664),
+(44665),
+(44666),
+(44667),
+(44668),
+(44669),
+(44670),
+(44671),
+(44672),
+(44673),
+(44674),
+(44675),
+(44676),
+(44677),
+(44678),
+(44679),
+(44680),
+(44681),
+(44682),
+(44683),
+(44684),
+(44685),
+(44686),
+(44687),
+(44688),
+(44689),
+(44690),
+(44691),
+(44692),
+(44693),
+(44694),
+(44695),
+(44696),
+(44697),
+(44698),
+(44699),
+(44700),
+(44701),
+(44702),
+(44703),
+(44704),
+(44705),
+(44706),
+(44707),
+(44708),
+(44709),
+(44710),
+(44711),
+(44712),
+(44713),
+(44714),
+(44715),
+(44716),
+(44717),
+(44718),
+(44719),
+(44720),
+(44721),
+(44722),
+(44723),
+(44724),
+(44725),
+(44726),
+(44727),
+(44728),
+(44729),
+(44730),
+(44731),
+(44732),
+(44733),
+(44734),
+(44735),
+(44737),
+(44738),
+(44739),
+(44740),
+(44741),
+(44742),
+(44743),
+(44744),
+(44745),
+(44746),
+(44747),
+(44748),
+(44749),
+(44750),
+(44751),
+(44752),
+(44753),
+(44754),
+(44755),
+(44756),
+(44757),
+(44758),
+(44759),
+(44762),
+(44764),
+(44765),
+(44766),
+(44767),
+(44768),
+(44769),
+(44770),
+(44771),
+(44772),
+(44773),
+(44774),
+(44775),
+(44776),
+(44777),
+(44778),
+(44779),
+(44780),
+(44781),
+(44782),
+(44783),
+(44784),
+(44785),
+(44786),
+(44787),
+(44788),
+(44789),
+(44790),
+(44791),
+(44792),
+(44793),
+(44794),
+(44795),
+(44796),
+(44797),
+(44798),
+(44799),
+(44800),
+(44801),
+(44802),
+(44803),
+(44804),
+(44805),
+(44806),
+(44807),
+(44808),
+(44809),
+(44810),
+(44811),
+(44812),
+(44813),
+(44814),
+(44815),
+(44816),
+(44817),
+(44818),
+(44819),
+(44820),
+(44821),
+(44822),
+(44823),
+(44824),
+(44825),
+(44826),
+(44827),
+(44828),
+(44829),
+(44830),
+(44831),
+(44832),
+(44833),
+(44834),
+(44835),
+(44836),
+(44837),
+(44838),
+(44839),
+(44840),
+(44841),
+(44842),
+(44843),
+(44844),
+(44845),
+(44846),
+(44847),
+(44848),
+(44849),
+(44850),
+(44851),
+(44852),
+(44853),
+(44854),
+(44855),
+(44856),
+(44857),
+(44858),
+(44859),
+(44860),
+(44861),
+(44862),
+(44863),
+(44864),
+(44865),
+(44866),
+(44867),
+(44868),
+(44869),
+(44870),
+(44871),
+(44872),
+(44873),
+(44874),
+(44875),
+(44876),
+(44877),
+(44878),
+(44879),
+(44880),
+(44881),
+(44882),
+(44883),
+(44884),
+(44885),
+(44886),
+(44887),
+(44888),
+(44889),
+(44890),
+(44891),
+(44892),
+(44893),
+(44894),
+(44895),
+(44896),
+(44897),
+(44898),
+(44899),
+(44900),
+(44901),
+(44902),
+(44903),
+(44904),
+(44905),
+(44906),
+(44907),
+(44908),
+(44909),
+(44910),
+(44911),
+(44912),
+(44913),
+(44914),
+(44915),
+(44916),
+(44917),
+(44918),
+(44919),
+(44920),
+(44921),
+(44922),
+(44923),
+(44924),
+(44925),
+(44926),
+(44927),
+(44928),
+(44929),
+(44930),
+(44931),
+(44932),
+(44933),
+(44934),
+(44935),
+(44936),
+(44937),
+(44938),
+(44939),
+(44940),
+(44941),
+(44942),
+(44943),
+(44944),
+(44945),
+(44946),
+(44947),
+(44948),
+(44949),
+(44950),
+(44951),
+(44952),
+(44953),
+(44954),
+(44955),
+(44956),
+(44957),
+(44958),
+(44959),
+(44960),
+(44961),
+(44962),
+(44964),
+(44965),
+(44966),
+(44967),
+(44968),
+(44969),
+(44970),
+(44971),
+(44972),
+(44973),
+(44974),
+(44975),
+(44976),
+(44977),
+(44978),
+(44979),
+(44980),
+(44981),
+(44982),
+(44983),
+(44984),
+(44985),
+(44986),
+(44987),
+(44988),
+(44989),
+(44990),
+(44991),
+(44992),
+(44993),
+(44994),
+(44995),
+(44996),
+(44997),
+(44998),
+(44999),
+(45000),
+(45001),
+(45002),
+(45003),
+(45004),
+(45005),
+(45006),
+(45007),
+(45008),
+(45009),
+(45011),
+(45016),
+(45017),
+(45018),
+(45019),
+(45020),
+(45021),
+(45022),
+(45023),
+(45024),
+(45025),
+(45026),
+(45027),
+(45028),
+(45029),
+(45030),
+(45031),
+(45032),
+(45033),
+(45034),
+(45035),
+(45036),
+(45040),
+(45041),
+(45042),
+(45043),
+(45044),
+(45045),
+(45046),
+(45047),
+(45048),
+(45049),
+(45050),
+(45051),
+(45052),
+(45054),
+(45055),
+(45056),
+(45057),
+(45058),
+(45059),
+(45060),
+(45061),
+(45062),
+(45063),
+(45064),
+(45065),
+(45066),
+(45067),
+(45068),
+(45069),
+(45070),
+(45071),
+(45072),
+(45073),
+(45074),
+(45075),
+(45076),
+(45077),
+(45078),
+(45079),
+(45080),
+(45081),
+(45082),
+(45083),
+(45084),
+(45085),
+(45086),
+(45087),
+(45088),
+(45089),
+(45090),
+(45091),
+(45092),
+(45093),
+(45094),
+(45095),
+(45096),
+(45097),
+(45098),
+(45099),
+(45100),
+(45101),
+(45102),
+(45103),
+(45104),
+(45105),
+(45106),
+(45107),
+(45108),
+(45109),
+(45110),
+(45111),
+(45112),
+(45113),
+(45114),
+(45115),
+(45116),
+(45117),
+(45118),
+(45119),
+(45120),
+(45121),
+(45122),
+(45123),
+(45124),
+(45125),
+(45126),
+(45127),
+(45128),
+(45129),
+(45130),
+(45131),
+(45132),
+(45133),
+(45134),
+(45135),
+(45136),
+(45137),
+(45138),
+(45139),
+(45140),
+(45141),
+(45142),
+(45143),
+(45144),
+(45145),
+(45146),
+(45147),
+(45148),
+(45149),
+(45150),
+(45151),
+(45152),
+(45153),
+(45154),
+(45155),
+(45156),
+(45157),
+(45158),
+(45159),
+(45160),
+(45161),
+(45162),
+(45163),
+(45164),
+(45165),
+(45166),
+(45167),
+(45168),
+(45169),
+(45170),
+(45171),
+(45172),
+(45173),
+(45174),
+(45175),
+(45176),
+(45177),
+(45178),
+(45179),
+(45180),
+(45181),
+(45182),
+(45183),
+(45184),
+(45185),
+(45186),
+(45187),
+(45188),
+(45189),
+(45190),
+(45191),
+(45192),
+(45193),
+(45194),
+(45195),
+(45196),
+(45197),
+(45198),
+(45199),
+(45200),
+(45201),
+(45202),
+(45203),
+(45204),
+(45205),
+(45206),
+(45207),
+(45208),
+(45209),
+(45210),
+(45211),
+(45212),
+(45213),
+(45214),
+(45220),
+(45223),
+(45224),
+(45225),
+(45226),
+(45227),
+(45228),
+(45229),
+(45230),
+(45231),
+(45232),
+(45233),
+(45234),
+(45235),
+(45236),
+(45237),
+(45238),
+(45239),
+(45240),
+(45241),
+(45242),
+(45243),
+(45244),
+(45245),
+(45246),
+(45247),
+(45248),
+(45249),
+(45250),
+(45251),
+(45252),
+(45253),
+(45254),
+(45255),
+(45257),
+(45258),
+(45259),
+(45260),
+(45261),
+(45262),
+(45263),
+(45264),
+(45265),
+(45266),
+(45267),
+(45268),
+(45269),
+(45270),
+(45271),
+(45272),
+(45273),
+(45274),
+(45275),
+(45276),
+(45277),
+(45278),
+(45279),
+(45280),
+(45281),
+(45282),
+(45283),
+(45284),
+(45285),
+(45286),
+(45288),
+(45289),
+(45290),
+(45291),
+(45292),
+(45293),
+(45294),
+(45295),
+(45296),
+(45297),
+(45298),
+(45299),
+(45300),
+(45301),
+(45302),
+(45303),
+(45304),
+(45305),
+(45306),
+(45307),
+(45308),
+(45309),
+(45310),
+(45311),
+(45312),
+(45313),
+(45314),
+(45315),
+(45316),
+(45317),
+(45318),
+(45319),
+(45320),
+(45321),
+(45322),
+(45323),
+(45324),
+(45325),
+(45326),
+(45327),
+(45328),
+(45329),
+(45330),
+(45331),
+(45332),
+(45333),
+(45334),
+(45335),
+(45336),
+(45337),
+(45338),
+(45339),
+(45340),
+(45341),
+(45342),
+(45347),
+(45348),
+(45349),
+(45352),
+(45353),
+(45354),
+(45355),
+(45356),
+(45357),
+(45358),
+(45359),
+(45360),
+(45361),
+(45362),
+(45363),
+(45364),
+(45365),
+(45366),
+(45367),
+(45368),
+(45369),
+(45370),
+(45371),
+(45372),
+(45373),
+(45374),
+(45375),
+(45376),
+(45377),
+(45378),
+(45379),
+(45380),
+(45381),
+(45382),
+(45383),
+(45384),
+(45385),
+(45386),
+(45389),
+(45390),
+(45391),
+(45392),
+(45393),
+(45394),
+(45395),
+(45396),
+(45397),
+(45398),
+(45399),
+(45400),
+(45401),
+(45402),
+(45403),
+(45404),
+(45405),
+(45406),
+(45407),
+(45408),
+(45409),
+(45410),
+(45411),
+(45412),
+(45413),
+(45414),
+(45415),
+(45416),
+(45417),
+(45418),
+(45419),
+(45420),
+(45421),
+(45422),
+(45423),
+(45424),
+(45425),
+(45426),
+(45427),
+(45428),
+(45429),
+(45430),
+(45431),
+(45432),
+(45433),
+(45434),
+(45435),
+(45436),
+(45437),
+(45439),
+(45440),
+(45441),
+(45442),
+(45443),
+(45444),
+(45445),
+(45446),
+(45447),
+(45448),
+(45449),
+(45450),
+(45451),
+(45452),
+(45453),
+(45454),
+(45455),
+(45456),
+(45457),
+(45458),
+(45459),
+(45460),
+(45461),
+(45462),
+(45463),
+(45464),
+(45465),
+(45466),
+(45467),
+(45468),
+(45469),
+(45470),
+(45471),
+(45472),
+(45473),
+(45474),
+(45475),
+(45476),
+(45477),
+(45478),
+(45479),
+(45480),
+(45481),
+(45482),
+(45483),
+(45484),
+(45485),
+(45486),
+(45487),
+(45488),
+(45489),
+(45490),
+(45491),
+(45492),
+(45493),
+(45494),
+(45495),
+(45496),
+(45497),
+(45498),
+(45499),
+(45500),
+(45501),
+(45502),
+(45503),
+(45504),
+(45505),
+(45506),
+(45507),
+(45508),
+(45509),
+(45510),
+(45511),
+(45512),
+(45513),
+(45514),
+(45515),
+(45516),
+(45517),
+(45518),
+(45519),
+(45520),
+(45521),
+(45522),
+(45523),
+(45524),
+(45525),
+(45526),
+(45527),
+(45528),
+(45529),
+(45530),
+(45531),
+(45532),
+(45533),
+(45534),
+(45535),
+(45536),
+(45537),
+(45538),
+(45539),
+(45540),
+(45541),
+(45542),
+(45543),
+(45544),
+(45545),
+(45546),
+(45547),
+(45548),
+(45549),
+(45550),
+(45551),
+(45552),
+(45553),
+(45554),
+(45555),
+(45556),
+(45557),
+(45558),
+(45559),
+(45560),
+(45561),
+(45562),
+(45563),
+(45564),
+(45565),
+(45566),
+(45567),
+(45568),
+(45569),
+(45570),
+(45571),
+(45572),
+(45573),
+(45574),
+(45575),
+(45576),
+(45577),
+(45578),
+(45579),
+(45580),
+(45581),
+(45582),
+(45583),
+(45584),
+(45585),
+(45586),
+(45587),
+(45588),
+(45589),
+(45590),
+(45591),
+(45592),
+(45593),
+(45594),
+(45595),
+(45596),
+(45597),
+(45598),
+(45599),
+(45600),
+(45601),
+(45602),
+(45603),
+(45604),
+(45605),
+(45606),
+(45607),
+(45608),
+(45609),
+(45610),
+(45611),
+(45612),
+(45613),
+(45614),
+(45615),
+(45616),
+(45617),
+(45618),
+(45619),
+(45620),
+(45621),
+(45622),
+(45623),
+(45624),
+(45625),
+(45626),
+(45627),
+(45628),
+(45629),
+(45630),
+(45631),
+(45632),
+(45633),
+(45634),
+(45635),
+(45636),
+(45637),
+(45638),
+(45639),
+(45640),
+(45641),
+(45642),
+(45643),
+(45644),
+(45645),
+(45646),
+(45647),
+(45648),
+(45649),
+(45650),
+(45651),
+(45652),
+(45653),
+(45654),
+(45655),
+(45656),
+(45657),
+(45658),
+(45659),
+(45660),
+(45661),
+(45662),
+(45663),
+(45664),
+(45665),
+(45666),
+(45667),
+(45668),
+(45669),
+(45670),
+(45671),
+(45672),
+(45673),
+(45674),
+(45675),
+(45676),
+(45677),
+(45678),
+(45679),
+(45680),
+(45681),
+(45682),
+(45683),
+(45684),
+(45685),
+(45686),
+(45687),
+(45688),
+(45689),
+(45690),
+(45691),
+(45692),
+(45693),
+(45694),
+(45695),
+(45696),
+(45697),
+(45698),
+(45699),
+(45700),
+(45701),
+(45702),
+(45703),
+(45704),
+(45705),
+(45706),
+(45707),
+(45708),
+(45709),
+(45710),
+(45711),
+(45712),
+(45713),
+(45714),
+(45715),
+(45716),
+(45717),
+(45718),
+(45719),
+(45720),
+(45721),
+(45722),
+(45723),
+(45724),
+(45725),
+(45726),
+(45727),
+(45728),
+(45729),
+(45730),
+(45731),
+(45733),
+(45734),
+(45735),
+(45736),
+(45737),
+(45738),
+(45739),
+(45740),
+(45741),
+(45742),
+(45743),
+(45744),
+(45745),
+(45746),
+(45747),
+(45748),
+(45749),
+(45750),
+(45751),
+(45752),
+(45753),
+(45754),
+(45755),
+(45756),
+(45757),
+(45758),
+(45759),
+(45760),
+(45761),
+(45762),
+(45763),
+(45764),
+(45765),
+(45766),
+(45767),
+(45768),
+(45769),
+(45770),
+(45771),
+(45772),
+(45775),
+(45776),
+(45777),
+(45778),
+(45779),
+(45780),
+(45781),
+(45782),
+(45783),
+(45784),
+(45785),
+(45786),
+(45787),
+(45788),
+(45789),
+(45790),
+(45791),
+(45792),
+(45793),
+(45796),
+(45797),
+(45798),
+(45799),
+(45800),
+(45801),
+(45802),
+(45803),
+(45804),
+(45805),
+(45806),
+(45807),
+(45808),
+(45809),
+(45810),
+(45811),
+(45812),
+(45813),
+(45814),
+(45815),
+(45816),
+(45818),
+(45819),
+(45820),
+(45821),
+(45822),
+(45823),
+(45824),
+(45825),
+(45826),
+(45827),
+(45828),
+(45829),
+(45830),
+(45831),
+(45832),
+(45833),
+(45834),
+(45835),
+(45836),
+(45837),
+(45838),
+(45839),
+(45840),
+(45841),
+(45842),
+(45843),
+(45844),
+(45845),
+(45846),
+(45847),
+(45848),
+(45849),
+(45850),
+(45851),
+(45852),
+(45853),
+(45854),
+(45855),
+(45856),
+(45857),
+(45858),
+(45859),
+(45860),
+(45861),
+(45862),
+(45863),
+(45864),
+(45865),
+(45866),
+(45867),
+(45868),
+(45869),
+(45870),
+(45871),
+(45872),
+(45873),
+(45874),
+(45875),
+(45876),
+(45877),
+(45878),
+(45879),
+(45880),
+(45881),
+(45882),
+(45883),
+(45884),
+(45885),
+(45886),
+(45887),
+(45888),
+(45889),
+(45890),
+(45891),
+(45892),
+(45893),
+(45894),
+(45895),
+(45896),
+(45897),
+(45898),
+(45899),
+(45900),
+(45901),
+(45902),
+(45903),
+(45904),
+(45905),
+(45906),
+(45907),
+(45908),
+(45909),
+(45910),
+(45911),
+(45912),
+(45913),
+(45914),
+(45915),
+(45916),
+(45917),
+(45918),
+(45919),
+(45920),
+(45923),
+(45924),
+(45925),
+(45926),
+(45928),
+(45929),
+(45930),
+(45931),
+(45932),
+(45933),
+(45934),
+(45935),
+(45936),
+(45937),
+(45938),
+(45939),
+(45940),
+(45941),
+(45942),
+(45943),
+(45944),
+(45945),
+(45946),
+(45947),
+(45948),
+(45949),
+(45950),
+(45951),
+(45952),
+(45953),
+(45954),
+(45955),
+(45956),
+(45957),
+(45958),
+(45959),
+(45960),
+(45964),
+(45965),
+(45966),
+(45967),
+(45968),
+(45969),
+(45970),
+(45971),
+(45972),
+(45973),
+(45974),
+(45975),
+(45976),
+(45977),
+(45978),
+(45979),
+(45980),
+(45981),
+(45982),
+(45983),
+(45984),
+(45985),
+(45986),
+(45987),
+(45988),
+(45989),
+(45990),
+(45991),
+(45992),
+(45993),
+(45994),
+(45995),
+(45996),
+(45997),
+(45998),
+(45999),
+(46000),
+(46001),
+(46003),
+(46006),
+(46007),
+(46008),
+(46009),
+(46010),
+(46011),
+(46012),
+(46013),
+(46014),
+(46015),
+(46016),
+(46017),
+(46018),
+(46019),
+(46020),
+(46021),
+(46025),
+(46026),
+(46027),
+(46028),
+(46029),
+(46030),
+(46031),
+(46032),
+(46033),
+(46034),
+(46035),
+(46036),
+(46037),
+(46038),
+(46039),
+(46040),
+(46041),
+(46042),
+(46043),
+(46044),
+(46045),
+(46046),
+(46047),
+(46048),
+(46049),
+(46050),
+(46051),
+(46052),
+(46053),
+(46054),
+(46055),
+(46056),
+(46057),
+(46058),
+(46059),
+(46060),
+(46061),
+(46062),
+(46063),
+(46064),
+(46065),
+(46066),
+(46067),
+(46068),
+(46071),
+(46072),
+(46073),
+(46074),
+(46075),
+(46076),
+(46077),
+(46078),
+(46079),
+(46080),
+(46081),
+(46082),
+(46083),
+(46084),
+(46085),
+(46086),
+(46087),
+(46089),
+(46090),
+(46091),
+(46092),
+(46093),
+(46094),
+(46095),
+(46096),
+(46097),
+(46098),
+(46099),
+(46100),
+(46101),
+(46102),
+(46103),
+(46104),
+(46105),
+(46106),
+(46107),
+(46108),
+(46110),
+(46111),
+(46112),
+(46113),
+(46114),
+(46115),
+(46116),
+(46118),
+(46120),
+(46121),
+(46122),
+(46123),
+(46125),
+(46126),
+(46128),
+(46129),
+(46130),
+(46131),
+(46132),
+(46133),
+(46134),
+(46135),
+(46136),
+(46137),
+(46138),
+(46139),
+(46140),
+(46141),
+(46142),
+(46145),
+(46146),
+(46147),
+(46148),
+(46149),
+(46150),
+(46151),
+(46152),
+(46153),
+(46154),
+(46155),
+(46156),
+(46157),
+(46158),
+(46159),
+(46160),
+(46161),
+(46162),
+(46163),
+(46170),
+(46171),
+(46172),
+(46173),
+(46174),
+(46175),
+(46178),
+(46179),
+(46180),
+(46181),
+(46183),
+(46184),
+(46185),
+(46186),
+(46187),
+(46188),
+(46189),
+(46190),
+(46191),
+(46192),
+(46193),
+(46194),
+(46195),
+(46196),
+(46197),
+(46198),
+(46199),
+(46200),
+(46201),
+(46203),
+(46204),
+(46205),
+(46207),
+(46208),
+(46209),
+(46210),
+(46211),
+(46212),
+(46213),
+(46214),
+(46215),
+(46216),
+(46217),
+(46218),
+(46219),
+(46220),
+(46221),
+(46222),
+(46224),
+(46225),
+(46226),
+(46227),
+(46228),
+(46229),
+(46230),
+(46231),
+(46232),
+(46233),
+(46234),
+(46235),
+(46236),
+(46237),
+(46238),
+(46239),
+(46240),
+(46241),
+(46242),
+(46243),
+(46244),
+(46245),
+(46246),
+(46247),
+(46248),
+(46249),
+(46250),
+(46251),
+(46252),
+(46253),
+(46254),
+(46255),
+(46256),
+(46257),
+(46258),
+(46259),
+(46260),
+(46261),
+(46262),
+(46263),
+(46264),
+(46265),
+(46266),
+(46267),
+(46268),
+(46270),
+(46272),
+(46273),
+(46275),
+(46276),
+(46277),
+(46278),
+(46279),
+(46280),
+(46281),
+(46282),
+(46283),
+(46284),
+(46285),
+(46286),
+(46287),
+(46288),
+(46289),
+(46290),
+(46291),
+(46292),
+(46293),
+(46294),
+(46295),
+(46296),
+(46297),
+(46298),
+(46299),
+(46300),
+(46301),
+(46307),
+(46308),
+(46309),
+(46310),
+(46311),
+(46312),
+(46313),
+(46315),
+(46316),
+(46317),
+(46318),
+(46319),
+(46320),
+(46321),
+(46322),
+(46323),
+(46324),
+(46325),
+(46326),
+(46327),
+(46328),
+(46329),
+(46330),
+(46331),
+(46332),
+(46333),
+(46334),
+(46335),
+(46336),
+(46337),
+(46338),
+(46339),
+(46340),
+(46341),
+(46342),
+(46343),
+(46344),
+(46345),
+(46346),
+(46348),
+(46349),
+(46350),
+(46351),
+(46352),
+(46353),
+(46354),
+(46355),
+(46356),
+(46357),
+(46358),
+(46359),
+(46360),
+(46361),
+(46362),
+(46363),
+(46364),
+(46365),
+(46366),
+(46367),
+(46368),
+(46369),
+(46370),
+(46371),
+(46372),
+(46373),
+(46374),
+(46375),
+(46376),
+(46377),
+(46379),
+(46380),
+(46381),
+(46383),
+(46384),
+(46385),
+(46386),
+(46387),
+(46388),
+(46389),
+(46390),
+(46391),
+(46392),
+(46393),
+(46394),
+(46395),
+(46396),
+(46397),
+(46398),
+(46399),
+(46400),
+(46401),
+(46402),
+(46403),
+(46404),
+(46405),
+(46406),
+(46407),
+(46408),
+(46409),
+(46410),
+(46411),
+(46412),
+(46413),
+(46414),
+(46415),
+(46416),
+(46417),
+(46418),
+(46419),
+(46421),
+(46422),
+(46423),
+(46424),
+(46425),
+(46426),
+(46427),
+(46428),
+(46429),
+(46430),
+(46431),
+(46432),
+(46433),
+(46434),
+(46435),
+(46436),
+(46437),
+(46438),
+(46439),
+(46440),
+(46441),
+(46442),
+(46443),
+(46444),
+(46445),
+(46446),
+(46447),
+(46448),
+(46449),
+(46450),
+(46451),
+(46452),
+(46453),
+(46454),
+(46455),
+(46456),
+(46457),
+(46458),
+(46459),
+(46460),
+(46461),
+(46462),
+(46463),
+(46464),
+(46465),
+(46466),
+(46467),
+(46468),
+(46469),
+(46470),
+(46471),
+(46472),
+(46473),
+(46474),
+(46475),
+(46476),
+(46477),
+(46478),
+(46479),
+(46480),
+(46481),
+(46482),
+(46483),
+(46484),
+(46485),
+(46486),
+(46487),
+(46488),
+(46489),
+(46490),
+(46491),
+(46492),
+(46493),
+(46494),
+(46495),
+(46496),
+(46497),
+(46498),
+(46499),
+(46500),
+(46501),
+(46502),
+(46503),
+(46504),
+(46505),
+(46506),
+(46507),
+(46508),
+(46509),
+(46510),
+(46511),
+(46513),
+(46514),
+(46515),
+(46516),
+(46517),
+(46518),
+(46519),
+(46520),
+(46521),
+(46522),
+(46523),
+(46524),
+(46525),
+(46526),
+(46527),
+(46528),
+(46529),
+(46530),
+(46531),
+(46532),
+(46533),
+(46534),
+(46535),
+(46536),
+(46537),
+(46538),
+(46539),
+(46540),
+(46541),
+(46542),
+(46543),
+(46544),
+(46545),
+(46546),
+(46547),
+(46548),
+(46549),
+(46550),
+(46551),
+(46552),
+(46553),
+(46554),
+(46555),
+(46557),
+(46558),
+(46559),
+(46560),
+(46561),
+(46562),
+(46563),
+(46564),
+(46565),
+(46566),
+(46567),
+(46568),
+(46569),
+(46570),
+(46571),
+(46572),
+(46573),
+(46574),
+(46575),
+(46576),
+(46577),
+(46578),
+(46579),
+(46580),
+(46581),
+(46582),
+(46588),
+(46589),
+(46590),
+(46591),
+(46592),
+(46593),
+(46594),
+(46595),
+(46596),
+(46597),
+(46598),
+(46599),
+(46600),
+(46601),
+(46602),
+(46603),
+(46604),
+(46605),
+(46606),
+(46607),
+(46608),
+(46609),
+(46610),
+(46611),
+(46612),
+(46613),
+(46614),
+(46615),
+(46616),
+(46617),
+(46618),
+(46619),
+(46620),
+(46621),
+(46622),
+(46623),
+(46624),
+(46625),
+(46626),
+(46627),
+(46628),
+(46629),
+(46630),
+(46631),
+(46632),
+(46633),
+(46634),
+(46635),
+(46636),
+(46637),
+(46638),
+(46639),
+(46640),
+(46641),
+(46642),
+(46643),
+(46644),
+(46645),
+(46646),
+(46647),
+(46652),
+(46653),
+(46654),
+(46655),
+(46656),
+(46657),
+(46658),
+(46659),
+(46660),
+(46661),
+(46662),
+(46663),
+(46664),
+(46665),
+(46666),
+(46667),
+(46668),
+(46669),
+(46671),
+(46672),
+(46673),
+(46674),
+(46675),
+(46676),
+(46679),
+(46680),
+(46681),
+(46682),
+(46683),
+(46684),
+(46685),
+(46686),
+(46688),
+(46689),
+(46690),
+(46691),
+(46692),
+(46693),
+(46694),
+(46695),
+(46696),
+(46697),
+(46698),
+(46699),
+(46700),
+(46701),
+(46702),
+(46703),
+(46704),
+(46705),
+(46706),
+(46707),
+(46708),
+(46709),
+(46710),
+(46712),
+(46713),
+(46714),
+(46715),
+(46716),
+(46717),
+(46718),
+(46719),
+(46720),
+(46721),
+(46722),
+(46723),
+(46724),
+(46725),
+(46726),
+(46727),
+(46728),
+(46729),
+(46730),
+(46731),
+(46732),
+(46733),
+(46734),
+(46735),
+(46736),
+(46737),
+(46738),
+(46739),
+(46740),
+(46741),
+(46742),
+(46743),
+(46744),
+(46745),
+(46746),
+(46747),
+(46748),
+(46749),
+(46750),
+(46751),
+(46752),
+(46753),
+(46754),
+(46755),
+(46756),
+(46757),
+(46758),
+(46759),
+(46760),
+(46761),
+(46762),
+(46763),
+(46766),
+(46767),
+(46768),
+(46769),
+(46770),
+(46771),
+(46772),
+(46773),
+(46774),
+(46775),
+(46776),
+(46777),
+(46778),
+(46779),
+(46780),
+(46781),
+(46782),
+(46783),
+(46784),
+(46785),
+(46786),
+(46787),
+(46788),
+(46789),
+(46790),
+(46791),
+(46792),
+(46793),
+(46794),
+(46795),
+(46796),
+(46797),
+(46798),
+(46799),
+(46800),
+(46801),
+(46802),
+(46803),
+(46804),
+(46805),
+(46806),
+(46807),
+(46808),
+(46809),
+(46810),
+(46811),
+(46812),
+(46813),
+(46814),
+(46815),
+(46816),
+(46818),
+(46819),
+(46820),
+(46823),
+(46824),
+(46825),
+(46826),
+(46827),
+(46828),
+(46829),
+(46830),
+(46831),
+(46832),
+(46833),
+(46837),
+(46838),
+(46839),
+(46840),
+(46841),
+(46862),
+(46863),
+(46865),
+(46866),
+(46867),
+(46868),
+(46869),
+(46870),
+(46871),
+(46872),
+(46873),
+(46874),
+(46875),
+(46876),
+(46877),
+(46878),
+(46879),
+(46880),
+(46881),
+(46882),
+(46883),
+(46884),
+(46885),
+(46886),
+(46887),
+(46888),
+(46889),
+(46890),
+(46891),
+(46892),
+(46893),
+(46894),
+(46895),
+(46896),
+(46897),
+(46898),
+(46899),
+(46900),
+(46901),
+(46902),
+(46903),
+(46904),
+(46905),
+(46906),
+(46907),
+(46908),
+(46909),
+(46910),
+(46911),
+(46912),
+(46913),
+(46914),
+(46915),
+(46916),
+(46917),
+(46918),
+(46920),
+(46921),
+(46922),
+(46923),
+(46924),
+(46925),
+(46929),
+(46930),
+(46931),
+(46932),
+(46933),
+(46934),
+(46935),
+(46936),
+(46937),
+(46938),
+(46939),
+(46940),
+(46941),
+(46942),
+(46943),
+(46944),
+(46945),
+(46946),
+(46947),
+(46948),
+(46949),
+(46950),
+(46951),
+(46952),
+(46953),
+(46954),
+(46955),
+(46956),
+(46957),
+(46958),
+(46959),
+(46960),
+(46961),
+(46962),
+(46963),
+(46964),
+(46965),
+(46966),
+(46970),
+(46971),
+(46972),
+(46973),
+(46974),
+(46975),
+(46976),
+(46977),
+(46978),
+(46979),
+(46980),
+(46981),
+(46982),
+(46983),
+(46984),
+(46985),
+(46986),
+(46987),
+(46988),
+(46990),
+(46991),
+(46992),
+(46993),
+(46994),
+(46995),
+(46996),
+(46997),
+(46998),
+(46999),
+(47000),
+(47001),
+(47002),
+(47003),
+(47004),
+(47005),
+(47006),
+(47007),
+(47008),
+(47009),
+(47010),
+(47011),
+(47012),
+(47013),
+(47014),
+(47015),
+(47016),
+(47017),
+(47018),
+(47019),
+(47020),
+(47021),
+(47022),
+(47023),
+(47024),
+(47025),
+(47026),
+(47027),
+(47028),
+(47029),
+(47030),
+(47031),
+(47032),
+(47033),
+(47034),
+(47035),
+(47036),
+(47037),
+(47038),
+(47039),
+(47040),
+(47041),
+(47042),
+(47043),
+(47044),
+(47045),
+(47046),
+(47047),
+(47048),
+(47049),
+(47050),
+(47051),
+(47052),
+(47053),
+(47054),
+(47055),
+(47056),
+(47057),
+(47058),
+(47059),
+(47060),
+(47061),
+(47062),
+(47063),
+(47064),
+(47065),
+(47066),
+(47067),
+(47068),
+(47069),
+(47070),
+(47071),
+(47072),
+(47073),
+(47074),
+(47075),
+(47076),
+(47077),
+(47078),
+(47079),
+(47080),
+(47081),
+(47082),
+(47083),
+(47084),
+(47085),
+(47086),
+(47087),
+(47088),
+(47089),
+(47090),
+(47091),
+(47092),
+(47093),
+(47094),
+(47095),
+(47096),
+(47097),
+(47098),
+(47099),
+(47100),
+(47101),
+(47102),
+(47103),
+(47104),
+(47105),
+(47106),
+(47107),
+(47108),
+(47110),
+(47112),
+(47113),
+(47114),
+(47115),
+(47116),
+(47117),
+(47118),
+(47119),
+(47120),
+(47121),
+(47122),
+(47123),
+(47124),
+(47125),
+(47126),
+(47127),
+(47128),
+(47129),
+(47130),
+(47131),
+(47132),
+(47133),
+(47134),
+(47135),
+(47136),
+(47137),
+(47138),
+(47139),
+(47140),
+(47141),
+(47142),
+(47143),
+(47144),
+(47145),
+(47146),
+(47147),
+(47148),
+(47149),
+(47150),
+(47151),
+(47152),
+(47153),
+(47154),
+(47155),
+(47156),
+(47157),
+(47158),
+(47159),
+(47160),
+(47161),
+(47162),
+(47163),
+(47164),
+(47165),
+(47166),
+(47167),
+(47168),
+(47169),
+(47170),
+(47171),
+(47172),
+(47173),
+(47174),
+(47175),
+(47176),
+(47177),
+(47178),
+(47179),
+(47180),
+(47181),
+(47182),
+(47183),
+(47184),
+(47185),
+(47186),
+(47187),
+(47188),
+(47189),
+(47190),
+(47191),
+(47192),
+(47193),
+(47194),
+(47195),
+(47196),
+(47197),
+(47198),
+(47199),
+(47200),
+(47201),
+(47202),
+(47203),
+(47204),
+(47205),
+(47206),
+(47207),
+(47208),
+(47209),
+(47210),
+(47211),
+(47212),
+(47213),
+(47214),
+(47215),
+(47216),
+(47217),
+(47218),
+(47219),
+(47220),
+(47221),
+(47222),
+(47223),
+(47226),
+(47227),
+(47229),
+(47230),
+(47231),
+(47232),
+(47233),
+(47234),
+(47235),
+(47236),
+(47237),
+(47238),
+(47239),
+(47240),
+(47241),
+(47242),
+(47243),
+(47244),
+(47245),
+(47246),
+(47247),
+(47248),
+(47249),
+(47251),
+(47252),
+(47253),
+(47254),
+(47255),
+(47256),
+(47257),
+(47258),
+(47259),
+(47260),
+(47261),
+(47262),
+(47263),
+(47264),
+(47265),
+(47266),
+(47267),
+(47268),
+(47269),
+(47270),
+(47271),
+(47272),
+(47273),
+(47274),
+(47275),
+(47276),
+(47277),
+(47278),
+(47279),
+(47280),
+(47281),
+(47282),
+(47283),
+(47284),
+(47285),
+(47286),
+(47287),
+(47288),
+(47289),
+(47290),
+(47291),
+(47292),
+(47293),
+(47294),
+(47295),
+(47296),
+(47297),
+(47298),
+(47299),
+(47300),
+(47301),
+(47302),
+(47303),
+(47304),
+(47305),
+(47306),
+(47307),
+(47308),
+(47309),
+(47310),
+(47311),
+(47312),
+(47313),
+(47314),
+(47315),
+(47316),
+(47317),
+(47318),
+(47319),
+(47320),
+(47321),
+(47322),
+(47323),
+(47324),
+(47325),
+(47326),
+(47327),
+(47328),
+(47329),
+(47330),
+(47331),
+(47332),
+(47333),
+(47334),
+(47335),
+(47336),
+(47337),
+(47338),
+(47339),
+(47340),
+(47341),
+(47342),
+(47343),
+(47344),
+(47345),
+(47347),
+(47348),
+(47349),
+(47350),
+(47351),
+(47352),
+(47353),
+(47354),
+(47355),
+(47356),
+(47357),
+(47358),
+(47359),
+(47361),
+(47362),
+(47363),
+(47364),
+(47365),
+(47366),
+(47367),
+(47368),
+(47369),
+(47370),
+(47371),
+(47372),
+(47373),
+(47376),
+(47377),
+(47378),
+(47379),
+(47380),
+(47381),
+(47382),
+(47383),
+(47384),
+(47385),
+(47386),
+(47387),
+(47388),
+(47389),
+(47390),
+(47391),
+(47392),
+(47393),
+(47394),
+(47395),
+(47396),
+(47397),
+(47398),
+(47399),
+(47400),
+(47401),
+(47402),
+(47403),
+(47404),
+(47405),
+(47406),
+(47407),
+(47408),
+(47409),
+(47410),
+(47411),
+(47412),
+(47413),
+(47414),
+(47415),
+(47416),
+(47417),
+(47418),
+(47419),
+(47420),
+(47421),
+(47422),
+(47423),
+(47424),
+(47425),
+(47426),
+(47427),
+(47428),
+(47429),
+(47430),
+(47431),
+(47432),
+(47433),
+(47434),
+(47435),
+(47436),
+(47437),
+(47438),
+(47439),
+(47440),
+(47441),
+(47442),
+(47443),
+(47444),
+(47445),
+(47446),
+(47447),
+(47448),
+(47449),
+(47450),
+(47451),
+(47453),
+(47456),
+(47457),
+(47458),
+(47459),
+(47460),
+(47461),
+(47462),
+(47463),
+(47465),
+(47466),
+(47467),
+(47468),
+(47469),
+(47470),
+(47471),
+(47472),
+(47473),
+(47474),
+(47475),
+(47476),
+(47477),
+(47478),
+(47479),
+(47480),
+(47481),
+(47482),
+(47483),
+(47484),
+(47485),
+(47486),
+(47487),
+(47488),
+(47489),
+(47490),
+(47491),
+(47492),
+(47493),
+(47494),
+(47495),
+(47496),
+(47497),
+(47498),
+(47499),
+(47500),
+(47501),
+(47502),
+(47503),
+(47504),
+(47505),
+(47506),
+(47507),
+(47508),
+(47509),
+(47510),
+(47511),
+(47512),
+(47513),
+(47514),
+(47515),
+(47516),
+(47517),
+(47518),
+(47519),
+(47520),
+(47521),
+(47522),
+(47523),
+(47524),
+(47525),
+(47526),
+(47527),
+(47528),
+(47529),
+(47530),
+(47531),
+(47532),
+(47533),
+(47534),
+(47535),
+(47536),
+(47538),
+(47539),
+(47540),
+(47541),
+(47542),
+(47543),
+(47544),
+(47545),
+(47546),
+(47547),
+(47548),
+(47549),
+(47550),
+(47551),
+(47552),
+(47553),
+(47554),
+(47555),
+(47556),
+(47557),
+(47558),
+(47559),
+(47560),
+(47561),
+(47562),
+(47564),
+(47565),
+(47566),
+(47567),
+(47568),
+(47569),
+(47570),
+(47571),
+(47572),
+(47573),
+(47574),
+(47575),
+(47576),
+(47577),
+(47578),
+(47579),
+(47580),
+(47581),
+(47582),
+(47583),
+(47584),
+(47585),
+(47586),
+(47587),
+(47588),
+(47589),
+(47590),
+(47591),
+(47592),
+(47594),
+(47595),
+(47596),
+(47597),
+(47598),
+(47599),
+(47600),
+(47601),
+(47602),
+(47603),
+(47604),
+(47605),
+(47606),
+(47607),
+(47608),
+(47609),
+(47610),
+(47611),
+(47612),
+(47615),
+(47616),
+(47618),
+(47619),
+(47620),
+(47621),
+(47622),
+(47623),
+(47624),
+(47625),
+(47626),
+(47627),
+(47629),
+(47630),
+(47631),
+(47632),
+(47633),
+(47634),
+(47635),
+(47636),
+(47637),
+(47638),
+(47639),
+(47640),
+(47641),
+(47642),
+(47643),
+(47644),
+(47645),
+(47646),
+(47647),
+(47648),
+(47649),
+(47650),
+(47651),
+(47652),
+(47653),
+(47654),
+(47655),
+(47656),
+(47657),
+(47658),
+(47659),
+(47660),
+(47661),
+(47662),
+(47663),
+(47664),
+(47665),
+(47666),
+(47667),
+(47668),
+(47669),
+(47670),
+(47671),
+(47672),
+(47673),
+(47674),
+(47675),
+(47676),
+(47677),
+(47678),
+(47679),
+(47680),
+(47681),
+(47682),
+(47683),
+(47684),
+(47685),
+(47686),
+(47687),
+(47688),
+(47689),
+(47690),
+(47691),
+(47692),
+(47693),
+(47694),
+(47695),
+(47696),
+(47697),
+(47698),
+(47699),
+(47700),
+(47701),
+(47702),
+(47703),
+(47705),
+(47706),
+(47707),
+(47708),
+(47709),
+(47710),
+(47711),
+(47712),
+(47713),
+(47714),
+(47715),
+(47716),
+(47717),
+(47718),
+(47719),
+(47720),
+(47721),
+(47722),
+(47723),
+(47724),
+(47725),
+(47726),
+(47727),
+(47728),
+(47729),
+(47730),
+(47731),
+(47732),
+(47733),
+(47734),
+(47735),
+(47736),
+(47737),
+(47739),
+(47740),
+(47741),
+(47742),
+(47743),
+(47744),
+(47745),
+(47746),
+(47747),
+(47748),
+(47749),
+(47751),
+(47752),
+(47753),
+(47754),
+(47755),
+(47756),
+(47757),
+(47758),
+(47760),
+(47761),
+(47762),
+(47763),
+(47764),
+(47765),
+(47766),
+(47767),
+(47768),
+(47769),
+(47770),
+(47771),
+(47772),
+(47773),
+(47774),
+(47775),
+(47776),
+(47777),
+(47778),
+(47779),
+(47780),
+(47781),
+(47782),
+(47783),
+(47784),
+(47785),
+(47786),
+(47787),
+(47788),
+(47789),
+(47790),
+(47791),
+(47792),
+(47793),
+(47794),
+(47795),
+(47796),
+(47797),
+(47798),
+(47799),
+(47800),
+(47801),
+(47802),
+(47803),
+(47804),
+(47805),
+(47806),
+(47807),
+(47808),
+(47809),
+(47810),
+(47811),
+(47812),
+(47813),
+(47814),
+(47815),
+(47816),
+(47817),
+(47818),
+(47819),
+(47820),
+(47821),
+(47822),
+(47823),
+(47824),
+(47825),
+(47826),
+(47827),
+(47828),
+(47829),
+(47830),
+(47831),
+(47832),
+(47833),
+(47834),
+(47835),
+(47836),
+(47837),
+(47838),
+(47839),
+(47840),
+(47841),
+(47842),
+(47843),
+(47844),
+(47845),
+(47846),
+(47848),
+(47849),
+(47850),
+(47851),
+(47852),
+(47853),
+(47854),
+(47855),
+(47856),
+(47857),
+(47858),
+(47859),
+(47860),
+(47861),
+(47862),
+(47863),
+(47864),
+(47865),
+(47866),
+(47867),
+(47868),
+(47869),
+(47870),
+(47871),
+(47872),
+(47873),
+(47874),
+(47875),
+(47876),
+(47877),
+(47878),
+(47879),
+(47880),
+(47881),
+(47882),
+(47883),
+(47884),
+(47885),
+(47886),
+(47887),
+(47888),
+(47889),
+(47890),
+(47891),
+(47892),
+(47893),
+(47894),
+(47895),
+(47896),
+(47897),
+(47898),
+(47899),
+(47900),
+(47901),
+(47902),
+(47903),
+(47904),
+(47905),
+(47906),
+(47907),
+(47908),
+(47909),
+(47910),
+(47911),
+(47912),
+(47913),
+(47914),
+(47915),
+(47916),
+(47917),
+(47918),
+(47919),
+(47920),
+(47921),
+(47922),
+(47923),
+(47924),
+(47925),
+(47926),
+(47927),
+(47928),
+(47929),
+(47930),
+(47931),
+(47932),
+(47933),
+(47934),
+(47935),
+(47936),
+(47937),
+(47938),
+(47941),
+(47942),
+(47943),
+(47944),
+(47945),
+(47946),
+(47947),
+(47948),
+(47949),
+(47950),
+(47951),
+(47952),
+(47953),
+(47954),
+(47955),
+(47956),
+(47957),
+(47958),
+(47959),
+(47960),
+(47961),
+(47962),
+(47963),
+(47964),
+(47965),
+(47966),
+(47967),
+(47968),
+(47969),
+(47970),
+(47971),
+(47972),
+(47973),
+(47974),
+(47975),
+(47976),
+(47977),
+(47978),
+(47979),
+(47980),
+(47981),
+(47982),
+(47983),
+(47984),
+(47985),
+(47986),
+(47987),
+(47988),
+(47989),
+(47990),
+(47991),
+(47992),
+(47993),
+(47994),
+(47995),
+(47996),
+(47997),
+(47998),
+(47999),
+(48000),
+(48001),
+(48002),
+(48003),
+(48004),
+(48005),
+(48006),
+(48007),
+(48008),
+(48009),
+(48010),
+(48011),
+(48012),
+(48013),
+(48014),
+(48015),
+(48016),
+(48017),
+(48018),
+(48019),
+(48020),
+(48021),
+(48022),
+(48023),
+(48024),
+(48025),
+(48026),
+(48027),
+(48028),
+(48029),
+(48030),
+(48031),
+(48032),
+(48033),
+(48034),
+(48035),
+(48036),
+(48037),
+(48038),
+(48039),
+(48040),
+(48041),
+(48042),
+(48043),
+(48044),
+(48045),
+(48046),
+(48047),
+(48048),
+(48049),
+(48050),
+(48051),
+(48052),
+(48053),
+(48054),
+(48055),
+(48056),
+(48057),
+(48058),
+(48059),
+(48060),
+(48061),
+(48062),
+(48063),
+(48064),
+(48065),
+(48066),
+(48067),
+(48068),
+(48069),
+(48070),
+(48071),
+(48072),
+(48073),
+(48074),
+(48075),
+(48076),
+(48077),
+(48078),
+(48079),
+(48080),
+(48081),
+(48082),
+(48083),
+(48084),
+(48085),
+(48086),
+(48087),
+(48088),
+(48089),
+(48090),
+(48091),
+(48092),
+(48093),
+(48094),
+(48095),
+(48096),
+(48097),
+(48098),
+(48099),
+(48100),
+(48101),
+(48102),
+(48103),
+(48104),
+(48105),
+(48106),
+(48108),
+(48109),
+(48110),
+(48111),
+(48112),
+(48113),
+(48114),
+(48115),
+(48116),
+(48117),
+(48118),
+(48121),
+(48122),
+(48123),
+(48124),
+(48125),
+(48126),
+(48127),
+(48128),
+(48129),
+(48130),
+(48131),
+(48132),
+(48133),
+(48134),
+(48135),
+(48136),
+(48137),
+(48138),
+(48139),
+(48140),
+(48141),
+(48142),
+(48143),
+(48144),
+(48145),
+(48147),
+(48148),
+(48149),
+(48150),
+(48151),
+(48152),
+(48153),
+(48154),
+(48155),
+(48156),
+(48157),
+(48158),
+(48159),
+(48160),
+(48161),
+(48162),
+(48163),
+(48164),
+(48165),
+(48166),
+(48167),
+(48168),
+(48169),
+(48170),
+(48171),
+(48172),
+(48173),
+(48174),
+(48175),
+(48176),
+(48177),
+(48178),
+(48179),
+(48180),
+(48181),
+(48183),
+(48184),
+(48185),
+(48186),
+(48187),
+(48188),
+(48189),
+(48190),
+(48191),
+(48193),
+(48194),
+(48195),
+(48196),
+(48197),
+(48198),
+(48199),
+(48200),
+(48201),
+(48202),
+(48203),
+(48204),
+(48205),
+(48206),
+(48207),
+(48208),
+(48209),
+(48210),
+(48211),
+(48212),
+(48213),
+(48215),
+(48216),
+(48217),
+(48220),
+(48221),
+(48222),
+(48223),
+(48224),
+(48225),
+(48226),
+(48227),
+(48228),
+(48229),
+(48230),
+(48231),
+(48232),
+(48233),
+(48234),
+(48235),
+(48236),
+(48237),
+(48238),
+(48239),
+(48240),
+(48241),
+(48242),
+(48243),
+(48244),
+(48245),
+(48246),
+(48247),
+(48248),
+(48249),
+(48250),
+(48253),
+(48254),
+(48255),
+(48256),
+(48257),
+(48258),
+(48259),
+(48260),
+(48261),
+(48262),
+(48263),
+(48264),
+(48265),
+(48266),
+(48267),
+(48268),
+(48269),
+(48270),
+(48271),
+(48272),
+(48273),
+(48274),
+(48275),
+(48276),
+(48277),
+(48278),
+(48279),
+(48280),
+(48281),
+(48282),
+(48283),
+(48286),
+(48287),
+(48288),
+(48289),
+(48290),
+(48291),
+(48292),
+(48293),
+(48294),
+(48295),
+(48296),
+(48297),
+(48298),
+(48299),
+(48300),
+(48301),
+(48302),
+(48303),
+(48304),
+(48305),
+(48306),
+(48307),
+(48308),
+(48309),
+(48310),
+(48311),
+(48312),
+(48313),
+(48314),
+(48315),
+(48316),
+(48317),
+(48318),
+(48321),
+(48322),
+(48323),
+(48324),
+(48375),
+(48445),
+(48462),
+(48463),
+(48464),
+(48465),
+(48466),
+(48467),
+(48468),
+(48469),
+(48470),
+(48471),
+(48472),
+(48473),
+(48474),
+(48475),
+(48476),
+(48477),
+(48478),
+(48479),
+(48480),
+(48481),
+(48482),
+(48484),
+(48493),
+(48494),
+(48495),
+(48496),
+(48497),
+(48498),
+(48499),
+(48500),
+(48501),
+(48504),
+(48505),
+(48506),
+(48507),
+(48508),
+(48509),
+(48510),
+(48511),
+(48514),
+(48515),
+(48516),
+(48517),
+(48518),
+(48519),
+(48520),
+(48521),
+(48522),
+(48523),
+(48524),
+(48525),
+(48526),
+(48527),
+(48528),
+(48529),
+(48530),
+(48531),
+(48532),
+(48533),
+(48534),
+(48535),
+(48536),
+(48537),
+(48538),
+(48539),
+(48540),
+(48541),
+(48542),
+(48543),
+(48544),
+(48545),
+(48546),
+(48547),
+(48548),
+(48549),
+(48550),
+(48551),
+(48552),
+(48553),
+(48554),
+(48555),
+(48556),
+(48557),
+(48558),
+(48559),
+(48560),
+(48561),
+(48562),
+(48563),
+(48564),
+(48565),
+(48566),
+(48567),
+(48568),
+(48569),
+(48570),
+(48571),
+(48572),
+(48573),
+(48574),
+(48575),
+(48576),
+(48577),
+(48578),
+(48588),
+(48589),
+(48590),
+(48591),
+(48592),
+(48593),
+(48594),
+(48595),
+(48596),
+(48597),
+(48598),
+(48599),
+(48600),
+(48601),
+(48602),
+(48603),
+(48604),
+(48605),
+(48606),
+(48607),
+(48608),
+(48609),
+(48610),
+(48611),
+(48612),
+(48613),
+(48614),
+(48615),
+(48616),
+(48617),
+(48618),
+(48619),
+(48620),
+(48621),
+(48622),
+(48623),
+(48624),
+(48625),
+(48626),
+(48627),
+(48628),
+(48629),
+(48630),
+(48631),
+(48632),
+(48633),
+(48634),
+(48635),
+(48636),
+(48637),
+(48638),
+(48639),
+(48640),
+(48641),
+(48642),
+(48643),
+(48646),
+(48648),
+(48649),
+(48650),
+(48651),
+(48652),
+(48653),
+(48654),
+(48655),
+(48656),
+(48657),
+(48658),
+(48659),
+(48660),
+(48661),
+(48662),
+(48663),
+(48664),
+(48665),
+(48666),
+(48667),
+(48668),
+(48669),
+(48670),
+(48671),
+(48672),
+(48673),
+(48674),
+(48675),
+(48676),
+(48677),
+(48678),
+(48679),
+(48680),
+(48681),
+(48682),
+(48684),
+(48685),
+(48686),
+(48687),
+(48688),
+(48689),
+(48690),
+(48691),
+(48692),
+(48693),
+(48694),
+(48695),
+(48696),
+(48697),
+(48698),
+(48699),
+(48700),
+(48701),
+(48702),
+(48704),
+(48705),
+(48706),
+(48707),
+(48708),
+(48709),
+(48710),
+(48711),
+(48712),
+(48713),
+(48714),
+(48715),
+(48716),
+(48717),
+(48718),
+(48727),
+(48728),
+(48729),
+(48730),
+(48735),
+(48736),
+(48737),
+(48738),
+(48739),
+(48740),
+(48741),
+(48742),
+(48743),
+(48744),
+(48747),
+(48748),
+(48756),
+(48757),
+(48758),
+(48759),
+(48760),
+(48761),
+(48762),
+(48763),
+(48764),
+(48765),
+(48766),
+(48767),
+(48768),
+(48769),
+(48770),
+(48771),
+(48772),
+(48773),
+(48774),
+(48775),
+(48776),
+(48779),
+(48780),
+(48781),
+(48782),
+(48783),
+(48784),
+(48785),
+(48786),
+(48787),
+(48788),
+(48804),
+(48805),
+(48806),
+(48807),
+(48808),
+(48809),
+(48810),
+(48811),
+(48812),
+(48813),
+(48814),
+(48815),
+(48816),
+(48817),
+(48818),
+(48821),
+(48824),
+(48825),
+(48826),
+(48835),
+(48836),
+(48837),
+(48838),
+(48839),
+(48840),
+(48841),
+(48842),
+(48843),
+(48844),
+(48845),
+(48846),
+(48847),
+(48848),
+(48850),
+(48851),
+(48852),
+(48853),
+(48854),
+(48855),
+(48856),
+(48857),
+(48858),
+(48859),
+(48860),
+(48861),
+(48862),
+(48863),
+(48864),
+(48865),
+(48867),
+(48868),
+(48869),
+(48870),
+(48871),
+(48872),
+(48873),
+(48874),
+(48875),
+(48876),
+(48877),
+(48878),
+(48879),
+(48880),
+(48881),
+(48882),
+(48883),
+(48884),
+(48885),
+(48886),
+(48887),
+(48888),
+(48889),
+(48891),
+(48892),
+(48894),
+(48895),
+(48896),
+(48897),
+(48898),
+(48899),
+(48900),
+(48901),
+(48902),
+(48903),
+(48904),
+(48905),
+(48906),
+(48907),
+(48908),
+(48909),
+(48910),
+(48911),
+(48912),
+(48913),
+(48914),
+(48915),
+(48916),
+(48917),
+(48918),
+(48919),
+(48920),
+(48921),
+(48922),
+(48923),
+(48924),
+(48925),
+(48926),
+(48927),
+(48928),
+(48929),
+(48930),
+(48931),
+(48932),
+(48933),
+(48934),
+(48935),
+(48936),
+(48937),
+(48938),
+(48939),
+(48940),
+(48941),
+(48942),
+(48943),
+(48944),
+(48945),
+(48946),
+(48947),
+(48948),
+(48953),
+(48954),
+(48955),
+(48956),
+(48968),
+(48989),
+(48990),
+(48995),
+(48996),
+(48997),
+(48998),
+(48999),
+(49000),
+(49001),
+(49002),
+(49003),
+(49013),
+(49014),
+(49015),
+(49016),
+(49021),
+(49023),
+(49024),
+(49025),
+(49026),
+(49027),
+(49028),
+(49037),
+(49038),
+(49039),
+(49040),
+(49041),
+(49042),
+(49043),
+(49044),
+(49045),
+(49046),
+(49047),
+(49048),
+(49049),
+(49050),
+(49051),
+(49052),
+(49053),
+(49054),
+(49055),
+(49056),
+(49059),
+(49060),
+(49061),
+(49062),
+(49063),
+(49064),
+(49065),
+(49066),
+(49067),
+(49068),
+(49069),
+(49070),
+(49071),
+(49072),
+(49081),
+(49082),
+(49083),
+(49084),
+(49085),
+(49086),
+(49087),
+(49090),
+(49091),
+(49092),
+(49093),
+(49094),
+(49095),
+(49096),
+(49097),
+(49098),
+(49099),
+(49100),
+(49101),
+(49102),
+(49103),
+(49104),
+(49105),
+(49106),
+(49107),
+(49108),
+(49109),
+(49110),
+(49111),
+(49112),
+(49113),
+(49114),
+(49115),
+(49116),
+(49117),
+(49118),
+(49119),
+(49120),
+(49121),
+(49122),
+(49123),
+(49124),
+(49125),
+(49126),
+(49127),
+(49128),
+(49129),
+(49130),
+(49131),
+(49132),
+(49133),
+(49134),
+(49143),
+(49144),
+(49145),
+(49146),
+(49147),
+(49148),
+(49149),
+(49150),
+(49151),
+(49152),
+(49153),
+(49154),
+(49155),
+(49156),
+(49157),
+(49158),
+(49159),
+(49160),
+(49161),
+(49162),
+(49163),
+(49164),
+(49165),
+(49166),
+(49167),
+(49169),
+(49170),
+(49171),
+(49172),
+(49175),
+(49176),
+(49177),
+(49178),
+(49179),
+(49180),
+(49181),
+(49182),
+(49183),
+(49184),
+(49185),
+(49186),
+(49187),
+(49188),
+(49189),
+(49190),
+(49191),
+(49198),
+(49199),
+(49200),
+(49205),
+(49219),
+(49220),
+(49223),
+(49224),
+(49225),
+(49234),
+(49235),
+(49236),
+(49237),
+(49238),
+(49239),
+(49240),
+(49241),
+(49242),
+(49244),
+(49245),
+(49246),
+(49247),
+(49248),
+(49249),
+(49250),
+(49251),
+(49252),
+(49253),
+(49254),
+(49255),
+(49256),
+(49257),
+(49258),
+(49259),
+(49260),
+(49261),
+(49262),
+(49263),
+(49264),
+(49265),
+(49266),
+(49267),
+(49268),
+(49269),
+(49270),
+(49271),
+(49272),
+(49273),
+(49274),
+(49275),
+(49276),
+(49277),
+(49278),
+(49281),
+(49282),
+(49283),
+(49284),
+(49285),
+(49286),
+(49287),
+(49288),
+(49289),
+(49290),
+(49291),
+(49292),
+(49293),
+(49294),
+(49295),
+(49296),
+(49297),
+(49298),
+(49299),
+(49308),
+(49309),
+(49310),
+(49311),
+(49312),
+(49313),
+(49314),
+(49315),
+(49316),
+(49317),
+(49318),
+(49319),
+(49320),
+(49321),
+(49322),
+(49323),
+(49324),
+(49325),
+(49326),
+(49327),
+(49328),
+(49329),
+(49332),
+(49333),
+(49334),
+(49335),
+(49336),
+(49337),
+(49338),
+(49339),
+(49340),
+(49341),
+(49344),
+(49345),
+(49347),
+(49348),
+(49351),
+(49352),
+(49354),
+(49360),
+(49365),
+(49366),
+(49367),
+(49368),
+(49371),
+(49414),
+(49425),
+(49428),
+(49429),
+(49430),
+(49508),
+(49562),
+(49585),
+(49602),
+(49606),
+(49609),
+(49624),
+(49625),
+(49626),
+(49627),
+(49628),
+(49629),
+(49630),
+(49631),
+(49659),
+(49670),
+(49712),
+(49713),
+(49724),
+(49735),
+(49736),
+(49763),
+(49764),
+(49765),
+(49766),
+(49768),
+(49769),
+(49770),
+(49771),
+(49772),
+(49773),
+(49776),
+(49777),
+(49778),
+(49779),
+(49780),
+(49781),
+(49782),
+(49783),
+(49788),
+(49789),
+(49794),
+(49805),
+(49806),
+(49807),
+(49808),
+(49809),
+(49810),
+(49819),
+(49820),
+(49835),
+(49836),
+(49844),
+(49845),
+(49846),
+(49847),
+(49848),
+(49849),
+(49850),
+(49851),
+(49852),
+(49853),
+(49854),
+(49855),
+(49856),
+(49857),
+(49858),
+(49859),
+(49860),
+(49861),
+(49862),
+(49863),
+(49899),
+(49900),
+(49903),
+(49904),
+(49905),
+(49906),
+(49907),
+(49908),
+(49912),
+(49913),
+(49914),
+(49935),
+(49938),
+(49939),
+(49941),
+(49954),
+(49962),
+(49963),
+(49964),
+(49975),
+(49976),
+(49977),
+(49986),
+(49997),
+(50013),
+(50014),
+(50152),
+(50153),
+(50154),
+(50155),
+(50156),
+(50157),
+(50158),
+(50159),
+(50160),
+(50161),
+(50162),
+(50163),
+(50164),
+(50165),
+(50166),
+(50167),
+(50168),
+(50169),
+(50170),
+(50171),
+(50172),
+(50173),
+(50174),
+(50175),
+(50176),
+(50177),
+(50178),
+(50179),
+(50180),
+(50181),
+(50182),
+(50191),
+(50192),
+(50211),
+(50212),
+(50229),
+(50232),
+(50316),
+(50326),
+(50356),
+(50357),
+(50358),
+(50359),
+(50368),
+(50369),
+(50370),
+(50438),
+(50470),
+(50471),
+(50500),
+(50501),
+(50502),
+(50541),
+(50575),
+(50613),
+(50630),
+(50640),
+(50643),
+(50644),
+(50649),
+(50650),
+(50663),
+(50666),
+(50685),
+(50686),
+(50687),
+(50688),
+(50689),
+(50690),
+(50691),
+(50693),
+(50694),
+(50697),
+(50698),
+(50701),
+(50702),
+(50703),
+(50704),
+(50705),
+(50723),
+(50725),
+(50726),
+(50727),
+(50728),
+(50729),
+(50730),
+(50742),
+(50743),
+(50744),
+(50745),
+(50746),
+(50747),
+(50748),
+(50749),
+(50753),
+(50754),
+(50757),
+(50758),
+(50759),
+(50760),
+(50761),
+(50762),
+(50763),
+(50764),
+(50765),
+(50766),
+(50767),
+(50768),
+(50769),
+(50770),
+(50771),
+(50772),
+(50773),
+(50774),
+(50776),
+(50777),
+(50778),
+(50779),
+(50796),
+(50804),
+(50805),
+(50807),
+(50836),
+(50845),
+(50854),
+(50855),
+(50876),
+(50881),
+(50890),
+(50891),
+(50898),
+(50899),
+(50900),
+(50901),
+(50910),
+(50911),
+(50912),
+(50913),
+(50914),
+(50915),
+(50916),
+(50917),
+(50918),
+(50919),
+(50920),
+(50921),
+(50926),
+(50928),
+(50929),
+(50930),
+(50931),
+(50932),
+(50933),
+(50944),
+(50949),
+(50950),
+(50951),
+(50952),
+(50953),
+(50954),
+(50955),
+(50956),
+(50957),
+(50958),
+(50959),
+(50961),
+(50962),
+(50963),
+(50964),
+(50965),
+(50966),
+(50967),
+(50968),
+(50969),
+(50970),
+(50971),
+(50972),
+(50973),
+(50974),
+(50975),
+(50976),
+(50977),
+(50978),
+(50979),
+(50980),
+(50981),
+(50982),
+(50983),
+(50984),
+(50985),
+(50986),
+(50987),
+(50988),
+(50989),
+(50990),
+(50991),
+(50992),
+(50993),
+(50994),
+(50995),
+(50996),
+(51000),
+(51001),
+(51002),
+(51004),
+(51005),
+(51007),
+(51008),
+(51009),
+(51010),
+(51011),
+(51012),
+(51013),
+(51014),
+(51015),
+(51016),
+(51018),
+(51019),
+(51020),
+(51021),
+(51022),
+(51024),
+(51025),
+(51026),
+(51027),
+(51028),
+(51029),
+(51030),
+(51031),
+(51032),
+(51033),
+(51034),
+(51035),
+(51036),
+(51037),
+(51045),
+(51048),
+(51049),
+(51050),
+(51051),
+(51052),
+(51053),
+(51058),
+(51061),
+(51062),
+(51063),
+(51064),
+(51065),
+(51066),
+(51067),
+(51068),
+(51069),
+(51070),
+(51071),
+(51072),
+(51073),
+(51074),
+(51075),
+(51076),
+(51077),
+(51078),
+(51079),
+(51080),
+(51081),
+(51082),
+(51083),
+(51084),
+(51085),
+(51086),
+(51087),
+(51088),
+(51089),
+(51090),
+(51091),
+(51092),
+(51093),
+(51094),
+(51095),
+(51096),
+(51097),
+(51098),
+(51099),
+(51100),
+(51101),
+(51102),
+(51103),
+(51104),
+(51105),
+(51106),
+(51107),
+(51108),
+(51109),
+(51110),
+(51111),
+(51112),
+(51113),
+(51114),
+(51115),
+(51116),
+(51117),
+(51118),
+(51120),
+(51121),
+(51122),
+(51123),
+(51124),
+(51125),
+(51126),
+(51127),
+(51128),
+(51129),
+(51130),
+(51131),
+(51132),
+(51133),
+(51134),
+(51135),
+(51144),
+(51145),
+(51146),
+(51161),
+(51162),
+(51164),
+(51165),
+(51166),
+(51167),
+(51168),
+(51169),
+(51170),
+(51171),
+(51172),
+(51173),
+(51174),
+(51175),
+(51176),
+(51177),
+(51178),
+(51179),
+(51180),
+(51181),
+(51182),
+(51183),
+(51186),
+(51187),
+(51188),
+(51189),
+(51190),
+(51191),
+(51192),
+(51193),
+(51194),
+(51195),
+(51196),
+(51197),
+(51198),
+(51199),
+(51200),
+(51201),
+(51202),
+(51203),
+(51204),
+(51205),
+(51206),
+(51207),
+(51210),
+(51211),
+(51212),
+(51213),
+(51214),
+(51215),
+(51216),
+(51217),
+(51218),
+(51219),
+(51220),
+(51221),
+(51222),
+(51223),
+(51224),
+(51225),
+(51226),
+(51227),
+(51228),
+(51229),
+(51230),
+(51231),
+(51232),
+(51233),
+(51234),
+(51235),
+(51236),
+(51237),
+(51238),
+(51239),
+(51240),
+(51241),
+(51242),
+(51243),
+(51244),
+(51245),
+(51246),
+(51247),
+(51248),
+(51249),
+(51250),
+(51251),
+(51252),
+(51253),
+(51254),
+(51255),
+(51256),
+(51258),
+(51259),
+(51260),
+(51261),
+(51262),
+(51263),
+(51264),
+(51265),
+(51266),
+(51267),
+(51268),
+(51269),
+(51270),
+(51271),
+(51272),
+(51273),
+(51274),
+(51275),
+(51276),
+(51277),
+(51278),
+(51279),
+(51280),
+(51281),
+(51282),
+(51283),
+(51284),
+(51285),
+(51286),
+(51287),
+(51288),
+(51289),
+(51290),
+(51291),
+(51292),
+(51293),
+(51294),
+(51295),
+(51296),
+(51297),
+(51298),
+(51299),
+(51300),
+(51301),
+(51302),
+(51303),
+(51304),
+(51305),
+(51306),
+(51307),
+(51308),
+(51309),
+(51310),
+(51311),
+(51312),
+(51313),
+(51314),
+(51315),
+(51316),
+(51317),
+(51318),
+(51319),
+(51320),
+(51321),
+(51322),
+(51323),
+(51324),
+(51325),
+(51326),
+(51327),
+(51328),
+(51329),
+(51330),
+(51331),
+(51332),
+(51333),
+(51334),
+(51336),
+(51337),
+(51338),
+(51340),
+(51342),
+(51343),
+(51344),
+(51345),
+(51346),
+(51347),
+(51348),
+(51349),
+(51350),
+(51351),
+(51352),
+(51353),
+(51354),
+(51355),
+(51356),
+(51357),
+(51358),
+(51359),
+(51360),
+(51361),
+(51362),
+(51363),
+(51364),
+(51365),
+(51366),
+(51367),
+(51368),
+(51369),
+(51370),
+(51372),
+(51373),
+(51374),
+(51375),
+(51376),
+(51377),
+(51378),
+(51379),
+(51380),
+(51381),
+(51382),
+(51383),
+(51384),
+(51385),
+(51386),
+(51387),
+(51388),
+(51389),
+(51390),
+(51391),
+(51392),
+(51393),
+(51394),
+(51395),
+(51396),
+(51397),
+(51398),
+(51399),
+(51400),
+(51401),
+(51402),
+(51403),
+(51404),
+(51405),
+(51406),
+(51407),
+(51408),
+(51409),
+(51410),
+(51411),
+(51412),
+(51413),
+(51414),
+(51415),
+(51416),
+(51417),
+(51418),
+(51419),
+(51420),
+(51423),
+(51424),
+(51425),
+(51426),
+(51427),
+(51428),
+(51429),
+(51430),
+(51431),
+(51432),
+(51441),
+(51442),
+(51443),
+(51444),
+(51445),
+(51446),
+(51447),
+(51448),
+(51449),
+(51450),
+(51451),
+(51452),
+(51453),
+(51454),
+(51455),
+(51456),
+(51457),
+(51458),
+(51459),
+(51460),
+(51461),
+(51463),
+(51464),
+(51465),
+(51466),
+(51467),
+(51468),
+(51469),
+(51470),
+(51471),
+(51472),
+(51473),
+(51474),
+(51475),
+(51476),
+(51477),
+(51478),
+(51479),
+(51480),
+(51481),
+(51482),
+(51483),
+(51484),
+(51485),
+(51486),
+(51487),
+(51488),
+(51490),
+(51491),
+(51492),
+(51493),
+(51495),
+(51496),
+(51497),
+(51498),
+(51499),
+(51500),
+(51501),
+(51502),
+(51503),
+(51504),
+(51505),
+(51507),
+(51510),
+(51511),
+(51512),
+(51517),
+(51518),
+(51520),
+(51525),
+(51526),
+(51529),
+(51530),
+(51531),
+(51532),
+(51533),
+(51534),
+(51535),
+(51536),
+(51537),
+(51540),
+(51541),
+(51542),
+(51543),
+(51548),
+(51549),
+(51550),
+(51551),
+(51554),
+(51559),
+(51568),
+(51573),
+(51574),
+(51575),
+(51576),
+(51577),
+(51578),
+(51579),
+(51580),
+(51582),
+(51584),
+(51585),
+(51586),
+(51587),
+(51588),
+(51589),
+(51590),
+(51591),
+(51592),
+(51593),
+(51594),
+(51595),
+(51596),
+(51597),
+(51599),
+(51600),
+(51601),
+(51602),
+(51603),
+(51604),
+(51605),
+(51606),
+(51607),
+(51608),
+(51609),
+(51610),
+(51611),
+(51612),
+(51613),
+(51614),
+(51615),
+(51616),
+(51617),
+(51618),
+(51621),
+(51628),
+(51629),
+(51630),
+(51631),
+(51632),
+(51633),
+(51636),
+(51637),
+(51638),
+(51639),
+(51640),
+(51641),
+(51642),
+(51643),
+(51644),
+(51645),
+(51646),
+(51647),
+(51648),
+(51649),
+(51650),
+(51651),
+(51652),
+(51655),
+(51657),
+(51658),
+(51659),
+(51660),
+(51661),
+(51662),
+(51663),
+(51664),
+(51665),
+(51666),
+(51670),
+(51671),
+(51672),
+(51674),
+(51675),
+(51676),
+(51677),
+(51678),
+(51679),
+(51680),
+(51681),
+(51682),
+(51683),
+(51684),
+(51685),
+(51712),
+(51713),
+(51714),
+(51715),
+(51716),
+(51717),
+(51718),
+(51719),
+(51720),
+(51721),
+(51722),
+(51723),
+(51724),
+(51733),
+(51734),
+(51735),
+(51736),
+(51737),
+(51738),
+(51739),
+(51740),
+(51741),
+(51742),
+(51743),
+(51744),
+(51745),
+(51746),
+(51747),
+(51755),
+(51756),
+(51757),
+(51758),
+(51759),
+(51760),
+(51761),
+(51763),
+(51764),
+(51766),
+(51767),
+(51768),
+(51769),
+(51770),
+(51771),
+(51772),
+(51775),
+(51777),
+(51778),
+(51779),
+(51780),
+(51781),
+(51782),
+(51784),
+(51787),
+(51789),
+(51790),
+(51791),
+(51792),
+(51793),
+(51794),
+(51795),
+(51796),
+(51797),
+(51798),
+(51799),
+(51800),
+(51809),
+(51810),
+(51811),
+(51812),
+(51813),
+(51814),
+(51815),
+(51818),
+(51819),
+(51820),
+(51821),
+(51822),
+(51823),
+(51824),
+(51825),
+(51826),
+(51827),
+(51828),
+(51829),
+(51830),
+(51831),
+(51832),
+(51833),
+(51834),
+(51835),
+(51836),
+(51837),
+(51848),
+(51858),
+(51859),
+(51860),
+(51861),
+(51863),
+(51864),
+(51865),
+(51866),
+(51867),
+(51868),
+(51869),
+(51870),
+(51871),
+(51872),
+(51873),
+(51877),
+(51878),
+(51879),
+(51880),
+(51881),
+(51882),
+(51883),
+(51884),
+(51885),
+(51886),
+(51887),
+(51889),
+(51890),
+(51891),
+(51892),
+(51893),
+(51894),
+(51895),
+(51896),
+(51897),
+(51898),
+(51899),
+(51900),
+(51901),
+(51902),
+(51916),
+(51919),
+(51920),
+(51921),
+(51922),
+(51923),
+(51924),
+(51925),
+(51926),
+(51927),
+(51928),
+(51929),
+(51930),
+(51931),
+(51932),
+(51933),
+(51934),
+(51976),
+(51977),
+(51978),
+(51987),
+(51988),
+(51989),
+(51990),
+(51991),
+(51992),
+(51993),
+(51994),
+(51995),
+(51996),
+(51997),
+(51998),
+(51999),
+(52000),
+(52001),
+(52002),
+(52003),
+(52004),
+(52005),
+(52006),
+(52008),
+(52009),
+(52010),
+(52011),
+(52012),
+(52013),
+(52014),
+(52019),
+(52020),
+(52021),
+(52022),
+(52023),
+(52024),
+(52025),
+(52026),
+(52027),
+(52028),
+(52029),
+(52030),
+(52031),
+(52032),
+(52033),
+(52034),
+(52035),
+(52036),
+(52047),
+(52048),
+(52049),
+(52050),
+(52055),
+(52056),
+(52057),
+(52058),
+(52074),
+(52077),
+(52078),
+(52084),
+(52086),
+(52095),
+(52098),
+(52099),
+(52100),
+(52103),
+(52104),
+(52106),
+(52111),
+(52164),
+(52165),
+(52166),
+(52167),
+(52168),
+(52169),
+(52170),
+(52171),
+(52172),
+(52173),
+(52180),
+(52181),
+(52182),
+(52183),
+(52184),
+(52185),
+(52186),
+(52187),
+(52188),
+(52189),
+(52190),
+(52191),
+(52192),
+(52193),
+(52194),
+(52195),
+(52196),
+(52199),
+(52200),
+(52201),
+(52202),
+(52203),
+(52204),
+(52205),
+(52206),
+(52207),
+(52208),
+(52209),
+(52210),
+(52211),
+(52212),
+(52213),
+(52222),
+(52223),
+(52224),
+(52229),
+(52230),
+(52231),
+(52232),
+(52233),
+(52241),
+(52261),
+(52262),
+(52263),
+(52264),
+(52265),
+(52266),
+(52268),
+(52269),
+(52271),
+(52272),
+(52273),
+(52274),
+(52275),
+(52276),
+(52277),
+(52278),
+(52279),
+(52280),
+(52281),
+(52282),
+(52283),
+(52284),
+(52285),
+(52294),
+(52295),
+(52296),
+(52297),
+(52298),
+(52299),
+(52300),
+(52301),
+(52302),
+(52303),
+(52304),
+(52305),
+(52306),
+(52307),
+(52308),
+(52309),
+(52310),
+(52313),
+(52314),
+(52316),
+(52317),
+(52318),
+(52319),
+(52320),
+(52321),
+(52331),
+(52332),
+(52333),
+(52334),
+(52335),
+(52341),
+(52343),
+(52344),
+(52345),
+(52346),
+(52347),
+(52348),
+(52349),
+(52350),
+(52352),
+(52353),
+(52354),
+(52355),
+(52356),
+(52357),
+(52366),
+(52367),
+(52368),
+(52369),
+(52370),
+(52371),
+(52372),
+(52373),
+(52374),
+(52375),
+(52376),
+(52377),
+(52378),
+(52379),
+(52380),
+(52381),
+(52382),
+(52383),
+(52384),
+(52385),
+(52386),
+(52387),
+(52388),
+(52389),
+(52390),
+(52391),
+(52392),
+(52393),
+(52394),
+(52395),
+(52396),
+(52397),
+(52398),
+(52399),
+(52400),
+(52401),
+(52402),
+(52403),
+(52404),
+(52405),
+(52406),
+(52407),
+(52408),
+(52409),
+(52410),
+(52411),
+(52412),
+(52413),
+(52414),
+(52415),
+(52416),
+(52417),
+(52418),
+(52422),
+(52423),
+(52424),
+(52425),
+(52426),
+(52427),
+(52428),
+(52430),
+(52431),
+(52432),
+(52433),
+(52434),
+(52435),
+(52436),
+(52437),
+(52438),
+(52439),
+(52440),
+(52441),
+(52458),
+(52459),
+(52460),
+(52461),
+(52462),
+(52463),
+(52465),
+(52466),
+(52467),
+(52468),
+(52469),
+(52470),
+(52471),
+(52472),
+(52473),
+(52474),
+(52475),
+(52476),
+(52477),
+(52478),
+(52479),
+(52480),
+(52481),
+(52482),
+(52483),
+(52484),
+(52485),
+(52486),
+(52487),
+(52489),
+(52490),
+(52491),
+(52492),
+(52493),
+(52494),
+(52495),
+(52496),
+(52497),
+(52498),
+(52499),
+(52500),
+(52501),
+(52502),
+(52503),
+(52508),
+(52509),
+(52510),
+(52511),
+(52512),
+(52513),
+(52514),
+(52515),
+(52516),
+(52517),
+(52518),
+(52519),
+(52520),
+(52521),
+(52525),
+(52526),
+(52527),
+(52528),
+(52530),
+(52531),
+(52532),
+(52533),
+(52534),
+(52535),
+(52536),
+(52537),
+(52538),
+(52539),
+(52540),
+(52541),
+(52542),
+(52543),
+(52544),
+(52545),
+(52546),
+(52547),
+(52548),
+(52549),
+(52550),
+(52551),
+(52552),
+(52553),
+(52554),
+(52555),
+(52556),
+(52557),
+(52558),
+(52559),
+(52560),
+(52561),
+(52562),
+(52563),
+(52564),
+(52565),
+(52566),
+(52567),
+(52568),
+(52569),
+(52570),
+(52571),
+(52572),
+(52573),
+(52574),
+(52575),
+(52576),
+(52577),
+(52578),
+(52579),
+(52580),
+(52581),
+(52582),
+(52583),
+(52584),
+(52585),
+(52586),
+(52587),
+(52590),
+(52591),
+(52592),
+(52593),
+(52594),
+(52595),
+(52596),
+(52597),
+(52598),
+(52599),
+(52600),
+(52601),
+(52602),
+(52605),
+(52606),
+(52607),
+(52608),
+(52609),
+(52610),
+(52611),
+(52612),
+(52614),
+(52615),
+(52621),
+(52622),
+(52623),
+(52624),
+(52625),
+(52626),
+(52627),
+(52628),
+(52629),
+(52630),
+(52631),
+(52632),
+(52633),
+(52634),
+(52635),
+(52636),
+(52637),
+(52638),
+(52639),
+(52640),
+(52641),
+(52642),
+(52643),
+(52644),
+(52645),
+(52646),
+(52648),
+(52652),
+(52653),
+(52656),
+(52657),
+(52659),
+(52661),
+(52668),
+(52683),
+(52684),
+(52685),
+(52686),
+(52687),
+(52688),
+(52693),
+(52694),
+(52695),
+(52696),
+(52697),
+(52698),
+(52699),
+(52703),
+(52705),
+(52706),
+(52707),
+(52710),
+(52711),
+(52712),
+(52713),
+(52714),
+(52715),
+(52716),
+(52717),
+(52718),
+(52719),
+(52720),
+(52723),
+(52724),
+(52729),
+(52730),
+(52731),
+(52732),
+(52733),
+(52734),
+(52735),
+(52736),
+(52737),
+(52738),
+(52739),
+(52740),
+(52741),
+(52742),
+(52743),
+(52744),
+(52745),
+(52746),
+(52747),
+(52748),
+(52749),
+(52750),
+(52751),
+(52752),
+(52753),
+(52754),
+(52756),
+(52757),
+(52758),
+(52759),
+(52760),
+(52761),
+(52762),
+(52764),
+(52766),
+(52767),
+(52768),
+(52769),
+(52770),
+(52771),
+(52772),
+(52773),
+(52774),
+(52775),
+(52776),
+(52777),
+(52778),
+(52779),
+(52780),
+(52781),
+(52782),
+(52783),
+(52784),
+(52785),
+(52792),
+(52793),
+(52794),
+(52796),
+(52808),
+(52809),
+(52818),
+(52823),
+(52824),
+(52825),
+(52826),
+(52827),
+(52828),
+(52829),
+(52830),
+(52831),
+(52832),
+(52833),
+(52834),
+(52835),
+(52837),
+(52838),
+(52841),
+(52843),
+(52847),
+(52849),
+(52850),
+(52851),
+(52854),
+(52856),
+(52857),
+(52858),
+(52859),
+(52860),
+(52861),
+(52862),
+(52864),
+(52865),
+(52867),
+(52868),
+(52869),
+(52870),
+(52873),
+(52874),
+(52875),
+(52876),
+(52877),
+(52878),
+(52879),
+(52880),
+(52881),
+(52882),
+(52883),
+(52884),
+(52886),
+(52887),
+(52888),
+(52889),
+(52890),
+(52891),
+(52892),
+(52893),
+(52894),
+(52895),
+(52896),
+(52897),
+(52898),
+(52899),
+(52900),
+(52901),
+(52902),
+(52903),
+(52905),
+(52906),
+(52907),
+(52908),
+(52909),
+(52910),
+(52911),
+(52912),
+(52913),
+(52914),
+(52915),
+(52916),
+(52921),
+(52922),
+(52923),
+(52924),
+(52925),
+(52926),
+(52927),
+(52928),
+(52929),
+(52930),
+(52931),
+(52934),
+(52935),
+(52936),
+(52937),
+(52938),
+(52939),
+(52940),
+(52941),
+(52942),
+(52943),
+(52944),
+(52945),
+(52946),
+(52947),
+(52948),
+(52953),
+(52954),
+(52955),
+(52956),
+(52957),
+(52958),
+(52960),
+(52961),
+(52962),
+(52963),
+(52964),
+(52965),
+(52966),
+(52967),
+(52968),
+(52969),
+(52970),
+(52971),
+(52972),
+(52973),
+(52975),
+(52976),
+(52977),
+(52978),
+(52981),
+(52982),
+(52983),
+(52984),
+(52985),
+(52986),
+(52987),
+(52988),
+(52989),
+(52990),
+(52991),
+(52992),
+(52993),
+(52994),
+(52995),
+(52996),
+(52997),
+(52998),
+(52999),
+(53000),
+(53001),
+(53002),
+(53003),
+(53004),
+(53005),
+(53010),
+(53015),
+(53016),
+(53017),
+(53018),
+(53019),
+(53020),
+(53021),
+(53022),
+(53023),
+(53024),
+(53025),
+(53026),
+(53027),
+(53028),
+(53029),
+(53030),
+(53031),
+(53032),
+(53033),
+(53036),
+(53037),
+(53038),
+(53039),
+(53040),
+(53041),
+(53042),
+(53043),
+(53044),
+(53045),
+(53046),
+(53047),
+(53048),
+(53049),
+(53050),
+(53051),
+(53052),
+(53053),
+(53054),
+(53055),
+(53056),
+(53057),
+(53058),
+(53059),
+(53060),
+(53061),
+(53062),
+(53063),
+(53064),
+(53065),
+(53066),
+(53067),
+(53068),
+(53069),
+(53070),
+(53071),
+(53072),
+(53073),
+(53074),
+(53075),
+(53076),
+(53077),
+(53078),
+(53079),
+(53086),
+(53087),
+(53088),
+(53089),
+(53090),
+(53091),
+(53092),
+(53093),
+(53094),
+(53095),
+(53096),
+(53097),
+(53098),
+(53099),
+(53100),
+(53101),
+(53102),
+(53103),
+(53104),
+(53105),
+(53106),
+(53107),
+(53108),
+(53109),
+(53110),
+(53111),
+(53112),
+(53113),
+(53114),
+(53115),
+(53116),
+(53117),
+(53120),
+(53121),
+(53122),
+(53124),
+(53125),
+(53126),
+(53128),
+(53129),
+(53130),
+(53131),
+(53132),
+(53133),
+(53134),
+(53135),
+(53136),
+(53137),
+(53138),
+(53139),
+(53140),
+(53141),
+(53142),
+(53143),
+(53144),
+(53145),
+(53146),
+(53147),
+(53148),
+(53149),
+(53150),
+(53151),
+(53152),
+(53153),
+(53154),
+(53155),
+(53156),
+(53157),
+(53158),
+(53159),
+(53160),
+(53161),
+(53162),
+(53163),
+(53164),
+(53165),
+(53166),
+(53171),
+(53174),
+(53175),
+(53177),
+(53182),
+(53183),
+(53190),
+(53194),
+(53195),
+(53196),
+(53200),
+(53201),
+(53203),
+(53204),
+(53205),
+(53206),
+(53207),
+(53208),
+(53209),
+(53210),
+(53211),
+(53212),
+(53213),
+(53214),
+(53217),
+(53218),
+(53219),
+(53220),
+(53221),
+(53222),
+(53223),
+(53224),
+(53225),
+(53226),
+(53227),
+(53228),
+(53229),
+(53230),
+(53231),
+(53232),
+(53233),
+(53234),
+(53235),
+(53236),
+(53237),
+(53238),
+(53239),
+(53255),
+(53256),
+(53257),
+(53258),
+(53259),
+(53260),
+(53261),
+(53262),
+(53263),
+(53264),
+(53265),
+(53266),
+(53267),
+(53268),
+(53269),
+(53270),
+(53271),
+(53272),
+(53273),
+(53274),
+(53275),
+(53276),
+(53277),
+(53278),
+(53279),
+(53280),
+(53281),
+(53282),
+(53283),
+(53284),
+(53285),
+(53286),
+(53287),
+(53288),
+(53289),
+(53291),
+(53292),
+(53293),
+(53294),
+(53295),
+(53296),
+(53297),
+(53299),
+(53300),
+(53301),
+(53302),
+(53303),
+(53304),
+(53305),
+(53306),
+(53307),
+(53308),
+(53309),
+(53310),
+(53311),
+(53312),
+(53313),
+(53314),
+(53315),
+(53316),
+(53317),
+(53318),
+(53319),
+(53321),
+(53322),
+(53323),
+(53324),
+(53325),
+(53326),
+(53327),
+(53328),
+(53330),
+(53331),
+(53332),
+(53339),
+(53340),
+(53341),
+(53342),
+(53343),
+(53344),
+(53345),
+(53346),
+(53347),
+(53348),
+(53349),
+(53350),
+(53351),
+(53352),
+(53353),
+(53354),
+(53355),
+(53356),
+(53357),
+(53358),
+(53359),
+(53360),
+(53362),
+(53363),
+(53364),
+(53365),
+(53366),
+(53367),
+(53368),
+(53369),
+(53370),
+(53371),
+(53372),
+(53373),
+(53374),
+(53375),
+(53376),
+(53380),
+(53381),
+(53382),
+(53383),
+(53384),
+(53385),
+(53386),
+(53387),
+(53388),
+(53389),
+(53390),
+(53391),
+(53392),
+(53393),
+(53394),
+(53395),
+(53396),
+(53397),
+(53398),
+(53399),
+(53400),
+(53401),
+(53402),
+(53403),
+(53404),
+(53405),
+(53406),
+(53407),
+(53408),
+(53409),
+(53410),
+(53411),
+(53412),
+(53413),
+(53414),
+(53415),
+(53416),
+(53417),
+(53418),
+(53419),
+(53420),
+(53421),
+(53422),
+(53423),
+(53424),
+(53425),
+(53426),
+(53427),
+(53428),
+(53431),
+(53432),
+(53433),
+(53434),
+(53435),
+(53436),
+(53437),
+(53438),
+(53439),
+(53440),
+(53441),
+(53442),
+(53443),
+(53444),
+(53445),
+(53446),
+(53447),
+(53448),
+(53449),
+(53450),
+(53451),
+(53452),
+(53453),
+(53454),
+(53455),
+(53456),
+(53457),
+(53458),
+(53459),
+(53460),
+(53461),
+(53462),
+(53463),
+(53464),
+(53465),
+(53466),
+(53467),
+(53468),
+(53469),
+(53470),
+(53471),
+(53472),
+(53473),
+(53474),
+(53475),
+(53476),
+(53477),
+(53478),
+(53479),
+(53480),
+(53481),
+(53482),
+(53483),
+(53489),
+(53490),
+(53491),
+(53492),
+(53493),
+(53494),
+(53495),
+(53496),
+(53497),
+(53498),
+(53499),
+(53500),
+(53501),
+(53502),
+(53503),
+(53504),
+(53505),
+(53506),
+(53507),
+(53508),
+(53509),
+(53510),
+(53511),
+(53512),
+(53513),
+(53514),
+(53515),
+(53516),
+(53517),
+(53518),
+(53519),
+(53520),
+(53521),
+(53522),
+(53523),
+(53524),
+(53525),
+(53526),
+(53527),
+(53528),
+(53529),
+(53530),
+(53531),
+(53532),
+(53533),
+(53534),
+(53535),
+(53536),
+(53537),
+(53538),
+(53539),
+(53540),
+(53541),
+(53542),
+(53543),
+(53544),
+(53546),
+(53547),
+(53548),
+(53549),
+(53566),
+(53567),
+(53569),
+(53570),
+(53575),
+(53576),
+(53578),
+(53579),
+(53580),
+(53581),
+(53582),
+(53587),
+(53588),
+(53589),
+(53590),
+(53591),
+(53593),
+(53597),
+(53598),
+(53601),
+(53602),
+(53603),
+(53604),
+(53605),
+(53606),
+(53607),
+(53608),
+(53609),
+(53610),
+(53611),
+(53612),
+(53613),
+(53614),
+(53615),
+(53616),
+(53617),
+(53618),
+(53619),
+(53620),
+(53621),
+(53622),
+(53623),
+(53624),
+(53625),
+(53626),
+(53627),
+(53628),
+(53629),
+(53630),
+(53631),
+(53632),
+(53633),
+(53634),
+(53635),
+(53636),
+(53637),
+(53638),
+(53639),
+(53640),
+(53641),
+(53642),
+(53643),
+(53644),
+(53645),
+(53646),
+(53648),
+(53649),
+(53650),
+(53652),
+(53656),
+(53657),
+(53658),
+(53659),
+(53660),
+(53661),
+(53662),
+(53663),
+(53664),
+(53665),
+(53666),
+(53667),
+(53668),
+(53669),
+(53670),
+(53671),
+(53672),
+(53673),
+(53674),
+(53675),
+(53676),
+(53677),
+(53678),
+(53679),
+(53680),
+(53681),
+(53682),
+(53683),
+(53684),
+(53685),
+(53686),
+(53687),
+(53688),
+(53689),
+(53690),
+(53691),
+(53692),
+(53693),
+(53694),
+(53695),
+(53696),
+(53697),
+(53698),
+(53699),
+(53700),
+(53701),
+(53702),
+(53703),
+(53704),
+(53705),
+(53706),
+(53707),
+(53708),
+(53713),
+(53714),
+(53715),
+(53716),
+(53718),
+(53719),
+(53720),
+(53722),
+(53723),
+(53724),
+(53725),
+(53726),
+(53727),
+(53728),
+(53729),
+(53730),
+(53731),
+(53732),
+(53733),
+(53734),
+(53735),
+(53737),
+(53738),
+(53739),
+(53740),
+(53741),
+(53742),
+(53744),
+(53745),
+(53747),
+(53748),
+(53749),
+(53750),
+(53751),
+(53752),
+(53753),
+(53754),
+(53756),
+(53757),
+(53758),
+(53760),
+(53761),
+(53762),
+(53763),
+(53764),
+(53765),
+(53766),
+(53767),
+(53768),
+(53769),
+(53770),
+(53771),
+(53772),
+(53773),
+(53774),
+(53775),
+(53776),
+(53777),
+(53778),
+(53779),
+(53780),
+(53781),
+(53782),
+(53783),
+(53784),
+(53785),
+(53786),
+(53787),
+(53788),
+(53789),
+(53790),
+(53791),
+(53792),
+(53793),
+(53794),
+(53795),
+(53796),
+(53800),
+(53801),
+(53802),
+(53803),
+(53804),
+(53805),
+(53806),
+(53807),
+(53808),
+(53809),
+(53810),
+(53811),
+(53812),
+(53813),
+(53814),
+(53815),
+(53816),
+(53817),
+(53818),
+(53819),
+(53820),
+(53821),
+(53822),
+(53823),
+(53824),
+(53825),
+(53826),
+(53827),
+(53828),
+(53829),
+(53830),
+(53831),
+(53832),
+(53833),
+(53834),
+(53835),
+(53836),
+(53837),
+(53838),
+(53839),
+(53840),
+(53841),
+(53842),
+(53843),
+(53844),
+(53845),
+(53846),
+(53847),
+(53848),
+(53849),
+(53850),
+(53851),
+(53852),
+(53853),
+(53854),
+(53855),
+(53856),
+(53857),
+(53858),
+(53859),
+(53860),
+(53861),
+(53862),
+(53863),
+(53864),
+(53865),
+(53866),
+(53867),
+(53868),
+(53869),
+(53870),
+(53871),
+(53872),
+(53873),
+(53874),
+(53875),
+(53876),
+(53877),
+(53878),
+(53879),
+(53880),
+(53881),
+(53888),
+(53890),
+(53891),
+(53892),
+(53893),
+(53894),
+(53895),
+(53896),
+(53897),
+(53898),
+(53899),
+(53900),
+(53901),
+(53902),
+(53903),
+(53904),
+(53905),
+(53907),
+(53908),
+(53909),
+(53910),
+(53911),
+(53912),
+(53913),
+(53914),
+(53915),
+(53916),
+(53917),
+(53918),
+(53919),
+(53920),
+(53921),
+(53922),
+(53923),
+(53924),
+(53925),
+(53926),
+(53927),
+(53928),
+(53929),
+(53930),
+(53931),
+(53932),
+(53933),
+(53934),
+(53935),
+(53936),
+(53937),
+(53938),
+(53939),
+(53940),
+(53941),
+(53942),
+(53943),
+(53944),
+(53945),
+(53946),
+(53947),
+(53948),
+(53949),
+(53950),
+(53951),
+(53952),
+(53953),
+(53954),
+(53955),
+(53956),
+(53957),
+(53958),
+(53959),
+(53960),
+(53961),
+(53962),
+(53963),
+(53964),
+(53965),
+(53966),
+(53967),
+(53968),
+(53969),
+(53970),
+(53971),
+(53972),
+(53973),
+(53974),
+(53975),
+(53976),
+(53977),
+(53978),
+(53979),
+(53980),
+(53981),
+(53982),
+(53983),
+(53984),
+(53986),
+(53987),
+(53988),
+(53989),
+(53990),
+(53991),
+(53992),
+(53993),
+(53994),
+(53995),
+(53997),
+(53998),
+(53999),
+(54000),
+(54004),
+(54006),
+(54007),
+(54008),
+(54009),
+(54014),
+(54015),
+(54016),
+(54019),
+(54020),
+(54021),
+(54022),
+(54023),
+(54024),
+(54025),
+(54026),
+(54027),
+(54028),
+(54029),
+(54030),
+(54031),
+(54032),
+(54033),
+(54034),
+(54035),
+(54036),
+(54037),
+(54038),
+(54039),
+(54040),
+(54041),
+(54061),
+(54062),
+(54063),
+(54064),
+(54065),
+(54066),
+(54067),
+(54068),
+(54069),
+(54070),
+(54071),
+(54072),
+(54073),
+(54074),
+(54075),
+(54076),
+(54077),
+(54078),
+(54079),
+(54086),
+(54087),
+(54090),
+(54091),
+(54092),
+(54093),
+(54094),
+(54095),
+(54096),
+(54097),
+(54098),
+(54099),
+(54100),
+(54101),
+(54102),
+(54104),
+(54105),
+(54106),
+(54107),
+(54108),
+(54109),
+(54110),
+(54111),
+(54112),
+(54113),
+(54114),
+(54115),
+(54116),
+(54119),
+(54120),
+(54121),
+(54122),
+(54123),
+(54124),
+(54125),
+(54126),
+(54127),
+(54128),
+(54129),
+(54130),
+(54131),
+(54132),
+(54133),
+(54134),
+(54135),
+(54136),
+(54137),
+(54138),
+(54139),
+(54140),
+(54141),
+(54142),
+(54143),
+(54144),
+(54145),
+(54146),
+(54147),
+(54148),
+(54149),
+(54150),
+(54151),
+(54152),
+(54153),
+(54154),
+(54155),
+(54156),
+(54157),
+(54158),
+(54159),
+(54160),
+(54161),
+(54162),
+(54163),
+(54164),
+(54165),
+(54166),
+(54167),
+(54168),
+(54169),
+(54170),
+(54171),
+(54172),
+(54173),
+(54174),
+(54176),
+(54177),
+(54178),
+(54179),
+(54180),
+(54181),
+(54182),
+(54183),
+(54184),
+(54185),
+(54188),
+(54189),
+(54190),
+(54192),
+(54193),
+(54194),
+(54195),
+(54196),
+(54201),
+(54202),
+(54203),
+(54204),
+(54205),
+(54206),
+(54207),
+(54208),
+(54209),
+(54210),
+(54211),
+(54212),
+(54213),
+(54214),
+(54215),
+(54216),
+(54217),
+(54218),
+(54219),
+(54220),
+(54221),
+(54222),
+(54223),
+(54224),
+(54225),
+(54226),
+(54228),
+(54229),
+(54230),
+(54231),
+(54232),
+(54233),
+(54234),
+(54235),
+(54236),
+(54237),
+(54238),
+(54239),
+(54240),
+(54241),
+(54242),
+(54243),
+(54244),
+(54245),
+(54246),
+(54247),
+(54249),
+(54250),
+(54252),
+(54253),
+(54254),
+(54255),
+(54256),
+(54257),
+(54258),
+(54259),
+(54260),
+(54261),
+(54262),
+(54263),
+(54265),
+(54266),
+(54267),
+(54272),
+(54273),
+(54274),
+(54275),
+(54276),
+(54282),
+(54283),
+(54284),
+(54285),
+(54286),
+(54287),
+(54288),
+(54289),
+(54290),
+(54291),
+(54293),
+(54294),
+(54295),
+(54296),
+(54297),
+(54298),
+(54299),
+(54300),
+(54304),
+(54305),
+(54306),
+(54307),
+(54308),
+(54309),
+(54310),
+(54311),
+(54312),
+(54313),
+(54314),
+(54315),
+(54316),
+(54317),
+(54318),
+(54319),
+(54321),
+(54322),
+(54323),
+(54324),
+(54325),
+(54326),
+(54327),
+(54328),
+(54329),
+(54330),
+(54331),
+(54332),
+(54337),
+(54338),
+(54341),
+(54342),
+(54343),
+(54344),
+(54345),
+(54346),
+(54347),
+(54348),
+(54349),
+(54350),
+(54351),
+(54352),
+(54353),
+(54354),
+(54355),
+(54356),
+(54357),
+(54362),
+(54363),
+(54364),
+(54365),
+(54366),
+(54367),
+(54368),
+(54369),
+(54370),
+(54371),
+(54372),
+(54373),
+(54374),
+(54375),
+(54376),
+(54377),
+(54378),
+(54379),
+(54380),
+(54381),
+(54382),
+(54383),
+(54385),
+(54386),
+(54387),
+(54388),
+(54389),
+(54390),
+(54391),
+(54396),
+(54397),
+(54398),
+(54399),
+(54400),
+(54402),
+(54403),
+(54404),
+(54405),
+(54406),
+(54407),
+(54408),
+(54409),
+(54410),
+(54411),
+(54412),
+(54413),
+(54414),
+(54415),
+(54416),
+(54417),
+(54418),
+(54419),
+(54420),
+(54421),
+(54422),
+(54423),
+(54428),
+(54429),
+(54430),
+(54431),
+(54432),
+(54433),
+(54434),
+(54435),
+(54436),
+(54437),
+(54438),
+(54439),
+(54440),
+(54441),
+(54442),
+(54443),
+(54444),
+(54445),
+(54446),
+(54447),
+(54448),
+(54449),
+(54450),
+(54451),
+(54452),
+(54453),
+(54454),
+(54455),
+(54456),
+(54457),
+(54458),
+(54459),
+(54460),
+(54461),
+(54462),
+(54463),
+(54464),
+(54465),
+(54466),
+(54467),
+(54468),
+(54469),
+(54470),
+(54471),
+(54472),
+(54473),
+(54474),
+(54475),
+(54476),
+(54477),
+(54478),
+(54479),
+(54480),
+(54481),
+(54482),
+(54483),
+(54484),
+(54485),
+(54486),
+(54487),
+(54488),
+(54490),
+(54491),
+(54492),
+(54493),
+(54494),
+(54495),
+(54496),
+(54497),
+(54502),
+(54503),
+(54504),
+(54505),
+(54506),
+(54507),
+(54508),
+(54509),
+(54510),
+(54511),
+(54512),
+(54514),
+(54515),
+(54516),
+(54517),
+(54518),
+(54519),
+(54520),
+(54521),
+(54522),
+(54523),
+(54524),
+(54525),
+(54526),
+(54527),
+(54528),
+(54529),
+(54530),
+(54532),
+(54533),
+(54534),
+(54535),
+(54536),
+(54537),
+(54539),
+(54540),
+(54541),
+(54542),
+(54543),
+(54544),
+(54545),
+(54546),
+(54547),
+(54548),
+(54549),
+(54550),
+(54551),
+(54552),
+(54553),
+(54554),
+(54555),
+(54556),
+(54557),
+(54558),
+(54559),
+(54560),
+(54561),
+(54562),
+(54563),
+(54564),
+(54565),
+(54566),
+(54569),
+(54570),
+(54571),
+(54572),
+(54573),
+(54574),
+(54575),
+(54576),
+(54577),
+(54578),
+(54579),
+(54581),
+(54582),
+(54583),
+(54584),
+(54585),
+(54586),
+(54587),
+(54588),
+(54589),
+(54590),
+(54591),
+(54592),
+(54593),
+(54594),
+(54595),
+(54596),
+(54597),
+(54598),
+(54599),
+(54600),
+(54601),
+(54602),
+(54603),
+(54604),
+(54605),
+(54606),
+(54607),
+(54608),
+(54609),
+(54610),
+(54611),
+(54612),
+(54613),
+(54614),
+(54615),
+(54616),
+(54617),
+(54618),
+(54619),
+(54620),
+(54621),
+(54622),
+(54623),
+(54624),
+(54625),
+(54626),
+(54627),
+(54630),
+(54631),
+(54632),
+(54633),
+(54634),
+(54635),
+(54636),
+(54637),
+(54638),
+(54639),
+(54640),
+(54641),
+(54642),
+(54643),
+(54644),
+(54645),
+(54646),
+(54647),
+(54648),
+(54649),
+(54650),
+(54655),
+(54656),
+(54657),
+(54658),
+(54659),
+(54660),
+(54661),
+(54662),
+(54663),
+(54664),
+(54666),
+(54667),
+(54668),
+(54669),
+(54670),
+(54671),
+(54672),
+(54673),
+(54674),
+(54675),
+(54676),
+(54677),
+(54678),
+(54679),
+(54680),
+(54681),
+(54682),
+(54683),
+(54685),
+(54686),
+(54687),
+(54688),
+(54689),
+(54690),
+(54691),
+(54692),
+(54694),
+(54695),
+(54696),
+(54697),
+(54698),
+(54699),
+(54700),
+(54701),
+(54702),
+(54703),
+(54704),
+(54705),
+(54706),
+(54707),
+(54708),
+(54709),
+(54710),
+(54711),
+(54712),
+(54713),
+(54714),
+(54715),
+(54716),
+(54717),
+(54718),
+(54719),
+(54720),
+(54721),
+(54722),
+(54723),
+(54724),
+(54725),
+(54727),
+(54728),
+(54729),
+(54731),
+(54732),
+(54733),
+(54734),
+(54736),
+(54739),
+(54740),
+(54741),
+(54744),
+(54745),
+(54746),
+(54747),
+(54748),
+(54749),
+(54750),
+(54751),
+(54752),
+(54753),
+(54754),
+(54755),
+(54756),
+(54757),
+(54758),
+(54759),
+(54760),
+(54761),
+(54762),
+(54763),
+(54764),
+(54765),
+(54766),
+(54767),
+(54768),
+(54769),
+(54770),
+(54771),
+(54772),
+(54773),
+(54774),
+(54775),
+(54776),
+(54777),
+(54779),
+(54780),
+(54781),
+(54782),
+(54783),
+(54784),
+(54785),
+(54786),
+(54787),
+(54789),
+(54790),
+(54791),
+(54792),
+(54793),
+(54794),
+(54795),
+(54796),
+(54798),
+(54799),
+(54800),
+(54801),
+(54802),
+(54803),
+(54804),
+(54805),
+(54806),
+(54807),
+(54808),
+(54809),
+(54810),
+(54811),
+(54812),
+(54814),
+(54815),
+(54816),
+(54817),
+(54818),
+(54819),
+(54820),
+(54821),
+(54822),
+(54823),
+(54824),
+(54825),
+(54826),
+(54827),
+(54828),
+(54829),
+(54830),
+(54831),
+(54832),
+(54833),
+(54835),
+(54836),
+(54837),
+(54838),
+(54839),
+(54840),
+(54841),
+(54842),
+(54843),
+(54844),
+(54845),
+(54846),
+(54847),
+(54848),
+(54849),
+(54850),
+(54851),
+(54854),
+(54855),
+(54856),
+(54857),
+(54858),
+(54859),
+(54860),
+(54861),
+(54862),
+(54863),
+(54864),
+(54865),
+(54866),
+(54868),
+(54869),
+(54870),
+(54871),
+(54872),
+(54873),
+(54874),
+(54876),
+(54878),
+(54879),
+(54880),
+(54881),
+(54883),
+(54886),
+(54887),
+(54890),
+(54891),
+(54893),
+(54894),
+(54895),
+(54896),
+(54897),
+(54898),
+(54899),
+(54900),
+(54901),
+(54902),
+(54903),
+(54905),
+(54906),
+(54907),
+(54908),
+(54909),
+(54910),
+(54911),
+(54912),
+(54913),
+(54914),
+(54915),
+(54916),
+(54917),
+(54918),
+(54919),
+(54920),
+(54921),
+(54922),
+(54923),
+(54924),
+(54925),
+(54926),
+(54927),
+(54928),
+(54929),
+(54930),
+(54931),
+(54932),
+(54933),
+(54934),
+(54935),
+(54936),
+(54937),
+(54938),
+(54939),
+(54940),
+(54941),
+(54942),
+(54943),
+(54944),
+(54945),
+(54946),
+(54947),
+(54948),
+(54949),
+(54950),
+(54951),
+(54952),
+(54953),
+(54954),
+(54955),
+(54956),
+(54957),
+(54958),
+(54959),
+(54960),
+(54961),
+(54962),
+(54963),
+(54964),
+(54965),
+(54966),
+(54967),
+(54968),
+(54969),
+(54970),
+(54971),
+(54972),
+(54973),
+(54974),
+(54975),
+(54976),
+(54977),
+(54978),
+(54979),
+(54980),
+(54981),
+(54982),
+(54983),
+(54984),
+(54985),
+(54986),
+(54987),
+(54988),
+(54989),
+(54990),
+(54991),
+(54992),
+(54993),
+(54994),
+(54995),
+(54996),
+(54997),
+(54998),
+(54999),
+(55000),
+(55001),
+(55002),
+(55003),
+(55004),
+(55005),
+(55006),
+(55007),
+(55008),
+(55009),
+(55015),
+(55016),
+(55017),
+(55018),
+(55019),
+(55020),
+(55021),
+(55022),
+(55023),
+(55024),
+(55025),
+(55026),
+(55027),
+(55028),
+(55029),
+(55030),
+(55031),
+(55036),
+(55037),
+(55042),
+(55043),
+(55044),
+(55045),
+(55046),
+(55047),
+(55048),
+(55049),
+(55050),
+(55051),
+(55052),
+(55053),
+(55054),
+(55055),
+(55056),
+(55057),
+(55058),
+(55059),
+(55060),
+(55061),
+(55062),
+(55063),
+(55064),
+(55065),
+(55066),
+(55067),
+(55068),
+(55069),
+(55070),
+(55071),
+(55072),
+(55073),
+(55074),
+(55075),
+(55076),
+(55077),
+(55078),
+(55080),
+(55081),
+(55082),
+(55083),
+(55084),
+(55085),
+(55086),
+(55087),
+(55088),
+(55089),
+(55091),
+(55092),
+(55093),
+(55094),
+(55095),
+(55096),
+(55097),
+(55098),
+(55099),
+(55100),
+(55101),
+(55102),
+(55103),
+(55104),
+(55107),
+(55108),
+(55110),
+(55111),
+(55112),
+(55113),
+(55114),
+(55115),
+(55116),
+(55117),
+(55118),
+(55119),
+(55120),
+(55121),
+(55122),
+(55123),
+(55124),
+(55125),
+(55126),
+(55127),
+(55128),
+(55129),
+(55130),
+(55131),
+(55132),
+(55133),
+(55134),
+(55135),
+(55136),
+(55137),
+(55138),
+(55139),
+(55140),
+(55141),
+(55142),
+(55143),
+(55144),
+(55145),
+(55146),
+(55147),
+(55148),
+(55149),
+(55150),
+(55151),
+(55152),
+(55153),
+(55154),
+(55155),
+(55159),
+(55160),
+(55161),
+(55162),
+(55169),
+(55170),
+(55186),
+(55200),
+(55201),
+(55203),
+(55204),
+(55205),
+(55206),
+(55207),
+(55208),
+(55209),
+(55210),
+(55211),
+(55212),
+(55214),
+(55217),
+(55218),
+(55219),
+(55220),
+(55221),
+(55222),
+(55223),
+(55224),
+(55225),
+(55226),
+(55227),
+(55228),
+(55229),
+(55230),
+(55231),
+(55232),
+(55233),
+(55234),
+(55235),
+(55236),
+(55237),
+(55238),
+(55239),
+(55240),
+(55241),
+(55242),
+(55243),
+(55244),
+(55245),
+(55246),
+(55247),
+(55248),
+(55249),
+(55250),
+(55251),
+(55252),
+(55253),
+(55254),
+(55255),
+(55256),
+(55257),
+(55258),
+(55259),
+(55260),
+(55261),
+(55262),
+(55263),
+(55264),
+(55265),
+(55266),
+(55267),
+(55268),
+(55269),
+(55270),
+(55271),
+(55272),
+(55273),
+(55274),
+(55275),
+(55276),
+(55277),
+(55278),
+(55279),
+(55280),
+(55281),
+(55282),
+(55283),
+(55284),
+(55285),
+(55286),
+(55287),
+(55288),
+(55289),
+(55290),
+(55291),
+(55292),
+(55293),
+(55294),
+(55295),
+(55296),
+(55297),
+(55298),
+(55299),
+(55300),
+(55301),
+(55302),
+(55303),
+(55306),
+(55307),
+(55308),
+(55309),
+(55310),
+(55311),
+(55312),
+(55313),
+(55314),
+(55315),
+(55316),
+(55317),
+(55318),
+(55319),
+(55320),
+(55321),
+(55322),
+(55323),
+(55324),
+(55325),
+(55326),
+(55327),
+(55329),
+(55335),
+(55340),
+(55341),
+(55342),
+(55343),
+(55344),
+(55345),
+(55346),
+(55347),
+(55348),
+(55349),
+(55350),
+(55351),
+(55352),
+(55353),
+(55354),
+(55355),
+(55356),
+(55357),
+(55358),
+(55359),
+(55360),
+(55361),
+(55362),
+(55363),
+(55364),
+(55365),
+(55366),
+(55367),
+(55368),
+(55369),
+(55370),
+(55371),
+(55372),
+(55373),
+(55374),
+(55375),
+(55376),
+(55377),
+(55378),
+(55380),
+(55382),
+(55383),
+(55384),
+(55385),
+(55404),
+(55406),
+(55411),
+(55412),
+(55413),
+(55414),
+(55415),
+(55416),
+(55417),
+(55418),
+(55419),
+(55422),
+(55423),
+(55424),
+(55425),
+(55426),
+(55427),
+(55428),
+(55429),
+(55431),
+(55432),
+(55433),
+(55434),
+(55436),
+(55437),
+(55438),
+(55439),
+(55440),
+(55441),
+(55442),
+(55443),
+(55445),
+(55446),
+(55447),
+(55448),
+(55450),
+(55451),
+(55452),
+(55453),
+(55454),
+(55455),
+(55456),
+(55457),
+(55458),
+(55459),
+(55460),
+(55461),
+(55462),
+(55463),
+(55464),
+(55465),
+(55466),
+(55467),
+(55468),
+(55469),
+(55470),
+(55471),
+(55472),
+(55473),
+(55474),
+(55475),
+(55476),
+(55477),
+(55478),
+(55479),
+(55480),
+(55481),
+(55482),
+(55483),
+(55484),
+(55485),
+(55486),
+(55487),
+(55488),
+(55489),
+(55492),
+(55493),
+(55494),
+(55495),
+(55496),
+(55497),
+(55498),
+(55499),
+(55500),
+(55501),
+(55502),
+(55503),
+(55504),
+(55505),
+(55506),
+(55507),
+(55508),
+(55509),
+(55510),
+(55511),
+(55512),
+(55513),
+(55514),
+(55515),
+(55516),
+(55517),
+(55518),
+(55519),
+(55520),
+(55521),
+(55522),
+(55523),
+(55528),
+(55529),
+(55530),
+(55531),
+(55537),
+(55538),
+(55539),
+(55540),
+(55541),
+(55542),
+(55543),
+(55544),
+(55545),
+(55546),
+(55547),
+(55548),
+(55549),
+(55550),
+(55551),
+(55552),
+(55553),
+(55554),
+(55555),
+(55556),
+(55557),
+(55558),
+(55559),
+(55561),
+(55562),
+(55563),
+(55564),
+(55565),
+(55566),
+(55567),
+(55568),
+(55569),
+(55570),
+(55571),
+(55572),
+(55573),
+(55576),
+(55577),
+(55578),
+(55579),
+(55580),
+(55581),
+(55582),
+(55583),
+(55584),
+(55585),
+(55586),
+(55587),
+(55588),
+(55589),
+(55590),
+(55591),
+(55592),
+(55593),
+(55594),
+(55595),
+(55596),
+(55602),
+(55603),
+(55604),
+(55605),
+(55606),
+(55607),
+(55608),
+(55609),
+(55610),
+(55615),
+(55616),
+(55617),
+(55618),
+(55619),
+(55620),
+(55621),
+(55622),
+(55623),
+(55624),
+(55625),
+(55626),
+(55627),
+(55628),
+(55629),
+(55630),
+(55631),
+(55632),
+(55633),
+(55634),
+(55635),
+(55640),
+(55641),
+(55642),
+(55643),
+(55644),
+(55645),
+(55646),
+(55647),
+(55648),
+(55649),
+(55650),
+(55651),
+(55652),
+(55653),
+(55654),
+(55655),
+(55656),
+(55657),
+(55658),
+(55659),
+(55660),
+(55661),
+(55662),
+(55663),
+(55664),
+(55665),
+(55666),
+(55667),
+(55668),
+(55669),
+(55670),
+(55671),
+(55672),
+(55673),
+(55674),
+(55675),
+(55676),
+(55677),
+(55678),
+(55679),
+(55680),
+(55681),
+(55682),
+(55683),
+(55684),
+(55685),
+(55686),
+(55687),
+(55688),
+(55689),
+(55690),
+(55691),
+(55692),
+(55693),
+(55694),
+(55695),
+(55696),
+(55697),
+(55698),
+(55699),
+(55700),
+(55701),
+(55702),
+(55703),
+(55704),
+(55705),
+(55706),
+(55707),
+(55708),
+(55709),
+(55710),
+(55711),
+(55712),
+(55713),
+(55718),
+(55719),
+(55720),
+(55721),
+(55722),
+(55723),
+(55724),
+(55725),
+(55726),
+(55733),
+(55734),
+(55735),
+(55736),
+(55737),
+(55738),
+(55739),
+(55740),
+(55741),
+(55742),
+(55744),
+(55745),
+(55746),
+(55747),
+(55748),
+(55752),
+(55753),
+(55754),
+(55755),
+(55756),
+(55757),
+(55758),
+(55759),
+(55760),
+(55761),
+(55762),
+(55763),
+(55764),
+(55765),
+(55766),
+(55767),
+(55768),
+(55769),
+(55770),
+(55771),
+(55772),
+(55773),
+(55774),
+(55775),
+(55776),
+(55777),
+(55778),
+(55779),
+(55780),
+(55781),
+(55782),
+(55783),
+(55784),
+(55785),
+(55786),
+(55787),
+(55788),
+(55789),
+(55792),
+(55793),
+(55794),
+(55795),
+(55796),
+(55797),
+(55798),
+(55799),
+(55800),
+(55801),
+(55802),
+(55803),
+(55804),
+(55805),
+(55806),
+(55807),
+(55808),
+(55809),
+(55810),
+(55811),
+(55814),
+(55815),
+(55816),
+(55817),
+(55818),
+(55819),
+(55820),
+(55821),
+(55822),
+(55823),
+(55824),
+(55825),
+(55826),
+(55827),
+(55828),
+(55829),
+(55830),
+(55831),
+(55832),
+(55833),
+(55834),
+(55835),
+(55836),
+(55837),
+(55838),
+(55839),
+(55840),
+(55841),
+(55842),
+(55843),
+(55844),
+(55845),
+(55846),
+(55847),
+(55849),
+(55850),
+(55851),
+(55852),
+(55853),
+(55854),
+(55855),
+(55858),
+(55860),
+(55861),
+(55862),
+(55863),
+(55864),
+(55865),
+(55866),
+(55867),
+(55868),
+(55869),
+(55870),
+(55871),
+(55872),
+(55877),
+(55878),
+(55879),
+(55880),
+(55881),
+(55882),
+(55883),
+(55884),
+(55885),
+(55886),
+(55887),
+(55888),
+(55889),
+(55890),
+(55891),
+(55892),
+(55893),
+(55894),
+(55895),
+(55896),
+(55897),
+(55898),
+(55899),
+(55900),
+(55901),
+(55902),
+(55903),
+(55904),
+(55905),
+(55906),
+(55907),
+(55908),
+(55909),
+(55910),
+(55911),
+(55912),
+(55913),
+(55914),
+(55915),
+(55916),
+(55917),
+(55918),
+(55919),
+(55920),
+(55921),
+(55922),
+(55923),
+(55924),
+(55925),
+(55926),
+(55927),
+(55928),
+(55929),
+(55930),
+(55931),
+(55932),
+(55933),
+(55934),
+(55935),
+(55936),
+(55937),
+(55938),
+(55939),
+(55940),
+(55941),
+(55942),
+(55943),
+(55944),
+(55945),
+(55946),
+(55947),
+(55948),
+(55949),
+(55950),
+(55951),
+(55952),
+(55953),
+(55954),
+(55955),
+(55956),
+(55957),
+(55958),
+(55959),
+(55960),
+(55961),
+(55962),
+(55963),
+(55964),
+(55965),
+(55966),
+(55967),
+(55968),
+(55969),
+(55971),
+(55972),
+(55973),
+(55974),
+(55975),
+(55976),
+(55977),
+(55978),
+(55979),
+(55980),
+(55981),
+(55982),
+(55983),
+(55984),
+(55985),
+(55986),
+(55987),
+(55988),
+(55989),
+(55990),
+(55991),
+(55992),
+(55993),
+(55994),
+(55995),
+(55996),
+(55997),
+(55998),
+(55999),
+(56000),
+(56001),
+(56002),
+(56003),
+(56004),
+(56005),
+(56006),
+(56007),
+(56008),
+(56009),
+(56014),
+(56015),
+(56016),
+(56017),
+(56018),
+(56019),
+(56020),
+(56021),
+(56022),
+(56023),
+(56024),
+(56025),
+(56026),
+(56027),
+(56028),
+(56029),
+(56030),
+(56031),
+(56032),
+(56033),
+(56034),
+(56035),
+(56036),
+(56037),
+(56038),
+(56039),
+(56040),
+(56041),
+(56042),
+(56043),
+(56044),
+(56045),
+(56046),
+(56047),
+(56054),
+(56055),
+(56056),
+(56057),
+(56058),
+(56059),
+(56060),
+(56061),
+(56062),
+(56063),
+(56064),
+(56065),
+(56066),
+(56067),
+(56068),
+(56069),
+(56070),
+(56071),
+(56072),
+(56073),
+(56074),
+(56075),
+(56076),
+(56077),
+(56078),
+(56079),
+(56080),
+(56081),
+(56082),
+(56083),
+(56084),
+(56085),
+(56086),
+(56087),
+(56088),
+(56089),
+(56090),
+(56091),
+(56092),
+(56093),
+(56094),
+(56095),
+(56096),
+(56097),
+(56098),
+(56099),
+(56100),
+(56105),
+(56106),
+(56107),
+(56108),
+(56109),
+(56110),
+(56111),
+(56112),
+(56113),
+(56114),
+(56115),
+(56116),
+(56117),
+(56118),
+(56119),
+(56120),
+(56121),
+(56122),
+(56123),
+(56124),
+(56125),
+(56126),
+(56127),
+(56128),
+(56129),
+(56130),
+(56131),
+(56132),
+(56133),
+(56134),
+(56135),
+(56136),
+(56137),
+(56138),
+(56139),
+(56140),
+(56141),
+(56142),
+(56143),
+(56144),
+(56145),
+(56146),
+(56147),
+(56148),
+(56149),
+(56150),
+(56151),
+(56152),
+(56153),
+(56154),
+(56155),
+(56156),
+(56157),
+(56158),
+(56159),
+(56160),
+(56161),
+(56162),
+(56163),
+(56164),
+(56165),
+(56166),
+(56167),
+(56168),
+(56173),
+(56174),
+(56175),
+(56176),
+(56177),
+(56178),
+(56179),
+(56180),
+(56181),
+(56182),
+(56183),
+(56184),
+(56185),
+(56186),
+(56187),
+(56188),
+(56189),
+(56190),
+(56191),
+(56192),
+(56193),
+(56194),
+(56195),
+(56196),
+(56197),
+(56198),
+(56199),
+(56200),
+(56201),
+(56202),
+(56203),
+(56204),
+(56205),
+(56206),
+(56207),
+(56208),
+(56209),
+(56210),
+(56211),
+(56212),
+(56213),
+(56214),
+(56215),
+(56216),
+(56217),
+(56218),
+(56219),
+(56220),
+(56221),
+(56222),
+(56223),
+(56224),
+(56225),
+(56226),
+(56227),
+(56228),
+(56229),
+(56230),
+(56231),
+(56232),
+(56233),
+(56235),
+(56236),
+(56237),
+(56238),
+(56239),
+(56240),
+(56241),
+(56242),
+(56243),
+(56244),
+(56245),
+(56246),
+(56247),
+(56248),
+(56249),
+(56250),
+(56251),
+(56252),
+(56253),
+(56254),
+(56255),
+(56257),
+(56258),
+(56259),
+(56260),
+(56261),
+(56262),
+(56263),
+(56264),
+(56265),
+(56266),
+(56267),
+(56268),
+(56269),
+(56270),
+(56271),
+(56272),
+(56273),
+(56274),
+(56275),
+(56276),
+(56277),
+(56278),
+(56279),
+(56280),
+(56281),
+(56282),
+(56283),
+(56284),
+(56285),
+(56287),
+(56288),
+(56289),
+(56290),
+(56291),
+(56292),
+(56293),
+(56294),
+(56295),
+(56296),
+(56297),
+(56298),
+(56299),
+(56300),
+(56301),
+(56302),
+(56303),
+(56304),
+(56305),
+(56306),
+(56307),
+(56308),
+(56309),
+(56310),
+(56311),
+(56312),
+(56313),
+(56314),
+(56315),
+(56316),
+(56317),
+(56318),
+(56319),
+(56320),
+(56321),
+(56322),
+(56323),
+(56324),
+(56325),
+(56326),
+(56327),
+(56328),
+(56329),
+(56330),
+(56332),
+(56333),
+(56334),
+(56335),
+(56336),
+(56337),
+(56338),
+(56339),
+(56340),
+(56341),
+(56342),
+(56343),
+(56344),
+(56345),
+(56346),
+(56347),
+(56348),
+(56349),
+(56350),
+(56351),
+(56352),
+(56353),
+(56354),
+(56355),
+(56356),
+(56357),
+(56358),
+(56359),
+(56360),
+(56361),
+(56362),
+(56363),
+(56364),
+(56365),
+(56366),
+(56367),
+(56368),
+(56369),
+(56370),
+(56371),
+(56372),
+(56373),
+(56374),
+(56375),
+(56376),
+(56381),
+(56382),
+(56383),
+(56384),
+(56385),
+(56386),
+(56387),
+(56388),
+(56389),
+(56390),
+(56391),
+(56392),
+(56393),
+(56394),
+(56395),
+(56396),
+(56397),
+(56398),
+(56399),
+(56400),
+(56401),
+(56402),
+(56403),
+(56404),
+(56405),
+(56406),
+(56407),
+(56408),
+(56409),
+(56410),
+(56411),
+(56412),
+(56413),
+(56414),
+(56415),
+(56416),
+(56417),
+(56418),
+(56419),
+(56421),
+(56422),
+(56423),
+(56424),
+(56425),
+(56426),
+(56427),
+(56428),
+(56429),
+(56430),
+(56431),
+(56432),
+(56433),
+(56434),
+(56435),
+(56436),
+(56437),
+(56438),
+(56439),
+(56440),
+(56441),
+(56442),
+(56443),
+(56444),
+(56445),
+(56446),
+(56447),
+(56448),
+(56450),
+(56451),
+(56452),
+(56453),
+(56454),
+(56455),
+(56456),
+(56457),
+(56458),
+(56459),
+(56460),
+(56461),
+(56462),
+(56463),
+(56464),
+(56465),
+(56466),
+(56467),
+(56468),
+(56469),
+(56470),
+(56471),
+(56472),
+(56473),
+(56474),
+(56475),
+(56476),
+(56477),
+(56478),
+(56479),
+(56480),
+(56481),
+(56482),
+(56483),
+(56484),
+(56485),
+(56486),
+(56487),
+(56488),
+(56489),
+(56490),
+(56491),
+(56495),
+(56496),
+(56497),
+(56498),
+(56499),
+(56500),
+(56501),
+(56502),
+(56503),
+(56504),
+(56505),
+(56506),
+(56507),
+(56508),
+(56509),
+(56510),
+(56511),
+(56512),
+(56513),
+(56514),
+(56515),
+(56516),
+(56517),
+(56518),
+(56519),
+(56520),
+(56521),
+(56522),
+(56523),
+(56524),
+(56525),
+(56526),
+(56527),
+(56528),
+(56529),
+(56530),
+(56531),
+(56532),
+(56533),
+(56534),
+(56535),
+(56536),
+(56537),
+(56538),
+(56539),
+(56540),
+(56541),
+(56542),
+(56543),
+(56544),
+(56545),
+(56546),
+(56547),
+(56548),
+(56549),
+(56553),
+(56554),
+(56555),
+(56556),
+(56557),
+(56559),
+(56560),
+(56561),
+(56562),
+(56563),
+(56564),
+(56565),
+(56566),
+(56567),
+(56568),
+(56569),
+(56570),
+(56571),
+(56572),
+(56573),
+(56574),
+(56575),
+(56576),
+(56577),
+(56578),
+(56579),
+(56580),
+(56581),
+(56582),
+(56583),
+(56584),
+(56585),
+(56586),
+(56587),
+(56588),
+(56589),
+(56590),
+(56591),
+(56592),
+(56593),
+(56594),
+(56595),
+(56596),
+(56597),
+(56598),
+(56599),
+(56600),
+(56601),
+(56602),
+(56603),
+(56604),
+(56605),
+(56606),
+(56607),
+(56608),
+(56609),
+(56610),
+(56611),
+(56612),
+(56613),
+(56614),
+(56615),
+(56616),
+(56617),
+(56618),
+(56619),
+(56620),
+(56621),
+(56622),
+(56623),
+(56624),
+(56625),
+(56626),
+(56627),
+(56628),
+(56629),
+(56630),
+(56631),
+(56632),
+(56633),
+(56634),
+(56635),
+(56636),
+(56637),
+(56638),
+(56639),
+(56640),
+(56641),
+(56642),
+(56643),
+(56644),
+(56645),
+(56646),
+(56647),
+(56648),
+(56649),
+(56650),
+(56651),
+(56652),
+(56653),
+(56654),
+(56655),
+(56656),
+(56657),
+(56658),
+(56659),
+(56660),
+(56661),
+(56662),
+(56663),
+(56664),
+(56665),
+(56666),
+(56667),
+(56668),
+(56669),
+(56674),
+(56675),
+(56676),
+(56677),
+(56678),
+(56679),
+(56680),
+(56681),
+(56682),
+(56683),
+(56684),
+(56685),
+(56686),
+(56687),
+(56688),
+(56689),
+(56690),
+(56691),
+(56692),
+(56693),
+(56694),
+(56695),
+(56696),
+(56697),
+(56698),
+(56703),
+(56704),
+(56705),
+(56706),
+(56707),
+(56708),
+(56709),
+(56710),
+(56711),
+(56712),
+(56713),
+(56714),
+(56715),
+(56716),
+(56717),
+(56718),
+(56719),
+(56720),
+(56721),
+(56722),
+(56723),
+(56724),
+(56725),
+(56727),
+(56728),
+(56729),
+(56730),
+(56731),
+(56732),
+(56733),
+(56734),
+(56735),
+(56736),
+(56737),
+(56738),
+(56739),
+(56740),
+(56741),
+(56742),
+(56743),
+(56744),
+(56745),
+(56746),
+(56747),
+(56748),
+(56749),
+(56750),
+(56751),
+(56752),
+(56753),
+(56754),
+(56755),
+(56756),
+(56757),
+(56758),
+(56759),
+(56764),
+(56765),
+(56766),
+(56767),
+(56768),
+(56769),
+(56770),
+(56771),
+(56772),
+(56773),
+(56774),
+(56775),
+(56776),
+(56777),
+(56778),
+(56779),
+(56780),
+(56781),
+(56782),
+(56783),
+(56784),
+(56785),
+(56786),
+(56787),
+(56788),
+(56789),
+(56790),
+(56791),
+(56792),
+(56793),
+(56794),
+(56795),
+(56796),
+(56797),
+(56798),
+(56799),
+(56800),
+(56801),
+(56802),
+(56803),
+(56804),
+(56805),
+(56806),
+(56807),
+(56808),
+(56809),
+(56810),
+(56811),
+(56812),
+(56813),
+(56814),
+(56815),
+(56816),
+(56817),
+(56818),
+(56819),
+(56820),
+(56821),
+(56822),
+(56823),
+(56824),
+(56825),
+(56826),
+(56827),
+(56828),
+(56829),
+(56830),
+(56831),
+(56832),
+(56833),
+(56834),
+(56835),
+(56836),
+(56837),
+(56838),
+(56839),
+(56840),
+(56841),
+(56842),
+(56843),
+(56845),
+(56846),
+(56847),
+(56848),
+(56849),
+(56850),
+(56851),
+(56852),
+(56853),
+(56854),
+(56855),
+(56856),
+(56857),
+(56858),
+(56859),
+(56860),
+(56861),
+(56862),
+(56863),
+(56864),
+(56865),
+(56868),
+(56869),
+(56870),
+(56871),
+(56872),
+(56873),
+(56874),
+(56875),
+(56877),
+(56878),
+(56879),
+(56880),
+(56881),
+(56882),
+(56883),
+(56884),
+(56885),
+(56886),
+(56887),
+(56888),
+(56889),
+(56890),
+(56891),
+(56892),
+(56893),
+(56894),
+(56895),
+(56896),
+(56897),
+(56898),
+(56899),
+(56900),
+(56901),
+(56902),
+(56903),
+(56904),
+(56905),
+(56906),
+(56907),
+(56908),
+(56909),
+(56910),
+(56911),
+(56912),
+(56913),
+(56914),
+(56915),
+(56916),
+(56917),
+(56918),
+(56919),
+(56920),
+(56921),
+(56922),
+(56923),
+(56924),
+(56925),
+(56926),
+(56927),
+(56928),
+(56929),
+(56930),
+(56931),
+(56932),
+(56933),
+(56934),
+(56935),
+(56936),
+(56937),
+(56938),
+(56939),
+(56940),
+(56941),
+(56942),
+(56943),
+(56944),
+(56945),
+(56946),
+(56947),
+(56948),
+(56949),
+(56950),
+(56951),
+(56952),
+(56953),
+(56954),
+(56955),
+(56956),
+(56957),
+(56958),
+(56959),
+(56960),
+(56961),
+(56962),
+(56963),
+(56964),
+(56965),
+(56966),
+(56967),
+(56968),
+(56969),
+(56970),
+(56971),
+(56972),
+(56973),
+(56974),
+(56975),
+(56976),
+(56977),
+(56978),
+(56979),
+(56980),
+(56981),
+(56982),
+(56983),
+(56984),
+(56985),
+(56986),
+(56987),
+(56988),
+(56989),
+(56990),
+(56991),
+(56992),
+(56993),
+(56994),
+(56995),
+(56996),
+(56997),
+(56998),
+(56999),
+(57000),
+(57001),
+(57002),
+(57003),
+(57004),
+(57005),
+(57006),
+(57007),
+(57008),
+(57009),
+(57010),
+(57011),
+(57012),
+(57013),
+(57014),
+(57015),
+(57016),
+(57017),
+(57018),
+(57019),
+(57020),
+(57021),
+(57022),
+(57023),
+(57024),
+(57025),
+(57027),
+(57028),
+(57029),
+(57030),
+(57031),
+(57032),
+(57033),
+(57034),
+(57035),
+(57036),
+(57037),
+(57039),
+(57040),
+(57041),
+(57042),
+(57043),
+(57044),
+(57045),
+(57046),
+(57047),
+(57048),
+(57049),
+(57050),
+(57051),
+(57052),
+(57053),
+(57054),
+(57055),
+(57056),
+(57057),
+(57058),
+(57059),
+(57060),
+(57061),
+(57062),
+(57063),
+(57064),
+(57065),
+(57066),
+(57067),
+(57068),
+(57069),
+(57070),
+(57071),
+(57072),
+(57073),
+(57074),
+(57075),
+(57076),
+(57077),
+(57078),
+(57079),
+(57080),
+(57081),
+(57082),
+(57083),
+(57084),
+(57086),
+(57087),
+(57088),
+(57089),
+(57090),
+(57091),
+(57092),
+(57093),
+(57094),
+(57095),
+(57096),
+(57097),
+(57098),
+(57099),
+(57100),
+(57101),
+(57102),
+(57103),
+(57104),
+(57105),
+(57106),
+(57107),
+(57108),
+(57109),
+(57110),
+(57111),
+(57112),
+(57113),
+(57114),
+(57115),
+(57116),
+(57117),
+(57118),
+(57119),
+(57120),
+(57121),
+(57126),
+(57127),
+(57128),
+(57129),
+(57130),
+(57131),
+(57132),
+(57133),
+(57134),
+(57135),
+(57136),
+(57137),
+(57138),
+(57139),
+(57140),
+(57141),
+(57142),
+(57143),
+(57145),
+(57146),
+(57147),
+(57148),
+(57149),
+(57150),
+(57151),
+(57152),
+(57153),
+(57154),
+(57155),
+(57156),
+(57157),
+(57158),
+(57159),
+(57160),
+(57161),
+(57162),
+(57163),
+(57164),
+(57165),
+(57166),
+(57167),
+(57168),
+(57169),
+(57170),
+(57171),
+(57172),
+(57173),
+(57174),
+(57175),
+(57176),
+(57177),
+(57178),
+(57179),
+(57180),
+(57181),
+(57182),
+(57183),
+(57184),
+(57185),
+(57186),
+(57187),
+(57188),
+(57189),
+(57190),
+(57191),
+(57192),
+(57193),
+(57194),
+(57195),
+(57196),
+(57197),
+(57198),
+(57199),
+(57200),
+(57201),
+(57202),
+(57203),
+(57204),
+(57205),
+(57206),
+(57207),
+(57208),
+(57209),
+(57210),
+(57211),
+(57212),
+(57213),
+(57214),
+(57216),
+(57217),
+(57218),
+(57219),
+(57220),
+(57221),
+(57222),
+(57223),
+(57224),
+(57225),
+(57226),
+(57227),
+(57228),
+(57229),
+(57230),
+(57231),
+(57232),
+(57233),
+(57234),
+(57235),
+(57236),
+(57237),
+(57238),
+(57239),
+(57240),
+(57241),
+(57242),
+(57243),
+(57244),
+(57245),
+(57246),
+(57247),
+(57248),
+(57249),
+(57250),
+(57251),
+(57252),
+(57253),
+(57254),
+(57255),
+(57256),
+(57257),
+(57258),
+(57259),
+(57260),
+(57261),
+(57262),
+(57263),
+(57264),
+(57265),
+(57266),
+(57267),
+(57268),
+(57269),
+(57270),
+(57271),
+(57272),
+(57273),
+(57274),
+(57275),
+(57276),
+(57277),
+(57278),
+(57279),
+(57280),
+(57281),
+(57282),
+(57283),
+(57284),
+(57285),
+(57286),
+(57287),
+(57288),
+(57289),
+(57290),
+(57291),
+(57292),
+(57293),
+(57294),
+(57295),
+(57296),
+(57297),
+(57298),
+(57299),
+(57300),
+(57301),
+(57302),
+(57303),
+(57304),
+(57305),
+(57306),
+(57307),
+(57308),
+(57309),
+(57310),
+(57311),
+(57312),
+(57313),
+(57314),
+(57315),
+(57316),
+(57317),
+(57318),
+(57319),
+(57320),
+(57321),
+(57322),
+(57323),
+(57324),
+(57325),
+(57326),
+(57327),
+(57328),
+(57329),
+(57330),
+(57331),
+(57332),
+(57333),
+(57334),
+(57335),
+(57336),
+(57337),
+(57338),
+(57339),
+(57340),
+(57341),
+(57342),
+(57343),
+(57344),
+(57345),
+(57346),
+(57347),
+(57348),
+(57349),
+(57351),
+(57352),
+(57353),
+(57354),
+(57355),
+(57356),
+(57357),
+(57358),
+(57359),
+(57360),
+(57361),
+(57362),
+(57363),
+(57364),
+(57365),
+(57366),
+(57367),
+(57368),
+(57369),
+(57370),
+(57371),
+(57372),
+(57373),
+(57374),
+(57375),
+(57376),
+(57377),
+(57378),
+(57379),
+(57380),
+(57381),
+(57382),
+(57383),
+(57384),
+(57385),
+(57386),
+(57387),
+(57388),
+(57389),
+(57390),
+(57391),
+(57392),
+(57393),
+(57394),
+(57395),
+(57396),
+(57397),
+(57398),
+(57399),
+(57400),
+(57401),
+(57402),
+(57403),
+(57404),
+(57405),
+(57406),
+(57407),
+(57408),
+(57409),
+(57410),
+(57411),
+(57412),
+(57413),
+(57414),
+(57415),
+(57417),
+(57418),
+(57419),
+(57420),
+(57421),
+(57422),
+(57423),
+(57424),
+(57425),
+(57426),
+(57427),
+(57428),
+(57429),
+(57430),
+(57431),
+(57432),
+(57433),
+(57434),
+(57435),
+(57436),
+(57437),
+(57438),
+(57439),
+(57440),
+(57441),
+(57442),
+(57443),
+(57444),
+(57445),
+(57446),
+(57447),
+(57448),
+(57449),
+(57450),
+(57451),
+(57452),
+(57453),
+(57454),
+(57455),
+(57456),
+(57457),
+(57458),
+(57459),
+(57460),
+(57461),
+(57462),
+(57463),
+(57464),
+(57465),
+(57466),
+(57467),
+(57468),
+(57469),
+(57470),
+(57471),
+(57472),
+(57473),
+(57474),
+(57475),
+(57476),
+(57477),
+(57478),
+(57479),
+(57480),
+(57481),
+(57482),
+(57483),
+(57484),
+(57485),
+(57486),
+(57487),
+(57488),
+(57489),
+(57490),
+(57491),
+(57492),
+(57493),
+(57494),
+(57495),
+(57496),
+(57497),
+(57498),
+(57499),
+(57500),
+(57501),
+(57502),
+(57503),
+(57504),
+(57505),
+(57506),
+(57507),
+(57508),
+(57509),
+(57510),
+(57511),
+(57512),
+(57513),
+(57514),
+(57515),
+(57516),
+(57517),
+(57518),
+(57519),
+(57520),
+(57521),
+(57522),
+(57524),
+(57525),
+(57526),
+(57527),
+(57528),
+(57529),
+(57530),
+(57531),
+(57532),
+(57533),
+(57534),
+(57535),
+(57536),
+(57537),
+(57538),
+(57539),
+(57540),
+(57541),
+(57542),
+(57543),
+(57544),
+(57545),
+(57546),
+(57547),
+(57548),
+(57549),
+(57550),
+(57551),
+(57552),
+(57553),
+(57554),
+(57555),
+(57556),
+(57557),
+(57558),
+(57559),
+(57560),
+(57561),
+(57562),
+(57563),
+(57564),
+(57565),
+(57566),
+(57567),
+(57568),
+(57569),
+(57570),
+(57571),
+(57572),
+(57573),
+(57574),
+(57575),
+(57576),
+(57577),
+(57578),
+(57579),
+(57580),
+(57581),
+(57582),
+(57583),
+(57584),
+(57585),
+(57586),
+(57587),
+(57588),
+(57589),
+(57590),
+(57591),
+(57592),
+(57593),
+(57594),
+(57595),
+(57596),
+(57597),
+(57598),
+(57599),
+(57600),
+(57601),
+(57602),
+(57603),
+(57604),
+(57605),
+(57606),
+(57607),
+(57608),
+(57609),
+(57610),
+(57611),
+(57612),
+(57613),
+(57614),
+(57615),
+(57616),
+(57617),
+(57618),
+(57619),
+(57620),
+(57621),
+(57622),
+(57623),
+(57624),
+(57625),
+(57626),
+(57627),
+(57628),
+(57629),
+(57630),
+(57631),
+(57632),
+(57633),
+(57634),
+(57635),
+(57636),
+(57637),
+(57638),
+(57639),
+(57640),
+(57641),
+(57642),
+(57643),
+(57644),
+(57645),
+(57646),
+(57647),
+(57648),
+(57649),
+(57650),
+(57651),
+(57652),
+(57653),
+(57654),
+(57655),
+(57656),
+(57657),
+(57658),
+(57659),
+(57660),
+(57661),
+(57662),
+(57663),
+(57664),
+(57665),
+(57666),
+(57667),
+(57668),
+(57669),
+(57670),
+(57671),
+(57672),
+(57673),
+(57674),
+(57675),
+(57676),
+(57677),
+(57678),
+(57679),
+(57680),
+(57681),
+(57682),
+(57683),
+(57684),
+(57685),
+(57686),
+(57687),
+(57688),
+(57689),
+(57690),
+(57691),
+(57692),
+(57693),
+(57694),
+(57695),
+(57696),
+(57698),
+(57699),
+(57700),
+(57701),
+(57702),
+(57703),
+(57704),
+(57705),
+(57706),
+(57707),
+(57708),
+(57709),
+(57710),
+(57711),
+(57712),
+(57713),
+(57714),
+(57715),
+(57716),
+(57717),
+(57718),
+(57719),
+(57720),
+(57721),
+(57722),
+(57723),
+(57724),
+(57725),
+(57726),
+(57727),
+(57728),
+(57729),
+(57730),
+(57732),
+(57733),
+(57734),
+(57735),
+(57736),
+(57737),
+(57738),
+(57739),
+(57740),
+(57741),
+(57742),
+(57743),
+(57744),
+(57745),
+(57746),
+(57747),
+(57748),
+(57749),
+(57750),
+(57751),
+(57752),
+(57753),
+(57754),
+(57755),
+(57756),
+(57757),
+(57758),
+(57759),
+(57760),
+(57761),
+(57762),
+(57763),
+(57764),
+(57765),
+(57766),
+(57767),
+(57768),
+(57769),
+(57770),
+(57771),
+(57772),
+(57773),
+(57774),
+(57775),
+(57776),
+(57778),
+(57779),
+(57780),
+(57781),
+(57782),
+(57783),
+(57784),
+(57785),
+(57786),
+(57787),
+(57788),
+(57789),
+(57790),
+(57791),
+(57792),
+(57793),
+(57794),
+(57795),
+(57796),
+(57797),
+(57798),
+(57799),
+(57800),
+(57801),
+(57802),
+(57803),
+(57804),
+(57805),
+(57806),
+(57807),
+(57808),
+(57809),
+(57810),
+(57811),
+(57812),
+(57813),
+(57814),
+(57815),
+(57816),
+(57819),
+(57820),
+(57821),
+(57822),
+(57823),
+(57824),
+(57825),
+(57826),
+(57827),
+(57828),
+(57829),
+(57830),
+(57831),
+(57832),
+(57833),
+(57834),
+(57835),
+(57836),
+(57837),
+(57838),
+(57839),
+(57840),
+(57841),
+(57842),
+(57843),
+(57844),
+(57845),
+(57846),
+(57847),
+(57848),
+(57849),
+(57850),
+(57851),
+(57852),
+(57853),
+(57854),
+(57855),
+(57856),
+(57857),
+(57858),
+(57859),
+(57860),
+(57861),
+(57862),
+(57863),
+(57864),
+(57865),
+(57866),
+(57867),
+(57868),
+(57869),
+(57870),
+(57871),
+(57872),
+(57873),
+(57874),
+(57875),
+(57876),
+(57877),
+(57878),
+(57879),
+(57880),
+(57881),
+(57882),
+(57883),
+(57884),
+(57885),
+(57886),
+(57887),
+(57888),
+(57889),
+(57890),
+(57891),
+(57892),
+(57894),
+(57895),
+(57896),
+(57897),
+(57898),
+(57899),
+(57900),
+(57901),
+(57902),
+(57903),
+(57904),
+(57905),
+(57906),
+(57907),
+(57908),
+(57909),
+(57910),
+(57911),
+(57912),
+(57913),
+(57914),
+(57915),
+(57916),
+(57917),
+(57918),
+(57919),
+(57920),
+(57921),
+(57922),
+(57923),
+(57924),
+(57925),
+(57926),
+(57927),
+(57928),
+(57929),
+(57930),
+(57931),
+(57932),
+(57933),
+(57934),
+(57935),
+(57936),
+(57937),
+(57938),
+(57939),
+(57940),
+(57941),
+(57943),
+(57944),
+(57945),
+(57947),
+(57948),
+(57949),
+(57950),
+(57951),
+(57952),
+(57953),
+(57954),
+(57955),
+(57956),
+(57957),
+(57958),
+(57959),
+(57960),
+(57961),
+(57962),
+(57963),
+(57964),
+(57965),
+(57966),
+(57967),
+(57968),
+(57969),
+(57970),
+(57971),
+(57972),
+(57973),
+(57974),
+(57975),
+(57976),
+(57977),
+(57978),
+(57979),
+(57980),
+(57981),
+(57982),
+(57983),
+(57984),
+(57985),
+(57986),
+(57987),
+(57988),
+(57989),
+(57990),
+(57991),
+(57992),
+(57993),
+(57994),
+(57995),
+(57996),
+(57997),
+(57998),
+(57999),
+(58000),
+(58001),
+(58002),
+(58003),
+(58004),
+(58005),
+(58006),
+(58007),
+(58008),
+(58009),
+(58010),
+(58011),
+(58012),
+(58013),
+(58014),
+(58015),
+(58016),
+(58017),
+(58018),
+(58019),
+(58020),
+(58021),
+(58022),
+(58023),
+(58025),
+(58026),
+(58031),
+(58032),
+(58033),
+(58034),
+(58035),
+(58036),
+(58037),
+(58038),
+(58039),
+(58040),
+(58041),
+(58042),
+(58043),
+(58044),
+(58045),
+(58046),
+(58047),
+(58048),
+(58049),
+(58050),
+(58051),
+(58052),
+(58053),
+(58054),
+(58055),
+(58056),
+(58057),
+(58058),
+(58059),
+(58060),
+(58061),
+(58062),
+(58063),
+(58064),
+(58065),
+(58066),
+(58067),
+(58068),
+(58069),
+(58070),
+(58071),
+(58072),
+(58073),
+(58074),
+(58075),
+(58076),
+(58077),
+(58078),
+(58079),
+(58080),
+(58081),
+(58082),
+(58083),
+(58084),
+(58085),
+(58086),
+(58087),
+(58088),
+(58089),
+(58090),
+(58091),
+(58092),
+(58093),
+(58094),
+(58095),
+(58096),
+(58097),
+(58098),
+(58099),
+(58100),
+(58101),
+(58102),
+(58103),
+(58104),
+(58105),
+(58106),
+(58107),
+(58108),
+(58109),
+(58110),
+(58111),
+(58112),
+(58113),
+(58114),
+(58115),
+(58116),
+(58117),
+(58118),
+(58119),
+(58120),
+(58121),
+(58122),
+(58123),
+(58124),
+(58125),
+(58126),
+(58127),
+(58128),
+(58129),
+(58130),
+(58131),
+(58132),
+(58133),
+(58134),
+(58135),
+(58136),
+(58137),
+(58138),
+(58139),
+(58140),
+(58141),
+(58142),
+(58143),
+(58144),
+(58145),
+(58146),
+(58147),
+(58148),
+(58149),
+(58150),
+(58155),
+(58156),
+(58157),
+(58158),
+(58159),
+(58160),
+(58161),
+(58162),
+(58163),
+(58164),
+(58165),
+(58166),
+(58167),
+(58168),
+(58169),
+(58170),
+(58171),
+(58172),
+(58173),
+(58174),
+(58175),
+(58176),
+(58177),
+(58178),
+(58179),
+(58180),
+(58181),
+(58182),
+(58183),
+(58184),
+(58185),
+(58186),
+(58187),
+(58188),
+(58189),
+(58190),
+(58191),
+(58192),
+(58193),
+(58194),
+(58195),
+(58196),
+(58197),
+(58198),
+(58199),
+(58200),
+(58201),
+(58202),
+(58203),
+(58204),
+(58205),
+(58206),
+(58207),
+(58208),
+(58209),
+(58210),
+(58211),
+(58212),
+(58213),
+(58214),
+(58215),
+(58216),
+(58217),
+(58218),
+(58219),
+(58220),
+(58221),
+(58222),
+(58223),
+(58224),
+(58225),
+(58226),
+(58227),
+(58228),
+(58229),
+(58230),
+(58231),
+(58232),
+(58233),
+(58234),
+(58235),
+(58236),
+(58237),
+(58238),
+(58239),
+(58240),
+(58241),
+(58242),
+(58243),
+(58244),
+(58245),
+(58246),
+(58247),
+(58248),
+(58249),
+(58250),
+(58251),
+(58252),
+(58253),
+(58254),
+(58255),
+(58256),
+(58257),
+(58258),
+(58259),
+(58260),
+(58261),
+(58262),
+(58263),
+(58264),
+(58265),
+(58266),
+(58267),
+(58268),
+(58269),
+(58270),
+(58271),
+(58272),
+(58273),
+(58274),
+(58275),
+(58276),
+(58277),
+(58278),
+(58279),
+(58280),
+(58281),
+(58282),
+(58283),
+(58284),
+(58285),
+(58286),
+(58287),
+(58288),
+(58289),
+(58290),
+(58291),
+(58292),
+(58293),
+(58294),
+(58295),
+(58296),
+(58297),
+(58298),
+(58299),
+(58300),
+(58301),
+(58302),
+(58303),
+(58304),
+(58305),
+(58306),
+(58307),
+(58308),
+(58309),
+(58310),
+(58314),
+(58317),
+(58318),
+(58319),
+(58320),
+(58321),
+(58322),
+(58323),
+(58324),
+(58325),
+(58326),
+(58327),
+(58328),
+(58329),
+(58330),
+(58331),
+(58332),
+(58333),
+(58334),
+(58335),
+(58336),
+(58337),
+(58338),
+(58339),
+(58340),
+(58341),
+(58342),
+(58343),
+(58344),
+(58345),
+(58346),
+(58347),
+(58348),
+(58349),
+(58350),
+(58351),
+(58352),
+(58353),
+(58354),
+(58355),
+(58356),
+(58357),
+(58358),
+(58359),
+(58360),
+(58361),
+(58362),
+(58363),
+(58364),
+(58365),
+(58366),
+(58367),
+(58368),
+(58369),
+(58370),
+(58371),
+(58372),
+(58373),
+(58374),
+(58375),
+(58376),
+(58377),
+(58378),
+(58379),
+(58380),
+(58381),
+(58382),
+(58383),
+(58384),
+(58385),
+(58386),
+(58387),
+(58388),
+(58389),
+(58390),
+(58391),
+(58392),
+(58393),
+(58394),
+(58395),
+(58396),
+(58398),
+(58399),
+(58400),
+(58401),
+(58402),
+(58403),
+(58404),
+(58405),
+(58406),
+(58407),
+(58408),
+(58409),
+(58410),
+(58411),
+(58412),
+(58413),
+(58414),
+(58415),
+(58416),
+(58417),
+(58418),
+(58419),
+(58420),
+(58421),
+(58422),
+(58423),
+(58424),
+(58425),
+(58426),
+(58427),
+(58428),
+(58429),
+(58430),
+(58431),
+(58432),
+(58433),
+(58434),
+(58435),
+(58436),
+(58437),
+(58438),
+(58439),
+(58440),
+(58441),
+(58442),
+(58443),
+(58444),
+(58445),
+(58446),
+(58447),
+(58448),
+(58449),
+(58450),
+(58451),
+(58452),
+(58453),
+(58454),
+(58455),
+(58456),
+(58457),
+(58458),
+(58459),
+(58460),
+(58461),
+(58462),
+(58463),
+(58464),
+(58465),
+(58466),
+(58467),
+(58468),
+(58469),
+(58470),
+(58471),
+(58472),
+(58473),
+(58474),
+(58475),
+(58476),
+(58477),
+(58478),
+(58479),
+(58480),
+(58481),
+(58482),
+(58483),
+(58484),
+(58485),
+(58486),
+(58487),
+(58488),
+(58489),
+(58490),
+(58491),
+(58492),
+(58493),
+(58494),
+(58495),
+(58496),
+(58497),
+(58498),
+(58499),
+(58500),
+(58501),
+(58502),
+(58503),
+(58504),
+(58505),
+(58506),
+(58507),
+(58508),
+(58509),
+(58510),
+(58511),
+(58512),
+(58513),
+(58514),
+(58515),
+(58516),
+(58517),
+(58518),
+(58519),
+(58520),
+(58521),
+(58522),
+(58523),
+(58524),
+(58525),
+(58526),
+(58527),
+(58528),
+(58529),
+(58530),
+(58531),
+(58532),
+(58533),
+(58534),
+(58535),
+(58536),
+(58537),
+(58538),
+(58539),
+(58540),
+(58541),
+(58542),
+(58543),
+(58544),
+(58545),
+(58547),
+(58548),
+(58549),
+(58550),
+(58552),
+(58553),
+(58554),
+(58555),
+(58557),
+(58558),
+(58559),
+(58560),
+(58561),
+(58562),
+(58563),
+(58564),
+(58565),
+(58566),
+(58567),
+(58568),
+(58569),
+(58570),
+(58571),
+(58572),
+(58573),
+(58574),
+(58575),
+(58576),
+(58577),
+(58578),
+(58579),
+(58580),
+(58581),
+(58582),
+(58583),
+(58584),
+(58585),
+(58586),
+(58587),
+(58588),
+(58589),
+(58590),
+(58591),
+(58592),
+(58593),
+(58594),
+(58595),
+(58596),
+(58597),
+(58598),
+(58599),
+(58600),
+(58601),
+(58602),
+(58603),
+(58604),
+(58605),
+(58606),
+(58607),
+(58608),
+(58609),
+(58610),
+(58611),
+(58612),
+(58613),
+(58614),
+(58615),
+(58616),
+(58617),
+(58618),
+(58619),
+(58620),
+(58621),
+(58622),
+(58623),
+(58624),
+(58625),
+(58626),
+(58627),
+(58628),
+(58629),
+(58630),
+(58631),
+(58632),
+(58637),
+(58638),
+(58639),
+(58640),
+(58641),
+(58642),
+(58644),
+(58645),
+(58646),
+(58647),
+(58648),
+(58649),
+(58650),
+(58651),
+(58652),
+(58653),
+(58654),
+(58655),
+(58656),
+(58657),
+(58658),
+(58659),
+(58661),
+(58662),
+(58663),
+(58664),
+(58665),
+(58666),
+(58667),
+(58668),
+(58669),
+(58670),
+(58671),
+(58672),
+(58673),
+(58674),
+(58675),
+(58676),
+(58677),
+(58678),
+(58679),
+(58680),
+(58681),
+(58682),
+(58683),
+(58684),
+(58685),
+(58686),
+(58687),
+(58688),
+(58689),
+(58690),
+(58691),
+(58692),
+(58693),
+(58694),
+(58695),
+(58696),
+(58697),
+(58698),
+(58699),
+(58700),
+(58701),
+(58702),
+(58703),
+(58704),
+(58705),
+(58706),
+(58707),
+(58708),
+(58709),
+(58710),
+(58711),
+(58712),
+(58713),
+(58714),
+(58715),
+(58716),
+(58717),
+(58718),
+(58719),
+(58720),
+(58721),
+(58722),
+(58723),
+(58724),
+(58725),
+(58726),
+(58727),
+(58728),
+(58729),
+(58730),
+(58731),
+(58732),
+(58733),
+(58734),
+(58735),
+(58736),
+(58737),
+(58738),
+(58739),
+(58740),
+(58741),
+(58742),
+(58743),
+(58744),
+(58745),
+(58746),
+(58747),
+(58748),
+(58749),
+(58750),
+(58751),
+(58752),
+(58753),
+(58754),
+(58755),
+(58756),
+(58757),
+(58758),
+(58759),
+(58760),
+(58761),
+(58762),
+(58763),
+(58764),
+(58765),
+(58766),
+(58767),
+(58768),
+(58769),
+(58770),
+(58771),
+(58772),
+(58773),
+(58774),
+(58775),
+(58776),
+(58777),
+(58778),
+(58779),
+(58780),
+(58781),
+(58782),
+(58783),
+(58784),
+(58785),
+(58786),
+(58787),
+(58788),
+(58789),
+(58790),
+(58791),
+(58792),
+(58793),
+(58794),
+(58795),
+(58796),
+(58799),
+(58800),
+(58801),
+(58802),
+(58803),
+(58804),
+(58805),
+(58806),
+(58807),
+(58808),
+(58809),
+(58810),
+(58811),
+(58812),
+(58813),
+(58814),
+(58815),
+(58816),
+(58817),
+(58818),
+(58819),
+(58820),
+(58821),
+(58822),
+(58823),
+(58824),
+(58825),
+(58826),
+(58827),
+(58828),
+(58829),
+(58830),
+(58831),
+(58832),
+(58833),
+(58834),
+(58835),
+(58836),
+(58837),
+(58838),
+(58839),
+(58840),
+(58841),
+(58842),
+(58843),
+(58844),
+(58845),
+(58846),
+(58847),
+(58848),
+(58849),
+(58850),
+(58851),
+(58852),
+(58853),
+(58854),
+(58855),
+(58856),
+(58857),
+(58858),
+(58859),
+(58860),
+(58861),
+(58862),
+(58863),
+(58864),
+(58865),
+(58866),
+(58867),
+(58868),
+(58869),
+(58870),
+(58875),
+(58876),
+(58877),
+(58878),
+(58879),
+(58880),
+(58881),
+(58882),
+(58883),
+(58884),
+(58885),
+(58886),
+(58887),
+(58888),
+(58889),
+(58890),
+(58891),
+(58892),
+(58893),
+(58894),
+(58895),
+(58896),
+(58898),
+(58899),
+(58900),
+(58905),
+(58906),
+(58907),
+(58908),
+(58909),
+(58910),
+(58911),
+(58912),
+(58913),
+(58914),
+(58915),
+(58916),
+(58917),
+(58918),
+(58919),
+(58920),
+(58921),
+(58922),
+(58923),
+(58924),
+(58925),
+(58926),
+(58927),
+(58928),
+(58929),
+(58930),
+(58931),
+(58932),
+(58933),
+(58934),
+(58935),
+(58936),
+(58937),
+(58938),
+(58939),
+(58940),
+(58941),
+(58942),
+(58943),
+(58944),
+(58945),
+(58946),
+(58947),
+(58948),
+(58949),
+(58950),
+(58951),
+(58952),
+(58953),
+(58954),
+(58955),
+(58956),
+(58957),
+(58958),
+(58959),
+(58960),
+(58961),
+(58962),
+(58963),
+(58964),
+(58965),
+(58966),
+(58967),
+(58968),
+(58970),
+(58971),
+(58972),
+(58973),
+(58974),
+(58975),
+(58976),
+(58977),
+(58978),
+(58979),
+(58980),
+(58981),
+(58982),
+(58983),
+(58984),
+(58985),
+(58986),
+(58987),
+(58988),
+(58989),
+(58990),
+(58991),
+(58992),
+(58993),
+(58994),
+(58995),
+(58996),
+(58997),
+(58998),
+(58999),
+(59000),
+(59001),
+(59002),
+(59003),
+(59004),
+(59005),
+(59006),
+(59007),
+(59008),
+(59009),
+(59010),
+(59011),
+(59012),
+(59013),
+(59014),
+(59015),
+(59016),
+(59017),
+(59018),
+(59019),
+(59020),
+(59021),
+(59022),
+(59023),
+(59024),
+(59025),
+(59026),
+(59027),
+(59028),
+(59029),
+(59030),
+(59031),
+(59032),
+(59033),
+(59034),
+(59035),
+(59036),
+(59037),
+(59038),
+(59039),
+(59040),
+(59041),
+(59042),
+(59043),
+(59044),
+(59045),
+(59046),
+(59047),
+(59048),
+(59049),
+(59050),
+(59051),
+(59052),
+(59053),
+(59054),
+(59055),
+(59056),
+(59057),
+(59058),
+(59059),
+(59060),
+(59061),
+(59062),
+(59063),
+(59064),
+(59065),
+(59066),
+(59067),
+(59068),
+(59069),
+(59070),
+(59071),
+(59072),
+(59073),
+(59074),
+(59075),
+(59076),
+(59077),
+(59078),
+(59079),
+(59080),
+(59081),
+(59082),
+(59083),
+(59084),
+(59085),
+(59086),
+(59087),
+(59088),
+(59089),
+(59090),
+(59091),
+(59092),
+(59093),
+(59094),
+(59095),
+(59096),
+(59097),
+(59098),
+(59099),
+(59100),
+(59101),
+(59102),
+(59103),
+(59104),
+(59105),
+(59106),
+(59107),
+(59108),
+(59109),
+(59110),
+(59111),
+(59112),
+(59113),
+(59114),
+(59115),
+(59116),
+(59117),
+(59118),
+(59119),
+(59120),
+(59121),
+(59122),
+(59123),
+(59124),
+(59125),
+(59126),
+(59127),
+(59128),
+(59129),
+(59130),
+(59131),
+(59132),
+(59133),
+(59134),
+(59135),
+(59136),
+(59137),
+(59138),
+(59139),
+(59140),
+(59141),
+(59142),
+(59143),
+(59144),
+(59145),
+(59146),
+(59147),
+(59148),
+(59149),
+(59150),
+(59151),
+(59152),
+(59153),
+(59154),
+(59155),
+(59156),
+(59157),
+(59158),
+(59159),
+(59160),
+(59161),
+(59162),
+(59163),
+(59164),
+(59165),
+(59166),
+(59167),
+(59168),
+(59169),
+(59170),
+(59171),
+(59172),
+(59173),
+(59174),
+(59175),
+(59176),
+(59177),
+(59178),
+(59179),
+(59180),
+(59181),
+(59182),
+(59183),
+(59184),
+(59185),
+(59186),
+(59187),
+(59188),
+(59189),
+(59190),
+(59191),
+(59192),
+(59193),
+(59194),
+(59195),
+(59196),
+(59197),
+(59198),
+(59199),
+(59200),
+(59201),
+(59202),
+(59203),
+(59204),
+(59205),
+(59206),
+(59207),
+(59208),
+(59209),
+(59210),
+(59211),
+(59212),
+(59213),
+(59214),
+(59215),
+(59216),
+(59217),
+(59218),
+(59219),
+(59220),
+(59221),
+(59222),
+(59223),
+(59224),
+(59225),
+(59228),
+(59229),
+(59230),
+(59231),
+(59232),
+(59233),
+(59234),
+(59235),
+(59236),
+(59237),
+(59238),
+(59239),
+(59240),
+(59241),
+(59242),
+(59243),
+(59244),
+(59245),
+(59246),
+(59247),
+(59248),
+(59249),
+(59250),
+(59251),
+(59252),
+(59253),
+(59254),
+(59255),
+(59256),
+(59257),
+(59258),
+(59259),
+(59260),
+(59261),
+(59262),
+(59263),
+(59264),
+(59265),
+(59266),
+(59267),
+(59268),
+(59269),
+(59270),
+(59271),
+(59272),
+(59273),
+(59274),
+(59275),
+(59276),
+(59277),
+(59278),
+(59279),
+(59280),
+(59281),
+(59282),
+(59283),
+(59284),
+(59285),
+(59286),
+(59287),
+(59288),
+(59289),
+(59290),
+(59291),
+(59292),
+(59293),
+(59294),
+(59295),
+(59296),
+(59297),
+(59298),
+(59299),
+(59300),
+(59301),
+(59302),
+(59303),
+(59304),
+(59305),
+(59306),
+(59307),
+(59308),
+(59309),
+(59310),
+(59311),
+(59312),
+(59313),
+(59314),
+(59315),
+(59316),
+(59317),
+(59318),
+(59319),
+(59320),
+(59321),
+(59322),
+(59323),
+(59324),
+(59325),
+(59326),
+(59327),
+(59328),
+(59329),
+(59330),
+(59331),
+(59332),
+(59333),
+(59334),
+(59335),
+(59336),
+(59337),
+(59338),
+(59339),
+(59340),
+(59341),
+(59342),
+(59343),
+(59344),
+(59345),
+(59346),
+(59347),
+(59348),
+(59349),
+(59350),
+(59351),
+(59352),
+(59353),
+(59354),
+(59355),
+(59356),
+(59357),
+(59358),
+(59359),
+(59360),
+(59361),
+(59362),
+(59363),
+(59364),
+(59365),
+(59366),
+(59367),
+(59369),
+(59370),
+(59371),
+(59372),
+(59373),
+(59374),
+(59375),
+(59376),
+(59377),
+(59378),
+(59379),
+(59380),
+(59381),
+(59382),
+(59383),
+(59384),
+(59385),
+(59386),
+(59387),
+(59388),
+(59389),
+(59390),
+(59391),
+(59392),
+(59393),
+(59394),
+(59395),
+(59396),
+(59397),
+(59398),
+(59399),
+(59400),
+(59401),
+(59402),
+(59403),
+(59404),
+(59405),
+(59406),
+(59407),
+(59408),
+(59409),
+(59410),
+(59411),
+(59412),
+(59413),
+(59414),
+(59415),
+(59416),
+(59417),
+(59418),
+(59419),
+(59420),
+(59421),
+(59422),
+(59423),
+(59424),
+(59425),
+(59426),
+(59427),
+(59428),
+(59429),
+(59430),
+(59431),
+(59432),
+(59433),
+(59434),
+(59435),
+(59436),
+(59437),
+(59438),
+(59439),
+(59440),
+(59441),
+(59442),
+(59443),
+(59444),
+(59445),
+(59446),
+(59447),
+(59448),
+(59449),
+(59450),
+(59451),
+(59452),
+(59453),
+(59454),
+(59455),
+(59456),
+(59457),
+(59458),
+(59459),
+(59460),
+(59461),
+(59462),
+(59463),
+(59464),
+(59465),
+(59466),
+(59467),
+(59468),
+(59469),
+(59470),
+(59471),
+(59472),
+(59473),
+(59474),
+(59475),
+(59476),
+(59477),
+(59478),
+(59479),
+(59480),
+(59481),
+(59482),
+(59483),
+(59484),
+(59485),
+(59486),
+(59487),
+(59488),
+(59489),
+(59490),
+(59491),
+(59492),
+(59493),
+(59494),
+(59495),
+(59496),
+(59497),
+(59498),
+(59499),
+(59500),
+(59501),
+(59502),
+(59503),
+(59507),
+(59508),
+(59509),
+(59510),
+(59511),
+(59512),
+(59513),
+(59514),
+(59515),
+(59516),
+(59517),
+(59518),
+(59519),
+(59520),
+(59521),
+(59524),
+(59525),
+(59526),
+(59527),
+(59528),
+(59529),
+(59530),
+(59531),
+(59532),
+(59533),
+(59534),
+(59535),
+(59536),
+(59537),
+(59538),
+(59539),
+(59540),
+(59541),
+(59542),
+(59543),
+(59544),
+(59545),
+(59546),
+(59549),
+(59550),
+(59551),
+(59552),
+(59553),
+(59554),
+(59555),
+(59556),
+(59560),
+(59561),
+(59562),
+(59563),
+(59564),
+(59565),
+(59566),
+(59567),
+(59568),
+(59569),
+(59570),
+(59571),
+(59572),
+(59573),
+(59574),
+(59575),
+(59576),
+(59577),
+(59578),
+(59579),
+(59580),
+(59581),
+(59582),
+(59583),
+(59584),
+(59585),
+(59586),
+(59587),
+(59588),
+(59589),
+(59590),
+(59591),
+(59592),
+(59596),
+(59597),
+(59598),
+(59599),
+(59600),
+(59601),
+(59602),
+(59603),
+(59604),
+(59605),
+(59606),
+(59607),
+(59608),
+(59609),
+(59610),
+(59611),
+(59612),
+(59613),
+(59614),
+(59615),
+(59616),
+(59618),
+(59619),
+(59620),
+(59621),
+(59622),
+(59623),
+(59624),
+(59625),
+(59626),
+(59627),
+(59628),
+(59629),
+(59630),
+(59631),
+(59632),
+(59633),
+(59634),
+(59635),
+(59636),
+(59637),
+(59638),
+(59639),
+(59640),
+(59641),
+(59642),
+(59643),
+(59644),
+(59645),
+(59647),
+(59648),
+(59649),
+(59650),
+(59651),
+(59652),
+(59653),
+(59654),
+(59655),
+(59656),
+(59657),
+(59658),
+(59659),
+(59660),
+(59661),
+(59662),
+(59663),
+(59664),
+(59665),
+(59666),
+(59667),
+(59668),
+(59669),
+(59670),
+(59671),
+(59672),
+(59673),
+(59674),
+(59675),
+(59676),
+(59677),
+(59678),
+(59679),
+(59680),
+(59681),
+(59682),
+(59683),
+(59684),
+(59686),
+(59687),
+(59688),
+(59689),
+(59690),
+(59691),
+(59692),
+(59693),
+(59694),
+(59695),
+(59696),
+(59697),
+(59698),
+(59699),
+(59700),
+(59701),
+(59702),
+(59703),
+(59704),
+(59705),
+(59706),
+(59707),
+(59708),
+(59709),
+(59710),
+(59711),
+(59712),
+(59713),
+(59715),
+(59716),
+(59717),
+(59718),
+(59719),
+(59720),
+(59721),
+(59722),
+(59723),
+(59724),
+(59725),
+(59726),
+(59727),
+(59728),
+(59729),
+(59730),
+(59731),
+(59732),
+(59733),
+(59734),
+(59735),
+(59736),
+(59737),
+(59738),
+(59739),
+(59740),
+(59741),
+(59742),
+(59743),
+(59744),
+(59745),
+(59746),
+(59747),
+(59748),
+(59749),
+(59750),
+(59751),
+(59752),
+(59753),
+(59754),
+(59756),
+(59757),
+(59758),
+(59759),
+(59760),
+(59761),
+(59762),
+(59763),
+(59764),
+(59765),
+(59766),
+(59767),
+(59768),
+(59769),
+(59770),
+(59776),
+(59777),
+(59778),
+(59779),
+(59780),
+(59781),
+(59782),
+(59783),
+(59784),
+(59785),
+(59786),
+(59787),
+(59788),
+(59789),
+(59790),
+(59791),
+(59792),
+(59793),
+(59794),
+(59795),
+(59796),
+(59797),
+(59798),
+(59799),
+(59800),
+(59801),
+(59802),
+(59803),
+(59804),
+(59805),
+(59806),
+(59807),
+(59808),
+(59809),
+(59810),
+(59811),
+(59812),
+(59813),
+(59814),
+(59815),
+(59816),
+(59817),
+(59818),
+(59820),
+(59821),
+(59822),
+(59823),
+(59824),
+(59825),
+(59826),
+(59827),
+(59828),
+(59829),
+(59830),
+(59831),
+(59832),
+(59833),
+(59834),
+(59835),
+(59836),
+(59837),
+(59838),
+(59839),
+(59840),
+(59841),
+(59842),
+(59843),
+(59844),
+(59845),
+(59846),
+(59847),
+(59848),
+(59849),
+(59850),
+(59851),
+(59852),
+(59853),
+(59854),
+(59855),
+(59856),
+(59857),
+(59858),
+(59859),
+(59860),
+(59861),
+(59862),
+(59863),
+(59864),
+(59865),
+(59866),
+(59868),
+(59869),
+(59870),
+(59871),
+(59872),
+(59873),
+(59874),
+(59875),
+(59877),
+(59878),
+(59879),
+(59880),
+(59881),
+(59882),
+(59883),
+(59884),
+(59885),
+(59886),
+(59887),
+(59888),
+(59889),
+(59890),
+(59891),
+(59892),
+(59893),
+(59894),
+(59895),
+(59896),
+(59897),
+(59898),
+(59899),
+(59900),
+(59901),
+(59902),
+(59903),
+(59904),
+(59905),
+(59906),
+(59907),
+(59912),
+(59913),
+(59914),
+(59915),
+(59916),
+(59917),
+(59918),
+(59919),
+(59920),
+(59921),
+(59922),
+(59923),
+(59924),
+(59925),
+(59926),
+(59927),
+(59928),
+(59929),
+(59930),
+(59931),
+(59932),
+(59933),
+(59934),
+(59935),
+(59936),
+(59937),
+(59938),
+(59939),
+(59940),
+(59941),
+(59942),
+(59943),
+(59944),
+(59945),
+(59946),
+(59947),
+(59948),
+(59949),
+(59950),
+(59951),
+(59952),
+(59953),
+(59954),
+(59955),
+(59956),
+(59957),
+(59958),
+(59959),
+(59960),
+(59961),
+(59962),
+(59963),
+(59964),
+(59965),
+(59966),
+(59967),
+(59968),
+(59969),
+(59970),
+(59971),
+(59972),
+(59973),
+(59974),
+(59975),
+(59976),
+(59977),
+(59978),
+(59979),
+(59980),
+(59981),
+(59982),
+(59983),
+(59984),
+(59985),
+(59986),
+(59987),
+(59988),
+(59989),
+(59990),
+(59991),
+(59993),
+(59994),
+(59995),
+(59996),
+(59997),
+(59998),
+(59999),
+(60000),
+(60001),
+(60002),
+(60003),
+(60004),
+(60005),
+(60006),
+(60007),
+(60008),
+(60009),
+(60010),
+(60011),
+(60012),
+(60013),
+(60014),
+(60015),
+(60016),
+(60017),
+(60018),
+(60019),
+(60020),
+(60021),
+(60022),
+(60023),
+(60024),
+(60025),
+(60026),
+(60027),
+(60028),
+(60029),
+(60030),
+(60031),
+(60032),
+(60033),
+(60034),
+(60035),
+(60036),
+(60037),
+(60038),
+(60039),
+(60040),
+(60041),
+(60042),
+(60043),
+(60044),
+(60045),
+(60046),
+(60047),
+(60048),
+(60049),
+(60050),
+(60051),
+(60052),
+(60053),
+(60054),
+(60055),
+(60056),
+(60057),
+(60058),
+(60059),
+(60060),
+(60061),
+(60062),
+(60063),
+(60064),
+(60065),
+(60066),
+(60067),
+(60068),
+(60069),
+(60070),
+(60071),
+(60072),
+(60073),
+(60074),
+(60075),
+(60076),
+(60077),
+(60078),
+(60083),
+(60084),
+(60085),
+(60086),
+(60091),
+(60092),
+(60093),
+(60094),
+(60095),
+(60096),
+(60097),
+(60098),
+(60099),
+(60100),
+(60101),
+(60102),
+(60103),
+(60104),
+(60105),
+(60106),
+(60107),
+(60108),
+(60109),
+(60114),
+(60115),
+(60116),
+(60117),
+(60118),
+(60119),
+(60120),
+(60121),
+(60122),
+(60123),
+(60124),
+(60125),
+(60126),
+(60127),
+(60128),
+(60129),
+(60130),
+(60131),
+(60132),
+(60133),
+(60134),
+(60135),
+(60136),
+(60137),
+(60138),
+(60139),
+(60140),
+(60141),
+(60142),
+(60143),
+(60144),
+(60145),
+(60146),
+(60147),
+(60148),
+(60149),
+(60150),
+(60151),
+(60152),
+(60153),
+(60154),
+(60155),
+(60156),
+(60157),
+(60159),
+(60160),
+(60161),
+(60162),
+(60163),
+(60164),
+(60165),
+(60166),
+(60167),
+(60168),
+(60169),
+(60170),
+(60171),
+(60172),
+(60173),
+(60174),
+(60175),
+(60176),
+(60177),
+(60178),
+(60179),
+(60180),
+(60181),
+(60182),
+(60183),
+(60184),
+(60185),
+(60186),
+(60187),
+(60188),
+(60189),
+(60190),
+(60191),
+(60192),
+(60193),
+(60194),
+(60195),
+(60196),
+(60197),
+(60198),
+(60199),
+(60200),
+(60201),
+(60202),
+(60203),
+(60204),
+(60205),
+(60206),
+(60207),
+(60208),
+(60209),
+(60210),
+(60211),
+(60212),
+(60213),
+(60214),
+(60215),
+(60216),
+(60217),
+(60218),
+(60219),
+(60220),
+(60221),
+(60222),
+(60223),
+(60224),
+(60225),
+(60226),
+(60227),
+(60228),
+(60229),
+(60230),
+(60231),
+(60232),
+(60233),
+(60234),
+(60235),
+(60236),
+(60237),
+(60238),
+(60239),
+(60240),
+(60242),
+(60246),
+(60247),
+(60248),
+(60249),
+(60250),
+(60251),
+(60252),
+(60253),
+(60254),
+(60255),
+(60256),
+(60257),
+(60258),
+(60259),
+(60260),
+(60261),
+(60262),
+(60263),
+(60264),
+(60265),
+(60266),
+(60267),
+(60268),
+(60269),
+(60270),
+(60271),
+(60272),
+(60273),
+(60274),
+(60275),
+(60276),
+(60277),
+(60278),
+(60279),
+(60280),
+(60282),
+(60283),
+(60284),
+(60285),
+(60286),
+(60287),
+(60288),
+(60289),
+(60290),
+(60291),
+(60292),
+(60293),
+(60294),
+(60295),
+(60296),
+(60297),
+(60298),
+(60299),
+(60300),
+(60301),
+(60302),
+(60303),
+(60304),
+(60305),
+(60306),
+(60307),
+(60308),
+(60309),
+(60310),
+(60311),
+(60312),
+(60313),
+(60314),
+(60315),
+(60316),
+(60317),
+(60318),
+(60319),
+(60320),
+(60321),
+(60322),
+(60323),
+(60324),
+(60325),
+(60326),
+(60327),
+(60328),
+(60329),
+(60330),
+(60331),
+(60332),
+(60333),
+(60334),
+(60335),
+(60336),
+(60337),
+(60338),
+(60339),
+(60340),
+(60341),
+(60342),
+(60343),
+(60344),
+(60345),
+(60346),
+(60347),
+(60348),
+(60349),
+(60350),
+(60351),
+(60352),
+(60353),
+(60354),
+(60355),
+(60356),
+(60357),
+(60358),
+(60359),
+(60360),
+(60361),
+(60362),
+(60363),
+(60364),
+(60365),
+(60366),
+(60367),
+(60368),
+(60369),
+(60370),
+(60371),
+(60372),
+(60373),
+(60374),
+(60375),
+(60376),
+(60377),
+(60378),
+(60379),
+(60380),
+(60381),
+(60382),
+(60383),
+(60384),
+(60385),
+(60386),
+(60387),
+(60388),
+(60389),
+(60390),
+(60391),
+(60392),
+(60393),
+(60394),
+(60395),
+(60396),
+(60397),
+(60398),
+(60399),
+(60400),
+(60401),
+(60402),
+(60403),
+(60404),
+(60405),
+(60406),
+(60407),
+(60408),
+(60409),
+(60410),
+(60411),
+(60412),
+(60413),
+(60414),
+(60415),
+(60416),
+(60417),
+(60418),
+(60419),
+(60420),
+(60421),
+(60422),
+(60423),
+(60424),
+(60425),
+(60426),
+(60427),
+(60428),
+(60429),
+(60430),
+(60431),
+(60432),
+(60433),
+(60434),
+(60435),
+(60436),
+(60437),
+(60438),
+(60440),
+(60441),
+(60442),
+(60443),
+(60444),
+(60445),
+(60446),
+(60448),
+(60449),
+(60450),
+(60451),
+(60452),
+(60453),
+(60454),
+(60455),
+(60456),
+(60457),
+(60458),
+(60459),
+(60460),
+(60461),
+(60462),
+(60463),
+(60464),
+(60465),
+(60466),
+(60467),
+(60468),
+(60469),
+(60470),
+(60471),
+(60472),
+(60473),
+(60474),
+(60475),
+(60476),
+(60477),
+(60478),
+(60479),
+(60480),
+(60481),
+(60482),
+(60483),
+(60484),
+(60485),
+(60486),
+(60487),
+(60488),
+(60489),
+(60490),
+(60491),
+(60492),
+(60493),
+(60494),
+(60495),
+(60496),
+(60497),
+(60498),
+(60499),
+(60500),
+(60501),
+(60502),
+(60503),
+(60504),
+(60505),
+(60506),
+(60507),
+(60508),
+(60509),
+(60510),
+(60511),
+(60512),
+(60513),
+(60514),
+(60515),
+(60516),
+(60517),
+(60518),
+(60519),
+(60520),
+(60521),
+(60522),
+(60523),
+(60524),
+(60525),
+(60526),
+(60527),
+(60528),
+(60529),
+(60530),
+(60531),
+(60532),
+(60533),
+(60534),
+(60535),
+(60536),
+(60537),
+(60538),
+(60539),
+(60540),
+(60541),
+(60542),
+(60543),
+(60544),
+(60545),
+(60546),
+(60547),
+(60548),
+(60549),
+(60551),
+(60552),
+(60553),
+(60554),
+(60555),
+(60556),
+(60557),
+(60558),
+(60560),
+(60561),
+(60562),
+(60563),
+(60564),
+(60565),
+(60566),
+(60567),
+(60568),
+(60569),
+(60570),
+(60571),
+(60572),
+(60573),
+(60574),
+(60575),
+(60576),
+(60577),
+(60578),
+(60579),
+(60580),
+(60581),
+(60582),
+(60583),
+(60584),
+(60585),
+(60586),
+(60587),
+(60588),
+(60589),
+(60590),
+(60591),
+(60592),
+(60593),
+(60594),
+(60595),
+(60596),
+(60597),
+(60598),
+(60600),
+(60601),
+(60602),
+(60603),
+(60604),
+(60606),
+(60607),
+(60608),
+(60609),
+(60610),
+(60611),
+(60612),
+(60613),
+(60615),
+(60616),
+(60617),
+(60618),
+(60619),
+(60620),
+(60621),
+(60622),
+(60623),
+(60624),
+(60625),
+(60626),
+(60627),
+(60628),
+(60629),
+(60630),
+(60631),
+(60632),
+(60633),
+(60634),
+(60635),
+(60636),
+(60637),
+(60638),
+(60639),
+(60640),
+(60641),
+(60642),
+(60643),
+(60644),
+(60645),
+(60646),
+(60647),
+(60648),
+(60649),
+(60650),
+(60651),
+(60652),
+(60653),
+(60654),
+(60655),
+(60656),
+(60657),
+(60658),
+(60659),
+(60660),
+(60661),
+(60662),
+(60663),
+(60664),
+(60665),
+(60666),
+(60667),
+(60668),
+(60669),
+(60670),
+(60671),
+(60672),
+(60673),
+(60674),
+(60675),
+(60676),
+(60677),
+(60678),
+(60679),
+(60680),
+(60681),
+(60682),
+(60683),
+(60684),
+(60685),
+(60686),
+(60687),
+(60688),
+(60689),
+(60690),
+(60691),
+(60692),
+(60693),
+(60694),
+(60695),
+(60696),
+(60697),
+(60698),
+(60699),
+(60700),
+(60701),
+(60702),
+(60703),
+(60704),
+(60705),
+(60706),
+(60707),
+(60708),
+(60709),
+(60710),
+(60711),
+(60712),
+(60713),
+(60714),
+(60715),
+(60716),
+(60717),
+(60718),
+(60719),
+(60720),
+(60721),
+(60722),
+(60723),
+(60724),
+(60725),
+(60726),
+(60727),
+(60728),
+(60729),
+(60730),
+(60731),
+(60732),
+(60733),
+(60734),
+(60735),
+(60737),
+(60738),
+(60739),
+(60741),
+(60742),
+(60744),
+(60746),
+(60749),
+(60753),
+(60754),
+(60755),
+(60756),
+(60757),
+(60758),
+(60759),
+(60760),
+(60761),
+(60762),
+(60763),
+(60764),
+(60765),
+(60766),
+(60767),
+(60768),
+(60769),
+(60771),
+(60772),
+(60773),
+(60774),
+(60775),
+(60776),
+(60777),
+(60778),
+(60779),
+(60780),
+(60781),
+(60782),
+(60783),
+(60784),
+(60785),
+(60786),
+(60787),
+(60788),
+(60793),
+(60794),
+(60795),
+(60796),
+(60797),
+(60798),
+(60799),
+(60800),
+(60801),
+(60802),
+(60803),
+(60804),
+(60805),
+(60806),
+(60807),
+(60808),
+(60809),
+(60810),
+(60811),
+(60812),
+(60813),
+(60814),
+(60815),
+(60816),
+(60817),
+(60818),
+(60819),
+(60820),
+(60821),
+(60822),
+(60823),
+(60824),
+(60825),
+(60826),
+(60827),
+(60828),
+(60829),
+(60830),
+(60831),
+(60832),
+(60833),
+(60834),
+(60835),
+(60836),
+(60837),
+(60838),
+(60839),
+(60840),
+(60841),
+(60842),
+(60843),
+(60844),
+(60846),
+(60847),
+(60848),
+(60849),
+(60850),
+(60851),
+(60852),
+(60853),
+(60854),
+(60855),
+(60856),
+(60857),
+(60858),
+(60859),
+(60860),
+(60861),
+(60862),
+(60863),
+(60864),
+(60865),
+(60866),
+(60867),
+(60868),
+(60869),
+(60870),
+(60871),
+(60872),
+(60873),
+(60874),
+(60875),
+(60876),
+(60877),
+(60878),
+(60879),
+(60880),
+(60881),
+(60882),
+(60883),
+(60884),
+(60885),
+(60886),
+(60887),
+(60888),
+(60889),
+(60890),
+(60891),
+(60892),
+(60893),
+(60894),
+(60895),
+(60896),
+(60897),
+(60898),
+(60899),
+(60900),
+(60901),
+(60902),
+(60903),
+(60904),
+(60907),
+(60908),
+(60909),
+(60910),
+(60911),
+(60912),
+(60913),
+(60914),
+(60915),
+(60916),
+(60917),
+(60918),
+(60919),
+(60920),
+(60921),
+(60922),
+(60923),
+(60924),
+(60925),
+(60926),
+(60927),
+(60928),
+(60929),
+(60930),
+(60931),
+(60932),
+(60933),
+(60934),
+(60935),
+(60936),
+(60937),
+(60938),
+(60939),
+(60940),
+(60941),
+(60942),
+(60943),
+(60944),
+(60945),
+(60946),
+(60947),
+(60948),
+(60949),
+(60950),
+(60951),
+(60952),
+(60953),
+(60954),
+(60955),
+(60956),
+(60957),
+(60958),
+(60959),
+(60960),
+(60961),
+(60962),
+(60963),
+(60964),
+(60965),
+(60966),
+(60967),
+(60968),
+(60969),
+(60970),
+(60971),
+(60972),
+(60973),
+(60974),
+(60975),
+(60976),
+(60977),
+(60978),
+(60979),
+(60980),
+(60981),
+(60982),
+(60983),
+(60984),
+(60985),
+(60986),
+(60987),
+(60988),
+(60989),
+(60990),
+(60991),
+(60992),
+(60993),
+(60994),
+(60995),
+(60996),
+(60997),
+(60998),
+(60999),
+(61000),
+(61001),
+(61002),
+(61003),
+(61004),
+(61005),
+(61006),
+(61007),
+(61008),
+(61009),
+(61010),
+(61011),
+(61012),
+(61013),
+(61014),
+(61015),
+(61016),
+(61017),
+(61018),
+(61019),
+(61020),
+(61021),
+(61022),
+(61023),
+(61024),
+(61025),
+(61026),
+(61027),
+(61028),
+(61029),
+(61030),
+(61031),
+(61032),
+(61033),
+(61034),
+(61035),
+(61036),
+(61037),
+(61039),
+(61040),
+(61041),
+(61042),
+(61043),
+(61045),
+(61046),
+(61047),
+(61048),
+(61049),
+(61050),
+(61051),
+(61057),
+(61058),
+(61059),
+(61060),
+(61061),
+(61062),
+(61063),
+(61064),
+(61065),
+(61066),
+(61067),
+(61070),
+(61071),
+(61072),
+(61073),
+(61075),
+(61076),
+(61077),
+(61078),
+(61079),
+(61080),
+(61081),
+(61082),
+(61083),
+(61087),
+(61088),
+(61090),
+(61091),
+(61092),
+(61093),
+(61094),
+(61103),
+(61104),
+(61105),
+(61106),
+(61107),
+(61108),
+(61109),
+(61110),
+(61111),
+(61112),
+(61113),
+(61114),
+(61115),
+(61116),
+(61117),
+(61118),
+(61119),
+(61120),
+(61121),
+(61124),
+(61125),
+(61126),
+(61127),
+(61128),
+(61129),
+(61132),
+(61133),
+(61134),
+(61135),
+(61138),
+(61139),
+(61140),
+(61141),
+(61142),
+(61143),
+(61144),
+(61145),
+(61146),
+(61147),
+(61148),
+(61149),
+(61150),
+(61151),
+(61152),
+(61153),
+(61159),
+(61160),
+(61162),
+(61163),
+(61164),
+(61166),
+(61167),
+(61169),
+(61170),
+(61171),
+(61172),
+(61174),
+(61175),
+(61176),
+(61177),
+(61178),
+(61179),
+(61180),
+(61181),
+(61182),
+(61186),
+(61187),
+(61188),
+(61189),
+(61191),
+(61192),
+(61193),
+(61194),
+(61195),
+(61196),
+(61197),
+(61198),
+(61199),
+(61200),
+(61201),
+(61202),
+(61203),
+(61204),
+(61205),
+(61206),
+(61207),
+(61208),
+(61210),
+(61211),
+(61212),
+(61213),
+(61214),
+(61215),
+(61216),
+(61217),
+(61218),
+(61219),
+(61220),
+(61221),
+(61222),
+(61223),
+(61225),
+(61226),
+(61227),
+(61228),
+(61229),
+(61230),
+(61231),
+(61232),
+(61233),
+(61234),
+(61235),
+(61236),
+(61237),
+(61238),
+(61239),
+(61240),
+(61241),
+(61242),
+(61243),
+(61244),
+(61245),
+(61246),
+(61247),
+(61248),
+(61249),
+(61250),
+(61251),
+(61252),
+(61253),
+(61254),
+(61255),
+(61256),
+(61257),
+(61258),
+(61259),
+(61260),
+(61261),
+(61262),
+(61263),
+(61264),
+(61265),
+(61266),
+(61267),
+(61271),
+(61272),
+(61273),
+(61274),
+(61275),
+(61276),
+(61278),
+(61279),
+(61280),
+(61281),
+(61282),
+(61287),
+(61289),
+(61290),
+(61291),
+(61292),
+(61293),
+(61294),
+(61295),
+(61296),
+(61297),
+(61298),
+(61299),
+(61300),
+(61301),
+(61302),
+(61303),
+(61306),
+(61307),
+(61308),
+(61309),
+(61310),
+(61311),
+(61312),
+(61313),
+(61314),
+(61315),
+(61317),
+(61318),
+(61319),
+(61320),
+(61323),
+(61324),
+(61329),
+(61330),
+(61331),
+(61332),
+(61333),
+(61335),
+(61336),
+(61337),
+(61338),
+(61340),
+(61341),
+(61342),
+(61343),
+(61344),
+(61345),
+(61346),
+(61347),
+(61348),
+(61349),
+(61350),
+(61351),
+(61353),
+(61354),
+(61355),
+(61356),
+(61357),
+(61358),
+(61359),
+(61360),
+(61361),
+(61362),
+(61363),
+(61364),
+(61365),
+(61366),
+(61367),
+(61368),
+(61369),
+(61370),
+(61371),
+(61372),
+(61373),
+(61374),
+(61375),
+(61376),
+(61377),
+(61378),
+(61379),
+(61380),
+(61381),
+(61382),
+(61383),
+(61384),
+(61385),
+(61386),
+(61387),
+(61388),
+(61389),
+(61390),
+(61391),
+(61392),
+(61393),
+(61394),
+(61395),
+(61396),
+(61397),
+(61398),
+(61399),
+(61400),
+(61402),
+(61403),
+(61404),
+(61405),
+(61406),
+(61407),
+(61408),
+(61409),
+(61410),
+(61411),
+(61412),
+(61413),
+(61414),
+(61415),
+(61416),
+(61417),
+(61418),
+(61419),
+(61420),
+(61421),
+(61422),
+(61423),
+(61424),
+(61425),
+(61426),
+(61427),
+(61428),
+(61429),
+(61430),
+(61431),
+(61432),
+(61433),
+(61434),
+(61435),
+(61436),
+(61437),
+(61438),
+(61439),
+(61440),
+(61441),
+(61442),
+(61443),
+(61444),
+(61445),
+(61446),
+(61447),
+(61448),
+(61449),
+(61450),
+(61451),
+(61452),
+(61453),
+(61454),
+(61455),
+(61456),
+(61457),
+(61458),
+(61459),
+(61460),
+(61461),
+(61462),
+(61463),
+(61464),
+(61465),
+(61466),
+(61467),
+(61468),
+(61469),
+(61470),
+(61471),
+(61472),
+(61473),
+(61474),
+(61475),
+(61476),
+(61477),
+(61478),
+(61479),
+(61480),
+(61481),
+(61482),
+(61483),
+(61484),
+(61485),
+(61486),
+(61487),
+(61488),
+(61489),
+(61490),
+(61491),
+(61492),
+(61493),
+(61494),
+(61495),
+(61496),
+(61497),
+(61498),
+(61499),
+(61500),
+(61501),
+(61502),
+(61503),
+(61504),
+(61505),
+(61506),
+(61507),
+(61508),
+(61509),
+(61510),
+(61511),
+(61512),
+(61513),
+(61514),
+(61515),
+(61516),
+(61517),
+(61518),
+(61519),
+(61520),
+(61521),
+(61522),
+(61523),
+(61524),
+(61525),
+(61526),
+(61527),
+(61528),
+(61529),
+(61530),
+(61531),
+(61532),
+(61533),
+(61534),
+(61535),
+(61536),
+(61537),
+(61538),
+(61539),
+(61540),
+(61541),
+(61542),
+(61543),
+(61544),
+(61545),
+(61546),
+(61547),
+(61548),
+(61549),
+(61550),
+(61551),
+(61552),
+(61553),
+(61554),
+(61555),
+(61556),
+(61557),
+(61558),
+(61559),
+(61560),
+(61561),
+(61562),
+(61563),
+(61564),
+(61565),
+(61566),
+(61567),
+(61568),
+(61569),
+(61570),
+(61571),
+(61572),
+(61573),
+(61574),
+(61575),
+(61576),
+(61577),
+(61578),
+(61579),
+(61580),
+(61581),
+(61582),
+(61583),
+(61584),
+(61585),
+(61586),
+(61587),
+(61588),
+(61589),
+(61590),
+(61591),
+(61592),
+(61593),
+(61594),
+(61595),
+(61596),
+(61597),
+(61598),
+(61599),
+(61600),
+(61602),
+(61603),
+(61604),
+(61605),
+(61606),
+(61607),
+(61608),
+(61609),
+(61610),
+(61611),
+(61613),
+(61614),
+(61632),
+(61633),
+(61634),
+(61635),
+(61636),
+(61637),
+(61638),
+(61639),
+(61643),
+(61644),
+(61645),
+(61646),
+(61652),
+(61654),
+(61655),
+(61656),
+(61657),
+(61658),
+(61668),
+(61669),
+(61670),
+(61671),
+(61672),
+(61673),
+(61674),
+(61675),
+(61676),
+(61677),
+(61678),
+(61679),
+(61680),
+(61681),
+(61682),
+(61684),
+(61685),
+(61686),
+(61687),
+(61688),
+(61689),
+(61690),
+(61691),
+(61727);
diff --git a/sql/updates/world/2014_11_16_05_world.sql b/sql/updates/world/2014_11_16_05_world.sql
new file mode 100644
index 00000000000..60bfbeb7eae
--- /dev/null
+++ b/sql/updates/world/2014_11_16_05_world.sql
@@ -0,0 +1 @@
+TRUNCATE `npc_trainer`;
diff --git a/sql/updates/world/2014_11_16_06_world.sql b/sql/updates/world/2014_11_16_06_world.sql
new file mode 100644
index 00000000000..db999f41dac
--- /dev/null
+++ b/sql/updates/world/2014_11_16_06_world.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `npcflag`=`npcflag`-0x30 WHERE npcflag&0x20 AND npcflag&0x10;
diff --git a/sql/updates/world/2014_11_19_00_world.sql b/sql/updates/world/2014_11_19_00_world.sql
new file mode 100644
index 00000000000..d2b188cbf69
--- /dev/null
+++ b/sql/updates/world/2014_11_19_00_world.sql
@@ -0,0 +1,6 @@
+--
+DELETE FROM `command` WHERE `name`='pvpstats';
+INSERT INTO `command` (`name`, `permission`, `help`) VALUES
+('pvpstats', 797, 'Shows number of battleground victories in the last 7 days');
+
+UPDATE `command` SET `permission`=798 WHERE `name`='modify xp';
diff --git a/sql/updates/world/2014_11_19_01_world.sql b/sql/updates/world/2014_11_19_01_world.sql
new file mode 100644
index 00000000000..3019db4045f
--- /dev/null
+++ b/sql/updates/world/2014_11_19_01_world.sql
@@ -0,0 +1,15 @@
+DELETE FROM `player_factionchange_reputations` WHERE `alliance_id` IN (1134, 1174, 1242, 1353, 1376, 1387, 1419, 1682, 1691, 1710, 1731, 1733, 1738);
+INSERT INTO `player_factionchange_reputations` (`alliance_id`, `horde_id`) VALUES
+(1134, 1133), -- Gilneas <-> Bilgewater Cartel
+(1174, 1172), -- Wildhammer Clan <-> Dragonmaw Clan
+(1242, 1228), -- Pearlfin Jinyu <-> Forest Hozen
+(1353, 1352), -- Tushui Pandaren <-> Huojin Pandaren
+(1376, 1375), -- Operation: Shieldwall <-> Dominance Offensive
+(1387, 1388), -- Kirin Tor Offensive <-> Sunreaver Onslaught
+(1419, 1374), -- Bizmo's Brawlpub (Season 1) <-> Brawl'gar Arena (Season 1)
+(1682, 1681), -- Wrynn's Vanguard <-> Vol'jin's Spear
+(1691, 1690), -- Bizmo's Brawlpub <-> Brawl'gar Arena
+(1710, 1708), -- Sha'tari Defense <-> Laughing Skull Orcs
+(1731, 1445), -- Council of Exarchs <-> Frostwolf Orcs
+(1733, 1739), -- Delvar Ironfist <-> Vivianne
+(1738, 1740); -- Defender Illona <-> Aeda Brightdawn
diff --git a/sql/updates/world/2014_11_20_00_world.sql b/sql/updates/world/2014_11_20_00_world.sql
new file mode 100644
index 00000000000..d30256ee367
--- /dev/null
+++ b/sql/updates/world/2014_11_20_00_world.sql
@@ -0,0 +1,42 @@
+SET @GAME_TELE_ID_START := 1524;
+
+DELETE FROM `game_tele` WHERE `id` BETWEEN @GAME_TELE_ID_START AND @GAME_TELE_ID_START + 30;
+INSERT INTO `game_tele` (`id`, `position_x`, `position_y`, `position_z`, `orientation`, `map`, `name`) VALUES
+(@GAME_TELE_ID_START + 00, -62.9117, -884.924, 20.2665, 0.790889, 1116, 'Draenor'),
+-- shadowmoon valley
+(@GAME_TELE_ID_START + 01, -10.7263, -11.6916, 132.447, 4.99356, 1116, 'DraenorShadowmoonValley'),
+(@GAME_TELE_ID_START + 02, 1868.25, 543.887, 36.8879, 0.822293, 1116, 'DraenorTheCursedWoods'),
+(@GAME_TELE_ID_START + 03, 792.977, -661.44, -34.4487, 5.79858, 1116, 'DraenorEmbaariVillage'),
+-- frostfire ridge
+(@GAME_TELE_ID_START + 04, 6277.09, 4661.2, 164.159, 5.27711, 1116, 'DraenorFrostfireRidge'),
+(@GAME_TELE_ID_START + 05, 6035.97, 2747.9, 204.467, 4.29143, 1116, 'DraenorThunderPass'),
+(@GAME_TELE_ID_START + 06, 7201.84, 6143.85, 118.187, 5.21116, 1116, 'DraenorCircleOfBlood'),
+-- talrador
+(@GAME_TELE_ID_START + 07, 2434.15, 2375.28, 126.584, 5.44828, 1116, 'DraenorTalrador'),
+(@GAME_TELE_ID_START + 08, 2892.45, 3496.2, 60.264, 4.00866, 1116, 'DraenorShattrath'),
+(@GAME_TELE_ID_START + 09, 1904.64, 2748.87, 133.659, 2.65699, 1116, 'DraenorAuchindoun'),
+(@GAME_TELE_ID_START + 10, 3046.93, 2259.74, 119.867, 3.41882, 1116, 'DraenorTuurem'),
+(@GAME_TELE_ID_START + 11, 3250.92, 1007.09, 39.5669, 5.54724, 1116, 'DraenorTangarra'),
+(@GAME_TELE_ID_START + 12, 3205.78, 832.338, 81.9089, 4.51366, 1116, 'DraenorKhadagarsTower'),
+(@GAME_TELE_ID_START + 13, 3444.42, 3122.29, 20.4026, 0.00939501, 1116, 'DraenorShatariAnchorage'),
+-- spires of arak
+(@GAME_TELE_ID_START + 14, -587.879, 1080.18, 32.3069, 1.02256, 1116, 'DraenorSpiresOfArak'),
+(@GAME_TELE_ID_START + 15, 261.102, 1306.36, 0.370201, 2.31847, 1116, 'DraenorHarvestingPits'),
+(@GAME_TELE_ID_START + 16, -2117.71, 1255.85, 14.1154, 3.08267, 1116, 'DraenorPinchwhistlePoint'),
+(@GAME_TELE_ID_START + 17, -1243.2, 1948.67, 22.5656, 3.22797, 1116, 'DraenorBloodmanePridelands'),
+(@GAME_TELE_ID_START + 18, -166.49, 1862.79, 34.1361, 3.52249, 1116, 'DraenorShadowGlade'),
+(@GAME_TELE_ID_START + 19, 596.594, 2410.67, 196.983, 3.76597, 1116, 'DraenorTerrokarPass'),
+-- nagrand
+(@GAME_TELE_ID_START + 20, 3324.23, 4759.55, 124.411, 1.3061, 1116, 'DraenorNagrand'),
+(@GAME_TELE_ID_START + 21, 2000.47, 5057.39, 193.49, 3.05203, 1116, 'DraenorGatesOfGrommash'),
+(@GAME_TELE_ID_START + 22, 2693.53, 6341.21, 48.8304, 3.60574, 1116, 'DraenorSpiritWoods'),
+(@GAME_TELE_ID_START + 23, 3659.56, 7226.28, 10.4416, 2.00588, 1116, 'DraenorHighmaul'),
+-- gorgrond
+(@GAME_TELE_ID_START + 24, 6803.53, 1219.95, 69.6852, 5.61794, 1116, 'DraenorGorgrond'),
+(@GAME_TELE_ID_START + 25, 7242.45, 902.165, 76.8599, 1.38465, 1116, 'DraenorSteamburstCauldron'),
+(@GAME_TELE_ID_START + 26, 6847.86, 418.138, 79.4367, 3.69765, 1116, 'DraenorEverbloomWilds'),
+(@GAME_TELE_ID_START + 27, 6126.31, 528.017, 16.2278, 5.23311, 1116, 'DraenorCrimsonFen'),
+(@GAME_TELE_ID_START + 28, 5536.02, 1189.81, 93.15, 5.79781, 1116, 'DraenorRazorbloom'),
+(@GAME_TELE_ID_START + 29, 5406.03, 1922.05, 171.85, 5.24411, 1116, 'DraenorGorgrondPass'),
+-- tanaan junngle
+(@GAME_TELE_ID_START + 30, 3549, -2126.4, 17.7437, 0.287412, 1116, 'DraenorBarrierSea');
diff --git a/sql/updates/world/2014_11_20_01_world.sql b/sql/updates/world/2014_11_20_01_world.sql
new file mode 100644
index 00000000000..75474e72596
--- /dev/null
+++ b/sql/updates/world/2014_11_20_01_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `gameobject` WHERE `id`=187372;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
+(44719, 187372, 556, 3, 1, 65.88321, 286.6981, 25.04024, 0, 0, 0, 0, 1, 86400, 255, 1, 12340);
diff --git a/sql/updates/world/2014_11_20_02_world.sql b/sql/updates/world/2014_11_20_02_world.sql
new file mode 100644
index 00000000000..1e0048e1943
--- /dev/null
+++ b/sql/updates/world/2014_11_20_02_world.sql
@@ -0,0 +1,7 @@
+ALTER TABLE `spell_target_position` CHANGE `id` `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` CHANGE `effIndex` `EffectIndex` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` CHANGE `target_map` `MapID` SMALLINT(3) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` CHANGE `target_position_x` `PositionX` FLOAT NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` CHANGE `target_position_y` `PositionY` FLOAT NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` CHANGE `target_position_z` `PositionZ` FLOAT NOT NULL DEFAULT '0';
+ALTER TABLE `spell_target_position` DROP COLUMN `target_orientation`;
diff --git a/src/server/bnetserver/Packets/CachePackets.cpp b/src/server/bnetserver/Packets/CachePackets.cpp
index deacfd34065..8ae489fe47c 100644
--- a/src/server/bnetserver/Packets/CachePackets.cpp
+++ b/src/server/bnetserver/Packets/CachePackets.cpp
@@ -21,7 +21,7 @@
void Battlenet::Cache::GetStreamItemsRequest::Read()
{
- _stream.WriteSkip(31);
+ _stream.ReadSkip(31);
Index = _stream.Read<uint32>(32);
ReferenceTime = _stream.Read<int32>(32) - std::numeric_limits<int32>::min();
_stream.Read<bool>(1); // StreamDirection
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 7f9359053a1..2f99bc0a6cc 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -70,7 +70,9 @@ namespace Trinity
private:
void do_helper(WorldPacket& data, char const* text)
{
- ChatHandler::BuildChatPacket(data, _msgtype, LANG_UNIVERSAL, _source, _source, text);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, text);
+ data = *packet.Write();
}
ChatMsg _msgtype;
@@ -94,7 +96,9 @@ namespace Trinity
char str[2048];
snprintf(str, 2048, text, arg1str, arg2str);
- ChatHandler::BuildChatPacket(data, _msgtype, LANG_UNIVERSAL, _source, _source, str);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, str);
+ data = *packet.Write();
}
private:
@@ -1693,11 +1697,12 @@ void Battleground::SendWarningToAll(uint32 entry, ...)
if (!entry)
return;
- std::map<uint32, WorldPacket> localizedPackets;
+ std::map<uint32, WorldPackets::Chat::Chat> localizedPackets;
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (Player* player = _GetPlayer(itr, "SendWarningToAll"))
{
- if (localizedPackets.find(player->GetSession()->GetSessionDbLocaleIndex()) == localizedPackets.end())
+ auto packetItr = localizedPackets.find(player->GetSession()->GetSessionDbLocaleIndex());
+ if (packetItr == localizedPackets.end())
{
char const* format = sObjectMgr->GetTrinityString(entry, player->GetSession()->GetSessionDbLocaleIndex());
@@ -1707,10 +1712,10 @@ void Battleground::SendWarningToAll(uint32 entry, ...)
vsnprintf(str, 1024, format, ap);
va_end(ap);
- ChatHandler::BuildChatPacket(localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()], CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, NULL, NULL, str);
+ ChatHandler::BuildChatPacket(&packetItr->second, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, NULL, NULL, str);
}
- player->SendDirectMessage(&localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()]);
+ player->SendDirectMessage(packetItr->second.Write());
}
}
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp
index 65f07b625e1..e2b6b16c9f2 100644
--- a/src/server/game/Chat/Channels/Channel.cpp
+++ b/src/server/game/Chat/Channels/Channel.cpp
@@ -31,18 +31,16 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team):
_IsSaved(false),
_flags(0),
_channelId(channelId),
- _Team(team),
- _ownerGUID(),
- _name(name),
- _password("")
+ _team(team),
+ _name(name)
{
// set special flags if built-in channel
if (ChatChannelsEntry const* ch = sChatChannelsStore.LookupEntry(channelId)) // check whether it's a built-in channel
{
- _announce = false; // no join/leave announces
- _ownership = false; // no ownership handout
+ _announce = false; // no join/leave announces
+ _ownership = false; // no ownership handout
- _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels
+ _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels
if (ch->Flags & CHANNEL_DBC_FLAG_TRADE) // for trade channel
_flags |= CHANNEL_FLAG_TRADE;
@@ -62,31 +60,31 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team):
// If storing custom channels in the db is enabled either load or save the channel
if (sWorld->getBoolConfig(CONFIG_PRESERVE_CUSTOM_CHANNELS))
{
- PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL);
- stmt->setString(0, name);
- stmt->setUInt32(1, _Team);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL);
+ stmt->setString(0, _name);
+ stmt->setUInt32(1, _team);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
- if (result) //load
+ if (result) // load
{
Field* fields = result->Fetch();
_announce = fields[0].GetBool();
_ownership = fields[1].GetBool();
_password = fields[2].GetString();
- const char* db_BannedList = fields[3].GetCString();
+ std::string bannedList = fields[3].GetString();
- if (db_BannedList)
+ if (!bannedList.empty())
{
- Tokenizer tokens(db_BannedList, ' ');
+ Tokenizer tokens(bannedList, ' ');
for (Tokenizer::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
{
std::string bannedGuidStr(*i);
- ObjectGuid banned_guid;
- banned_guid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), NULL, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), NULL, 16)));
- if (!banned_guid.IsEmpty())
+ ObjectGuid bannedGuid;
+ bannedGuid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), nullptr, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), nullptr, 16)));
+ if (!bannedGuid.IsEmpty())
{
- TC_LOG_DEBUG("chat.system", "Channel(%s) loaded bannedStore %s", name.c_str(), banned_guid.ToString().c_str());
- bannedStore.insert(banned_guid);
+ TC_LOG_DEBUG("chat.system", "Channel (%s) loaded bannedStore %s", _name.c_str(), bannedGuid.ToString().c_str());
+ _bannedStore.insert(bannedGuid);
}
}
}
@@ -94,10 +92,10 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team):
else // save
{
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHANNEL);
- stmt->setString(0, name);
- stmt->setUInt32(1, _Team);
+ stmt->setString(0, _name);
+ stmt->setUInt32(1, _team);
CharacterDatabase.Execute(stmt);
- TC_LOG_DEBUG("chat.system", "Channel(%s) saved in database", name.c_str());
+ TC_LOG_DEBUG("chat.system", "Channel (%s) saved in database", _name.c_str());
}
_IsSaved = true;
@@ -110,22 +108,19 @@ void Channel::UpdateChannelInDB() const
if (_IsSaved)
{
std::ostringstream banlist;
- BannedContainer::const_iterator iter;
- for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter)
- banlist << *iter << ' ';
-
- std::string banListStr = banlist.str();
+ for (ObjectGuid const& guid : _bannedStore)
+ banlist << guid << ' ';
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL);
stmt->setBool(0, _announce);
stmt->setBool(1, _ownership);
stmt->setString(2, _password);
- stmt->setString(3, banListStr);
+ stmt->setString(3, banlist.str());
stmt->setString(4, _name);
- stmt->setUInt32(5, _Team);
+ stmt->setUInt32(5, _team);
CharacterDatabase.Execute(stmt);
- TC_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str());
+ TC_LOG_DEBUG("chat.system", "Channel (%s) updated in database", _name.c_str());
}
}
@@ -133,7 +128,7 @@ void Channel::UpdateChannelUseageInDB() const
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_USAGE);
stmt->setString(0, _name);
- stmt->setUInt32(1, _Team);
+ stmt->setUInt32(1, _team);
CharacterDatabase.Execute(stmt);
}
@@ -151,32 +146,32 @@ void Channel::CleanOldChannelsInDB()
void Channel::JoinChannel(Player* player, std::string const& pass)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (IsOn(guid))
{
// Do not send error message for built-in channels
if (!IsConstant())
{
- WorldPacket data;
- MakePlayerAlreadyMember(&data, guid);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerAlreadyMember(notify, guid);
+ player->SendDirectMessage(notify.Write());
}
return;
}
if (IsBanned(guid))
{
- WorldPacket data;
- MakeBanned(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeBanned(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
if (!_password.empty() && pass != _password)
{
- WorldPacket data;
- MakeWrongPassword(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeWrongPassword(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -185,9 +180,9 @@ void Channel::JoinChannel(Player* player, std::string const& pass)
AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && //FIXME: Move to RBAC
player->GetGroup())
{
- WorldPacket data;
- MakeNotInLfg(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotInLfg(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -195,73 +190,90 @@ void Channel::JoinChannel(Player* player, std::string const& pass)
if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL))
{
- WorldPacket data;
- MakeJoined(&data, guid);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeJoined(notify, guid);
+ SendToAll(notify.Write());
}
- PlayerInfo pinfo;
- pinfo.player = guid;
- pinfo.flags = MEMBER_FLAG_NONE;
- playersStore[guid] = pinfo;
+ PlayerInfo playerInfo;
+ playerInfo.PlayerGuid = guid;
+ _playersStore[guid] = playerInfo;
- WorldPacket data;
- MakeYouJoined(&data);
- SendToOne(&data, guid);
+ /*
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeYouJoined(notify);
+ player->SendDirectMessage(notify.Write());
+ */
- JoinNotify(guid);
+ WorldPackets::Channel::ChannelNotifyJoined notify;
+ //notify.ChannelWelcomeMsg = "";
+ notify.ChatChannelID = _channelId;
+ //notify.InstanceID = 0;
+ notify.ChannelFlags = _flags;
+ notify.Channel = _name;
+ player->SendDirectMessage(notify.Write());
+
+ JoinNotify(player);
// Custom channel handling
if (!IsConstant())
{
// Update last_used timestamp in db
- if (!playersStore.empty())
+ if (!_playersStore.empty())
UpdateChannelUseageInDB();
// If the channel has no owner yet and ownership is allowed, set the new owner.
- if (!_ownerGUID && _ownership)
+ if (_ownerGUID.IsEmpty() && _ownership)
{
- SetOwner(guid, playersStore.size() > 1);
- playersStore[guid].SetModerator(true);
+ SetOwner(guid, _playersStore.size() > 1);
+ _playersStore[guid].SetModerator(true);
}
}
}
void Channel::LeaveChannel(Player* player, bool send)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (!IsOn(guid))
{
if (send)
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
}
return;
}
+ player->LeftChannel(this);
+
if (send)
{
- WorldPacket data;
- MakeYouLeft(&data);
- SendToOne(&data, guid);
- player->LeftChannel(this);
- data.clear();
+ /*
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeYouLeft(notify);
+ player->SendDirectMessage(notify.Write());
+ */
+
+ WorldPackets::Channel::ChannelNotifyLeft notify;
+ notify.Channel = _name;
+ notify.ChatChannelID = 0;
+ //notify.Suspended = false;
+ player->SendDirectMessage(notify.Write());
}
- bool changeowner = playersStore[guid].IsOwner();
+ bool changeowner = _playersStore[guid].IsOwner();
- playersStore.erase(guid);
+ _playersStore.erase(guid);
if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL))
{
- WorldPacket data;
- MakeLeft(&data, guid);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeLeft(notify, guid);
+ SendToAll(notify.Write());
}
- LeaveNotify(guid);
+ LeaveNotify(player);
if (!IsConstant())
{
@@ -269,10 +281,10 @@ void Channel::LeaveChannel(Player* player, bool send)
UpdateChannelUseageInDB();
// If the channel owner left and there are still playersStore inside, pick a new owner
- if (changeowner && _ownership && !playersStore.empty())
+ if (changeowner && _ownership && !_playersStore.empty())
{
- ObjectGuid newowner = playersStore.begin()->second.player;
- playersStore[newowner].SetModerator(true);
+ ObjectGuid const& newowner = _playersStore.begin()->second.PlayerGuid;
+ _playersStore[newowner].SetModerator(true);
SetOwner(newowner);
}
}
@@ -280,21 +292,21 @@ void Channel::LeaveChannel(Player* player, bool send)
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban)
{
- ObjectGuid good = player->GetGUID();
+ ObjectGuid const& good = player->GetGUID();
if (!IsOn(good))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
+ if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
{
- WorldPacket data;
- MakeNotModerator(&data);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotModerator(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -302,9 +314,9 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b
ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty;
if (!victim || !IsOn(victim))
{
- WorldPacket data;
- MakePlayerNotFound(&data, badname);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerNotFound(notify, badname);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -312,154 +324,152 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b
if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID)
{
- WorldPacket data;
- MakeNotOwner(&data);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotOwner(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
if (ban && !IsBanned(victim))
{
- bannedStore.insert(victim);
+ _bannedStore.insert(victim);
UpdateChannelInDB();
if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL))
{
- WorldPacket data;
- MakePlayerBanned(&data, victim, good);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerBanned(notify, victim, good);
+ SendToAll(notify.Write());
}
}
else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL))
{
- WorldPacket data;
- MakePlayerKicked(&data, victim, good);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerKicked(notify, victim, good);
+ SendToAll(notify.Write());
}
- playersStore.erase(victim);
+ _playersStore.erase(victim);
bad->LeftChannel(this);
- if (changeowner && _ownership && !playersStore.empty())
+ if (changeowner && _ownership && !_playersStore.empty())
{
- ObjectGuid newowner = good;
- playersStore[newowner].SetModerator(true);
- SetOwner(newowner);
+ _playersStore[good].SetModerator(true);
+ SetOwner(good);
}
}
void Channel::UnBan(Player const* player, std::string const& badname)
{
- ObjectGuid good = player->GetGUID();
+ ObjectGuid const& good = player->GetGUID();
if (!IsOn(good))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
+ if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
{
- WorldPacket data;
- MakeNotModerator(&data);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotModerator(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname);
ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty;
- if (!victim || !IsBanned(victim))
+ if (victim.IsEmpty() || !IsBanned(victim))
{
- WorldPacket data;
- MakePlayerNotFound(&data, badname);
- SendToOne(&data, good);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerNotFound(notify, badname);
+ player->SendDirectMessage(notify.Write());
return;
}
- bannedStore.erase(victim);
+ _bannedStore.erase(victim);
- WorldPacket data;
- MakePlayerUnbanned(&data, victim, good);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerUnbanned(notify, victim, good);
+ SendToAll(notify.Write());
UpdateChannelInDB();
}
void Channel::Password(Player const* player, std::string const& pass)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
- ChatHandler chat(player->GetSession());
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
+ if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
{
- WorldPacket data;
- MakeNotModerator(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotModerator(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
_password = pass;
- WorldPacket data;
- MakePasswordChanged(&data, guid);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePasswordChanged(notify, guid);
+ SendToAll(notify.Write());
UpdateChannelInDB();
}
void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bool set)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
+ if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
{
- WorldPacket data;
- MakeNotModerator(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotModerator(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (guid == _ownerGUID && std::string(p2n) == player->GetName() && mod)
+ if (guid == _ownerGUID && p2n == player->GetName() && mod)
return;
Player* newp = ObjectAccessor::FindConnectedPlayerByName(p2n);
ObjectGuid victim = newp ? newp->GetGUID() : ObjectGuid::Empty;
- if (!victim || !IsOn(victim) ||
+ if (victim.IsEmpty() || !IsOn(victim) ||
(player->GetTeam() != newp->GetTeam() &&
(!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) ||
!newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL))))
{
- WorldPacket data;
- MakePlayerNotFound(&data, p2n);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerNotFound(notify, p2n);
+ player->SendDirectMessage(notify.Write());
return;
}
if (_ownerGUID == victim && _ownerGUID != guid)
{
- WorldPacket data;
- MakeNotOwner(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotOwner(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -471,21 +481,21 @@ void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bo
void Channel::SetOwner(Player const* player, std::string const& newname)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && guid != _ownerGUID)
{
- WorldPacket data;
- MakeNotOwner(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotOwner(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -497,55 +507,49 @@ void Channel::SetOwner(Player const* player, std::string const& newname)
(!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) ||
!newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL))))
{
- WorldPacket data;
- MakePlayerNotFound(&data, newname);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerNotFound(notify, newname);
+ player->SendDirectMessage(notify.Write());
return;
}
- playersStore[victim].SetModerator(true);
+ _playersStore[victim].SetModerator(true);
SetOwner(victim);
}
-void Channel::SendWhoOwner(ObjectGuid guid)
+void Channel::SendWhoOwner(Player const* player)
{
- WorldPacket data;
- if (IsOn(guid))
- MakeChannelOwner(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ if (IsOn(player->GetGUID()))
+ MakeChannelOwner(notify);
else
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
}
void Channel::List(Player const* player)
{
- ObjectGuid guid = player->GetGUID();
-
- if (!IsOn(guid))
+ if (!IsOn(player->GetGUID()))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
TC_LOG_DEBUG("chat.system", "SMSG_CHANNEL_LIST %s Channel: %s",
player->GetSession()->GetPlayerInfo().c_str(), GetName().c_str());
- WorldPacket data(SMSG_CHANNEL_LIST, 1+(GetName().size()+1)+1+4+playersStore.size()*(8+1));
- data << uint8(1); // channel type?
- data << GetName(); // channel name
- data << uint8(GetFlags()); // channel flags?
-
- size_t pos = data.wpos();
- data << uint32(0); // size of list, placeholder
+ WorldPackets::Channel::ChannelListResponse list;
+ list.Display = true; /// always true?
+ list.Channel = GetName();
+ list.ChannelFlags = GetFlags();
uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST);
- uint32 count = 0;
- for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
+ for (PlayerContainer::value_type const& i : _playersStore)
{
- Player* member = ObjectAccessor::FindConnectedPlayer(i->first);
+ Player* member = ObjectAccessor::FindConnectedPlayer(i.first);
// PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
// MODERATOR, GAME MASTER, ADMINISTRATOR can see all
@@ -554,50 +558,46 @@ void Channel::List(Player const* player)
member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) &&
member->IsVisibleGloballyFor(player))
{
- data << i->first;
- data << uint8(i->second.flags); // flags seems to be changed...
- ++count;
+ list.Members.emplace_back(i.second.PlayerGuid, GetVirtualRealmAddress(), i.second.GetFlags());
}
}
- data.put<uint32>(pos, count);
-
- SendToOne(&data, guid);
+ player->SendDirectMessage(list.Write());
}
void Channel::Announce(Player const* player)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
- if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
+ if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR))
{
- WorldPacket data;
- MakeNotModerator(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotModerator(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
_announce = !_announce;
- WorldPacket data;
+ WorldPackets::Channel::ChannelNotify notify;
if (_announce)
- MakeAnnouncementsOn(&data, guid);
+ MakeAnnouncementsOn(notify, guid);
else
- MakeAnnouncementsOff(&data, guid);
- SendToAll(&data);
+ MakeAnnouncementsOff(notify, guid);
+ SendToAll(notify.Write());
UpdateChannelInDB();
}
-void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang)
+void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang)
{
if (what.empty())
return;
@@ -608,55 +608,59 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang)
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ SendToOne(notify.Write(), guid);
return;
}
- if (playersStore[guid].IsMuted())
+ if (_playersStore[guid].IsMuted())
{
- WorldPacket data;
- MakeMuted(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeMuted(notify);
+ SendToOne(notify.Write(), guid);
return;
}
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
- ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name);
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name);
else
- ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), guid, guid, what, 0, "", "", 0, false, _name);
+ {
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), NULL, NULL, what, 0, _name);
+ packet.SenderGUID = guid;
+ packet.TargetGUID = guid;
+ }
- SendToAll(&data, !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty);
+ SendToAll(packet.Write(), !_playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty);
}
void Channel::Invite(Player const* player, std::string const& newname)
{
- ObjectGuid guid = player->GetGUID();
+ ObjectGuid const& guid = player->GetGUID();
if (!IsOn(guid))
{
- WorldPacket data;
- MakeNotMember(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeNotMember(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
Player* newp = ObjectAccessor::FindConnectedPlayerByName(newname);
if (!newp || !newp->isGMVisible())
{
- WorldPacket data;
- MakePlayerNotFound(&data, newname);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerNotFound(notify, newname);
+ player->SendDirectMessage(notify.Write());
return;
}
if (IsBanned(newp->GetGUID()))
{
- WorldPacket data;
- MakePlayerInviteBanned(&data, newname);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerInviteBanned(notify, newname);
+ player->SendDirectMessage(notify.Write());
return;
}
@@ -664,169 +668,167 @@ void Channel::Invite(Player const* player, std::string const& newname)
(!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) ||
!newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))
{
- WorldPacket data;
- MakeInviteWrongFaction(&data);
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeInviteWrongFaction(notify);
+ player->SendDirectMessage(notify.Write());
return;
}
if (IsOn(newp->GetGUID()))
{
- WorldPacket data;
- MakePlayerAlreadyMember(&data, newp->GetGUID());
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerAlreadyMember(notify, newp->GetGUID());
+ player->SendDirectMessage(notify.Write());
return;
}
if (!newp->GetSocial()->HasIgnore(guid))
{
- WorldPacket data;
- MakeInvite(&data, guid);
- SendToOne(&data, newp->GetGUID());
- data.clear();
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeInvite(notify, guid);
+ newp->SendDirectMessage(notify.Write());
}
- WorldPacket data;
- MakePlayerInvited(&data, newp->GetName());
- SendToOne(&data, guid);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakePlayerInvited(notify, newp->GetName());
+ player->SendDirectMessage(notify.Write());
}
-void Channel::SetOwner(ObjectGuid guid, bool exclaim)
+void Channel::SetOwner(ObjectGuid const& guid, bool exclaim)
{
if (!_ownerGUID.IsEmpty())
{
// [] will re-add player after it possible removed
- PlayerContainer::iterator p_itr = playersStore.find(_ownerGUID);
- if (p_itr != playersStore.end())
- p_itr->second.SetOwner(false);
+ PlayerContainer::iterator itr = _playersStore.find(_ownerGUID);
+ if (itr != _playersStore.end())
+ itr->second.SetOwner(false);
}
_ownerGUID = guid;
if (!_ownerGUID.IsEmpty())
{
- uint8 oldFlag = GetPlayerFlags(_ownerGUID);
- playersStore[_ownerGUID].SetModerator(true);
- playersStore[_ownerGUID].SetOwner(true);
+ uint8 oldFlag = _playersStore[_ownerGUID].GetFlags();
+ _playersStore[_ownerGUID].SetModerator(true);
+ _playersStore[_ownerGUID].SetOwner(true);
- WorldPacket data;
- MakeModeChange(&data, _ownerGUID, oldFlag);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify notify;
+ MakeModeChange(notify, _ownerGUID, oldFlag, _playersStore[_ownerGUID].GetFlags());
+ SendToAll(notify.Write());
if (exclaim)
{
- MakeOwnerChanged(&data, _ownerGUID);
- SendToAll(&data);
+ MakeOwnerChanged(notify, _ownerGUID);
+ SendToAll(notify.Write());
}
UpdateChannelInDB();
}
}
-void Channel::SendToAll(WorldPacket* data, ObjectGuid guid)
+void Channel::SendToAll(WorldPacket const* data, ObjectGuid const& guid)
{
- for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
- if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first))
- if (!guid || !player->GetSocial()->HasIgnore(guid))
- player->GetSession()->SendPacket(data);
+ for (PlayerContainer::value_type const& i : _playersStore)
+ if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first))
+ if (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid))
+ player->SendDirectMessage(data);
}
-void Channel::SendToAllButOne(WorldPacket* data, ObjectGuid who)
+void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid const& who)
{
- for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i)
- if (i->first != who)
- if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first))
- player->GetSession()->SendPacket(data);
+ for (PlayerContainer::value_type const& i : _playersStore)
+ if (i.first != who)
+ if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first))
+ player->SendDirectMessage(data);
}
-void Channel::SendToOne(WorldPacket* data, ObjectGuid who)
+void Channel::SendToOne(WorldPacket const* data, ObjectGuid const& who)
{
if (Player* player = ObjectAccessor::FindConnectedPlayer(who))
- player->GetSession()->SendPacket(data);
+ player->SendDirectMessage(data);
}
-void Channel::Voice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/)
+void Channel::Voice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/)
{
}
-void Channel::DeVoice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/)
+void Channel::DeVoice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/)
{
}
-void Channel::MakeNotifyPacket(WorldPacket* data, uint8 notify_type)
+void Channel::MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType)
{
- data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + _name.size());
- *data << uint8(notify_type);
- *data << _name;
+ data.Type = notifyType;
+ data.Channel = _name;
}
-void Channel::MakeJoined(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_JOINED_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeLeft(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_LEFT_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeYouJoined(WorldPacket* data)
+void Channel::MakeYouJoined(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE);
- *data << uint8(GetFlags());
- *data << uint32(GetChannelId());
- *data << uint32(0);
+ //*data << uint8(GetFlags());
+ data.ChatChannelID = GetChannelId();
+ //*data << uint32(0);
}
-void Channel::MakeYouLeft(WorldPacket* data)
+void Channel::MakeYouLeft(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE);
- *data << uint32(GetChannelId());
- *data << uint8(IsConstant());
+ data.ChatChannelID = GetChannelId();
+ //*data << uint8(IsConstant());
}
-void Channel::MakeWrongPassword(WorldPacket* data)
+void Channel::MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_WRONG_PASSWORD_NOTICE);
}
-void Channel::MakeNotMember(WorldPacket* data)
+void Channel::MakeNotMember(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE);
}
-void Channel::MakeNotModerator(WorldPacket* data)
+void Channel::MakeNotModerator(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE);
}
-void Channel::MakePasswordChanged(WorldPacket* data, ObjectGuid guid)
+void Channel::MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_PASSWORD_CHANGED_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeOwnerChanged(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_OWNER_CHANGED_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakePlayerNotFound(WorldPacket* data, std::string const& name)
+void Channel::MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name)
{
MakeNotifyPacket(data, CHAT_PLAYER_NOT_FOUND_NOTICE);
- *data << name;
+ data.Sender = name;
}
-void Channel::MakeNotOwner(WorldPacket* data)
+void Channel::MakeNotOwner(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_OWNER_NOTICE);
}
-void Channel::MakeChannelOwner(WorldPacket* data)
+void Channel::MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data)
{
std::string name;
@@ -834,139 +836,140 @@ void Channel::MakeChannelOwner(WorldPacket* data)
name = "PLAYER_NOT_FOUND";
MakeNotifyPacket(data, CHAT_CHANNEL_OWNER_NOTICE);
- *data << ((IsConstant() || !_ownerGUID) ? "Nobody" : name);
+ data.Sender = ((IsConstant() || !_ownerGUID) ? "Nobody" : name);
}
-void Channel::MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags)
+void Channel::MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags)
{
MakeNotifyPacket(data, CHAT_MODE_CHANGE_NOTICE);
- *data << guid;
- *data << uint8(oldflags);
- *data << uint8(GetPlayerFlags(guid));
+ data.SenderGuid = guid;
+ data.OldFlags = oldFlags;
+ data.NewFlags = newFlags;
}
-void Channel::MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_ON_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_OFF_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeMuted(WorldPacket* data)
+void Channel::MakeMuted(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_MUTED_NOTICE);
}
-void Channel::MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good)
+void Channel::MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good)
{
MakeNotifyPacket(data, CHAT_PLAYER_KICKED_NOTICE);
- *data << bad;
- *data << good;
+ data.SenderGuid = good;
+ data.TargetGuid = bad;
}
-void Channel::MakeBanned(WorldPacket* data)
+void Channel::MakeBanned(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_BANNED_NOTICE);
}
-void Channel::MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good)
+void Channel::MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good)
{
MakeNotifyPacket(data, CHAT_PLAYER_BANNED_NOTICE);
- *data << bad;
- *data << good;
+ data.SenderGuid = good;
+ data.TargetGuid = bad;
}
-void Channel::MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good)
+void Channel::MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good)
{
MakeNotifyPacket(data, CHAT_PLAYER_UNBANNED_NOTICE);
- *data << bad;
- *data << good;
+ data.SenderGuid = good;
+ data.TargetGuid = bad;
}
-void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string &name)
+void Channel::MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name)
{
MakeNotifyPacket(data, CHAT_PLAYER_NOT_BANNED_NOTICE);
- *data << name;
+ data.Sender = name;
}
-void Channel::MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid)
+void Channel::MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_PLAYER_ALREADY_MEMBER_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeInvite(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_INVITE_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeInviteWrongFaction(WorldPacket* data)
+void Channel::MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_INVITE_WRONG_FACTION_NOTICE);
}
-void Channel::MakeWrongFaction(WorldPacket* data)
+void Channel::MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_WRONG_FACTION_NOTICE);
}
-void Channel::MakeInvalidName(WorldPacket* data)
+void Channel::MakeInvalidName(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_INVALID_NAME_NOTICE);
}
-void Channel::MakeNotModerated(WorldPacket* data)
+void Channel::MakeNotModerated(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_MODERATED_NOTICE);
}
-void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name)
+void Channel::MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name)
{
MakeNotifyPacket(data, CHAT_PLAYER_INVITED_NOTICE);
- *data << name;
+ data.Sender = name;
}
-void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name)
+void Channel::MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name)
{
MakeNotifyPacket(data, CHAT_PLAYER_INVITE_BANNED_NOTICE);
- *data << name;
+ data.Sender = name;
}
-void Channel::MakeThrottled(WorldPacket* data)
+void Channel::MakeThrottled(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_THROTTLED_NOTICE);
}
-void Channel::MakeNotInArea(WorldPacket* data)
+void Channel::MakeNotInArea(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_IN_AREA_NOTICE);
}
-void Channel::MakeNotInLfg(WorldPacket* data)
+void Channel::MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data)
{
MakeNotifyPacket(data, CHAT_NOT_IN_LFG_NOTICE);
}
-void Channel::MakeVoiceOn(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_VOICE_ON_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::MakeVoiceOff(WorldPacket* data, ObjectGuid guid)
+void Channel::MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid)
{
MakeNotifyPacket(data, CHAT_VOICE_OFF_NOTICE);
- *data << guid;
+ data.SenderGuid = guid;
}
-void Channel::JoinNotify(ObjectGuid guid)
+void Channel::JoinNotify(Player const* player)
{
+ ObjectGuid const& guid = player->GetGUID();
WorldPacket data(IsConstant() ? SMSG_USERLIST_ADD : SMSG_USERLIST_UPDATE, 8 + 1 + 1 + 4 + GetName().size());
data << guid;
data << uint8(GetPlayerFlags(guid));
@@ -980,8 +983,9 @@ void Channel::JoinNotify(ObjectGuid guid)
SendToAll(&data);
}
-void Channel::LeaveNotify(ObjectGuid guid)
+void Channel::LeaveNotify(Player const* player)
{
+ ObjectGuid const& guid = player->GetGUID();
WorldPacket data(SMSG_USERLIST_REMOVE, 8 + 1 + 4 + GetName().size());
data << guid;
data << uint8(GetFlags());
diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h
index 6489c8b47ad..4ee83b8fbb2 100644
--- a/src/server/game/Chat/Channels/Channel.h
+++ b/src/server/game/Chat/Channels/Channel.h
@@ -19,14 +19,11 @@
#ifndef _CHANNEL_H
#define _CHANNEL_H
-#include <list>
-#include <map>
-#include <string>
-
#include "Common.h"
#include "WorldSession.h"
-#include "WorldPacket.h"
+
+#include "Packets/ChannelPackets.h"
class Player;
@@ -122,33 +119,47 @@ class Channel
{
struct PlayerInfo
{
- ObjectGuid player;
- uint8 flags;
+ ObjectGuid PlayerGuid;
+
+ uint8 GetFlags() const { return _flags; }
+ inline bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; }
+ inline void SetFlag(uint8 flag) { _flags |= flag; }
+ inline void RemoveFlag(uint8 flag) { _flags &= ~flag; }
- bool HasFlag(uint8 flag) const { return (flags & flag) != 0; }
- void SetFlag(uint8 flag) { flags |= flag; }
- bool IsOwner() const { return (flags & MEMBER_FLAG_OWNER) != 0; }
+ bool IsOwner() const { return HasFlag(MEMBER_FLAG_OWNER); }
void SetOwner(bool state)
{
- if (state) flags |= MEMBER_FLAG_OWNER;
- else flags &= ~MEMBER_FLAG_OWNER;
+ if (state)
+ SetFlag(MEMBER_FLAG_OWNER);
+ else
+ RemoveFlag(MEMBER_FLAG_OWNER);
}
- bool IsModerator() const { return (flags & MEMBER_FLAG_MODERATOR) != 0; }
+
+ bool IsModerator() const { return HasFlag(MEMBER_FLAG_MODERATOR); }
void SetModerator(bool state)
{
- if (state) flags |= MEMBER_FLAG_MODERATOR;
- else flags &= ~MEMBER_FLAG_MODERATOR;
+ if (state)
+ SetFlag(MEMBER_FLAG_MODERATOR);
+ else
+ RemoveFlag(MEMBER_FLAG_MODERATOR);
}
- bool IsMuted() const { return (flags & MEMBER_FLAG_MUTED) != 0; }
+
+ bool IsMuted() const { return HasFlag(MEMBER_FLAG_MUTED); }
void SetMuted(bool state)
{
- if (state) flags |= MEMBER_FLAG_MUTED;
- else flags &= ~MEMBER_FLAG_MUTED;
+ if (state)
+ SetFlag(MEMBER_FLAG_MUTED);
+ else
+ RemoveFlag(MEMBER_FLAG_MUTED);
}
+
+ private:
+ uint8 _flags = MEMBER_FLAG_NONE;
};
public:
Channel(std::string const& name, uint32 channel_id, uint32 Team = 0);
+
std::string const& GetName() const { return _name; }
uint32 GetChannelId() const { return _channelId; }
bool IsConstant() const { return _channelId != 0; }
@@ -157,7 +168,7 @@ class Channel
std::string const& GetPassword() const { return _password; }
void SetPassword(std::string const& npassword) { _password = npassword; }
void SetAnnounce(bool nannounce) { _announce = nannounce; }
- uint32 GetNumPlayers() const { return playersStore.size(); }
+ uint32 GetNumPlayers() const { return _playersStore.size(); }
uint8 GetFlags() const { return _flags; }
bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; }
@@ -169,102 +180,102 @@ class Channel
void UnBan(Player const* player, std::string const& badname);
void Password(Player const* player, std::string const& pass);
void SetMode(Player const* player, std::string const& p2n, bool mod, bool set);
- void SetOwner(ObjectGuid guid, bool exclaim = true);
+ void SetOwner(ObjectGuid const& guid, bool exclaim = true);
void SetOwner(Player const* player, std::string const& name);
- void SendWhoOwner(ObjectGuid guid);
+ void SendWhoOwner(Player const* player);
void SetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, true); }
void UnsetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, false); }
void SetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, true); }
void UnsetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, false); }
void List(Player const* player);
void Announce(Player const* player);
- void Say(ObjectGuid guid, std::string const& what, uint32 lang);
+ void Say(ObjectGuid const& guid, std::string const& what, uint32 lang);
void Invite(Player const* player, std::string const& newp);
- void Voice(ObjectGuid guid1, ObjectGuid guid2);
- void DeVoice(ObjectGuid guid1, ObjectGuid guid2);
- void JoinNotify(ObjectGuid guid); // invisible notify
- void LeaveNotify(ObjectGuid guid); // invisible notify
+ void Voice(ObjectGuid const& guid1, ObjectGuid const& guid2);
+ void DeVoice(ObjectGuid const& guid1, ObjectGuid const& guid2);
+ void JoinNotify(Player const* player);
+ void LeaveNotify(Player const* player);
void SetOwnership(bool ownership) { _ownership = ownership; };
static void CleanOldChannelsInDB();
private:
// initial packet data (notify type and channel name)
- void MakeNotifyPacket(WorldPacket* data, uint8 notify_type);
+ void MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType);
// type specific packet data
- void MakeJoined(WorldPacket* data, ObjectGuid guid); //+ 0x00
- void MakeLeft(WorldPacket* data, ObjectGuid guid); //+ 0x01
- void MakeYouJoined(WorldPacket* data); //+ 0x02
- void MakeYouLeft(WorldPacket* data); //+ 0x03
- void MakeWrongPassword(WorldPacket* data); //? 0x04
- void MakeNotMember(WorldPacket* data); //? 0x05
- void MakeNotModerator(WorldPacket* data); //? 0x06
- void MakePasswordChanged(WorldPacket* data, ObjectGuid guid); //+ 0x07
- void MakeOwnerChanged(WorldPacket* data, ObjectGuid guid); //? 0x08
- void MakePlayerNotFound(WorldPacket* data, std::string const& name); //+ 0x09
- void MakeNotOwner(WorldPacket* data); //? 0x0A
- void MakeChannelOwner(WorldPacket* data); //? 0x0B
- void MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags);//+ 0x0C
- void MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid); //+ 0x0D
- void MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid); //+ 0x0E
- void MakeMuted(WorldPacket* data); //? 0x11
- void MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x12
- void MakeBanned(WorldPacket* data); //? 0x13
- void MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x14
- void MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x15
- void MakePlayerNotBanned(WorldPacket* data, std::string const& name); //? 0x16
- void MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid); //+ 0x17
- void MakeInvite(WorldPacket* data, ObjectGuid guid); //? 0x18
- void MakeInviteWrongFaction(WorldPacket* data); //? 0x19
- void MakeWrongFaction(WorldPacket* data); //? 0x1A
- void MakeInvalidName(WorldPacket* data); //? 0x1B
- void MakeNotModerated(WorldPacket* data); //? 0x1C
- void MakePlayerInvited(WorldPacket* data, std::string const& name); //+ 0x1D
- void MakePlayerInviteBanned(WorldPacket* data, std::string const& name);//? 0x1E
- void MakeThrottled(WorldPacket* data); //? 0x1F
- void MakeNotInArea(WorldPacket* data); //? 0x20
- void MakeNotInLfg(WorldPacket* data); //? 0x21
- void MakeVoiceOn(WorldPacket* data, ObjectGuid guid); //+ 0x22
- void MakeVoiceOff(WorldPacket* data, ObjectGuid guid); //+ 0x23
+ void MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x00
+ void MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x01
+ void MakeYouJoined(WorldPackets::Channel::ChannelNotify& data); //+ 0x02
+ void MakeYouLeft(WorldPackets::Channel::ChannelNotify& data); //+ 0x03
+ void MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data); //? 0x04
+ void MakeNotMember(WorldPackets::Channel::ChannelNotify& data); //? 0x05
+ void MakeNotModerator(WorldPackets::Channel::ChannelNotify& data); //? 0x06
+ void MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x07
+ void MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x08
+ void MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x09
+ void MakeNotOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0A
+ void MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0B
+ void MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags); //+ 0x0C
+ void MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0D
+ void MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0E
+ void MakeMuted(WorldPackets::Channel::ChannelNotify& data); //? 0x11
+ void MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x12
+ void MakeBanned(WorldPackets::Channel::ChannelNotify& data); //? 0x13
+ void MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x14
+ void MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x15
+ void MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x16
+ void MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x17
+ void MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x18
+ void MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x19
+ void MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x1A
+ void MakeInvalidName(WorldPackets::Channel::ChannelNotify& data); //? 0x1B
+ void MakeNotModerated(WorldPackets::Channel::ChannelNotify& data); //? 0x1C
+ void MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x1D
+ void MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x1E
+ void MakeThrottled(WorldPackets::Channel::ChannelNotify& data); //? 0x1F
+ void MakeNotInArea(WorldPackets::Channel::ChannelNotify& data); //? 0x20
+ void MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data); //? 0x21
+ void MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x22
+ void MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x23
- void SendToAll(WorldPacket* data, ObjectGuid guid = ObjectGuid::Empty);
- void SendToAllButOne(WorldPacket* data, ObjectGuid who);
- void SendToOne(WorldPacket* data, ObjectGuid who);
+ void SendToAll(WorldPacket const* data, ObjectGuid const& guid = ObjectGuid::Empty);
+ void SendToAllButOne(WorldPacket const* data, ObjectGuid const& who);
+ void SendToOne(WorldPacket const* data, ObjectGuid const& who);
- bool IsOn(ObjectGuid who) const { return playersStore.find(who) != playersStore.end(); }
- bool IsBanned(ObjectGuid guid) const { return bannedStore.find(guid) != bannedStore.end(); }
+ bool IsOn(ObjectGuid const& who) const { return _playersStore.find(who) != _playersStore.end(); }
+ bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.find(guid) != _bannedStore.end(); }
void UpdateChannelInDB() const;
void UpdateChannelUseageInDB() const;
- uint8 GetPlayerFlags(ObjectGuid guid) const
+ uint8 GetPlayerFlags(ObjectGuid const& guid) const
{
- PlayerContainer::const_iterator itr = playersStore.find(guid);
- return itr != playersStore.end() ? itr->second.flags : 0;
+ PlayerContainer::const_iterator itr = _playersStore.find(guid);
+ return itr != _playersStore.end() ? itr->second.GetFlags() : 0;
}
- void SetModerator(ObjectGuid guid, bool set)
+ void SetModerator(ObjectGuid const& guid, bool set)
{
- if (playersStore[guid].IsModerator() != set)
+ if (_playersStore[guid].IsModerator() != set)
{
- uint8 oldFlag = GetPlayerFlags(guid);
- playersStore[guid].SetModerator(set);
+ uint8 oldFlag = _playersStore[guid].GetFlags();
+ _playersStore[guid].SetModerator(set);
- WorldPacket data;
- MakeModeChange(&data, guid, oldFlag);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify data;
+ MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags());
+ SendToAll(data.Write());
}
}
- void SetMute(ObjectGuid guid, bool set)
+ void SetMute(ObjectGuid const& guid, bool set)
{
- if (playersStore[guid].IsMuted() != set)
+ if (_playersStore[guid].IsMuted() != set)
{
- uint8 oldFlag = GetPlayerFlags(guid);
- playersStore[guid].SetMuted(set);
+ uint8 oldFlag = _playersStore[guid].GetFlags();
+ _playersStore[guid].SetMuted(set);
- WorldPacket data;
- MakeModeChange(&data, guid, oldFlag);
- SendToAll(&data);
+ WorldPackets::Channel::ChannelNotify data;
+ MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags());
+ SendToAll(data.Write());
}
}
@@ -276,12 +287,12 @@ class Channel
bool _IsSaved;
uint8 _flags;
uint32 _channelId;
- uint32 _Team;
+ uint32 _team;
ObjectGuid _ownerGUID;
std::string _name;
std::string _password;
- PlayerContainer playersStore;
- BannedContainer bannedStore;
+ PlayerContainer _playersStore;
+ BannedContainer _bannedStore;
};
-#endif
+#endif
diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp
index a3a4ef69e63..ca664abffd9 100644
--- a/src/server/game/Chat/Channels/ChannelMgr.cpp
+++ b/src/server/game/Chat/Channels/ChannelMgr.cpp
@@ -23,11 +23,11 @@
ChannelMgr::~ChannelMgr()
{
- for (ChannelMap::iterator itr = channels.begin(); itr != channels.end(); ++itr)
+ for (ChannelMap::iterator itr = _channels.begin(); itr != _channels.end(); ++itr)
delete itr->second;
}
-ChannelMgr* ChannelMgr::forTeam(uint32 team)
+ChannelMgr* ChannelMgr::ForTeam(uint32 team)
{
static ChannelMgr allianceChannelMgr;
static ChannelMgr hordeChannelMgr;
@@ -40,49 +40,43 @@ ChannelMgr* ChannelMgr::forTeam(uint32 team)
if (team == HORDE)
return &hordeChannelMgr;
- return NULL;
+ return nullptr;
}
Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
- return NULL;
+ return nullptr;
wstrToLower(wname);
- ChannelMap::const_iterator i = channels.find(wname);
-
- if (i == channels.end())
+ ChannelMap::const_iterator i = _channels.find(wname);
+ if (i == _channels.end())
{
- Channel* nchan = new Channel(name, channelId, team);
- channels[wname] = nchan;
+ Channel* nchan = new Channel(name, channelId, _team);
+ _channels[wname] = nchan;
return nchan;
}
return i->second;
}
-Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pkt)
+Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool notify /*= true*/)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
- return NULL;
+ return nullptr;
wstrToLower(wname);
- ChannelMap::const_iterator i = channels.find(wname);
-
- if (i == channels.end())
+ ChannelMap::const_iterator i = _channels.find(wname);
+ if (i == _channels.end())
{
- if (pkt)
- {
- WorldPacket data;
- MakeNotOnPacket(&data, name);
- player->GetSession()->SendPacket(&data);
- }
-
- return NULL;
+ if (notify)
+ SendNotOnChannelNotify(player, name);
+
+ return nullptr;
}
return i->second;
@@ -96,22 +90,23 @@ void ChannelMgr::LeftChannel(std::string const& name)
wstrToLower(wname);
- ChannelMap::const_iterator i = channels.find(wname);
-
- if (i == channels.end())
+ ChannelMap::const_iterator i = _channels.find(wname);
+ if (i == _channels.end())
return;
Channel* channel = i->second;
if (!channel->GetNumPlayers() && !channel->IsConstant())
{
- channels.erase(wname);
+ _channels.erase(i);
delete channel;
}
}
-void ChannelMgr::MakeNotOnPacket(WorldPacket* data, std::string const& name)
+void ChannelMgr::SendNotOnChannelNotify(Player const* player, std::string const& name)
{
- data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + name.size());
- (*data) << uint8(5) << name;
+ WorldPackets::Channel::ChannelNotify notify;
+ notify.Type = CHAT_NOT_MEMBER_NOTICE;
+ notify.Channel = name;
+ player->SendDirectMessage(notify.Write());
}
diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h
index eee45ba5b97..9a8fdb10767 100644
--- a/src/server/game/Chat/Channels/ChannelMgr.h
+++ b/src/server/game/Chat/Channels/ChannelMgr.h
@@ -21,11 +21,6 @@
#include "Common.h"
#include "Channel.h"
-#include <map>
-#include <string>
-
-#include "World.h"
-
#define MAX_CHANNEL_PASS_STR 31
class ChannelMgr
@@ -33,22 +28,22 @@ class ChannelMgr
typedef std::map<std::wstring, Channel*> ChannelMap;
protected:
- ChannelMgr() : team(0) { }
+ ChannelMgr() : _team(0) { }
~ChannelMgr();
public:
- static ChannelMgr* forTeam(uint32 team);
- void setTeam(uint32 newTeam) { team = newTeam; }
+ static ChannelMgr* ForTeam(uint32 team);
+ void SetTeam(uint32 newTeam) { _team = newTeam; }
- Channel* GetJoinChannel(std::string const& name, uint32 channel_id);
- Channel* GetChannel(std::string const& name, Player* p, bool pkt = true);
+ Channel* GetJoinChannel(std::string const& name, uint32 channelId);
+ Channel* GetChannel(std::string const& name, Player* player, bool notify = true);
void LeftChannel(std::string const& name);
private:
- ChannelMap channels;
- uint32 team;
+ ChannelMap _channels;
+ uint32 _team;
- void MakeNotOnPacket(WorldPacket* data, std::string const& name);
+ static void SendNotOnChannelNotify(Player const* player, std::string const& name);
};
#endif
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index ec3bc458066..cbb0e4683aa 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -35,6 +35,8 @@
#include "SpellMgr.h"
#include "ScriptMgr.h"
#include "ChatLink.h"
+#include "Guild.h"
+#include "Group.h"
bool ChatHandler::load_command_table = true;
@@ -202,7 +204,7 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part)
void ChatHandler::SendSysMessage(const char *str)
{
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -210,8 +212,8 @@ void ChatHandler::SendSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- m_session->SendPacket(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ m_session->SendPacket(packet.Write());
}
free(buf);
@@ -220,7 +222,7 @@ void ChatHandler::SendSysMessage(const char *str)
void ChatHandler::SendGlobalSysMessage(const char *str)
{
// Chat output
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -228,8 +230,8 @@ void ChatHandler::SendGlobalSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- sWorld->SendGlobalMessage(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ sWorld->SendGlobalMessage(packet.Write());
}
free(buf);
@@ -238,7 +240,7 @@ void ChatHandler::SendGlobalSysMessage(const char *str)
void ChatHandler::SendGlobalGMSysMessage(const char *str)
{
// Chat output
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -246,8 +248,8 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- sWorld->SendGlobalGMMessage(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ sWorld->SendGlobalGMMessage(packet.Write());
}
free(buf);
@@ -628,132 +630,56 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
return ShowHelpForSubCommands(table, "", cmd);
}
-size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag,
- std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/,
- uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/,
- std::string const& addonPrefix /*= ""*/)
+void ChatHandler::BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message,
+ uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string const& addonPrefix /*= ""*/)
{
- size_t receiverGUIDPos = 0;
- data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT);
- data << uint8(chatType);
- data << int32(language);
- data << senderGUID;
- data << uint32(0); // some flags
- switch (chatType)
- {
- case CHAT_MSG_MONSTER_SAY:
- case CHAT_MSG_MONSTER_PARTY:
- case CHAT_MSG_MONSTER_YELL:
- case CHAT_MSG_MONSTER_WHISPER:
- case CHAT_MSG_MONSTER_EMOTE:
- case CHAT_MSG_RAID_BOSS_EMOTE:
- case CHAT_MSG_RAID_BOSS_WHISPER:
- case CHAT_MSG_BATTLENET:
- data << uint32(senderName.length() + 1);
- data << senderName;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer() && !receiverGUID.IsPet())
- {
- data << uint32(receiverName.length() + 1);
- data << receiverName;
- }
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_WHISPER_FOREIGN:
- data << uint32(senderName.length() + 1);
- data << senderName;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_BG_SYSTEM_NEUTRAL:
- case CHAT_MSG_BG_SYSTEM_ALLIANCE:
- case CHAT_MSG_BG_SYSTEM_HORDE:
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer())
- {
- data << uint32(receiverName.length() + 1);
- data << receiverName;
- }
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_ACHIEVEMENT:
- case CHAT_MSG_GUILD_ACHIEVEMENT:
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- default:
- if (gmMessage)
- {
- data << uint32(senderName.length() + 1);
- data << senderName;
- }
-
- if (chatType == CHAT_MSG_CHANNEL)
- {
- ASSERT(channelName.length() > 0);
- data << channelName;
- }
+ // Clear everything because same packet can be used multiple times
+ packet->Reset();
+ packet->SenderGUID.Clear();
+ packet->SenderAccountGUID.Clear();
+ packet->SenderGuildGUID.Clear();
+ packet->PartyGUID.Clear();
+ packet->TargetGUID.Clear();
+ packet->SenderName.clear();
+ packet->TargetName.clear();
+ packet->ChatFlags = CHAT_FLAG_NONE;
+
+ packet->SlashCmd = chatType;
+ packet->Language = language;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- }
-
- data << uint32(message.length() + 1);
- data << message;
- data << uint8(chatTag);
-
- if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT)
- data << uint32(achievementId);
- else if (chatType == CHAT_MSG_RAID_BOSS_WHISPER || chatType == CHAT_MSG_RAID_BOSS_EMOTE)
+ if (sender)
{
- data << float(0.0f); // Display time in middle of the screen (in seconds), defaults to 10 if not set (cannot be below 1)
- data << uint8(0); // Hide in chat frame (only shows in middle of the screen)
- }
+ packet->SenderGUID = sender->GetGUID();
- return receiverGUIDPos;
-}
+ if (Creature const* creatureSender = sender->ToCreature())
+ packet->SenderName = creatureSender->GetNameForLocaleIdx(locale);
-size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message,
- uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string const& addonPrefix /*= ""*/)
-{
- ObjectGuid senderGUID;
- std::string senderName = "";
- uint8 chatTag = 0;
- bool gmMessage = false;
- ObjectGuid receiverGUID;
- std::string receiverName = "";
- if (sender)
- {
- senderGUID = sender->GetGUID();
- senderName = sender->GetNameForLocaleIdx(locale);
if (Player const* playerSender = sender->ToPlayer())
{
- chatTag = playerSender->GetChatTag();
- gmMessage = playerSender->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT);
+ packet->SenderAccountGUID = playerSender->GetSession()->GetAccountGUID();
+ packet->ChatFlags = playerSender->GetChatFlags();
+
+ if (Guild const* guild = playerSender->GetGuild())
+ packet->SenderGuildGUID = guild->GetGUID();
+
+ if (Group const* group = playerSender->GetGroup())
+ packet->PartyGUID = group->GetGUID();
}
}
if (receiver)
{
- receiverGUID = receiver->GetGUID();
- receiverName = receiver->GetNameForLocaleIdx(locale);
+ packet->TargetGUID = receiver->GetGUID();
+ if (Creature const* creatureReceiver = receiver->ToCreature())
+ packet->TargetName = creatureReceiver->GetNameForLocaleIdx(locale);
}
- return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName, addonPrefix);
+ packet->SenderVirtualAddress = GetVirtualRealmAddress();
+ packet->TargetVirtualAddress = GetVirtualRealmAddress();
+ packet->AchievementID = achievementId;
+ packet->Channel = channelName;
+ packet->Prefix = addonPrefix;
+ packet->ChatText = message;
}
Player* ChatHandler::getSelectedPlayer()
@@ -1000,7 +926,7 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text)
if (!idS)
return 0;
- uint32 id = (uint32)atol(idS);
+ uint32 id = atoul(idS);
switch (type)
{
@@ -1020,7 +946,7 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text)
return id;
case SPELL_LINK_GLYPH:
{
- uint32 glyph_prop_id = param1_str ? (uint32)atol(param1_str) : 0;
+ uint32 glyph_prop_id = param1_str ? atoul(param1_str) : 0;
GlyphPropertiesEntry const* glyphPropEntry = sGlyphPropertiesStore.LookupEntry(glyph_prop_id);
if (!glyphPropEntry)
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 98c3bc3efbb..5db48db0fbe 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -22,6 +22,7 @@
#include "SharedDefines.h"
#include "WorldSession.h"
#include "RBAC.h"
+#include "Packets/ChatPackets.h"
#include <vector>
@@ -53,14 +54,7 @@ class ChatHandler
explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) { }
virtual ~ChatHandler() { }
- // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders
- static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag,
- std::string const& senderName = "", std::string const& receiverName = "",
- uint32 achievementId = 0, bool gmMessage = false, std::string const& channelName = "",
- std::string const& addonPrefix = "");
-
- // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders
- static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string const& addonPrefix = "");
+ static void BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string const& addonPrefix = "");
static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = NULL; return start; }
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index debee4056e7..654451af949 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -29,6 +29,79 @@
#include "SpellMgr.h"
#include "Spell.h"
+char const* ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX] =
+{
+ "None",
+ "Creature Loot",
+ "Disenchant Loot",
+ "Fishing Loot",
+ "GameObject Loot",
+ "Item Loot",
+ "Mail Loot",
+ "Milling Loot",
+ "Pickpocketing Loot",
+ "Prospecting Loot",
+ "Reference Loot",
+ "Skinning Loot",
+ "Spell Loot",
+ "Spell Impl. Target",
+ "Gossip Menu",
+ "Gossip Menu Option",
+ "Creature Vehicle",
+ "Spell Expl. Target",
+ "Spell Click Event",
+ "Quest Accept",
+ "Quest Show Mark",
+ "Vehicle Spell",
+ "SmartScript",
+ "Npc Vendor",
+ "Spell Proc",
+ "Phase Def"
+};
+
+ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] =
+{
+ { "None", false, false, false },
+ { "Aura", true, true, true },
+ { "Item Stored", true, true, true },
+ { "Item Equipped", true, false, false },
+ { "Zone", true, false, false },
+ { "Reputation", true, true, false },
+ { "Team", true, false, false },
+ { "Skill", true, true, false },
+ { "Quest Rewarded", true, false, false },
+ { "Quest Taken", true, false, false },
+ { "Drunken", true, false, false },
+ { "WorldState", true, true, false },
+ { "Active Event", true, false, false },
+ { "Instance Info", true, true, true },
+ { "Quest None", true, false, false },
+ { "Class", true, false, false },
+ { "Race", true, false, false },
+ { "Achievement", true, false, false },
+ { "Title", true, false, false },
+ { "SpawnMask", true, false, false },
+ { "Gender", true, false, false },
+ { "Unit State", true, false, false },
+ { "Map", true, false, false },
+ { "Area", true, false, false },
+ { "CreatureType", true, false, false },
+ { "Spell Known", true, false, false },
+ { "Phase", true, false, false },
+ { "Level", true, true, false },
+ { "Quest Completed", true, false, false },
+ { "Near Creature", true, true, false },
+ { "Near GameObject", true, true, false },
+ { "Object Entry or Guid", true, true, true },
+ { "Object TypeMask", true, false, false },
+ { "Relation", true, true, false },
+ { "Reaction", true, true, false },
+ { "Distance", true, true, true },
+ { "Alive", false, false, false },
+ { "Health Value", true, true, false },
+ { "Health Pct", true, true, false }
+};
+
// Checks if object meets the condition
// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: SmartAI)
bool Condition::Meets(ConditionSourceInfo& sourceInfo)
@@ -38,7 +111,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
// object not present, return false
if (!object)
{
- TC_LOG_DEBUG("condition", "Condition object not found for condition (Entry: %u Type: %u Group: %u)", SourceEntry, SourceType, SourceGroup);
+ TC_LOG_DEBUG("condition", "Condition object not found for %s", ToString().c_str());
return false;
}
bool condMeets = false;
@@ -540,6 +613,34 @@ uint32 Condition::GetMaxAvailableConditionTargets()
}
}
+std::string Condition::ToString(bool ext /*= false*/) const
+{
+ std::ostringstream ss;
+ ss << "[Condition ";
+ ss << "SourceType: " << SourceType;
+ if (SourceType < CONDITION_SOURCE_TYPE_MAX)
+ ss << " (" << ConditionMgr::StaticSourceTypeData[SourceType] << ")";
+ else
+ ss << " (Unknown)";
+ if (ConditionMgr::CanHaveSourceGroupSet(SourceType))
+ ss << ", SourceGroup: " << SourceGroup;
+ ss << ", SourceEntry: " << SourceEntry;
+ if (ConditionMgr::CanHaveSourceIdSet(SourceType))
+ ss << ", SourceId: " << SourceId;
+
+ if (ext)
+ {
+ ss << ", ConditionType: " << ConditionType;
+ if (ConditionType < CONDITION_MAX)
+ ss << " (" << ConditionMgr::StaticConditionTypeData[ConditionType].Name << ")";
+ else
+ ss << " (Unknown)";
+ }
+
+ ss << "]";
+ return ss.str();
+}
+
ConditionMgr::ConditionMgr() { }
ConditionMgr::~ConditionMgr()
@@ -602,7 +703,7 @@ bool ConditionMgr::IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo,
std::map<uint32, bool> ElseGroupStore;
for (ConditionList::const_iterator i = conditions.begin(); i != conditions.end(); ++i)
{
- TC_LOG_DEBUG("condition", "ConditionMgr::IsPlayerMeetToConditionList condType: %u val1: %u", (*i)->ConditionType, (*i)->ConditionValue1);
+ TC_LOG_DEBUG("condition", "ConditionMgr::IsPlayerMeetToConditionList %s val1: %u", (*i)->ToString().c_str(), (*i)->ConditionValue1);
if ((*i)->isLoaded())
{
//! Find ElseGroup in ElseGroupStore
@@ -623,8 +724,8 @@ bool ConditionMgr::IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo,
}
else
{
- TC_LOG_DEBUG("condition", "IsPlayerMeetToConditionList: Reference template -%u not found",
- (*i)->ReferenceId);//checked at loading, should never happen
+ TC_LOG_DEBUG("condition", "ConditionMgr::IsPlayerMeetToConditionList %s Reference template -%u not found",
+ (*i)->ToString().c_str(), (*i)->ReferenceId); // checked at loading, should never happen
}
}
@@ -663,7 +764,7 @@ bool ConditionMgr::IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, Con
return IsObjectMeetToConditionList(sourceInfo, conditions);
}
-bool ConditionMgr::CanHaveSourceGroupSet(ConditionSourceType sourceType) const
+bool ConditionMgr::CanHaveSourceGroupSet(ConditionSourceType sourceType)
{
return (sourceType == CONDITION_SOURCE_TYPE_CREATURE_LOOT_TEMPLATE ||
sourceType == CONDITION_SOURCE_TYPE_DISENCHANT_LOOT_TEMPLATE ||
@@ -687,7 +788,7 @@ bool ConditionMgr::CanHaveSourceGroupSet(ConditionSourceType sourceType) const
sourceType == CONDITION_SOURCE_TYPE_NPC_VENDOR);
}
-bool ConditionMgr::CanHaveSourceIdSet(ConditionSourceType sourceType) const
+bool ConditionMgr::CanHaveSourceIdSet(ConditionSourceType sourceType)
{
return (sourceType == CONDITION_SOURCE_TYPE_SMART_EVENT);
}
@@ -721,7 +822,7 @@ ConditionList ConditionMgr::GetConditionsForSpellClickEvent(uint32 creatureId, u
if (i != (*itr).second.end())
{
cond = (*i).second;
- TC_LOG_DEBUG("condition", "GetConditionsForSpellClickEvent: found conditions for Vehicle entry %u spell %u", creatureId, spellId);
+ TC_LOG_DEBUG("condition", "GetConditionsForSpellClickEvent: found conditions for SpellClickEvent entry %u spell %u", creatureId, spellId);
}
}
return cond;
@@ -753,7 +854,7 @@ ConditionList ConditionMgr::GetConditionsForSmartEvent(int64 entryOrGuid, uint32
if (i != (*itr).second.end())
{
cond = (*i).second;
- TC_LOG_DEBUG("condition", "GetConditionsForSmartEvent: found conditions for Smart Event entry or guid " SI64FMTD " event_id %u", entryOrGuid, eventId);
+ TC_LOG_DEBUG("condition", "GetConditionsForSmartEvent: found conditions for Smart Event entry or guid " SI64FMTD " eventId %u", entryOrGuid, eventId);
}
}
return cond;
@@ -917,26 +1018,26 @@ void ConditionMgr::LoadConditions(bool isReload)
//Grouping is only allowed for some types (loot templates, gossip menus, gossip items)
if (cond->SourceGroup && !CanHaveSourceGroupSet(cond->SourceType))
{
- TC_LOG_ERROR("sql.sql", "Condition type %u has not allowed value of SourceGroup = %u!", uint32(cond->SourceType), cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s has not allowed value of SourceGroup = %u!", cond->ToString().c_str(), cond->SourceGroup);
delete cond;
continue;
}
if (cond->SourceId && !CanHaveSourceIdSet(cond->SourceType))
{
- TC_LOG_ERROR("sql.sql", "Condition type %u has not allowed value of SourceId = %u!", uint32(cond->SourceType), cond->SourceId);
+ TC_LOG_ERROR("sql.sql", "%s has not allowed value of SourceId = %u!", cond->ToString().c_str(), cond->SourceId);
delete cond;
continue;
}
if (cond->ErrorType && cond->SourceType != CONDITION_SOURCE_TYPE_SPELL)
{
- TC_LOG_ERROR("sql.sql", "Condition type %u entry %i can't have ErrorType (%u), set to 0!", uint32(cond->SourceType), cond->SourceEntry, cond->ErrorType);
+ TC_LOG_ERROR("sql.sql", "%s can't have ErrorType (%u), set to 0!", cond->ToString().c_str(), cond->ErrorType);
cond->ErrorType = 0;
}
if (cond->ErrorTextId && !cond->ErrorType)
{
- TC_LOG_ERROR("sql.sql", "Condition type %u entry %i has any ErrorType, ErrorTextId (%u) is set, set to 0!", uint32(cond->SourceType), cond->SourceEntry, cond->ErrorTextId);
+ TC_LOG_ERROR("sql.sql", "%s has any ErrorType, ErrorTextId (%u) is set, set to 0!", cond->ToString().c_str(), cond->ErrorTextId);
cond->ErrorTextId = 0;
}
@@ -1034,7 +1135,7 @@ void ConditionMgr::LoadConditions(bool isReload)
if (!valid)
{
- TC_LOG_ERROR("sql.sql", "Not handled grouped condition, SourceGroup %u", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s Not handled grouped condition.", cond->ToString().c_str());
delete cond;
}
else
@@ -1067,21 +1168,20 @@ void ConditionMgr::LoadConditions(bool isReload)
while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u conditions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-
}
bool ConditionMgr::addToLootTemplate(Condition* cond, LootTemplate* loot)
{
if (!loot)
{
- TC_LOG_ERROR("sql.sql", "ConditionMgr: LootTemplate %u not found", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s LootTemplate %u not found.", cond->ToString().c_str(), cond->SourceGroup);
return false;
}
if (loot->addConditionItem(cond))
return true;
- TC_LOG_ERROR("sql.sql", "ConditionMgr: Item %u not found in LootTemplate %u", cond->SourceEntry, cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s Item %u not found in LootTemplate %u.", cond->ToString().c_str(), cond->SourceEntry, cond->SourceGroup);
return false;
}
@@ -1101,7 +1201,7 @@ bool ConditionMgr::addToGossipMenus(Condition* cond)
}
}
- TC_LOG_ERROR("sql.sql", "addToGossipMenus: GossipMenu %u not found", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s GossipMenu %u not found.", cond->ToString().c_str(), cond->SourceGroup);
return false;
}
@@ -1120,7 +1220,7 @@ bool ConditionMgr::addToGossipMenuItems(Condition* cond)
}
}
- TC_LOG_ERROR("sql.sql", "addToGossipMenuItems: GossipMenuId %u Item %u not found", cond->SourceGroup, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s GossipMenuId %u Item %u not found.", cond->ToString().c_str(), cond->SourceGroup, cond->SourceEntry);
return false;
}
@@ -1187,8 +1287,8 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond)
// we have overlapping masks in db
if (conditionEffMask != *itr)
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, has incorrect SourceGroup %u (spell effectMask) set - "
- "effect masks are overlapping (all SourceGroup values having given bit set must be equal) - ignoring.", cond->SourceEntry, cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s in `condition` table, has incorrect SourceGroup %u (spell effectMask) set - "
+ "effect masks are overlapping (all SourceGroup values having given bit set must be equal) - ignoring.", cond->ToString().c_str(), cond->SourceGroup);
return false;
}
}
@@ -1225,7 +1325,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (cond->SourceType == CONDITION_SOURCE_TYPE_NONE || cond->SourceType >= CONDITION_SOURCE_TYPE_MAX)
{
- TC_LOG_ERROR("sql.sql", "Invalid ConditionSourceType %u in `condition` table, ignoring.", uint32(cond->SourceType));
+ TC_LOG_ERROR("sql.sql", "%s Invalid ConditionSourceType in `condition` table, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1235,7 +1335,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Creature.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `creature_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `creature_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1243,7 +1343,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1252,7 +1352,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Disenchant.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `disenchant_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `disenchant_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1260,7 +1360,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1269,7 +1369,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Fishing.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `fishing_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `fishing_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1277,7 +1377,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1286,7 +1386,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Gameobject.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `gameobject_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `gameobject_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1294,7 +1394,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1303,7 +1403,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Item.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `item_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `item_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1311,7 +1411,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1320,7 +1420,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Mail.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `mail_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `mail_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1328,7 +1428,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1337,7 +1437,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Milling.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `milling_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `milling_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1345,7 +1445,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1354,7 +1454,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Pickpocketing.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `pickpocketing_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `pickpocketing_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1362,7 +1462,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1371,7 +1471,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Prospecting.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `prospecting_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `prospecting_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1379,7 +1479,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1388,7 +1488,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Reference.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `reference_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `reference_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1396,7 +1496,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1405,7 +1505,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Skinning.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `skinning_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `skinning_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1413,7 +1513,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1422,7 +1522,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!LootTemplates_Spell.HaveLootFor(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceGroup %u in `condition` table, does not exist in `spell_loot_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceGroup in `condition` table, does not exist in `spell_loot_template`, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1430,7 +1530,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
ItemTemplate const* pItemProto = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!pItemProto && !loot->isReference(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceType, cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceType, SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1440,13 +1540,13 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(cond->SourceEntry);
if (!spellInfo)
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s in `condition` table, SourceEntry does not exist in `spell.dbc`, ignoring.", cond->ToString().c_str());
return false;
}
if ((cond->SourceGroup > MAX_EFFECT_MASK) || !cond->SourceGroup)
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, has incorrect SourceGroup %u (spell effectMask) set, ignoring.", cond->SourceEntry, cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s in `condition` table, has incorrect SourceGroup (spell effectMask) set, ignoring.", cond->ToString().c_str());
return false;
}
@@ -1454,7 +1554,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- if (!((1<<i) & cond->SourceGroup))
+ if (!((1 << i) & cond->SourceGroup))
continue;
SpellEffectInfo const* effect = spellInfo->GetEffect(DIFFICULTY_NONE, i);
@@ -1482,7 +1582,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
}
TC_LOG_ERROR("sql.sql", "SourceEntry %u SourceGroup %u in `condition` table - spell %u does not have implicit targets of types: _AREA_, _CONE_, _NEARBY_ for effect %u, SourceGroup needs correction, ignoring.", cond->SourceEntry, origGroup, cond->SourceEntry, uint32(i));
- cond->SourceGroup &= ~(1<<i);
+ cond->SourceGroup &= ~(1 << i);
}
// all effects were removed, no need to add the condition at all
if (!cond->SourceGroup)
@@ -1493,7 +1593,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!sObjectMgr->GetCreatureTemplate(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `creature_template`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1504,48 +1604,42 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cond->SourceEntry);
if (!spellProto)
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->ToString().c_str());
return false;
}
break;
}
case CONDITION_SOURCE_TYPE_QUEST_ACCEPT:
- if (!sObjectMgr->GetQuestTemplate(cond->SourceEntry))
- {
- TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_QUEST_ACCEPT specifies non-existing quest (%u), skipped", cond->SourceEntry);
- return false;
- }
- break;
case CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK:
if (!sObjectMgr->GetQuestTemplate(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK specifies non-existing quest (%u), skipped", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry specifies non-existing quest, skipped.", cond->ToString().c_str());
return false;
}
break;
case CONDITION_SOURCE_TYPE_VEHICLE_SPELL:
if (!sObjectMgr->GetCreatureTemplate(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `creature_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->ToString().c_str());
return false;
}
if (!sSpellMgr->GetSpellInfo(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->ToString().c_str());
return false;
}
break;
case CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT:
if (!sObjectMgr->GetCreatureTemplate(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `creature_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->ToString().c_str());
return false;
}
if (!sSpellMgr->GetSpellInfo(cond->SourceEntry))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1560,13 +1654,13 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
{
if (!sObjectMgr->GetCreatureTemplate(cond->SourceGroup))
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `creature_template`, ignoring.", cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->ToString().c_str());
return false;
}
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(cond->SourceEntry);
if (!itemTemplate)
{
- TC_LOG_ERROR("sql.sql", "SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in `item_template`, ignoring.", cond->ToString().c_str());
return false;
}
break;
@@ -1586,13 +1680,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionType == CONDITION_NONE || cond->ConditionType >= CONDITION_MAX)
{
- TC_LOG_ERROR("sql.sql", "Invalid ConditionType %u at SourceEntry %u in `condition` table, ignoring.", uint32(cond->ConditionType), cond->SourceEntry);
+ TC_LOG_ERROR("sql.sql", "%s Invalid ConditionType in `condition` table, ignoring.", cond->ToString().c_str());
return false;
}
if (cond->ConditionTarget >= cond->GetMaxAvailableConditionTargets())
{
- TC_LOG_ERROR("sql.sql", "SourceType %u, SourceEntry %u, SourceGroup %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->SourceType, cond->SourceEntry, cond->SourceGroup);
+ TC_LOG_ERROR("sql.sql", "%s in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->ToString(true).c_str());
return false;
}
@@ -1602,17 +1696,15 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (!sSpellMgr->GetSpellInfo(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "Aura condition has non existing spell (Id: %d), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing spell (Id: %d), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue2 > EFFECT_2)
{
- TC_LOG_ERROR("sql.sql", "Aura condition has non existing effect index (%u) (must be 0..2), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has non existing effect index (%u) (must be 0..2), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Aura condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_ITEM:
@@ -1620,13 +1712,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(cond->ConditionValue1);
if (!proto)
{
- TC_LOG_ERROR("sql.sql", "Item condition has non existing item (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s Item (%u) does not exist, skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (!cond->ConditionValue2)
{
- TC_LOG_ERROR("sql.sql", "Item condition has 0 set for item count in value2 (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s Zero item count in ConditionValue2, skipped.", cond->ToString(true).c_str());
return false;
}
break;
@@ -1636,14 +1728,9 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(cond->ConditionValue1);
if (!proto)
{
- TC_LOG_ERROR("sql.sql", "ItemEquipped condition has non existing item (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s Item (%u) does not exist, skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "ItemEquipped condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "ItemEquipped condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_ZONEID:
@@ -1651,20 +1738,15 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(cond->ConditionValue1);
if (!areaEntry)
{
- TC_LOG_ERROR("sql.sql", "ZoneID condition has non existing area (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s Area (%u) does not exist, skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (areaEntry->ParentAreaID != 0)
{
- TC_LOG_ERROR("sql.sql", "ZoneID condition requires to be in area (%u) which is a subzone but zone expected, skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s requires to be in area (%u) which is a subzone but zone expected, skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "ZoneID condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "ZoneID condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_REPUTATION_RANK:
@@ -1672,25 +1754,18 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
FactionEntry const* factionEntry = sFactionStore.LookupEntry(cond->ConditionValue1);
if (!factionEntry)
{
- TC_LOG_ERROR("sql.sql", "Reputation condition has non existing faction (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing faction (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Reputation condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_TEAM:
{
if (cond->ConditionValue1 != ALLIANCE && cond->ConditionValue1 != HORDE)
{
- TC_LOG_ERROR("sql.sql", "Team condition specifies unknown team (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s specifies unknown team (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Team condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Team condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_SKILL:
@@ -1698,17 +1773,15 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(cond->ConditionValue1);
if (!pSkill)
{
- TC_LOG_ERROR("sql.sql", "Skill condition specifies non-existing skill (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s specifies non-existing skill (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue2 < 1 || cond->ConditionValue2 > sWorld->GetConfigMaxSkillValue())
{
- TC_LOG_ERROR("sql.sql", "Skill condition specifies skill (%u) with invalid value (%u), skipped", cond->ConditionValue1, cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s specifies skill (%u) with invalid value (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1, cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Skill condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_QUESTREWARDED:
@@ -1718,30 +1791,19 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (!sObjectMgr->GetQuestTemplate(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "Quest condition (Type: %u) points to non-existing quest (%u) for Source Entry %u. SourceGroup: %u, SourceTypeOrReferenceId: %u",
- cond->ConditionType, cond->ConditionValue1, cond->SourceEntry, cond->SourceGroup, cond->SourceType);
+ TC_LOG_ERROR("sql.sql", "%s points to non-existing quest (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2 > 1)
- TC_LOG_ERROR("sql.sql", "Quest condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Quest condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_ACTIVE_EVENT:
{
GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
- if (cond->ConditionValue1 >=events.size() || !events[cond->ConditionValue1].isValid())
+ if (cond->ConditionValue1 >= events.size() || !events[cond->ConditionValue1].isValid())
{
- TC_LOG_ERROR("sql.sql", "ActiveEvent condition has non existing event id (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing event id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "ActiveEvent condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "ActiveEvent condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_ACHIEVEMENT:
@@ -1749,56 +1811,36 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1);
if (!achievement)
{
- TC_LOG_ERROR("sql.sql", "Achivement condition has non existing achivement id (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing achivement id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Achivement condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Achivement condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_CLASS:
{
if (!(cond->ConditionValue1 & CLASSMASK_ALL_PLAYABLE))
{
- TC_LOG_ERROR("sql.sql", "Class condition has non existing classmask (%u), skipped", cond->ConditionValue1 & ~CLASSMASK_ALL_PLAYABLE);
+ TC_LOG_ERROR("sql.sql", "%s has non existing classmask (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1 & ~CLASSMASK_ALL_PLAYABLE);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Class condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Class condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_RACE:
{
if (!(cond->ConditionValue1 & RACEMASK_ALL_PLAYABLE))
{
- TC_LOG_ERROR("sql.sql", "Race condition has non existing racemask (%u), skipped", cond->ConditionValue1 & ~RACEMASK_ALL_PLAYABLE);
+ TC_LOG_ERROR("sql.sql", "%s has non existing racemask (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1 & ~RACEMASK_ALL_PLAYABLE);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Race condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Race condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_GENDER:
{
if (!Player::IsValidGender(uint8(cond->ConditionValue1)))
{
- TC_LOG_ERROR("sql.sql", "Gender condition has invalid gender (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has invalid gender (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Gender condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Gender condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_MAPID:
@@ -1806,77 +1848,54 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
MapEntry const* me = sMapStore.LookupEntry(cond->ConditionValue1);
if (!me)
{
- TC_LOG_ERROR("sql.sql", "Map condition has non existing map (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing map (%u), skipped", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Map condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Map condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_SPELL:
{
if (!sSpellMgr->GetSpellInfo(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "Spell condition has non existing spell (Id: %d), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing spell (Id: %d), skipped", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
-
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Spell condition has useless data (spell Id: %d) in value2 (%u)!", cond->ConditionValue1, cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Spell condition has useless data (spell Id: %d) in value3 (%u)!", cond->ConditionValue1, cond->ConditionValue3);
break;
}
case CONDITION_LEVEL:
{
if (cond->ConditionValue2 >= COMP_TYPE_MAX)
{
- TC_LOG_ERROR("sql.sql", "Level condition has invalid ComparisionType (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ComparisionType (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Level condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_DRUNKENSTATE:
{
if (cond->ConditionValue1 > DRUNKEN_SMASHED)
{
- TC_LOG_ERROR("sql.sql", "DrunkState condition has invalid state (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has invalid state (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue2)
- {
- TC_LOG_ERROR("sql.sql", "DrunkState condition has useless data in value2 (%u)!", cond->ConditionValue2);
- return false;
- }
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "DrunkState condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_NEAR_CREATURE:
{
if (!sObjectMgr->GetCreatureTemplate(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "NearCreature condition has non existing creature template entry (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing creature template entry (%u), skipped", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "NearCreature condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_NEAR_GAMEOBJECT:
{
if (!sObjectMgr->GetGameObjectTemplate(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "NearGameObject condition has non existing gameobject template entry (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing gameobject template entry (%u), skipped.", cond->ToString().c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "NearGameObject condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_OBJECT_ENTRY_GUID:
@@ -1886,7 +1905,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
case TYPEID_UNIT:
if (cond->ConditionValue2 && !sObjectMgr->GetCreatureTemplate(cond->ConditionValue2))
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has non existing creature template entry (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has non existing creature template entry (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
if (cond->ConditionValue3)
@@ -1895,13 +1914,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionValue2 && creatureData->id != cond->ConditionValue2)
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has guid %u set but does not match creature entry (%u), skipped", cond->ConditionValue3, cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has guid %u set but does not match creature entry (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue3, cond->ConditionValue2);
return false;
}
}
else
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has non existing creature guid (%u), skipped", cond->ConditionValue3);
+ TC_LOG_ERROR("sql.sql", "%s has non existing creature guid (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue3);
return false;
}
}
@@ -1909,7 +1928,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
case TYPEID_GAMEOBJECT:
if (cond->ConditionValue2 && !sObjectMgr->GetGameObjectTemplate(cond->ConditionValue2))
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has non existing gameobject template entry (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has non existing gameobject template entry (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
if (cond->ConditionValue3)
@@ -1918,13 +1937,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionValue2 && goData->id != cond->ConditionValue2)
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has guid %u set but does not match gameobject entry (%u), skipped", cond->ConditionValue3, cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has guid %u set but does not match gameobject entry (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue3, cond->ConditionValue2);
return false;
}
}
else
{
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has non existing gameobject guid (%u), skipped", cond->ConditionValue3);
+ TC_LOG_ERROR("sql.sql", "%s has non existing gameobject guid (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue3);
return false;
}
}
@@ -1932,12 +1951,12 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
case TYPEID_PLAYER:
case TYPEID_CORPSE:
if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has useless data in value2 (%u)!", cond->ConditionValue2);
+ LogUselessConditionValue(cond, 2, cond->ConditionValue2);
if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has useless data in value3 (%u)!", cond->ConditionValue3);
+ LogUselessConditionValue(cond, 3, cond->ConditionValue3);
break;
default:
- TC_LOG_ERROR("sql.sql", "ObjectEntryGuid condition has wrong typeid set (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has wrong typeid set (%u), skipped", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
break;
@@ -1946,51 +1965,45 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (!cond->ConditionValue1 || (cond->ConditionValue1 & ~(TYPEMASK_UNIT | TYPEMASK_PLAYER | TYPEMASK_GAMEOBJECT | TYPEMASK_CORPSE)))
{
- TC_LOG_ERROR("sql.sql", "TypeMask condition has invalid typemask set (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid typemask set (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "TypeMask condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "TypeMask condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_RELATION_TO:
{
if (cond->ConditionValue1 >= cond->GetMaxAvailableConditionTargets())
{
- TC_LOG_ERROR("sql.sql", "RelationTo condition has invalid ConditionValue1(ConditionTarget selection) (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ConditionValue1(ConditionTarget selection) (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue1 == cond->ConditionTarget)
{
- TC_LOG_ERROR("sql.sql", "RelationTo condition has ConditionValue1(ConditionTarget selection) set to self (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has ConditionValue1(ConditionTarget selection) set to self (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue2 >= RELATION_MAX)
{
- TC_LOG_ERROR("sql.sql", "RelationTo condition has invalid ConditionValue2(RelationType) (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ConditionValue2(RelationType) (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "RelationTo condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_REACTION_TO:
{
if (cond->ConditionValue1 >= cond->GetMaxAvailableConditionTargets())
{
- TC_LOG_ERROR("sql.sql", "ReactionTo condition has invalid ConditionValue1(ConditionTarget selection) (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ConditionValue1(ConditionTarget selection) (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue1 == cond->ConditionTarget)
{
- TC_LOG_ERROR("sql.sql", "ReactionTo condition has ConditionValue1(ConditionTarget selection) set to self (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has ConditionValue1(ConditionTarget selection) set to self (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (!cond->ConditionValue2)
{
- TC_LOG_ERROR("sql.sql", "mConditionValue2 condition has invalid ConditionValue2(rankMask) (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ConditionValue2(rankMask) (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
break;
@@ -1999,83 +2012,60 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionValue1 >= cond->GetMaxAvailableConditionTargets())
{
- TC_LOG_ERROR("sql.sql", "DistanceTo condition has invalid ConditionValue1(ConditionTarget selection) (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ConditionValue1(ConditionTarget selection) (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue1 == cond->ConditionTarget)
{
- TC_LOG_ERROR("sql.sql", "DistanceTo condition has ConditionValue1(ConditionTarget selection) set to self (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has ConditionValue1(ConditionTarget selection) set to self (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue3 >= COMP_TYPE_MAX)
{
- TC_LOG_ERROR("sql.sql", "DistanceTo condition has invalid ComparisionType (%u), skipped", cond->ConditionValue3);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ComparisionType (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue3);
return false;
}
break;
}
- case CONDITION_ALIVE:
- {
- if (cond->ConditionValue1)
- TC_LOG_ERROR("sql.sql", "Alive condition has useless data in value1 (%u)!", cond->ConditionValue1);
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Alive condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Alive condition has useless data in value3 (%u)!", cond->ConditionValue3);
- break;
- }
case CONDITION_HP_VAL:
{
if (cond->ConditionValue2 >= COMP_TYPE_MAX)
{
- TC_LOG_ERROR("sql.sql", "HpVal condition has invalid ComparisionType (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ComparisionType (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "HpVal condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_HP_PCT:
{
if (cond->ConditionValue1 > 100)
{
- TC_LOG_ERROR("sql.sql", "HpPct condition has too big percent value (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has too big percent value (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
if (cond->ConditionValue2 >= COMP_TYPE_MAX)
{
- TC_LOG_ERROR("sql.sql", "HpPct condition has invalid ComparisionType (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR("sql.sql", "%s has invalid ComparisionType (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "HpPct condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
- case CONDITION_AREAID:
- case CONDITION_INSTANCE_INFO:
- break;
case CONDITION_WORLD_STATE:
{
if (!sWorld->getWorldState(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "World state condition has non existing world state in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing world state in value1 (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "World state condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_PHASEID:
{
if (!sPhaseStore.LookupEntry(cond->ConditionValue1))
{
- TC_LOG_ERROR("sql.sql", "Phase condition has nonexistent phaseid in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has nonexistent phaseid in value1 (%u), skipped", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
- if (cond->ConditionValue2)
- TC_LOG_ERROR("sql.sql", "Phase condition has useless data in value2 (%u)!", cond->ConditionValue2);
- if (cond->ConditionValue3)
- TC_LOG_ERROR("sql.sql", "Phase condition has useless data in value3 (%u)!", cond->ConditionValue3);
break;
}
case CONDITION_TITLE:
@@ -2083,7 +2073,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(cond->ConditionValue1);
if (!titleEntry)
{
- TC_LOG_ERROR("sql.sql", "Title condition has non existing title in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing title in value1 (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
break;
@@ -2092,7 +2082,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionValue1 > SPAWNMASK_RAID_ALL)
{
- TC_LOG_ERROR("sql.sql", "SpawnMask condition has non existing SpawnMask in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing SpawnMask in value1 (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
break;
@@ -2101,7 +2091,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (!(cond->ConditionValue1 & UNIT_STATE_ALL_STATE_SUPPORTED))
{
- TC_LOG_ERROR("sql.sql", "UnitState condition has non existing UnitState in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing UnitState in value1 (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
break;
@@ -2110,17 +2100,34 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (!cond->ConditionValue1 || cond->ConditionValue1 > CREATURE_TYPE_GAS_CLOUD)
{
- TC_LOG_ERROR("sql.sql", "CreatureType condition has non existing CreatureType in value1 (%u), skipped", cond->ConditionValue1);
+ TC_LOG_ERROR("sql.sql", "%s has non existing CreatureType in value1 (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
return false;
}
break;
}
+ case CONDITION_INSTANCE_INFO:
+ case CONDITION_AREAID:
+ case CONDITION_ALIVE:
+ break;
default:
break;
}
+
+ if (cond->ConditionValue1 && !StaticConditionTypeData[cond->ConditionType].HasConditionValue1)
+ LogUselessConditionValue(cond, 1, cond->ConditionValue1);
+ if (cond->ConditionValue2 && !StaticConditionTypeData[cond->ConditionType].HasConditionValue2)
+ LogUselessConditionValue(cond, 2, cond->ConditionValue2);
+ if (cond->ConditionValue3 && !StaticConditionTypeData[cond->ConditionType].HasConditionValue3)
+ LogUselessConditionValue(cond, 3, cond->ConditionValue3);
+
return true;
}
+void ConditionMgr::LogUselessConditionValue(Condition* cond, uint8 index, uint32 value)
+{
+ TC_LOG_ERROR("sql.sql", "%s has useless data in ConditionValue%u (%u)!", cond->ToString(true).c_str(), index, value);
+}
+
void ConditionMgr::Clean()
{
for (ConditionReferenceContainer::iterator itr = ConditionReferenceStore.begin(); itr != ConditionReferenceStore.end(); ++itr)
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index e7f5b64716b..98bc1775e0d 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -23,6 +23,7 @@
#include "Errors.h"
#include <list>
#include <map>
+#include <string>
class Player;
class Unit;
@@ -210,6 +211,8 @@ struct Condition
uint32 GetSearcherTypeMaskForCondition();
bool isLoaded() const { return ConditionType > CONDITION_NONE || ReferenceId; }
uint32 GetMaxAvailableConditionTargets();
+
+ std::string ToString(bool ext = false) const; /// For logging purpose
};
typedef std::list<Condition*> ConditionList;
@@ -229,7 +232,6 @@ class ConditionMgr
~ConditionMgr();
public:
-
static ConditionMgr* instance()
{
static ConditionMgr instance;
@@ -244,8 +246,8 @@ class ConditionMgr
bool IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions);
bool IsObjectMeetToConditions(WorldObject* object1, WorldObject* object2, ConditionList const& conditions);
bool IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, ConditionList const& conditions);
- bool CanHaveSourceGroupSet(ConditionSourceType sourceType) const;
- bool CanHaveSourceIdSet(ConditionSourceType sourceType) const;
+ static bool CanHaveSourceGroupSet(ConditionSourceType sourceType);
+ static bool CanHaveSourceIdSet(ConditionSourceType sourceType);
ConditionList GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry);
ConditionList GetConditionsForSpellClickEvent(uint32 creatureId, uint32 spellId);
ConditionList GetConditionsForSmartEvent(int64 entryOrGuid, uint32 eventId, uint32 sourceType);
@@ -253,6 +255,16 @@ class ConditionMgr
ConditionList const* GetConditionsForPhaseDefinition(uint32 zone, uint32 entry);
ConditionList GetConditionsForNpcVendorEvent(uint32 creatureId, uint32 itemId);
+ struct ConditionTypeInfo
+ {
+ char const* Name;
+ bool HasConditionValue1;
+ bool HasConditionValue2;
+ bool HasConditionValue3;
+ };
+ static char const* StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX];
+ static ConditionTypeInfo const StaticConditionTypeData[CONDITION_MAX];
+
private:
bool isSourceTypeValid(Condition* cond);
bool addToLootTemplate(Condition* cond, LootTemplate* loot);
@@ -261,6 +273,8 @@ class ConditionMgr
bool addToSpellImplicitTargetConditions(Condition* cond);
bool IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo, ConditionList const& conditions);
+ static void LogUselessConditionValue(Condition* cond, uint8 index, uint32 value);
+
void Clean(); // free up resources
std::list<Condition*> AllocatedMemoryStore; // some garbage collection :)
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index c4d47e26468..51669deef9d 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -145,7 +145,7 @@ void LoadDB2Stores(std::string const& dataPath)
for (uint32 i = 0; i < sItemAppearanceStore.GetNumRows(); ++i)
if (ItemAppearanceEntry const* entry = sItemAppearanceStore.LookupEntry(i))
- sItemDisplayIDMap[entry->AppearanceID] = entry->DisplayID;
+ sItemDisplayIDMap[entry->FileDataID] = entry->DisplayID;
for (uint32 i = 1; i < sTaxiPathStore.GetNumRows(); ++i)
if (TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(i))
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index de5436860a6..249f95d80e4 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -21,6 +21,7 @@
#include "Common.h"
#include "DBCEnums.h"
#include "ItemPrototype.h"
+#include "Path.h"
// GCC has alternative #pragma pack(N) syntax and old gcc version does not support pack(push, N), also any gcc version does not support it at some platform
#if defined(__GNUC__)
@@ -60,15 +61,15 @@ struct ItemEntry
int32 Material; // 4
uint32 InventoryType; // 5
uint32 Sheath; // 6
- uint32 AppearanceID; // 7 (ItemAppearance.db2)
- //uint32 Unk; // 8
+ uint32 FileDataID; // 7
+ uint32 GroupSoundsID; // 8
};
struct ItemAppearanceEntry
{
uint32 ID; // 0 (reference to ItemModifiedAppearance.db2?)
uint32 DisplayID; // 1
- uint32 AppearanceID; // 2
+ uint32 FileDataID; // 2
};
struct ItemCurrencyCostEntry
@@ -153,77 +154,7 @@ struct ItemSparseEntry
float StatScalingFactor; // 98
uint32 CurrencySubstitutionID; // 99
uint32 CurrencySubstitutionCount; // 100
- //uint32 Unk3; // 101
-
- /*uint32 ID; // 0
- uint32 Quality; // 1
- uint32 Flags; // 2
- uint32 Flags2; // 3
- float Unk430_1;
- float Unk430_2;
- uint32 BuyCount;
- uint32 BuyPrice; // 4
- uint32 SellPrice; // 5
- uint32 InventoryType; // 6
- int32 AllowableClass; // 7
- int32 AllowableRace; // 8
- uint32 ItemLevel; // 9
- int32 RequiredLevel; // 10
- uint32 RequiredSkill; // 11
- uint32 RequiredSkillRank; // 12
- uint32 RequiredSpell; // 13
- uint32 RequiredHonorRank; // 14
- uint32 RequiredCityRank; // 15
- uint32 RequiredReputationFaction; // 16
- uint32 RequiredReputationRank; // 17
- uint32 MaxCount; // 18
- uint32 Stackable; // 19
- uint32 ContainerSlots; // 20
- int32 ItemStatType[MAX_ITEM_PROTO_STATS]; // 21 - 30
- uint32 ItemStatValue[MAX_ITEM_PROTO_STATS]; // 31 - 40
- int32 ItemStatUnk1[MAX_ITEM_PROTO_STATS]; // 41 - 50
- int32 ItemStatUnk2[MAX_ITEM_PROTO_STATS]; // 51 - 60
- uint32 ScalingStatDistribution; // 61
- uint32 DamageType; // 62
- uint32 Delay; // 63
- float RangedModRange; // 64
- int32 SpellId[MAX_ITEM_PROTO_SPELLS]; // 65 - 69
- int32 SpellTrigger[MAX_ITEM_PROTO_SPELLS]; // 70 - 74
- int32 SpellCharges[MAX_ITEM_PROTO_SPELLS]; // 75 - 79
- int32 SpellCooldown[MAX_ITEM_PROTO_SPELLS]; // 80 - 84
- int32 SpellCategory[MAX_ITEM_PROTO_SPELLS]; // 85 - 89
- int32 SpellCategoryCooldown[MAX_ITEM_PROTO_SPELLS]; // 90 - 94
- uint32 Bonding; // 95
- LocalizedString* Name; // 96
- LocalizedString* Name2; // 97
- LocalizedString* Name3; // 98
- LocalizedString* Name4; // 99
- LocalizedString* Description; // 100
- uint32 PageText; // 101
- uint32 LanguageID; // 102
- uint32 PageMaterial; // 103
- uint32 StartQuest; // 104
- uint32 LockID; // 105
- int32 Material; // 106
- uint32 Sheath; // 107
- uint32 RandomProperty; // 108
- uint32 RandomSuffix; // 109
- uint32 ItemSet; // 110
- uint32 Area; // 112
- uint32 Map; // 113
- uint32 BagFamily; // 114
- uint32 TotemCategory; // 115
- uint32 Color[MAX_ITEM_PROTO_SOCKETS]; // 116 - 118
- uint32 Content[MAX_ITEM_PROTO_SOCKETS]; // 119 - 121
- int32 SocketBonus; // 122
- uint32 GemProperties; // 123
- float ArmorDamageModifier; // 124
- uint32 Duration; // 125
- uint32 ItemLimitCategory; // 126
- uint32 HolidayId; // 127
- float StatScalingFactor; // 128
- int32 CurrencySubstitutionId; // 129
- int32 CurrencySubstitutionCount; // 130*/
+ uint32 ItemNameDescriptionID; // 101
};
#define MAX_ITEM_EXT_COST_ITEMS 5
@@ -232,13 +163,13 @@ struct ItemSparseEntry
struct ItemExtendedCostEntry
{
uint32 ID; // 0 extended-cost entry id
- //uint32 reqhonorpoints; // 1 required honor points
- //uint32 reqarenapoints; // 2 required arena points
+ uint32 RequiredHonorPoints; // 1 required honor points
+ uint32 RequiredArenaPoints; // 2 required arena points
uint32 RequiredArenaSlot; // 3 arena slot restrictions (min slot value)
uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // 4-8 required item id
uint32 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // 9-13 required count of 1st item
uint32 RequiredPersonalArenaRating; // 14 required personal arena rating
- //uint32 ItemPurchaseGroup; // 15
+ uint32 ItemPurchaseGroup; // 15
uint32 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES];// 16-20 required curency id
uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES];// 21-25 required curency count
uint32 RequiredFactionId;
diff --git a/src/server/game/DataStores/DB2Utility.cpp b/src/server/game/DataStores/DB2Utility.cpp
index 37b7fb949db..a835547b640 100644
--- a/src/server/game/DataStores/DB2Utility.cpp
+++ b/src/server/game/DataStores/DB2Utility.cpp
@@ -42,15 +42,15 @@ void DB2Utilities::WriteItemDbReply(DB2Storage<ItemEntry> const& /*store*/, uint
buffer << uint32(proto->Class);
buffer << uint32(proto->SubClass);
buffer << int32(proto->SoundOverrideSubclass);
- buffer << uint32(proto->Material);
- buffer << uint32(proto->DisplayInfoID);
+ buffer << int32(proto->Material);
buffer << uint32(proto->InventoryType);
buffer << uint32(proto->Sheath);
+ buffer << uint32(proto->FileDataID);
+ buffer << uint32(proto->GroupSoundsID);
}
void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*store*/, uint32 id, uint32 locale, ByteBuffer& buffer)
{
- /* TODO: 6.x update
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(id);
ASSERT(proto);
@@ -58,10 +58,12 @@ void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*s
buffer << uint32(proto->ItemId);
buffer << uint32(proto->Quality);
- buffer << uint32(proto->Flags);
- buffer << uint32(proto->Flags2);
- buffer << float(proto->Unk430_1);
- buffer << float(proto->Unk430_2);
+
+ for (uint32 i = 0; i < MAX_ITEM_PROTO_FLAGS; ++i)
+ buffer << uint32(proto->Flags[i]);
+
+ buffer << float(proto->Unk1);
+ buffer << float(proto->Unk2);
buffer << uint32(proto->BuyCount);
buffer << int32(proto->BuyPrice);
buffer << uint32(proto->SellPrice);
@@ -97,25 +99,6 @@ void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*s
buffer << uint32(proto->DamageType);
buffer << uint32(proto->Delay);
buffer << float(proto->RangedModRange);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << int32(proto->Spells[x].SpellId);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << uint32(proto->Spells[x].SpellTrigger);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << int32(proto->Spells[x].SpellCharges);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << int32(proto->Spells[x].SpellCooldown);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << uint32(proto->Spells[x].SpellCategory);
-
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- buffer << int32(proto->Spells[x].SpellCategoryCooldown);
-
buffer << uint32(proto->Bonding);
// item name
@@ -145,8 +128,8 @@ void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*s
buffer << uint32(proto->LockID);
buffer << int32(proto->Material);
buffer << uint32(proto->Sheath);
- buffer << int32(proto->RandomProperty);
- buffer << int32(proto->RandomSuffix);
+ buffer << uint32(proto->RandomProperty);
+ buffer << uint32(proto->RandomSuffix);
buffer << uint32(proto->ItemSet);
buffer << uint32(proto->Area);
@@ -157,9 +140,6 @@ void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*s
for (uint32 x = 0; x < MAX_ITEM_PROTO_SOCKETS; ++x)
buffer << uint32(proto->Socket[x].Color);
- for (uint32 x = 0; x < MAX_ITEM_PROTO_SOCKETS; ++x)
- buffer << uint32(proto->Socket[x].Content);
-
buffer << uint32(proto->socketBonus);
buffer << uint32(proto->GemProperties);
buffer << float(proto->ArmorDamageModifier);
@@ -169,5 +149,5 @@ void DB2Utilities::WriteItemSparseDbReply(DB2Storage<ItemSparseEntry> const& /*s
buffer << float(proto->StatScalingFactor); // StatScalingFactor
buffer << uint32(proto->CurrencySubstitutionId);
buffer << uint32(proto->CurrencySubstitutionCount);
- */
+ buffer << uint32(proto->ItemNameDescriptionID);
}
diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h
index 5d2f374f2a7..f47efa43f89 100644
--- a/src/server/game/DataStores/DB2fmt.h
+++ b/src/server/game/DataStores/DB2fmt.h
@@ -19,11 +19,11 @@
#define TRINITY_DB2SFRM_H
char const HolidaysEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix";
-char const Itemfmt[]="niiiiiiix";
+char const Itemfmt[]="niiiiiiii";
char const ItemAppearanceEntryfmt[]="nii";
char const ItemCurrencyCostfmt[]="xn";
-char const ItemSparsefmt[]="niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifisssssiiiiiiiiiiiiiiiiiiifiiifiix";
-char const ItemExtendedCostEntryfmt[]="nxxiiiiiiiiiiiixiiiiiiiiiiiiii";
+char const ItemSparsefmt[]="niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii";
+char const ItemExtendedCostEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
char const ItemEffectEntryfmt[]="niiiiiiii";
char const KeyChainfmt[]="nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const OverrideSpellDataEntryfmt[] = "niiiiiiiiiixx";
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index db35db880be..a4ba710f5db 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -17,6 +17,7 @@
*/
#include "DBCStores.h"
+#include "DB2Stores.h"
#include "Containers.h"
#include "Log.h"
#include "SharedDefines.h"
@@ -75,6 +76,7 @@ DBCStorage <ChrClassesEntry> sChrClassesStore(ChrClassesEntryfmt);
DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt);
DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore(ChrClassesXPowerTypesfmt);
DBCStorage <ChrSpecializationEntry> sChrSpecializationStore(ChrSpecializationEntryfmt);
+ChrSpecializationByIndexArray sChrSpecializationByIndexStore;
SpecializationSpellsBySpecStore sSpecializationSpellsBySpecStore;
DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore(CinematicSequencesEntryfmt);
DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore(CreatureDisplayInfofmt);
@@ -352,6 +354,10 @@ void LoadDBCStores(const std::string& dataPath)
}
LoadDBC(availableDbcLocales, bad_dbc_files, sChrSpecializationStore, dbcPath, "ChrSpecialization.dbc");
+ memset(sChrSpecializationByIndexStore, 0, sizeof(sChrSpecializationByIndexStore));
+ for (uint32 i = 0; i < sChrSpecializationStore.GetNumRows(); ++i)
+ if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(i))
+ sChrSpecializationByIndexStore[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec;
LoadDBC(availableDbcLocales, bad_dbc_files, sCinematicSequencesStore, dbcPath, "CinematicSequences.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureDisplayInfoStore, dbcPath, "CreatureDisplayInfo.dbc");//19116
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index bb7885c8bc2..e9a9b3c692f 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -22,6 +22,7 @@
#include "Common.h"
#include "DBCStore.h"
#include "DBCStructure.h"
+#include "SharedDefines.h"
#include <list>
@@ -90,6 +91,7 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u
typedef std::set<SpecializationSpellsEntry const*> SpecializationSpellsBySpecEntry;
typedef std::unordered_map<uint32, SpecializationSpellsBySpecEntry> SpecializationSpellsBySpecStore;
+typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES][MAX_SPECIALIZATIONS];
typedef std::unordered_map<uint32, TalentEntry const*> TalentBySpellIDMap;
extern DBCStorage <AchievementEntry> sAchievementStore;
@@ -110,6 +112,7 @@ extern DBCStorage <ChrClassesEntry> sChrClassesStore;
extern DBCStorage <ChrRacesEntry> sChrRacesStore;
extern DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore;
extern DBCStorage <ChrSpecializationEntry> sChrSpecializationStore;
+extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore;
extern DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore;
extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
extern DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 803e2dcf96b..77182b1bdf9 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -812,7 +812,7 @@ struct CreatureDisplayInfoEntry
//uint32 ObjectEffectPackageID; // 16
//uint32 AnimReplacementSetID; // 17
//uint32 Flags; // 18
- //uint32 Gender; // 19
+ int32 Gender; // 19
//uint32 StateSpellVisualKitID; // 20
};
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 867e64ef92e..9f53cb09ad8 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -43,7 +43,7 @@ char const ChrRacesEntryfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx";
char const ChrClassesXPowerTypesfmt[] = "nii";
char const ChrSpecializationEntryfmt[] = "nxiiiiiiiiixxxii";
char const CinematicSequencesEntryfmt[] = "nxxxxxxxxx";
-char const CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxxxxxxx";
+char const CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxxxxxix";
char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx";
char const CreatureFamilyfmt[] = "nfifiiiiixsx";
char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx";
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index d342bb3c431..05405d6eddb 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -51,6 +51,7 @@
#include "WaypointMovementGenerator.h"
#include "World.h"
#include "WorldPacket.h"
+#include "CombatPackets.h"
#include "Transport.h"
@@ -1829,12 +1830,12 @@ Player* Creature::SelectNearestPlayer(float distance) const
void Creature::SendAIReaction(AiReaction reactionType)
{
- WorldPacket data(SMSG_AI_REACTION, 12);
+ WorldPackets::Combat::AIReaction packet;
- data << GetGUID();
- data << uint32(reactionType);
+ packet.UnitGUID = GetGUID();
+ packet.Reaction = reactionType;
- ((WorldObject*)this)->SendMessageToSet(&data, true);
+ SendMessageToSet(packet.Write(), true);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_AI_REACTION, type %u.", reactionType);
}
@@ -2576,7 +2577,7 @@ void Creature::SetDisplayId(uint32 modelId)
}
}
-void Creature::SetTarget(ObjectGuid guid)
+void Creature::SetTarget(ObjectGuid const& guid)
{
if (!_focusSpell)
SetGuidValue(UNIT_FIELD_TARGET, guid);
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 2de22942a62..523a2eb2f4d 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -287,8 +287,8 @@ struct CreatureModelInfo
{
float bounding_radius;
float combat_reach;
- uint8 gender;
- uint32 modelid_other_gender;
+ int8 gender;
+ uint32 displayId_other_gender;
};
// Benchmarked: Faster than std::map (insert/find)
@@ -392,11 +392,13 @@ struct VendorItemCount
typedef std::list<VendorItemCount> VendorItemCounts;
+#define MAX_TRAINERSPELL_ABILITY_REQS 3
+
struct TrainerSpell
{
TrainerSpell() : SpellID(0), MoneyCost(0), ReqSkillLine(0), ReqSkillRank(0), ReqLevel(0)
{
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (uint8 i = 0; i < MAX_TRAINERSPELL_ABILITY_REQS; ++i)
ReqAbility[i] = 0;
}
@@ -405,7 +407,7 @@ struct TrainerSpell
uint32 ReqSkillLine;
uint32 ReqSkillRank;
uint32 ReqLevel;
- uint32 ReqAbility[MAX_SPELL_EFFECTS];
+ uint32 ReqAbility[MAX_TRAINERSPELL_ABILITY_REQS];
// helpers
bool IsCastable() const { return ReqAbility[0] != SpellID; }
@@ -674,7 +676,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
bool m_isTempWorldObject; //true when possessed
// Handling caster facing during spellcast
- void SetTarget(ObjectGuid guid) override;
+ void SetTarget(ObjectGuid const& guid) override;
void FocusTarget(Spell const* focusSpell, WorldObject const* target);
void ReleaseFocus(Spell const* focusSpell);
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 4d14ede70fe..2b07683d335 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -23,6 +23,8 @@
#include "WorldPacket.h"
#include "WorldSession.h"
#include "Formulas.h"
+#include "QuestPackets.h"
+#include "NPCPackets.h"
GossipMenu::GossipMenu()
{
@@ -192,44 +194,45 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
{
_gossipMenu.SetSenderGUID(objectGUID);
- WorldPacket data(SMSG_GOSSIP_MESSAGE, 100); // guess size
- data << objectGUID;
- data << uint32(_gossipMenu.GetMenuId()); // new 2.4.0
- data << uint32(titleTextId);
- data << uint32(_gossipMenu.GetMenuItemCount()); // max count 0x10
+ WorldPackets::NPC::GossipMessage packet;
+ packet.GossipGUID = objectGUID;
+ packet.TextID = titleTextId;
+ packet.GossipOptions.resize(_gossipMenu.GetMenuItems().size());
+ uint32 count = 0;
for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
{
+ WorldPackets::NPC::ClientGossipOptions& opt = packet.GossipOptions[count];
GossipMenuItem const& item = itr->second;
- data << uint32(itr->first);
- data << uint8(item.MenuItemIcon);
- data << uint8(item.IsCoded); // makes pop up box password
- data << uint32(item.BoxMoney); // money required to open menu, 2.0.3
- data << item.Message; // text for gossip item
- data << item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
+ opt.ClientOption = itr->first;
+ opt.OptionNPC = item.MenuItemIcon;
+ opt.OptionFlags = item.IsCoded; // makes pop up box password
+ opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3
+ opt.Text = item.Message; // text for gossip item
+ opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
+ ++count;
}
- size_t count_pos = data.wpos();
- data << uint32(0); // max count 0x20
- uint32 count = 0;
-
// Store this instead of checking the Singleton every loop iteration
bool questLevelInTitle = sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS);
+ packet.GossipText.resize(_questMenu.GetMenuItemCount());
+ count = 0;
for (uint8 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
{
QuestMenuItem const& item = _questMenu.GetItem(i);
uint32 questID = item.QuestId;
if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
{
- ++count;
- data << uint32(questID);
- data << uint32(item.QuestIcon);
- data << int32(quest->GetQuestLevel());
- data << uint32(quest->GetFlags()); // 3.3.3 quest flags
- data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation
- std::string title = quest->GetTitle();
+ WorldPackets::NPC::ClientGossipText& text = packet.GossipText[count];
+ text.QuestID = questID;
+ text.QuestType = item.QuestIcon;
+ text.QuestLevel = quest->GetQuestLevel();
+ text.QuestFlags[0] = quest->GetFlags();
+ text.QuestFlags[1] = 0;
+ text.Repeatable = quest->IsRepeatable();
+ std::string title = quest->GetTitle();
int32 locale = _session->GetSessionDbLocaleIndex();
if (locale >= 0)
if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
@@ -238,12 +241,15 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
if (questLevelInTitle)
AddQuestLevelToTitle(title, quest->GetQuestLevel());
- data << title; // max 0x200
+ text.QuestTitle = title;
+ ++count;
}
}
- data.put<uint8>(count_pos, count);
- _session->SendPacket(&data);
+ // Shrink to the real size
+ packet.GossipText.resize(count);
+
+ _session->SendPacket(packet.Write());
}
void PlayerMenu::SendCloseGossip()
@@ -373,11 +379,11 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string
void PlayerMenu::SendQuestGiverStatus(uint32 questStatus, ObjectGuid npcGUID) const
{
- WorldPacket data(SMSG_QUESTGIVER_STATUS, 8 + 4);
- data << npcGUID;
- data << uint32(questStatus);
+ WorldPackets::Quest::QuestGiverStatus packet;
+ packet.QuestGiver.Guid = npcGUID;
+ packet.QuestGiver.Status = questStatus;
- _session->SendPacket(&data);
+ _session->SendPacket(packet.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC=%s, status=%u", npcGUID.ToString().c_str(), questStatus);
}
diff --git a/src/server/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h
index e28e8a21678..fe6051b4f9c 100644
--- a/src/server/game/Entities/Item/ItemPrototype.h
+++ b/src/server/game/Entities/Item/ItemPrototype.h
@@ -611,6 +611,7 @@ struct ItemEffect
#pragma pack(pop)
#endif
+#define MAX_ITEM_PROTO_FLAGS 3
#define MAX_ITEM_PROTO_DAMAGES 2 // changed in 3.1.0
#define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_STATS 10
@@ -623,8 +624,10 @@ struct ItemTemplate
int32 SoundOverrideSubclass; // < 0: id from ItemSubClass.dbc, used to override weapon sound from actual SubClass
std::string Name1;
uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc
+ uint32 FileDataID;
+ uint32 GroupSoundsID;
uint32 Quality;
- uint32 Flags[3];
+ uint32 Flags[MAX_ITEM_PROTO_FLAGS];
float Unk1;
float Unk2;
uint32 BuyCount;
@@ -678,6 +681,7 @@ struct ItemTemplate
float StatScalingFactor;
uint32 CurrencySubstitutionId; // May be used instead of a currency
uint32 CurrencySubstitutionCount;
+ uint32 ItemNameDescriptionID;
// extra fields, not part of db2 files
float DamageMin;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index e482e0a449d..d2ac852bbfe 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1001,7 +1001,7 @@ void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uin
for (uint32 index = 0; index < count; ++index)
{
- m_uint32Values[startOffset + index] = atol(tokens[index]);
+ m_uint32Values[startOffset + index] = atoul(tokens[index]);
_changesMask.SetBit(startOffset + index);
}
}
@@ -2359,19 +2359,19 @@ void Object::ForceValuesUpdateAtIndex(uint32 i)
}
}
-void WorldObject::SendMessageToSet(WorldPacket* data, bool self)
+void WorldObject::SendMessageToSet(WorldPacket const* data, bool self)
{
if (IsInWorld())
SendMessageToSetInRange(data, GetVisibilityRange(), self);
}
-void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*self*/)
+void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/)
{
Trinity::MessageDistDeliverer notifier(this, data, dist);
VisitNearbyWorldObject(dist, notifier);
}
-void WorldObject::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr)
+void WorldObject::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr)
{
Trinity::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr);
VisitNearbyWorldObject(GetVisibilityRange(), notifier);
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index bae3a8b07c1..d2dd0108d20 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -661,9 +661,9 @@ class WorldObject : public Object, public WorldLocation
virtual void CleanupsBeforeDelete(bool finalCleanup = true); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units
- virtual void SendMessageToSet(WorldPacket* data, bool self);
- virtual void SendMessageToSetInRange(WorldPacket* data, float dist, bool self);
- virtual void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr);
+ virtual void SendMessageToSet(WorldPacket const* data, bool self);
+ virtual void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self);
+ virtual void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr);
virtual uint8 getLevelForTarget(WorldObject const* /*target*/) const { return 1; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 567b240db07..cfc7e233458 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -28,7 +28,6 @@
#include "BattlegroundMgr.h"
#include "BattlegroundScore.h"
#include "CellImpl.h"
-#include "Channel.h"
#include "ChannelMgr.h"
#include "CharacterDatabaseCleaner.h"
#include "CharacterPackets.h"
@@ -40,6 +39,7 @@
#include "DatabaseEnv.h"
#include "DB2Stores.h"
#include "DisableMgr.h"
+#include "EquipmentSetPackets.h"
#include "Formulas.h"
#include "GameEventMgr.h"
#include "GameObjectAI.h"
@@ -86,6 +86,10 @@
#include "WorldPacket.h"
#include "WorldSession.h"
#include "WorldStatePackets.h"
+#include "MiscPackets.h"
+#include "ChatPackets.h"
+#include "MovementPackets.h"
+#include "ItemPackets.h"
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -168,7 +172,7 @@ void PlayerTaxi::LoadTaxiMask(std::string const &data)
for (Tokenizer::const_iterator iter = tokens.begin(); index < TaxiMaskSize && iter != tokens.end(); ++iter, ++index)
{
// load and set bits only for existing taxi nodes
- m_taximask[index] = sTaxiNodesMask[index] & uint32(atol(*iter));
+ m_taximask[index] = sTaxiNodesMask[index] & atoul(*iter);
}
}
@@ -195,7 +199,7 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint3
for (Tokenizer::const_iterator iter = Tokenizer.begin(); iter != Tokenizer.end(); ++iter)
{
- uint32 node = uint32(atol(*iter));
+ uint32 node = atoul(*iter);
AddTaxiDestination(node);
}
@@ -1145,14 +1149,17 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
// special amount for food/drink
if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD_DRINK)
{
- switch (iProto->Effects[0].Category)
+ if (iProto->Effects.size() >= 1)
{
- case SPELL_CATEGORY_FOOD: // food
- count = getClass() == CLASS_DEATH_KNIGHT ? 10 : 4;
- break;
- case SPELL_CATEGORY_DRINK: // drink
- count = 2;
- break;
+ switch (iProto->Effects[0].Category)
+ {
+ case SPELL_CATEGORY_FOOD: // food
+ count = getClass() == CLASS_DEATH_KNIGHT ? 10 : 4;
+ break;
+ case SPELL_CATEGORY_DRINK: // drink
+ count = 2;
+ break;
+ }
}
if (iProto->GetMaxStackSize() < count)
count = iProto->GetMaxStackSize();
@@ -1926,18 +1933,18 @@ void Player::ToggleDND()
ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_DND);
}
-uint8 Player::GetChatTag() const
+uint8 Player::GetChatFlags() const
{
- uint8 tag = CHAT_TAG_NONE;
+ uint8 tag = CHAT_FLAG_NONE;
if (isGMChat())
- tag |= CHAT_TAG_GM;
+ tag |= CHAT_FLAG_GM;
if (isDND())
- tag |= CHAT_TAG_DND;
+ tag |= CHAT_FLAG_DND;
if (isAFK())
- tag |= CHAT_TAG_AFK;
+ tag |= CHAT_FLAG_AFK;
if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER))
- tag |= CHAT_TAG_DEV;
+ tag |= CHAT_FLAG_DEV;
return tag;
}
@@ -2129,18 +2136,16 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!GetSession()->PlayerLogout())
{
// send transfer packets
- WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
- data.WriteBit(0); // unknown
+ WorldPackets::Movement::TransferPending transferPending;
+ transferPending.MapID = mapid;
if (Transport* transport = GetTransport())
{
- data.WriteBit(1); // has transport
- data << GetMapId() << transport->GetEntry();
+ transferPending.Ship.HasValue = true;
+ transferPending.Ship.Value.ID = transport->GetEntry();
+ transferPending.Ship.Value.OriginMapID = GetMapId();
}
- else
- data.WriteBit(0); // has transport
- data << uint32(mapid);
- GetSession()->SendPacket(&data);
+ GetSession()->SendPacket(transferPending.Write());
}
// remove from old map now
@@ -2154,14 +2159,12 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!GetSession()->PlayerLogout())
{
- WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
- data << float(m_teleport_dest.GetPositionX());
- data << float(m_teleport_dest.GetOrientation());
- data << float(m_teleport_dest.GetPositionZ());
- data << uint32(mapid);
- data << float(m_teleport_dest.GetPositionY());
+ WorldPackets::Movement::NewWorld packet;
+ packet.MapID = mapid;
+ packet.Pos = m_teleport_dest;
+ packet.Reason = NEW_WORLD_NORMAL;
- GetSession()->SendPacket(&data);
+ SendDirectMessage(packet.Write());
SendSavedInstances();
}
@@ -3163,6 +3166,7 @@ void Player::SendKnownSpells()
WorldPackets::Spell::SendKnownSpells knownSpells;
knownSpells.InitialLogin = false; /// @todo
+ knownSpells.KnownSpells.reserve(m_spells.size());
for (PlayerSpellMap::value_type const& spell : m_spells)
{
if (spell.second->state == PLAYERSPELL_REMOVED)
@@ -5221,8 +5225,8 @@ void Player::CleanupChannels()
{
Channel* ch = *m_channels.begin();
m_channels.erase(m_channels.begin()); // remove from player's channel list
- ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam()))
+ ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam()))
cMgr->LeftChannel(ch->GetName()); // deleted channel if empty
}
TC_LOG_DEBUG("chat.system", "Player %s: channels cleaned up!", GetName().c_str());
@@ -5237,12 +5241,10 @@ void Player::UpdateLocalChannels(uint32 newZone)
if (!current_zone)
return;
- ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam());
+ ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam());
if (!cMgr)
return;
- std::string current_zone_name = current_zone->ZoneName;
-
for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
{
if (ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i))
@@ -5275,7 +5277,7 @@ void Player::UpdateLocalChannels(uint32 newZone)
if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY)
currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY);
else
- currentNameExt = current_zone_name.c_str();
+ currentNameExt = current_zone->ZoneName;
snprintf(new_channel_name_buf, 100, channel->Name_lang, currentNameExt);
@@ -6199,29 +6201,20 @@ int16 Player::GetSkillTempBonusValue(uint32 skill) const
void Player::SendActionButtons(uint32 state) const
{
- WorldPacket data(SMSG_ACTION_BUTTONS, 1+(MAX_ACTION_BUTTONS*4));
- /*
- state can be 0, 1, 2
- 0 - Sends initial action buttons, client does not validate if we have the spell or not
- 1 - Used used after spec swaps, client validates if a spell is known.
- 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
- */
- if (state != 2)
+ WorldPackets::Spell::UpdateActionButtons packet;
+
+ for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
{
- for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
- {
- ActionButtonList::const_iterator itr = m_actionButtons.find(button);
- if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
- data << uint32(itr->second.packedData);
- else
- data << uint32(0);
- }
+ ActionButtonList::const_iterator itr = m_actionButtons.find(button);
+ if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
+ packet.ActionButtons[button] = uint32(itr->second.packedData);
+ else
+ packet.ActionButtons[button] = 0;
}
- else
- data.resize(MAX_ACTION_BUTTONS * 4); // insert crap, client doesnt even parse this for state == 2
- data << uint8(state);
- GetSession()->SendPacket(&data);
+ packet.Reason = state;
+
+ SendDirectMessage(packet.Write());
TC_LOG_INFO("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup());
}
@@ -6351,7 +6344,7 @@ void Player::SaveRecallPosition()
m_recallO = GetOrientation();
}
-void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self)
+void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self)
{
if (self)
GetSession()->SendPacket(data);
@@ -6360,7 +6353,7 @@ void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self)
VisitNearbyWorldObject(dist, notifier);
}
-void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self, bool own_team_only)
+void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only)
{
if (self)
GetSession()->SendPacket(data);
@@ -6369,7 +6362,7 @@ void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self, b
VisitNearbyWorldObject(dist, notifier);
}
-void Player::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr)
+void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr)
{
if (skipped_rcvr != this)
GetSession()->SendPacket(data);
@@ -6380,7 +6373,7 @@ void Player::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr)
VisitNearbyWorldObject(GetVisibilityRange(), notifier);
}
-void Player::SendDirectMessage(WorldPacket const* data)
+void Player::SendDirectMessage(WorldPacket const* data) const
{
m_session->SendPacket(data);
}
@@ -8358,25 +8351,28 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8
{
ItemTemplate const* proto = item->GetTemplate();
// special learning case
- if (proto->Effects[0].SpellID == 483 || proto->Effects[0].SpellID == 55884)
+ if (proto->Effects.size() >= 2)
{
- uint32 learn_spell_id = proto->Effects[0].SpellID;
- uint32 learning_spell_id = proto->Effects[1].SpellID;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
- if (!spellInfo)
+ if (proto->Effects[0].SpellID == 483 || proto->Effects[0].SpellID == 55884)
{
- TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ", proto->ItemId, learn_spell_id);
- SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, item, NULL);
+ uint32 learn_spell_id = proto->Effects[0].SpellID;
+ uint32 learning_spell_id = proto->Effects[1].SpellID;
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
+ if (!spellInfo)
+ {
+ TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ", proto->ItemId, learn_spell_id);
+ SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, item, NULL);
+ return;
+ }
+
+ Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
+ spell->m_CastItem = item;
+ spell->m_cast_count = cast_count; //set count of casts
+ spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
+ spell->prepare(&targets);
return;
}
-
- Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
- spell->m_CastItem = item;
- spell->m_cast_count = cast_count; //set count of casts
- spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
- spell->prepare(&targets);
- return;
}
// use triggered flag only for items with many spell casts and for not first cast
@@ -11537,9 +11533,10 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const
return EQUIP_ERR_CLIENT_LOCKED_OUT;
// learning (recipes, mounts, pets, etc.)
- if (proto->Effects[0].SpellID == 483 || proto->Effects[0].SpellID == 55884)
- if (HasSpell(proto->Effects[1].SpellID))
- return EQUIP_ERR_INTERNAL_BAG_ERROR;
+ if (proto->Effects.size() >= 2)
+ if (proto->Effects[0].SpellID == 483 || proto->Effects[0].SpellID == 55884)
+ if (HasSpell(proto->Effects[1].SpellID))
+ return EQUIP_ERR_INTERNAL_BAG_ERROR;
return EQUIP_ERR_OK;
}
@@ -16745,28 +16742,26 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result)
if (!result)
return;
- uint32 count = 0;
do
{
Field* fields = result->Fetch();
- EquipmentSet eqSet;
+ EquipmentSetInfo eqSet;
- eqSet.Guid = fields[0].GetUInt64();
- uint8 index = fields[1].GetUInt8();
- eqSet.Name = fields[2].GetString();
- eqSet.IconName = fields[3].GetString();
- eqSet.IgnoreMask = fields[4].GetUInt32();
- eqSet.state = EQUIPMENT_SET_UNCHANGED;
+ eqSet.Data.Guid = fields[0].GetUInt64();
+ eqSet.Data.SetID = fields[1].GetUInt8();
+ eqSet.Data.SetName = fields[2].GetString();
+ eqSet.Data.SetIcon = fields[3].GetString();
+ eqSet.Data.IgnoreMask = fields[4].GetUInt32();
+ eqSet.State = EQUIPMENT_SET_UNCHANGED;
for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
- eqSet.Items[i] = fields[5 + i].GetUInt64();
-
- m_EquipmentSets[index] = eqSet;
+ if (uint64 guid = fields[5 + i].GetUInt64())
+ eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(guid);
- ++count;
+ if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit
+ continue;
- if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
- break;
+ _equipmentSets[eqSet.Data.SetID] = eqSet;
}
while (result->NextRow());
}
@@ -16831,6 +16826,17 @@ void Player::SetHomebind(WorldLocation const& loc, uint32 areaId)
CharacterDatabase.Execute(stmt);
}
+void Player::SendBindPointUpdate()
+{
+ WorldPackets::Misc::BindPointUpdate packet;
+ packet.BindPosition.x = m_homebindX;
+ packet.BindPosition.y = m_homebindY;
+ packet.BindPosition.z = m_homebindZ;
+ packet.BindMapID = m_homebindMapId;
+ packet.BindAreaID = m_homebindAreaId;
+ SendDirectMessage(packet.Write());
+}
+
uint32 Player::GetUInt32ValueFromArray(Tokenizer const& data, uint16 index)
{
if (index >= data.size())
@@ -17391,7 +17397,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
if (i >= talentSpecs.size())
break;
- uint32 talentSpec = atol(talentSpecs[i]);
+ uint32 talentSpec = atoul(talentSpecs[i]);
if (sChrSpecializationStore.LookupEntry(talentSpec))
SetTalentSpec(i, talentSpec);
else
@@ -20417,9 +20423,9 @@ void Player::Say(std::string const& text, Language language, WorldObject const*
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
- SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SAY, language, this, this, _text);
+ SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
}
void Player::Yell(std::string const& text, Language language, WorldObject const* /*= nullptr*/)
@@ -20427,9 +20433,9 @@ void Player::Yell(std::string const& text, Language language, WorldObject const*
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
- SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_YELL, language, this, this, _text);
+ SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true);
}
void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/, bool /*= false*/)
@@ -20437,9 +20443,9 @@ void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text);
- SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT));
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text);
+ SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT));
}
void Player::WhisperAddon(std::string const& text, const std::string& prefix, Player* receiver)
@@ -20450,9 +20456,9 @@ void Player::WhisperAddon(std::string const& text, const std::string& prefix, Pl
if (!receiver->GetSession()->IsAddonRegistered(prefix))
return;
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix);
- receiver->GetSession()->SendPacket(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix);
+ receiver->SendDirectMessage(packet.Write());
}
void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/)
@@ -20467,16 +20473,16 @@ void Player::Whisper(std::string const& text, Language language, Player* target,
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, Language(language), this, this, _text);
- target->GetSession()->SendPacket(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, Language(language), this, this, _text);
+ target->SendDirectMessage(packet.Write());
// rest stuff shouldn't happen in case of addon message
if (isAddonMessage)
return;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
- GetSession()->SendPacket(&data);
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
+ SendDirectMessage(packet.Write());
if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
{
@@ -20966,9 +20972,10 @@ void Player::SetSpellModTakingSpell(Spell* spell, bool apply)
// send Proficiency
void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask)
{
- WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
- data << uint8(itemClass) << uint32(itemSubclassMask);
- GetSession()->SendPacket(&data);
+ WorldPackets::Item::SetProficiency packet;
+ packet.ProficiencyMask = itemSubclassMask;
+ packet.ProficiencyClass = itemClass;
+ SendDirectMessage(packet.Write());
}
void Player::RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
@@ -22971,68 +22978,67 @@ void Player::SendInitialPacketsBeforeAddToMap()
/// Pass 'this' as argument because we're not stored in ObjectAccessor yet
GetSocial()->SendSocialList(this);
- // guild bank list wtf?
-
+ /// SMSG_SPELL_CATEGORY_COOLDOWN
GetSession()->SendSpellCategoryCooldowns();
- // Homebind
- WorldPacket data(SMSG_BINDPOINTUPDATE, 5*4);
- data << m_homebindX << m_homebindY << m_homebindZ;
- data << (uint32) m_homebindMapId;
- data << (uint32) m_homebindAreaId;
- GetSession()->SendPacket(&data);
+ /// SMSG_BINDPOINTUPDATE
+ SendBindPointUpdate();
// SMSG_SET_PROFICIENCY
// SMSG_SET_PCT_SPELL_MODIFIER
// SMSG_SET_FLAT_SPELL_MODIFIER
- // SMSG_UPDATE_AURA_DURATION
+ /// SMSG_TALENTS_INFO
SendTalentsInfoData();
-
- data.Initialize(SMSG_WORLD_SERVER_INFO, 1 + 1 + 4 + 4);
- data.WriteBit(0); // HasRestrictedLevel
- data.WriteBit(0); // HasRestrictedMoney
- data.WriteBit(0); // IneligibleForLoot
- data.FlushBits();
- //if (IneligibleForLoot)
- // data << uint32(0); // EncounterMask
-
- data << uint8(0); // IsOnTournamentRealm
- //if (HasRestrictedMoney)
- // data << uint32(100000); // RestrictedMoney (starter accounts)
- //if (HasRestrictedLevel)
- // data << uint32(20); // RestrictedLevel (starter accounts)
-
- data << uint32(sWorld->GetNextWeeklyQuestsResetTime() - WEEK); // LastWeeklyReset (not instance reset)
- data << uint32(GetMap()->GetDifficulty());
- GetSession()->SendPacket(&data);
-
+ /// SMSG_INITIAL_SPELLS
SendKnownSpells();
- data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
- data << uint32(0); // count, for (count) uint32;
- GetSession()->SendPacket(&data);
+ /// SMSG_SEND_UNLEARN_SPELLS
+ SendDirectMessage(WorldPackets::Spell::SendUnlearnSpells().Write());
+
+ /// @todo: SMSG_SEND_SPELL_HISTORY
+ /// @todo: SMSG_SEND_SPELL_CHARGES
+ /// SMSG_ACTION_BUTTONS
SendInitialActionButtons();
- m_reputationMgr->SendInitialReputations();
- m_achievementMgr->SendAllAchievementData(this);
+ /// SMSG_INITIALIZE_FACTIONS
+ m_reputationMgr->SendInitialReputations();
+ /// SMSG_SET_FORCED_REACTIONS
+ m_reputationMgr->SendForceReactions();
+ /// SMSG_INIT_CURRENCY
+ SendCurrencies();
+ /// SMSG_EQUIPMENT_SET_LIST
SendEquipmentSetList();
- data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
- data.AppendPackedTime(sWorld->GetGameTime());
- data << float(0.01666667f); // game speed
- data << uint32(0); // added in 3.1.2
- GetSession()->SendPacket(&data);
+ m_achievementMgr->SendAllAchievementData(this);
- GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
+ /// SMSG_LOGIN_SETTIMESPEED
+ static float const TimeSpeed = 0.01666667f;
+ WorldPackets::Misc::LoginSetTimeSpeed loginSetTimeSpeed;
+ loginSetTimeSpeed.NewSpeed = TimeSpeed;
+ loginSetTimeSpeed.GameTime = sWorld->GetGameTime();
+ loginSetTimeSpeed.ServerTime = sWorld->GetGameTime();
+ loginSetTimeSpeed.GameTimeHolidayOffset = 0; /// @todo
+ loginSetTimeSpeed.ServerTimeHolidayOffset = 0; /// @todo
+ SendDirectMessage(loginSetTimeSpeed.Write());
+
+ /// SMSG_WORLD_SERVER_INFO
+ WorldPackets::Misc::WorldServerInfo worldServerInfo;
+ worldServerInfo.IneligibleForLootMask.Clear(); /// @todo
+ worldServerInfo.WeeklyReset = sWorld->GetNextWeeklyQuestsResetTime() - WEEK;
+ worldServerInfo.InstanceGroupSize.Clear(); /// @todo
+ worldServerInfo.IsTournamentRealm = 0; /// @todo
+ worldServerInfo.RestrictedAccountMaxLevel.Clear(); /// @todo
+ worldServerInfo.RestrictedAccountMaxMoney.Clear(); /// @todo
+ worldServerInfo.DifficultyID = GetMap()->GetDifficulty();
+ SendDirectMessage(worldServerInfo.Write());
// SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
// SMSG_PET_GUIDS
// SMSG_UPDATE_WORLD_STATE
// SMSG_POWER_UPDATE
- SendCurrencies();
SetMover(this);
}
@@ -23107,11 +23113,11 @@ void Player::SendUpdateToOutOfRangeGroupMembers()
void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg)
{
- WorldPacket data(SMSG_TRANSFER_ABORTED, 4+2);
- data << uint32(mapid);
- data << uint8(reason); // transfer abort reason
- data << uint8(arg);
- GetSession()->SendPacket(&data);
+ WorldPackets::Movement::TransferAborted transferAborted;
+ transferAborted.MapID = mapid;
+ transferAborted.Arg = arg;
+ transferAborted.TransfertAbort = reason;
+ GetSession()->SendPacket(transferAborted.Write());
}
void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time)
@@ -25440,6 +25446,10 @@ bool Player::LearnTalent(uint32 talentId)
{
uint8 group = GetActiveTalentGroup();
+ // check if talent specialization is learnt
+ if (!GetTalentSpec(group))
+ return false;
+
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
if (!talentInfo)
@@ -25472,34 +25482,6 @@ bool Player::LearnTalent(uint32 talentId)
if (HasSpell(spellid))
return false;
- // set talent spec for player
- if (!GetTalentSpec(group))
- {
- SetTalentSpec(group, talentInfo->SpecID);
-
- // Replace default spells by specialization spells
- auto specSpells = sSpecializationSpellsBySpecStore.find(talentInfo->SpecID);
- if (specSpells != sSpecializationSpellsBySpecStore.end())
- {
- for (auto it = specSpells->second.begin(); it != specSpells->second.end(); ++it)
- {
- SpecializationSpellsEntry const* specSpell = *it;
- if (HasSpell(specSpell->OverridesSpellID)) {
- RemoveSpell(specSpell->OverridesSpellID, true);
- LearnSpell(specSpell->SpellID, false);
- }
- }
- }
-
- if (CanUseMastery()) {
- ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(talentInfo->SpecID);
- for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i)
- if (SpellInfo const* masterySpell = sSpellMgr->GetSpellInfo(chrSpec->MasterySpellID[i]))
- if (masterySpell->IsPassive() && IsNeedCastPassiveSpellAtLearn(masterySpell))
- CastSpell(this, masterySpell->Id, true);
- }
- }
-
// Check talent spec
if (talentInfo->SpecID != GetTalentSpec(group))
return false;
@@ -25513,6 +25495,41 @@ bool Player::LearnTalent(uint32 talentId)
return true;
}
+void Player::LearnTalentSpecialization(uint32 talentSpec)
+{
+ SetTalentSpec(GetActiveTalentGroup(), talentSpec);
+
+ // Replace default spells by specialization spells
+ auto specSpells = sSpecializationSpellsBySpecStore.find(talentSpec);
+ if (specSpells != sSpecializationSpellsBySpecStore.end())
+ {
+ for (auto it = specSpells->second.begin(); it != specSpells->second.end(); ++it)
+ {
+ SpecializationSpellsEntry const* specSpell = *it;
+
+ // Unlearn spell if it is replaced by new specialization
+ if (specSpell->OverridesSpellID)
+ RemoveSpell(specSpell->OverridesSpellID, true);
+
+ // Learn new spell
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(specSpell->SpellID))
+ if (spellInfo->BaseLevel <= getLevel())
+ LearnSpell(specSpell->SpellID, false);
+ }
+ }
+
+ if (CanUseMastery())
+ {
+ ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(talentSpec);
+ for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i)
+ if (SpellInfo const* masterySpell = sSpellMgr->GetSpellInfo(chrSpec->MasterySpellID[i]))
+ if (masterySpell->IsPassive() && IsNeedCastPassiveSpellAtLearn(masterySpell))
+ CastSpell(this, masterySpell->Id, true);
+ }
+
+ SendTalentsInfoData();
+}
+
void Player::AddKnownCurrency(uint32 itemId)
{
if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
@@ -25618,7 +25635,7 @@ void Player::SendTalentsInfoData()
packet.Info.TalentGroups.push_back(groupInfoPkt);
}
- GetSession()->SendPacket(packet.Write());
+ SendDirectMessage(packet.Write());
}
void Player::BuildEnchantmentsInfoData(WorldPacket* data)
@@ -25666,122 +25683,100 @@ void Player::BuildEnchantmentsInfoData(WorldPacket* data)
void Player::SendEquipmentSetList()
{
- ObjectGuid ignoredItemGuid;
- ignoredItemGuid.SetRawValue(0, 1);
- uint32 count = 0;
- WorldPacket data(SMSG_EQUIPMENT_SET_LIST, 4);
- size_t count_pos = data.wpos();
- data << uint32(count); // count placeholder
- for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ WorldPackets::EquipmentSet::LoadEquipmentSet data;
+
+ for (EquipmentSetContainer::value_type const& eqSet : _equipmentSets)
{
- if (itr->second.state == EQUIPMENT_SET_DELETED)
+ if (eqSet.second.State == EQUIPMENT_SET_DELETED)
continue;
- data.AppendPackedUInt64(itr->second.Guid);
- data << uint32(itr->first);
- data << itr->second.Name;
- data << itr->second.IconName;
- for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
- {
- // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HIGHGUID_ITEM
- if (itr->second.IgnoreMask & (1 << i))
- data << ignoredItemGuid;
- else
- data << ObjectGuid::Create<HighGuid::Item>(itr->second.Items[i]);
- }
- ++count; // client have limit but it checked at loading and set
+ data.SetData.push_back(&eqSet.second.Data);
}
- data.put<uint32>(count_pos, count);
- GetSession()->SendPacket(&data);
+
+ SendDirectMessage(data.Write());
}
-void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset)
+void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet)
{
- if (eqset.Guid != 0)
+ if (newEqSet.Guid != 0)
{
- bool found = false;
-
- for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ // something wrong...
+ EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.SetID);
+ if (itr == _equipmentSets.end() || itr->second.Data.Guid != newEqSet.Guid)
{
- if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
- {
- found = true;
- break;
- }
- }
-
- if (!found) // something wrong...
- {
- TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set not found!", GetName().c_str(), eqset.Guid, index);
+ TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index: %u), but that equipment set not found!", GetName().c_str(), newEqSet.Guid, newEqSet.SetID);
return;
}
}
- EquipmentSet& eqslot = m_EquipmentSets[index];
+ EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.SetID];
- EquipmentSetUpdateState old_state = eqslot.state;
+ EquipmentSetUpdateState oldState = eqSlot.State;
- eqslot = eqset;
+ eqSlot.Data = newEqSet;
- if (eqset.Guid == 0)
+ if (eqSlot.Data.Guid == 0)
{
- eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
+ eqSlot.Data.Guid = sObjectMgr->GenerateEquipmentSetGuid();
- WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1);
- data << uint32(index);
- data.AppendPackedUInt64(eqslot.Guid);
- GetSession()->SendPacket(&data);
+ WorldPackets::EquipmentSet::EquipmentSetID data;
+ data.GUID = eqSlot.Data.Guid;
+ data.SetID = eqSlot.Data.SetID;
+ SendDirectMessage(data.Write());
}
- eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED;
+ eqSlot.State = oldState == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED;
}
void Player::_SaveEquipmentSets(SQLTransaction& trans)
{
- for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
+ for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();)
{
- uint32 index = itr->first;
- EquipmentSet& eqset = itr->second;
- PreparedStatement* stmt = NULL;
+ EquipmentSetInfo& eqSet = itr->second;
+ PreparedStatement* stmt = nullptr;
uint8 j = 0;
- switch (eqset.state)
+ switch (eqSet.State)
{
case EQUIPMENT_SET_UNCHANGED:
++itr;
break; // nothing do
case EQUIPMENT_SET_CHANGED:
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
- stmt->setString(j++, eqset.Name.c_str());
- stmt->setString(j++, eqset.IconName.c_str());
- stmt->setUInt32(j++, eqset.IgnoreMask);
- for (uint8 i=0; i<EQUIPMENT_SLOT_END; ++i)
- stmt->setUInt64(j++, eqset.Items[i]);
+ stmt->setString(j++, eqSet.Data.SetName);
+ stmt->setString(j++, eqSet.Data.SetIcon);
+ stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
+
+ for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter());
+
stmt->setUInt64(j++, GetGUID().GetCounter());
- stmt->setUInt64(j++, eqset.Guid);
- stmt->setUInt32(j, index);
+ stmt->setUInt64(j++, eqSet.Data.Guid);
+ stmt->setUInt32(j, eqSet.Data.SetID);
trans->Append(stmt);
- eqset.state = EQUIPMENT_SET_UNCHANGED;
+ eqSet.State = EQUIPMENT_SET_UNCHANGED;
++itr;
break;
case EQUIPMENT_SET_NEW:
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
stmt->setUInt64(j++, GetGUID().GetCounter());
- stmt->setUInt64(j++, eqset.Guid);
- stmt->setUInt32(j++, index);
- stmt->setString(j++, eqset.Name.c_str());
- stmt->setString(j++, eqset.IconName.c_str());
- stmt->setUInt32(j++, eqset.IgnoreMask);
- for (uint8 i=0; i<EQUIPMENT_SLOT_END; ++i)
- stmt->setUInt64(j++, eqset.Items[i]);
+ stmt->setUInt64(j++, eqSet.Data.Guid);
+ stmt->setUInt32(j++, eqSet.Data.SetID);
+ stmt->setString(j++, eqSet.Data.SetName);
+ stmt->setString(j++, eqSet.Data.SetIcon);
+ stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
+
+ for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter());
+
trans->Append(stmt);
- eqset.state = EQUIPMENT_SET_UNCHANGED;
+ eqSet.State = EQUIPMENT_SET_UNCHANGED;
++itr;
break;
case EQUIPMENT_SET_DELETED:
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
- stmt->setUInt64(0, eqset.Guid);
+ stmt->setUInt64(0, eqSet.Data.Guid);
trans->Append(stmt);
- m_EquipmentSets.erase(itr++);
+ itr = _equipmentSets.erase(itr);
break;
}
}
@@ -25810,16 +25805,17 @@ void Player::_SaveBGData(SQLTransaction& trans)
void Player::DeleteEquipmentSet(uint64 setGuid)
{
- for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();)
{
- if (itr->second.Guid == setGuid)
+ if (itr->second.Data.Guid == setGuid)
{
- if (itr->second.state == EQUIPMENT_SET_NEW)
- m_EquipmentSets.erase(itr);
+ if (itr->second.State == EQUIPMENT_SET_NEW)
+ itr = _equipmentSets.erase(itr);
else
- itr->second.state = EQUIPMENT_SET_DELETED;
+ itr->second.State = EQUIPMENT_SET_DELETED;
break;
}
+ ++itr;
}
}
@@ -26183,9 +26179,9 @@ void Player::SendTimeSync()
{
m_timeSyncQueue.push(m_movementCounter++);
- WorldPacket data(SMSG_TIME_SYNC_REQ, 4);
- data << uint32(m_timeSyncQueue.back());
- GetSession()->SendPacket(&data);
+ WorldPackets::Misc::TimeSyncRequest packet;
+ packet.SequenceIndex = m_timeSyncQueue.back();
+ SendDirectMessage(packet.Write());
// Schedule next sync in 10 sec
m_timeSyncTimer = 10000;
@@ -26753,7 +26749,13 @@ std::string Player::GetCoordsMapAreaAndZoneString()
Guild* Player::GetGuild()
{
ObjectGuid::LowType guildId = GetGuildId();
- return guildId ? sGuildMgr->GetGuildById(guildId) : NULL;
+ return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
+}
+
+Guild const* Player::GetGuild() const
+{
+ ObjectGuid::LowType guildId = GetGuildId();
+ return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
}
Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index a5698740092..1dcd75a156e 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -328,15 +328,15 @@ enum ReputationSource
REPUTATION_SOURCE_SPELL
};
-#define ACTION_BUTTON_ACTION(X) (uint32(X) & 0x00FFFFFF)
-#define ACTION_BUTTON_TYPE(X) ((uint32(X) & 0xFF000000) >> 24)
-#define MAX_ACTION_BUTTON_ACTION_VALUE (0x00FFFFFF+1)
+#define ACTION_BUTTON_ACTION(X) (uint64(X) & 0x00000000FFFFFFFF)
+#define ACTION_BUTTON_TYPE(X) ((uint64(X) & 0xFFFFFFFF00000000) >> 32)
+#define MAX_ACTION_BUTTON_ACTION_VALUE (0xFFFFFFFF)
struct ActionButton
{
ActionButton() : packedData(0), uState(ACTIONBUTTON_NEW) { }
- uint32 packedData;
+ uint64 packedData;
ActionButtonUpdateState uState;
// helpers
@@ -344,7 +344,7 @@ struct ActionButton
uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); }
void SetActionAndType(uint32 action, ActionButtonType type)
{
- uint32 newData = action | (uint32(type) << 24);
+ uint64 newData = uint64(action) | (uint64(type) << 32);
if (newData != packedData || uState == ACTIONBUTTON_DELETED)
{
packedData = newData;
@@ -354,7 +354,7 @@ struct ActionButton
}
};
-#define MAX_ACTION_BUTTONS 144 //checked in 3.2.0
+#define MAX_ACTION_BUTTONS 132
typedef std::map<uint8, ActionButton> ActionButtonList;
@@ -747,24 +747,26 @@ enum EquipmentSetUpdateState
EQUIPMENT_SET_DELETED = 3
};
-struct EquipmentSet
+struct EquipmentSetInfo
{
- EquipmentSet() : Guid(0), IgnoreMask(0), state(EQUIPMENT_SET_NEW)
+ /// Data sent in EquipmentSet related packets
+ struct EquipmentSetData
{
- memset(Items, 0, sizeof(Items));
- }
+ uint64 Guid = 0; ///< Set Identifier
+ uint32 SetID = 0; ///< Index
+ uint32 IgnoreMask = 0; ///< Mask of EquipmentSlot
+ std::string SetName;
+ std::string SetIcon;
+ ObjectGuid Pieces[EQUIPMENT_SLOT_END];
+ } Data;
- uint64 Guid;
- std::string Name;
- std::string IconName;
- uint32 IgnoreMask;
- ObjectGuid::LowType Items[EQUIPMENT_SLOT_END];
- EquipmentSetUpdateState state;
+ /// Server-side data
+ EquipmentSetUpdateState State = EQUIPMENT_SET_NEW;
};
#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
-typedef std::map<uint32, EquipmentSet> EquipmentSets;
+typedef std::map<uint32, EquipmentSetInfo> EquipmentSetContainer;
struct ItemPosCount
{
@@ -785,24 +787,45 @@ enum TradeSlots
enum TransferAbortReason
{
- TRANSFER_ABORT_NONE = 0x00,
- TRANSFER_ABORT_ERROR = 0x01,
- TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
- TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
- TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
- TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
- TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC, WotLK> expansion installed to access this area.
- TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal, Heroic, Epic> difficulty mode is not available for %s.
- TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
- TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
- TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
- TRANSFER_ABORT_NOT_FOUND1 = 0x0C, // 3.1
- TRANSFER_ABORT_NOT_FOUND2 = 0x0D, // 3.1
- TRANSFER_ABORT_NOT_FOUND3 = 0x0E, // 3.2
- TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm.
- TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time.
- TRANSFER_ABORT_LOCKED_TO_DIFFERENT_INSTANCE = 0x12, // 4.2.2
- TRANSFER_ABORT_ALREADY_COMPLETED_ENCOUNTER = 0x13 // 4.2.2
+ TRANSFER_ABORT_NONE = 0,
+ TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 1, // Additional instances cannot be launched, please try again later.
+ TRANSFER_ABORT_DIFFICULTY = 3, // <Normal, Heroic, Epic> difficulty mode is not available for %s.
+ TRANSFER_ABORT_INSUF_EXPAN_LVL = 8, // You must have <TBC, WotLK> expansion installed to access this area.
+ TRANSFER_ABORT_NOT_FOUND = 10, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_TOO_MANY_INSTANCES = 11, // You have entered too many instances recently.
+ TRANSFER_ABORT_MAX_PLAYERS = 12, // Transfer Aborted: instance is full
+ TRANSFER_ABORT_XREALM_ZONE_DOWN = 14, // Transfer Aborted: cross-realm zone is down
+ TRANSFER_ABORT_NOT_FOUND_2 = 15, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_DIFFICULTY_NOT_FOUND = 16, // client writes to console "Unable to resolve requested difficultyID %u to actual difficulty for map %d"
+ TRANSFER_ABORT_NOT_FOUND_3 = 17, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_NOT_FOUND_4 = 18, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_ZONE_IN_COMBAT = 19, // Unable to zone in while an encounter is in progress.
+ TRANSFER_ABORT_ALREADY_COMPLETED_ENCOUNTER = 20, // You are ineligible to participate in at least one encounter in this instance because you are already locked to an instance in which it has been defeated.
+ TRANSFER_ABORT_LOCKED_TO_DIFFERENT_INSTANCE = 24, // You are already locked to %s
+ TRANSFER_ABORT_REALM_ONLY = 25, // All players in the party must be from the same realm to enter %s.
+ TRANSFER_ABORT_MAP_NOT_ALLOWED = 27, // Map cannot be entered at this time.
+ TRANSFER_ABORT_SOLO_PLAYER_SWITCH_DIFFICULTY = 28, // This instance is already in progress. You may only switch difficulties from inside the instance.
+ TRANSFER_ABORT_NEED_GROUP = 29, // Transfer Aborted: you must be in a raid group to enter this instance
+ TRANSFER_ABORT_UNIQUE_MESSAGE = 30, // Until you've escaped TLK's grasp, you cannot leave this place!
+ TRANSFER_ABORT_ERROR = 31,
+ /*
+ // Unknown values - not used by the client to display any error
+ TRANSFER_ABORT_MANY_REALM_INSTANCES
+ TRANSFER_ABORT_AREA_NOT_ZONED
+ TRANSFER_ABORT_TIMEOUT
+ TRANSFER_ABORT_SHUTTING_DOWN
+ TRANSFER_ABORT_PLAYER_CONDITION
+ TRANSFER_ABORT_BUSY
+ TRANSFER_ABORT_DISCONNECTED
+ TRANSFER_ABORT_LOGGING_OUT
+ TRANSFER_ABORT_NEED_SERVER
+ */
+};
+
+enum NewWorldReason
+{
+ NEW_WORLD_NORMAL = 16, // Normal map change
+ NEW_WORLD_SEAMLESS = 21, // Teleport to another map without a loading screen, used for outdoor scenarios
};
enum InstanceResetWarningType
@@ -858,18 +881,6 @@ enum EnviromentalDamage
DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss
};
-enum PlayerChatTag
-{
- CHAT_TAG_NONE = 0x00,
- CHAT_TAG_AFK = 0x01,
- CHAT_TAG_DND = 0x02,
- CHAT_TAG_GM = 0x04,
- CHAT_TAG_COM = 0x08, // Commentator
- CHAT_TAG_DEV = 0x10,
- CHAT_TAG_BOSS_SOUND = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper
- CHAT_TAG_MOBILE = 0x40
-};
-
enum PlayedTimeIndex
{
PLAYED_TIME_TOTAL = 0,
@@ -1314,7 +1325,7 @@ class Player : public Unit, public GridObject<Player>
void ToggleDND();
bool isAFK() const { return HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK); }
bool isDND() const { return HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DND); }
- uint8 GetChatTag() const;
+ uint8 GetChatFlags() const;
std::string autoReplyMsg;
uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL);
@@ -1747,8 +1758,8 @@ class Player : public Unit, public GridObject<Player>
Unit* GetSelectedUnit() const;
Player* GetSelectedPlayer() const;
- void SetTarget(ObjectGuid /*guid*/) override { } /// Used for serverside target changes, does not apply to players
- void SetSelection(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); }
+ void SetTarget(ObjectGuid const& /*guid*/) override { } /// Used for serverside target changes, does not apply to players
+ void SetSelection(ObjectGuid const& guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); }
uint8 GetComboPoints() const { return m_comboPoints; }
ObjectGuid GetComboTarget() const { return m_comboTarget; }
@@ -1841,6 +1852,7 @@ class Player : public Unit, public GridObject<Player>
bool LearnTalent(uint32 talentId);
bool AddTalent(uint32 talentId, uint8 spec);
bool HasTalent(uint32 talentId, uint8 spec);
+ void LearnTalentSpecialization(uint32 talentSpec);
// Dual Spec
void UpdateTalentGroupCount(uint8 count);
@@ -1967,6 +1979,7 @@ class Player : public Unit, public GridObject<Player>
void SetGuildIdInvited(ObjectGuid::LowType GuildId) { m_GuildIdInvited = GuildId; }
ObjectGuid::LowType GetGuildId() const { return GetUInt64Value(OBJECT_FIELD_DATA); /* return only lower part */ }
Guild* GetGuild();
+ Guild const* GetGuild() const;
static ObjectGuid::LowType GetGuildIdFromDB(ObjectGuid guid);
static uint8 GetRankFromDB(ObjectGuid guid);
ObjectGuid::LowType GetGuildIdInvited() { return m_GuildIdInvited; }
@@ -2088,10 +2101,10 @@ class Player : public Unit, public GridObject<Player>
bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
void UpdateUnderwaterState(Map* m, float x, float y, float z) override;
- void SendMessageToSet(WorldPacket* data, bool self) override {SendMessageToSetInRange(data, GetVisibilityRange(), self); };// overwrite Object::SendMessageToSet
- void SendMessageToSetInRange(WorldPacket* data, float fist, bool self) override;// overwrite Object::SendMessageToSetInRange
- void SendMessageToSetInRange(WorldPacket* data, float dist, bool self, bool own_team_only);
- void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) override;
+ void SendMessageToSet(WorldPacket const* data, bool self) override {SendMessageToSetInRange(data, GetVisibilityRange(), self); };// overwrite Object::SendMessageToSet
+ void SendMessageToSetInRange(WorldPacket const* data, float fist, bool self) override;// overwrite Object::SendMessageToSetInRange
+ void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only);
+ void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) override;
Corpse* GetCorpse() const;
void SpawnCorpseBones();
@@ -2239,12 +2252,12 @@ class Player : public Unit, public GridObject<Player>
void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto);
void SendEquipmentSetList();
- void SetEquipmentSet(uint32 index, EquipmentSet eqset);
+ void SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet);
void DeleteEquipmentSet(uint64 setGuid);
void SendInitWorldStates(uint32 zone, uint32 area);
void SendUpdateWorldState(uint32 variable, uint32 value, bool hidden = false);
- void SendDirectMessage(WorldPacket const* data);
+ void SendDirectMessage(WorldPacket const* data) const;
void SendBGWeekendWorldStates();
void SendBattlefieldWorldStates();
@@ -2378,6 +2391,7 @@ class Player : public Unit, public GridObject<Player>
void SaveRecallPosition();
void SetHomebind(WorldLocation const& loc, uint32 areaId);
+ void SendBindPointUpdate();
// Homebind coordinates
uint32 m_homebindMapId;
@@ -2851,7 +2865,7 @@ class Player : public Unit, public GridObject<Player>
DeclinedName *m_declinedname;
Runes *m_runes;
- EquipmentSets m_EquipmentSets;
+ EquipmentSetContainer _equipmentSets;
bool CanAlwaysSee(WorldObject const* obj) const override;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index fd75103ab7d..9831ad342d7 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -62,6 +62,9 @@
#include "WorldPacket.h"
#include "MovementStructures.h"
#include "WorldSession.h"
+#include "ChatPackets.h"
+#include "MovementPackets.h"
+#include "CombatPackets.h"
#include <cmath>
@@ -1409,10 +1412,10 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
void Unit::HandleEmoteCommand(uint32 anim_id)
{
- WorldPacket data(SMSG_EMOTE, 4 + 8);
- data << uint32(anim_id);
- data << GetGUID();
- SendMessageToSet(&data, true);
+ WorldPackets::Chat::Emote packet;
+ packet.Guid = GetGUID();
+ packet.EmoteID = anim_id;
+ SendMessageToSet(packet.Write(), true);
}
bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo, uint8 effIndex)
@@ -2108,24 +2111,24 @@ float Unit::CalculateLevelPenalty(SpellInfo const* spellProto) const
void Unit::SendMeleeAttackStart(Unit* victim)
{
- WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
- data << GetGUID();
- data << victim->GetGUID();
- SendMessageToSet(&data, true);
+ WorldPackets::Combat::AttackStart packet;
+ packet.Attacker = GetGUID();
+ packet.Victim = victim->GetGUID();
+ SendMessageToSet(packet.Write(), true);
TC_LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
}
void Unit::SendMeleeAttackStop(Unit* victim)
{
- WorldPacket data(SMSG_ATTACKSTOP, (8+8+4));
- data << GetPackGUID();
+ WorldPackets::Combat::SAttackStop packet;
+ packet.Attacker = GetGUID();
if (victim)
- data << victim->GetPackGUID();
- else
- data << uint8(0);
+ {
+ packet.Victim = victim->GetGUID();
+ packet.Dead = victim->isDead();
+ }
- data << uint32(0); //! Can also take the value 0x01, which seems related to updating rotation
- SendMessageToSet(&data, true);
+ SendMessageToSet(packet.Write(), true);
TC_LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
if (victim)
@@ -3021,12 +3024,16 @@ Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint3
if (!effect)
continue;
+ AuraEffect const* eff = foundAura->GetEffect(effect->EffectIndex);
+ if (!eff)
+ continue;
+
int bp;
if (baseAmount)
bp = *(baseAmount + effect->EffectIndex);
else
bp = effect->BasePoints;
-
+ TC_LOG_ERROR("spells", "_TryStackingOrRefreshingExistingAura spell %u effMask %u currIdx %u", newAura->Id, effMask, effect->EffectIndex);
int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(effect->EffectIndex)->m_baseAmount)); // todo 6.x review GetBaseAmount and GetCastItemGUID in this case
*oldBP = bp;
}
@@ -4848,67 +4855,26 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
{
TC_LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
- uint32 count = 1;
- size_t maxsize = 4+5+5+4+4+1+4+4+4+4+4+1+4+4+4+4+4*12;
- WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
- data << uint32(damageInfo->HitInfo);
- data << damageInfo->attacker->GetPackGUID();
- data << damageInfo->target->GetPackGUID();
- data << uint32(damageInfo->damage); // Full damage
+ WorldPackets::Combat::AttackerStateUpdate packet;
+ packet.HitInfo = damageInfo->HitInfo;
+ packet.AttackerGUID = damageInfo->attacker->GetGUID();
+ packet.VictimGUID = damageInfo->target->GetGUID();
+ packet.Damage = damageInfo->damage;
int32 overkill = damageInfo->damage - damageInfo->target->GetHealth();
- data << uint32(overkill < 0 ? 0 : overkill); // Overkill
- data << uint8(count); // Sub damage count
+ packet.OverDamage = (overkill < 0 ? -1 : overkill);
- for (uint32 i = 0; i < count; ++i)
- {
- data << uint32(damageInfo->damageSchoolMask); // School of sub damage
- data << float(damageInfo->damage); // sub damage
- data << uint32(damageInfo->damage); // Sub Damage
- }
+ WorldPackets::Combat::SubDamage& subDmg = packet.SubDmg.Value;
+ subDmg.SchoolMask = damageInfo->damageSchoolMask; // School of sub damage
+ subDmg.FDamage = damageInfo->damage; // sub damage
+ subDmg.Damage = damageInfo->damage; // Sub Damage
+ subDmg.Absorbed = damageInfo->absorb;
+ subDmg.Resisted = damageInfo->resist;
+ packet.SubDmg.HasValue = true;
- if (damageInfo->HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB))
- {
- for (uint32 i = 0; i < count; ++i)
- data << uint32(damageInfo->absorb); // Absorb
- }
+ packet.VictimState = damageInfo->TargetState;
+ packet.BlockAmount = damageInfo->blocked_amount;
- if (damageInfo->HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST))
- {
- for (uint32 i = 0; i < count; ++i)
- data << uint32(damageInfo->resist); // Resist
- }
-
- data << uint8(damageInfo->TargetState);
- data << uint32(0); // Unknown attackerstate
- data << uint32(0); // Melee spellid
-
- if (damageInfo->HitInfo & HITINFO_BLOCK)
- data << uint32(damageInfo->blocked_amount);
-
- if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
- data << uint32(0);
-
- //! Probably used for debugging purposes, as it is not known to appear on retail servers
- if (damageInfo->HitInfo & HITINFO_UNK1)
- {
- data << uint32(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- for (uint8 i = 0; i < 2; ++i)
- {
- data << float(0);
- data << float(0);
- }
- data << uint32(0);
- }
-
- SendMessageToSet(&data, true);
+ SendMessageToSet(packet.Write(), true);
}
void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
@@ -10636,11 +10602,22 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
pet->SetSpeed(mtype, m_speed_rate[mtype], forced);
}
- static MovementStatusElements const speedVal = MSEExtraFloat;
- Movement::ExtraMovementStatusElement extra(&speedVal);
- extra.Data.floatData = GetSpeed(mtype);
-
- Movement::PacketSender(this, moveTypeToOpcode[mtype][0], moveTypeToOpcode[mtype][1], moveTypeToOpcode[mtype][2], &extra).Send();
+ if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER)
+ {
+ /// @todo fix SMSG_MOVE_SET packets (were they removed?)
+ //_selfOpcode = playerControl;
+ WorldPackets::Movement::MoveUpdate packet(moveTypeToOpcode[mtype][2]);
+ packet.movementInfo = m_movementInfo;
+ packet.Speed = rate;
+ SendMessageToSet(packet.Write(), false);
+ }
+ else
+ {
+ WorldPackets::Movement::MoveSplineSet packet(moveTypeToOpcode[mtype][0]);
+ packet.MoverGUID = GetGUID();
+ packet.Speed = rate;
+ SendMessageToSet(packet.Write(), true);
+ }
}
void Unit::setDeathState(DeathState s)
@@ -12082,7 +12059,7 @@ void CharmInfo::LoadPetActionBar(const std::string& data)
// use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion
ActiveStates type = ActiveStates(atol(*iter));
++iter;
- uint32 action = uint32(atol(*iter));
+ uint32 action = atoul(*iter);
PetActionBar[index].SetActionAndType(action, type);
@@ -12745,10 +12722,10 @@ void Unit::SendPetAIReaction(ObjectGuid guid)
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return;
- WorldPacket data(SMSG_AI_REACTION, 8 + 4);
- data << guid;
- data << uint32(AI_REACTION_HOSTILE);
- owner->ToPlayer()->GetSession()->SendPacket(&data);
+ WorldPackets::Combat::AIReaction packet;
+ packet.UnitGUID = guid;
+ packet.Reaction = AI_REACTION_HOSTILE;
+ owner->ToPlayer()->SendDirectMessage(packet.Write());
}
///----------End of Pet responses methods----------
@@ -15690,7 +15667,7 @@ void Unit::SendTeleportPacket(Position& pos)
if (GetTypeId() == TYPEID_PLAYER)
{
- WorldPacket data2(MSG_MOVE_TELEPORT, 38);
+ WorldPacket data2(SMSG_MOVE_TELEPORT, 38);
data2.WriteBit(guid[6]);
data2.WriteBit(guid[0]);
data2.WriteBit(guid[3]);
@@ -15813,19 +15790,19 @@ void Unit::SendThreatListUpdate()
{
if (!getThreatManager().isThreatListEmpty())
{
- uint32 count = getThreatManager().getThreatList().size();
-
TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
- WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
- data << GetPackGUID();
- data << uint32(count);
+ WorldPackets::Combat::ThreatUpdate packet;
+ packet.UnitGUID = GetGUID();
ThreatContainer::StorageType const &tlist = getThreatManager().getThreatList();
+ packet.ThreatList.reserve(tlist.size());
for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
{
- data << (*itr)->getUnitGuid().WriteAsPacked();
- data << uint32((*itr)->getThreat() * 100);
+ WorldPackets::Combat::ThreatInfo info;
+ info.UnitGUID = (*itr)->getUnitGuid();
+ info.Threat = (*itr)->getThreat() * 100;
+ packet.ThreatList.push_back(info);
}
- SendMessageToSet(&data, false);
+ SendMessageToSet(packet.Write(), false);
}
}
@@ -15833,20 +15810,20 @@ void Unit::SendChangeCurrentVictimOpcode(HostileReference* pHostileReference)
{
if (!getThreatManager().isThreatListEmpty())
{
- uint32 count = getThreatManager().getThreatList().size();
-
TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
- WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
- data << GetPackGUID();
- data << pHostileReference->getUnitGuid().WriteAsPacked();
- data << uint32(count);
+ WorldPackets::Combat::HighestThreatUpdate packet;
+ packet.UnitGUID = GetGUID();
+ packet.HighestThreatGUID = pHostileReference->getUnitGuid();
ThreatContainer::StorageType const &tlist = getThreatManager().getThreatList();
+ packet.ThreatList.reserve(tlist.size());
for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
{
- data << (*itr)->getUnitGuid().WriteAsPacked();
- data << uint32((*itr)->getThreat());
+ WorldPackets::Combat::ThreatInfo info;
+ info.UnitGUID = (*itr)->getUnitGuid();
+ info.Threat = int32((*itr)->getThreat());
+ packet.ThreatList.push_back(info);
}
- SendMessageToSet(&data, false);
+ SendMessageToSet(packet.Write(), false);
}
}
@@ -15861,10 +15838,10 @@ void Unit::SendClearThreatListOpcode()
void Unit::SendRemoveFromThreatListOpcode(HostileReference* pHostileReference)
{
TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
- WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
- data << GetPackGUID();
- data << pHostileReference->getUnitGuid().WriteAsPacked();
- SendMessageToSet(&data, false);
+ WorldPackets::Combat::ThreatRemove packet;
+ packet.UnitGUID = GetGUID();
+ packet.AboutGUID = pHostileReference->getUnitGuid();
+ SendMessageToSet(packet.Write(), false);
}
// baseRage means damage taken when attacker = false
@@ -16625,9 +16602,9 @@ void Unit::Whisper(std::string const& text, Language language, Player* target, b
return;
LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex();
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
- target->SendDirectMessage(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
+ target->SendDirectMessage(packet.Write());
}
void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target)
@@ -16672,7 +16649,7 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/
}
LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex();
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
- target->SendDirectMessage(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
+ target->SendDirectMessage(packet.Write());
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 94bc911c945..120eef7ae51 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -339,7 +339,7 @@ enum HitInfo
HITINFO_CRITICALHIT = 0x00000200, // critical hit
// 0x00000400
// 0x00000800
- // 0x00001000
+ HITINFO_UNK12 = 0x00001000,
HITINFO_BLOCK = 0x00002000, // blocked damage
// 0x00004000 // Hides worldtext for 0 damage
// 0x00008000 // Related to blood visual
@@ -2194,7 +2194,7 @@ class Unit : public WorldObject
TempSummon const* ToTempSummon() const { if (IsSummon()) return reinterpret_cast<TempSummon const*>(this); else return NULL; }
ObjectGuid GetTarget() const { return GetGuidValue(UNIT_FIELD_TARGET); }
- virtual void SetTarget(ObjectGuid /*guid*/) = 0;
+ virtual void SetTarget(ObjectGuid const& /*guid*/) = 0;
// Movement info
Movement::MoveSpline * movespline;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 71064b3d9fd..a01251af433 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -155,6 +155,16 @@ bool normalizePlayerName(std::string& name)
return true;
}
+// Extracts player and realm names delimited by -
+ExtendedPlayerName ExtractExtendedPlayerName(std::string& name)
+{
+ size_t pos = name.find('-');
+ if (pos != std::string::npos)
+ return ExtendedPlayerName(name.substr(0, pos), name.substr(pos+1));
+ else
+ return ExtendedPlayerName(name, "");
+}
+
LanguageDesc lang_description[LANGUAGES_COUNT] =
{
{ LANG_ADDON, 0, 0 },
@@ -574,17 +584,17 @@ void ObjectMgr::LoadCreatureTemplateAddons()
creatureAddon.auras.resize(tokens.size());
for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
{
- SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(uint32(atol(*itr)));
+ SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(atoul(*itr));
if (!AdditionalSpellInfo)
{
- TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong spell %u defined in `auras` field in `creature_template_addon`.", entry, uint32(atol(*itr)));
+ TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong spell %lu defined in `auras` field in `creature_template_addon`.", entry, atoul(*itr));
continue;
}
if (AdditionalSpellInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_CONTROL_VEHICLE))
TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_template_addon`.", entry, uint32(atol(*itr)));
- creatureAddon.auras[i++] = uint32(atol(*itr));
+ creatureAddon.auras[i++] = atoul(*itr);
}
if (creatureAddon.mount)
@@ -1022,17 +1032,18 @@ void ObjectMgr::LoadCreatureAddons()
creatureAddon.auras.resize(tokens.size());
for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
{
- SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(uint32(atol(*itr)));
+ SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(atoul(*itr));
if (!AdditionalSpellInfo)
{
- TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has wrong spell %u defined in `auras` field in `creature_addon`.", guid, uint32(atol(*itr)));
+ TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has wrong spell %lu defined in `auras` field in `creature_addon`.", guid, atoul(*itr));
continue;
}
if (AdditionalSpellInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_CONTROL_VEHICLE))
- TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_addon`.", guid, uint32(atol(*itr)));
+ TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has SPELL_AURA_CONTROL_VEHICLE aura %lu defined in `auras` field in `creature_addon`.", guid, uint32(atol(*itr)));
- creatureAddon.auras[i++] = uint32(atol(*itr));
+
+ creatureAddon.auras[i++] = atoul(*itr);
}
if (creatureAddon.mount)
@@ -1222,15 +1233,15 @@ CreatureModelInfo const* ObjectMgr::GetCreatureModelRandomGender(uint32* display
return NULL;
// If a model for another gender exists, 50% chance to use it
- if (modelInfo->modelid_other_gender != 0 && urand(0, 1) == 0)
+ if (modelInfo->displayId_other_gender != 0 && urand(0, 1) == 0)
{
- CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->modelid_other_gender);
+ CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->displayId_other_gender);
if (!minfo_tmp)
- TC_LOG_ERROR("sql.sql", "Model (Entry: %u) has modelid_other_gender %u not found in table `creature_model_info`. ", *displayID, modelInfo->modelid_other_gender);
+ TC_LOG_ERROR("sql.sql", "Model (Entry: %u) has modelid_other_gender %u not found in table `creature_model_info`. ", *displayID, modelInfo->displayId_other_gender);
else
{
- // Model ID changed
- *displayID = modelInfo->modelid_other_gender;
+ // DisplayID changed
+ *displayID = modelInfo->displayId_other_gender;
return minfo_tmp;
}
}
@@ -1242,7 +1253,7 @@ void ObjectMgr::LoadCreatureModelInfo()
{
uint32 oldMSTime = getMSTime();
- QueryResult result = WorldDatabase.Query("SELECT modelid, bounding_radius, combat_reach, gender, modelid_other_gender FROM creature_model_info");
+ QueryResult result = WorldDatabase.Query("SELECT DisplayID, BoundingRadius, CombatReach, DisplayID_Other_Gender FROM creature_model_info");
if (!result)
{
@@ -1257,30 +1268,36 @@ void ObjectMgr::LoadCreatureModelInfo()
{
Field* fields = result->Fetch();
- uint32 modelId = fields[0].GetUInt32();
+ uint32 displayId = fields[0].GetUInt32();
+
+ CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(displayId);
+ if (!creatureDisplay)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has a non-existent DisplayID (ID: %u). Skipped.", displayId);
+ continue;
+ }
- CreatureModelInfo& modelInfo = _creatureModelStore[modelId];
+ CreatureModelInfo& modelInfo = _creatureModelStore[displayId];
- modelInfo.bounding_radius = fields[1].GetFloat();
- modelInfo.combat_reach = fields[2].GetFloat();
- modelInfo.gender = fields[3].GetUInt8();
- modelInfo.modelid_other_gender = fields[4].GetUInt32();
+ modelInfo.bounding_radius = fields[1].GetFloat();
+ modelInfo.combat_reach = fields[2].GetFloat();
+ modelInfo.displayId_other_gender = fields[3].GetUInt32();
+ modelInfo.gender = creatureDisplay->Gender;
// Checks
- if (!sCreatureDisplayInfoStore.LookupEntry(modelId))
- TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has model for nonexistent display id (%u).", modelId);
-
- if (modelInfo.gender > GENDER_NONE)
+ // to remove when the purpose of GENDER_UNKNOWN is known
+ if (modelInfo.gender == GENDER_UNKNOWN)
{
- TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender (%u) for display id (%u).", uint32(modelInfo.gender), modelId);
+ // We don't need more errors
+ //TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has an unimplemented Gender (ID: %i) being used by DisplayID (ID: %u). Gender set to GENDER_MALE.", modelInfo.gender, modelId);
modelInfo.gender = GENDER_MALE;
}
- if (modelInfo.modelid_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.modelid_other_gender))
+ if (modelInfo.displayId_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.displayId_other_gender))
{
- TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has nonexistent alt.gender model (%u) for existed display id (%u).", modelInfo.modelid_other_gender, modelId);
- modelInfo.modelid_other_gender = 0;
+ TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has a non-existent DisplayID_Other_Gender (ID: %u) being used by DisplayID (ID: %u).", modelInfo.displayId_other_gender, displayId);
+ modelInfo.displayId_other_gender = 0;
}
if (modelInfo.combat_reach < 0.1f)
@@ -2492,7 +2509,9 @@ void ObjectMgr::LoadItemTemplates()
itemTemplate.SubClass = db2Data->SubClass;
itemTemplate.SoundOverrideSubclass = db2Data->SoundOverrideSubclass;
itemTemplate.Name1 = sparse->Name->Str[sWorld->GetDefaultDbcLocale()];
- itemTemplate.DisplayInfoID = GetItemDisplayID(db2Data->AppearanceID);
+ itemTemplate.DisplayInfoID = GetItemDisplayID(db2Data->FileDataID);
+ itemTemplate.FileDataID = db2Data->FileDataID;
+ itemTemplate.GroupSoundsID = db2Data->GroupSoundsID;
itemTemplate.Quality = sparse->Quality;
memcpy(itemTemplate.Flags, sparse->Flags, sizeof(itemTemplate.Flags));
itemTemplate.Unk1 = sparse->Unk1;
@@ -2571,6 +2590,7 @@ void ObjectMgr::LoadItemTemplates()
itemTemplate.StatScalingFactor = sparse->StatScalingFactor;
itemTemplate.CurrencySubstitutionId = sparse->CurrencySubstitutionID;
itemTemplate.CurrencySubstitutionCount = sparse->CurrencySubstitutionCount;
+ itemTemplate.ItemNameDescriptionID = sparse->ItemNameDescriptionID;
itemTemplate.ScriptId = 0;
itemTemplate.FoodType = 0;
itemTemplate.MinMoneyLoot = 0;
@@ -9015,6 +9035,12 @@ void ObjectMgr::LoadMissingKeyChains()
uint32 id = fields[0].GetUInt32();
KeyChainEntry* kce = sKeyChainStore.CreateEntry(id, true);
+ if (!kce)
+ {
+ TC_LOG_ERROR("sql.sql", "Could not create KeyChainEntry %u, skipped.", id);
+ continue;
+ }
+
kce->Id = id;
for (uint32 i = 0; i < KEYCHAIN_SIZE; ++i)
kce->Key[i] = fields[1 + i].GetUInt8();
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index bb392caeffb..e7191735ca1 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -677,6 +677,15 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry);
bool normalizePlayerName(std::string& name);
+struct ExtendedPlayerName
+{
+ ExtendedPlayerName(std::string const& name, std::string const& realm) : Name(name), Realm(realm) {}
+ std::string Name;
+ std::string Realm;
+};
+
+ExtendedPlayerName ExtractExtendedPlayerName(std::string& name);
+
struct LanguageDesc
{
Language lang_id;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index ae3bef5a8df..b693d2e13ac 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -33,6 +33,7 @@
#include "CreatureAI.h"
#include "Spell.h"
#include "WorldSession.h"
+#include "Packets/ChatPackets.h"
class Player;
//class Map;
@@ -125,11 +126,11 @@ namespace Trinity
struct MessageDistDeliverer
{
WorldObject* i_source;
- WorldPacket* i_message;
+ WorldPacket const* i_message;
float i_distSq;
uint32 team;
Player const* skipped_receiver;
- MessageDistDeliverer(WorldObject* src, WorldPacket* msg, float dist, bool own_team_only = false, Player const* skipped = NULL)
+ MessageDistDeliverer(WorldObject* src, WorldPacket const* msg, float dist, bool own_team_only = false, Player const* skipped = NULL)
: i_source(src), i_message(msg), i_distSq(dist * dist)
, team(0)
, skipped_receiver(skipped)
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 894f87f6145..9c4a2a5a2d1 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1623,7 +1623,7 @@ void Group::UpdatePlayerOutOfRange(Player* player)
}
}
-void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/)
+void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/)
{
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -1638,7 +1638,7 @@ void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string&
}
}
-void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer)
+void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer)
{
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -1651,7 +1651,7 @@ void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int
}
}
-void Group::BroadcastReadyCheck(WorldPacket* packet)
+void Group::BroadcastReadyCheck(WorldPacket const* packet)
{
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 0bdfbf24a71..6216b7323b0 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -288,9 +288,9 @@ class Group
worker(itr->GetSource());
}
- void BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty);
- void BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty);
- void BroadcastReadyCheck(WorldPacket* packet);
+ void BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty);
+ void BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty);
+ void BroadcastReadyCheck(WorldPacket const* packet);
void OfflineReadyCheck();
/*********************************************************/
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 4fb361209c1..0b703d4bcb2 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -30,6 +30,7 @@
#include "ScriptMgr.h"
#include "SocialMgr.h"
#include "Opcodes.h"
+#include "ChatPackets.h"
#define MAX_GUILD_BANK_TAB_TEXT_LEN 500
#define EMBLEM_PRICE 10 * GOLD
@@ -1481,23 +1482,23 @@ void Guild::SendQueryResponse(WorldSession* session)
response.GuildGuid = GetGUID();
response.Info.HasValue = true;
- response.Info.value.GuildGUID = GetGUID();
- response.Info.value.VirtualRealmAddress = GetVirtualRealmAddress();
+ response.Info.Value.GuildGUID = GetGUID();
+ response.Info.Value.VirtualRealmAddress = GetVirtualRealmAddress();
- response.Info.value.EmblemStyle = m_emblemInfo.GetStyle();
- response.Info.value.EmblemColor = m_emblemInfo.GetColor();
- response.Info.value.BorderStyle = m_emblemInfo.GetBorderStyle();
- response.Info.value.BorderColor = m_emblemInfo.GetBorderColor();
- response.Info.value.BackgroundColor = m_emblemInfo.GetBackgroundColor();
+ response.Info.Value.EmblemStyle = m_emblemInfo.GetStyle();
+ response.Info.Value.EmblemColor = m_emblemInfo.GetColor();
+ response.Info.Value.BorderStyle = m_emblemInfo.GetBorderStyle();
+ response.Info.Value.BorderColor = m_emblemInfo.GetBorderColor();
+ response.Info.Value.BackgroundColor = m_emblemInfo.GetBackgroundColor();
for (uint8 i = 0; i < _GetRanksSize(); ++i)
{
WorldPackets::Guild::QueryGuildInfoResponse::GuildInfo::GuildInfoRank info
(m_ranks[i].GetId(), i, m_ranks[i].GetName());
- response.Info.value.Ranks.insert(info);
+ response.Info.Value.Ranks.insert(info);
}
- response.Info.value.GuildName = m_name;
+ response.Info.Value.GuildName = m_name;
session->SendPacket(response.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", session->GetPlayerInfo().c_str());
@@ -2593,13 +2594,14 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin
{
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
{
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), NULL, msg);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), NULL, msg);
+ WorldPacket const* data = packet.Write();
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
if (Player* player = itr->second->FindConnectedPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
- player->GetSession()->SendPacket(&data);
+ player->GetSession()->SendPacket(data);
}
}
@@ -2607,14 +2609,15 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::
{
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
{
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), NULL, msg, 0, "", DEFAULT_LOCALE, prefix);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), NULL, msg, 0, "", DEFAULT_LOCALE, prefix);
+ WorldPacket const* data = packet.Write();
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
if (Player* player = itr->second->FindPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()) &&
player->GetSession()->IsAddonRegistered(prefix))
- player->GetSession()->SendPacket(&data);
+ player->GetSession()->SendPacket(data);
}
}
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index d52e218e66d..fcd96ec9370 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -728,7 +728,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket& recvData)
TC_LOG_DEBUG("auctionHouse", "Auctionhouse search (%s) list from: %u, searchedname: %s, levelmin: %u, levelmax: %u, auctionSlotID: %u, auctionMainCategory: %u, auctionSubCategory: %u, quality: %u, usable: %u",
guid.ToString().c_str(), listfrom, searchedname.c_str(), levelmin, levelmax, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, usable);
- WorldPacket data(SMSG_AUCTION_LIST_RESULT, (4+4+4));
+ WorldPacket data(SMSG_AUCTION_LIST_ITEMS_RESULT, (4+4+4));
uint32 count = 0;
uint32 totalcount = 0;
data << uint32(0);
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index c9e1e6508b9..d8b8f4fe018 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -27,20 +27,20 @@ void WorldSession::SendAuthResponse(uint8 code, bool queued, uint32 queuePos)
response.SuccessInfo.HasValue = code == AUTH_OK;
response.Result = code;
response.WaitInfo.HasValue = queued;
- response.WaitInfo.value.WaitCount = queuePos;
+ response.WaitInfo.Value.WaitCount = queuePos;
if (code == AUTH_OK)
{
- response.SuccessInfo.value.AccountExpansionLevel = Expansion();
- response.SuccessInfo.value.ActiveExpansionLevel = Expansion();
- response.SuccessInfo.value.VirtualRealmAddress = GetVirtualRealmAddress();
+ response.SuccessInfo.Value.AccountExpansionLevel = Expansion();
+ response.SuccessInfo.Value.ActiveExpansionLevel = Expansion();
+ response.SuccessInfo.Value.VirtualRealmAddress = GetVirtualRealmAddress();
std::string realmName = sObjectMgr->GetRealmName(realmHandle.Index);
// Send current home realm. Also there is no need to send it later in realm queries.
- response.SuccessInfo.value.VirtualRealms.emplace_back(GetVirtualRealmAddress(), true, false, realmName, realmName);
+ response.SuccessInfo.Value.VirtualRealms.emplace_back(GetVirtualRealmAddress(), true, false, realmName, realmName);
- response.SuccessInfo.value.AvailableClasses = &sObjectMgr->GetClassExpansionRequirements();
- response.SuccessInfo.value.AvailableRaces = &sObjectMgr->GetRaceExpansionRequirements();
+ response.SuccessInfo.Value.AvailableClasses = &sObjectMgr->GetClassExpansionRequirements();
+ response.SuccessInfo.Value.AvailableRaces = &sObjectMgr->GetRaceExpansionRequirements();
}
SendPacket(response.Write());
@@ -60,7 +60,7 @@ void WorldSession::SendAuthWaitQue(uint32 position)
{
response.WaitInfo.HasValue = true;
response.SuccessInfo.HasValue = false;
- response.WaitInfo.value.WaitCount = position;
+ response.WaitInfo.Value.WaitCount = position;
response.Result = AUTH_WAIT_QUEUE;
}
diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp
index 5826415a201..c6cd5337c5b 100644
--- a/src/server/game/Handlers/ChannelHandler.cpp
+++ b/src/server/game/Handlers/ChannelHandler.cpp
@@ -18,31 +18,20 @@
#include "ObjectMgr.h" // for normalizePlayerName
#include "ChannelMgr.h"
+#include "ChannelPackets.h"
#include "Player.h"
#include "WorldSession.h"
#include <cctype>
-void WorldSession::HandleJoinChannel(WorldPacket& recvPacket)
+void WorldSession::HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet)
{
- uint32 channelId;
- uint32 channelLength, passLength;
- std::string channelName, password;
+ TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s ChatChannelId: %u, CreateVoiceSession: %u, Internal: %u, ChannelName: %s, Password: %s",
+ GetPlayerInfo().c_str(), packet.ChatChannelId, packet.CreateVoiceSession, packet.Internal, packet.ChannelName.c_str(), packet.Password.c_str());
- recvPacket >> channelId;
- uint8 unknown1 = recvPacket.ReadBit(); // unknowns
- uint8 unknown2 = recvPacket.ReadBit();
- channelLength = recvPacket.ReadBits(8);
- passLength = recvPacket.ReadBits(8);
- channelName = recvPacket.ReadString(channelLength);
- password = recvPacket.ReadString(passLength);
-
- TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s",
- GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str());
-
- if (channelId)
+ if (packet.ChatChannelId)
{
- ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId);
+ ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(packet.ChatChannelId);
if (!channel)
return;
@@ -51,53 +40,43 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket)
return;
}
- if (channelName.empty())
+ if (packet.ChannelName.empty())
return;
- if (isdigit(channelName[0]))
+ if (isdigit(packet.ChannelName[0]))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
{
- cMgr->setTeam(GetPlayer()->GetTeam());
- if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId))
- channel->JoinChannel(GetPlayer(), password);
+ cMgr->SetTeam(GetPlayer()->GetTeam());
+ if (Channel* channel = cMgr->GetJoinChannel(packet.ChannelName, packet.ChatChannelId))
+ channel->JoinChannel(GetPlayer(), packet.Password);
}
}
-void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket)
+void WorldSession::HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet)
{
- uint32 unk;
- std::string channelName;
- recvPacket >> unk; // channel id?
- uint32 length = recvPacket.ReadBits(8);
- channelName = recvPacket.ReadString(length);
+ TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s ChannelName: %s, ZoneChannelID: %u",
+ GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.ZoneChannelID);
- TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u",
- GetPlayerInfo().c_str(), channelName.c_str(), unk);
-
- if (channelName.empty())
+ if (packet.ChannelName.empty())
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
{
- if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
+ if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer()))
channel->LeaveChannel(GetPlayer(), true);
- cMgr->LeftChannel(channelName);
+ cMgr->LeftChannel(packet.ChannelName);
}
}
-void WorldSession::HandleChannelList(WorldPacket& recvPacket)
+void WorldSession::HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet)
{
- uint32 length = recvPacket.ReadBits(8);
- std::string channelName = recvPacket.ReadString(length);
-
- TC_LOG_DEBUG("chat.system", "%s %s Channel: %s",
- recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST",
- GetPlayerInfo().c_str(), channelName.c_str());
+ TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s",
+ GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str());
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
- if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
+ if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer()))
channel->List(GetPlayer());
}
@@ -115,7 +94,7 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket)
if (password.length() > MAX_CHANNEL_PASS_STR)
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->Password(GetPlayer(), password);
}
@@ -134,7 +113,7 @@ void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->SetOwner(GetPlayer(), targetName);
}
@@ -147,9 +126,9 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket)
TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s",
GetPlayerInfo().c_str(), channelName.c_str());
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
- channel->SendWhoOwner(GetPlayer()->GetGUID());
+ channel->SendWhoOwner(GetPlayer());
}
void WorldSession::HandleChannelModerator(WorldPacket& recvPacket)
@@ -166,7 +145,7 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->SetModerator(GetPlayer(), targetName);
}
@@ -185,7 +164,7 @@ void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->UnsetModerator(GetPlayer(), targetName);
}
@@ -204,7 +183,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->SetMute(GetPlayer(), targetName);
}
@@ -223,7 +202,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->UnsetMute(GetPlayer(), targetName);
}
@@ -242,7 +221,7 @@ void WorldSession::HandleChannelInvite(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->Invite(GetPlayer(), targetName);
}
@@ -261,7 +240,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->Kick(GetPlayer(), targetName);
}
@@ -283,7 +262,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->Ban(GetPlayer(), targetName);
}
@@ -302,7 +281,7 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket)
if (!normalizePlayerName(targetName))
return;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->UnBan(GetPlayer(), targetName);
}
@@ -315,17 +294,11 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket)
TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s",
GetPlayerInfo().c_str(), channelName.c_str());
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
channel->Announce(GetPlayer());
}
-void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket)
-{
- // this should be OK because the 2 function _were_ the same
- HandleChannelList(recvPacket);
-}
-
void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket)
{
std::string channelName;
@@ -334,7 +307,7 @@ void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket)
TC_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s",
GetPlayerInfo().c_str(), channelName.c_str());
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam()))
{
if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer()))
{
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index a2e6f4b0340..de7d44bdc69 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -29,6 +29,7 @@
#include "ClientConfigPackets.h"
#include "Common.h"
#include "DatabaseEnv.h"
+#include "EquipmentSetPackets.h"
#include "Group.h"
#include "Guild.h"
#include "GuildFinderMgr.h"
@@ -36,6 +37,7 @@
#include "Language.h"
#include "LFGMgr.h"
#include "Log.h"
+#include "MiscPackets.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Opcodes.h"
@@ -835,6 +837,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
return;
}
+ SendTutorialsData();
+
pCurrChar->GetMotionMaster()->Initialize();
pCurrChar->SendDungeonDifficulty(false);
@@ -857,6 +861,16 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
/// Send FeatureSystemStatus
{
WorldPackets::System::FeatureSystemStatus features;
+
+ /// START OF DUMMY VALUES
+ features.ComplaintStatus = 2;
+ features.ScrollOfResurrectionRequestsRemaining = 1;
+ features.ScrollOfResurrectionMaxRequestsPerDay = 1;
+ features.CfgRealmID = 2;
+ features.CfgRealmRecID = 0;
+ features.VoiceEnabled = true;
+ /// END OF DUMMY VALUES
+
features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED);
features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED);
@@ -1096,32 +1110,35 @@ void WorldSession::HandleSetFactionCheat(WorldPacket& /*recvData*/)
GetPlayer()->GetReputationMgr().SendStates();
}
-void WorldSession::HandleTutorialFlag(WorldPacket& recvData)
-{
- uint32 data;
- recvData >> data;
-
- uint8 index = uint8(data / 32);
- if (index >= MAX_ACCOUNT_TUTORIAL_VALUES)
- return;
-
- uint32 value = (data % 32);
-
- uint32 flag = GetTutorialInt(index);
- flag |= (1 << value);
- SetTutorialInt(index, flag);
-}
-
-void WorldSession::HandleTutorialClear(WorldPacket& /*recvData*/)
-{
- for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
- SetTutorialInt(i, 0xFFFFFFFF);
-}
-
-void WorldSession::HandleTutorialReset(WorldPacket& /*recvData*/)
+void WorldSession::HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet)
{
- for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
- SetTutorialInt(i, 0x00000000);
+ switch (packet.Action)
+ {
+ case TUTORIAL_ACTION_UPDATE:
+ {
+ uint8 index = uint8(packet.TutorialBit >> 5);
+ if (index >= MAX_ACCOUNT_TUTORIAL_VALUES)
+ {
+ TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received bad TutorialBit %u.", packet.TutorialBit);
+ return;
+ }
+ uint32 flag = GetTutorialInt(index);
+ flag |= (1 << (packet.TutorialBit & 0x1F));
+ SetTutorialInt(index, flag);
+ break;
+ }
+ case TUTORIAL_ACTION_CLEAR:
+ for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
+ SetTutorialInt(i, 0xFFFFFFFF);
+ break;
+ case TUTORIAL_ACTION_RESET:
+ for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
+ SetTutorialInt(i, 0x00000000);
+ break;
+ default:
+ TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received unknown TutorialAction %u.", packet.Action);
+ return;
+ }
}
void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket& recvData)
@@ -1525,59 +1542,36 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World
GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), customizeInfo->CharGUID.ToString().c_str(), customizeInfo->CharName.c_str());
}
-void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData)
+void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet)
{
TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_SAVE");
- uint64 setGuid;
- recvData.ReadPackedUInt64(setGuid);
-
- uint32 index;
- recvData >> index;
- if (index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
+ if (packet.Set.SetID >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
return;
- std::string name;
- recvData >> name;
-
- std::string iconName;
- recvData >> iconName;
-
- EquipmentSet eqSet;
-
- eqSet.Guid = setGuid;
- eqSet.Name = name;
- eqSet.IconName = iconName;
- eqSet.state = EQUIPMENT_SET_NEW;
-
- ObjectGuid ignoredItemGuid;
- ignoredItemGuid.SetRawValue(0, 1);
-
- for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
- ObjectGuid itemGuid;
- recvData >> itemGuid.ReadAsPacked();
-
- // equipment manager sends "1" (as raw GUID) for slots set to "ignore" (don't touch slot at equip set)
- if (itemGuid == ignoredItemGuid)
+ if (!(packet.Set.IgnoreMask & (1 << i)))
{
- // ignored slots saved as bit mask because we have no free special values for Items[i]
- eqSet.IgnoreMask |= 1 << i;
- continue;
- }
-
- Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
+ ObjectGuid const& itemGuid = packet.Set.Pieces[i];
- if (!item && !itemGuid.IsEmpty()) // cheating check 1
- return;
+ Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
- if (item && item->GetGUID() != itemGuid) // cheating check 2
- return;
+ /// cheating check 1 (item equipped but sent empty guid)
+ if (!item && !itemGuid.IsEmpty())
+ return;
- eqSet.Items[i] = itemGuid.GetCounter();
+ /// cheating check 2 (sent guid does not match equipped item)
+ if (item && item->GetGUID() != itemGuid)
+ return;
+ }
+ else
+ packet.Set.Pieces[i].Clear();
}
- _player->SetEquipmentSet(index, eqSet);
+ packet.Set.IgnoreMask &= 0x7FFFF; /// clear invalid bits (i > EQUIPMENT_SLOT_END)
+
+ _player->SetEquipmentSet(std::move(packet.Set));
}
void WorldSession::HandleEquipmentSetDelete(WorldPacket& recvData)
@@ -1799,7 +1793,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
if (factionChangeInfo->SkinID.HasValue)
{
playerBytes &= ~uint32(0xFF);
- playerBytes |= factionChangeInfo->SkinID.value;
+ playerBytes |= factionChangeInfo->SkinID.Value;
}
else
factionChangeInfo->SkinID.Set(uint8(playerBytes & 0xFF));
@@ -1807,7 +1801,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
if (factionChangeInfo->FaceID.HasValue)
{
playerBytes &= ~(uint32(0xFF) << 8);
- playerBytes |= uint32(factionChangeInfo->FaceID.value) << 8;
+ playerBytes |= uint32(factionChangeInfo->FaceID.Value) << 8;
}
else
factionChangeInfo->FaceID.Set(uint8((playerBytes2 >> 8) & 0xFF));
@@ -1815,7 +1809,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
if (factionChangeInfo->HairStyleID.HasValue)
{
playerBytes &= ~(uint32(0xFF) << 16);
- playerBytes |= uint32(factionChangeInfo->HairStyleID.value) << 16;
+ playerBytes |= uint32(factionChangeInfo->HairStyleID.Value) << 16;
}
else
factionChangeInfo->HairStyleID.Set(uint8((playerBytes2 >> 16) & 0xFF));
@@ -1823,7 +1817,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
if (factionChangeInfo->HairColorID.HasValue)
{
playerBytes &= ~(uint32(0xFF) << 24);
- playerBytes |= uint32(factionChangeInfo->HairColorID.value) << 24;
+ playerBytes |= uint32(factionChangeInfo->HairColorID.Value) << 24;
}
else
factionChangeInfo->HairColorID.Set(uint8((playerBytes2 >> 24) & 0xFF));
@@ -1831,7 +1825,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
if (factionChangeInfo->FacialHairStyleID.HasValue)
{
playerBytes2 &= ~0xFF;
- playerBytes2 |= factionChangeInfo->FacialHairStyleID.value;
+ playerBytes2 |= factionChangeInfo->FacialHairStyleID.Value;
}
else
factionChangeInfo->FacialHairStyleID.Set(uint8(playerBytes2 & 0xFF));
@@ -2181,7 +2175,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
}
for (uint32 index = 0; index < ktcount; ++index)
- knownTitles[index] = atol(tokens[index]);
+ knownTitles[index] = atoul(tokens[index]);
for (std::map<uint32, uint32>::const_iterator it = sObjectMgr->FactionChangeTitles.begin(); it != sObjectMgr->FactionChangeTitles.end(); ++it)
{
@@ -2526,14 +2520,14 @@ void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Cha
if (result == RESPONSE_SUCCESS)
{
packet.Display.HasValue = true;
- packet.Display.value.Name = factionChangeInfo->Name;
- packet.Display.value.SexID = factionChangeInfo->SexID;
- packet.Display.value.SkinID = factionChangeInfo->SkinID.value;
- packet.Display.value.HairColorID = factionChangeInfo->HairColorID.value;
- packet.Display.value.HairStyleID = factionChangeInfo->HairStyleID.value;
- packet.Display.value.FacialHairStyleID = factionChangeInfo->FacialHairStyleID.value;
- packet.Display.value.FaceID = factionChangeInfo->FaceID.value;
- packet.Display.value.RaceID = factionChangeInfo->RaceID;
+ packet.Display.Value.Name = factionChangeInfo->Name;
+ packet.Display.Value.SexID = factionChangeInfo->SexID;
+ packet.Display.Value.SkinID = factionChangeInfo->SkinID.Value;
+ packet.Display.Value.HairColorID = factionChangeInfo->HairColorID.Value;
+ packet.Display.Value.HairStyleID = factionChangeInfo->HairStyleID.Value;
+ packet.Display.Value.FacialHairStyleID = factionChangeInfo->FacialHairStyleID.Value;
+ packet.Display.Value.FaceID = factionChangeInfo->FaceID.Value;
+ packet.Display.Value.RaceID = factionChangeInfo->RaceID;
}
SendPacket(packet.Write());
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index a2fc248bb61..2c0fe333b00 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -39,261 +39,163 @@
#include "Util.h"
#include "ScriptMgr.h"
#include "AccountMgr.h"
+#include "ChatPackets.h"
-void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
+void WorldSession::HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& packet)
{
- uint32 type = 0;
- uint32 lang;
+ ChatMsg type;
- switch (recvData.GetOpcode())
+ switch (packet.GetOpcode())
{
- /*
case CMSG_MESSAGECHAT_SAY:
type = CHAT_MSG_SAY;
break;
case CMSG_MESSAGECHAT_YELL:
type = CHAT_MSG_YELL;
break;
- case CMSG_MESSAGECHAT_CHANNEL:
- type = CHAT_MSG_CHANNEL;
- break;
- case CMSG_MESSAGECHAT_WHISPER:
- type = CHAT_MSG_WHISPER;
- break;
case CMSG_MESSAGECHAT_GUILD:
type = CHAT_MSG_GUILD;
break;
case CMSG_MESSAGECHAT_OFFICER:
type = CHAT_MSG_OFFICER;
break;
- case CMSG_MESSAGECHAT_AFK:
- type = CHAT_MSG_AFK;
- break;
- case CMSG_MESSAGECHAT_DND:
- type = CHAT_MSG_DND;
- break;
- case CMSG_MESSAGECHAT_EMOTE:
- type = CHAT_MSG_EMOTE;
- break;
case CMSG_MESSAGECHAT_PARTY:
type = CHAT_MSG_PARTY;
break;
case CMSG_MESSAGECHAT_RAID:
type = CHAT_MSG_RAID;
break;
- case CMSG_MESSAGECHAT_BATTLEGROUND:
- type = CHAT_MSG_BATTLEGROUND;
- break;
case CMSG_MESSAGECHAT_RAID_WARNING:
type = CHAT_MSG_RAID_WARNING;
break;
- */
default:
- TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode());
- recvData.hexlike();
+ TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", packet.GetOpcode());
return;
}
- if (type >= MAX_CHAT_MSG_TYPE)
- {
- TC_LOG_ERROR("network", "CHAT: Wrong message type received: %u", type);
- recvData.rfinish();
- return;
- }
+ HandleChatMessage(type, packet.Language, packet.Text);
+}
+
+void WorldSession::HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& packet)
+{
+ HandleChatMessage(CHAT_MSG_WHISPER, packet.Language, packet.Text, packet.Target);
+}
+void WorldSession::HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& packet)
+{
+ HandleChatMessage(CHAT_MSG_CHANNEL, packet.Language, packet.Text, packet.Target);
+}
+
+void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& packet)
+{
+ HandleChatMessage(CHAT_MSG_EMOTE, LANG_UNIVERSAL, packet.Text);
+}
+
+void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, std::string target /*= ""*/)
+{
Player* sender = GetPlayer();
- //TC_LOG_DEBUG("misc", "CHAT: packet received. type %u, lang %u", type, lang);
+ if (lang == LANG_UNIVERSAL && type != CHAT_MSG_EMOTE)
+ {
+ TC_LOG_ERROR("network", "CMSG_MESSAGECHAT: Possible hacking-attempt: %s tried to send a message in universal language", GetPlayerInfo().c_str());
+ SendNotification(LANG_UNKNOWN_LANGUAGE);
+ return;
+ }
- // no language sent with emote packet.
- if (type != CHAT_MSG_EMOTE && type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
+ // prevent talking at unknown language (cheating)
+ LanguageDesc const* langDesc = GetLanguageDescByID(lang);
+ if (!langDesc)
{
- recvData >> lang;
+ SendNotification(LANG_UNKNOWN_LANGUAGE);
+ return;
+ }
- if (lang == LANG_UNIVERSAL)
+ if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
+ {
+ // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
+ Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE);
+ bool foundAura = false;
+ for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
{
- TC_LOG_ERROR("network", "CMSG_MESSAGECHAT: Possible hacking-attempt: %s tried to send a message in universal language", GetPlayerInfo().c_str());
- SendNotification(LANG_UNKNOWN_LANGUAGE);
- recvData.rfinish();
- return;
+ if ((*i)->GetMiscValue() == int32(lang))
+ {
+ foundAura = true;
+ break;
+ }
}
-
- // prevent talking at unknown language (cheating)
- LanguageDesc const* langDesc = GetLanguageDescByID(lang);
- if (!langDesc)
+ if (!foundAura)
{
- SendNotification(LANG_UNKNOWN_LANGUAGE);
- recvData.rfinish();
+ SendNotification(LANG_NOT_LEARNED_LANGUAGE);
return;
}
+ }
- if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
- {
- // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
- Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE);
- bool foundAura = false;
- for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
- {
- if ((*i)->GetMiscValue() == int32(lang))
- {
- foundAura = true;
- break;
- }
- }
- if (!foundAura)
- {
- SendNotification(LANG_NOT_LEARNED_LANGUAGE);
- recvData.rfinish();
- return;
- }
- }
-
- if (lang == LANG_ADDON)
+ // send in universal language if player in .gm on mode (ignore spell effects)
+ if (sender->IsGameMaster())
+ lang = LANG_UNIVERSAL;
+ else
+ {
+ // send in universal language in two side iteration allowed mode
+ if (HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT))
+ lang = LANG_UNIVERSAL;
+ else
{
- // LANG_ADDON is only valid for the following message types
switch (type)
{
case CHAT_MSG_PARTY:
case CHAT_MSG_RAID:
+ case CHAT_MSG_RAID_WARNING:
+ // allow two side chat at group channel if two side group allowed
+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
+ lang = LANG_UNIVERSAL;
+ break;
case CHAT_MSG_GUILD:
- case CHAT_MSG_BATTLEGROUND:
- case CHAT_MSG_WHISPER:
- // check if addon messages are disabled
- if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
- {
- recvData.rfinish();
- return;
- }
+ case CHAT_MSG_OFFICER:
+ // allow two side chat at guild channel if two side guild allowed
+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
+ lang = LANG_UNIVERSAL;
break;
- default:
- TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid language/message type combination",
- GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
-
- recvData.rfinish();
- return;
}
}
- // LANG_ADDON should not be changed nor be affected by flood control
- else
- {
- // send in universal language if player in .gm on mode (ignore spell effects)
- if (sender->IsGameMaster())
- lang = LANG_UNIVERSAL;
- else
- {
- // send in universal language in two side iteration allowed mode
- if (HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT))
- lang = LANG_UNIVERSAL;
- else
- {
- switch (type)
- {
- case CHAT_MSG_PARTY:
- case CHAT_MSG_PARTY_LEADER:
- case CHAT_MSG_RAID:
- case CHAT_MSG_RAID_LEADER:
- case CHAT_MSG_RAID_WARNING:
- // allow two side chat at group channel if two side group allowed
- if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
- lang = LANG_UNIVERSAL;
- break;
- case CHAT_MSG_GUILD:
- case CHAT_MSG_OFFICER:
- // allow two side chat at guild channel if two side guild allowed
- if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
- lang = LANG_UNIVERSAL;
- break;
- }
- }
-
- // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
- Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
- if (!ModLangAuras.empty())
- lang = ModLangAuras.front()->GetMiscValue();
- }
- if (!sender->CanSpeak())
- {
- std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
- SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
- recvData.rfinish(); // Prevent warnings
- return;
- }
- }
+ // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
+ Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
+ if (!ModLangAuras.empty())
+ lang = ModLangAuras.front()->GetMiscValue();
}
- else
- lang = LANG_UNIVERSAL;
- if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER)
+ if (!sender->CanSpeak())
{
- SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
- recvData.rfinish();
+ std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
+ SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
return;
}
- uint32 textLength = 0;
- uint32 receiverLength = 0;
- std::string to, channel, msg;
- bool ignoreChecks = false;
- switch (type)
+ if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER)
{
- case CHAT_MSG_SAY:
- case CHAT_MSG_EMOTE:
- case CHAT_MSG_YELL:
- case CHAT_MSG_PARTY:
- case CHAT_MSG_GUILD:
- case CHAT_MSG_OFFICER:
- case CHAT_MSG_RAID:
- case CHAT_MSG_RAID_WARNING:
- case CHAT_MSG_BATTLEGROUND:
- textLength = recvData.ReadBits(9);
- msg = recvData.ReadString(textLength);
- break;
- case CHAT_MSG_WHISPER:
- receiverLength = recvData.ReadBits(10);
- textLength = recvData.ReadBits(9);
- to = recvData.ReadString(receiverLength);
- msg = recvData.ReadString(textLength);
- break;
- case CHAT_MSG_CHANNEL:
- receiverLength = recvData.ReadBits(10);
- textLength = recvData.ReadBits(9);
- msg = recvData.ReadString(textLength);
- channel = recvData.ReadString(receiverLength);
- break;
- case CHAT_MSG_AFK:
- case CHAT_MSG_DND:
- textLength = recvData.ReadBits(9);
- msg = recvData.ReadString(textLength);
- ignoreChecks = true;
- break;
+ SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
+ return;
}
- if (!ignoreChecks)
- {
- if (msg.empty())
- return;
+ if (msg.empty())
+ return;
- if (ChatHandler(this).ParseCommands(msg.c_str()))
- return;
+ if (ChatHandler(this).ParseCommands(msg.c_str()))
+ return;
- if (lang != LANG_ADDON)
- {
- // Strip invisible characters for non-addon messages
- if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING))
- stripLineInvisibleChars(msg);
+ // Strip invisible characters for non-addon messages
+ if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING))
+ stripLineInvisibleChars(msg);
- if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str()))
- {
- TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(),
- GetPlayer()->GetGUID().ToString().c_str(), msg.c_str());
+ if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str()))
+ {
+ TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(),
+ GetPlayer()->GetGUID().ToString().c_str(), msg.c_str());
- if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK))
- KickPlayer();
+ if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK))
+ KickPlayer();
- return;
- }
- }
+ return;
}
switch (type)
@@ -322,16 +224,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
case CHAT_MSG_WHISPER:
{
- if (!normalizePlayerName(to))
+ /// @todo implement cross realm whispers (someday)
+ ExtendedPlayerName extName = ExtractExtendedPlayerName(target);
+
+ if (!normalizePlayerName(extName.Name))
{
- SendPlayerNotFoundNotice(to);
+ SendPlayerNotFoundNotice(target);
break;
}
- Player* receiver = ObjectAccessor::FindConnectedPlayerByName(to);
+ Player* receiver = ObjectAccessor::FindConnectedPlayerByName(extName.Name);
if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
{
- SendPlayerNotFoundNotice(to);
+ SendPlayerNotFoundNotice(target);
return;
}
if (!sender->IsGameMaster() && sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))
@@ -362,7 +267,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
break;
}
case CHAT_MSG_PARTY:
- case CHAT_MSG_PARTY_LEADER:
{
// if player is in battleground, he cannot say to battleground members by /p
Group* group = GetPlayer()->GetOriginalGroup();
@@ -378,9 +282,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg);
- group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg);
+ group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID()));
break;
}
case CHAT_MSG_GUILD:
@@ -410,25 +314,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
break;
}
case CHAT_MSG_RAID:
- case CHAT_MSG_RAID_LEADER:
{
- // if player is in battleground, he cannot say to battleground members by /ra
Group* group = GetPlayer()->GetOriginalGroup();
if (!group)
- {
- group = GetPlayer()->GetGroup();
- if (!group || group->isBGGroup() || !group->isRaidGroup())
- return;
- }
+ return;
if (group->IsLeader(GetPlayer()->GetGUID()))
type = CHAT_MSG_RAID_LEADER;
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg);
- group->BroadcastPacket(&data, false);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg);
+ group->BroadcastPacket(packet.Write(), false);
break;
}
case CHAT_MSG_RAID_WARNING:
@@ -439,28 +337,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
//in battleground, raid warning is sent only to players in battleground - code is ok
- ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg);
- group->BroadcastPacket(&data, false);
- break;
- }
- case CHAT_MSG_BATTLEGROUND:
- case CHAT_MSG_BATTLEGROUND_LEADER:
- {
- // battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
- Group* group = GetPlayer()->GetGroup();
- if (!group || !group->isBGGroup())
- return;
-
- if (group->IsLeader(GetPlayer()->GetGUID()))
- type = CHAT_MSG_BATTLEGROUND_LEADER;
-
- sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
-
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg);
- group->BroadcastPacket(&data, false);
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg);
+ group->BroadcastPacket(packet.Write(), false);
break;
}
case CHAT_MSG_CHANNEL:
@@ -474,9 +354,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
}
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam()))
{
- if (Channel* chn = cMgr->GetChannel(channel, sender))
+ if (Channel* chn = cMgr->GetChannel(target, sender))
{
sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
chn->Say(sender->GetGUID(), msg.c_str(), lang);
@@ -484,70 +364,18 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
break;
}
- case CHAT_MSG_AFK:
- {
- if (!sender->IsInCombat())
- {
- if (sender ->isAFK()) // Already AFK
- {
- if (msg.empty())
- sender->ToggleAFK(); // Remove AFK
- else
- sender->autoReplyMsg = msg; // Update message
- }
- else // New AFK mode
- {
- sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
-
- if (sender->isDND())
- sender->ToggleDND();
-
- sender->ToggleAFK();
- }
-
- sScriptMgr->OnPlayerChat(sender, type, lang, msg);
- }
- break;
- }
- case CHAT_MSG_DND:
- {
- if (sender->isDND()) // Already DND
- {
- if (msg.empty())
- sender->ToggleDND(); // Remove DND
- else
- sender->autoReplyMsg = msg; // Update message
- }
- else // New DND mode
- {
- sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
-
- if (sender->isAFK())
- sender->ToggleAFK();
-
- sender->ToggleDND();
- }
-
- sScriptMgr->OnPlayerChat(sender, type, lang, msg);
- break;
- }
default:
TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang);
break;
}
}
-void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
+void WorldSession::HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& packet)
{
- Player* sender = GetPlayer();
ChatMsg type;
- switch (recvData.GetOpcode())
+ switch (packet.GetOpcode())
{
- /*
- case CMSG_MESSAGECHAT_ADDON_BATTLEGROUND:
- type = CHAT_MSG_BATTLEGROUND;
- break;
case CMSG_MESSAGECHAT_ADDON_GUILD:
type = CHAT_MSG_GUILD;
break;
@@ -560,95 +388,50 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
case CMSG_MESSAGECHAT_ADDON_RAID:
type = CHAT_MSG_RAID;
break;
- case CMSG_MESSAGECHAT_ADDON_WHISPER:
- type = CHAT_MSG_WHISPER;
- break;
- */
default:
- TC_LOG_ERROR("network", "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode());
- recvData.hexlike();
+ TC_LOG_ERROR("network", "HandleChatAddonMessageOpcode: Unknown addon chat opcode (%u)", packet.GetOpcode());
return;
}
- std::string message;
- std::string prefix;
- std::string targetName;
+ HandleChatAddonMessage(type, packet.Prefix, packet.Text);
+}
- switch (type)
- {
- case CHAT_MSG_WHISPER:
- {
- uint32 msgLen = recvData.ReadBits(9);
- uint32 prefixLen = recvData.ReadBits(5);
- uint32 targetLen = recvData.ReadBits(10);
- message = recvData.ReadString(msgLen);
- prefix = recvData.ReadString(prefixLen);
- targetName = recvData.ReadString(targetLen);
- break;
- }
- case CHAT_MSG_PARTY:
- case CHAT_MSG_RAID:
- case CHAT_MSG_OFFICER:
- {
- uint32 prefixLen = recvData.ReadBits(5);
- uint32 msgLen = recvData.ReadBits(9);
- prefix = recvData.ReadString(prefixLen);
- message = recvData.ReadString(msgLen);
- break;
- }
- case CHAT_MSG_GUILD:
- case CHAT_MSG_BATTLEGROUND:
- {
- uint32 msgLen = recvData.ReadBits(9);
- uint32 prefixLen = recvData.ReadBits(5);
- message = recvData.ReadString(msgLen);
- prefix = recvData.ReadString(prefixLen);
- break;
- }
- default:
- break;
- }
+void WorldSession::HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatAddonMessageWhisper& packet)
+{
+ HandleChatAddonMessage(CHAT_MSG_WHISPER, packet.Prefix, packet.Text, packet.Target);
+}
+
+void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target /*= ""*/)
+{
+ Player* sender = GetPlayer();
if (prefix.empty() || prefix.length() > 16)
return;
// Disabled addon channel?
if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
- {
- recvData.rfinish();
return;
- }
switch (type)
{
- case CHAT_MSG_BATTLEGROUND:
- {
- Group* group = sender->GetGroup();
- if (!group || !group->isBGGroup())
- return;
-
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix);
- group->BroadcastAddonMessagePacket(&data, prefix, false);
- break;
- }
case CHAT_MSG_GUILD:
case CHAT_MSG_OFFICER:
{
if (sender->GetGuildId())
if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId()))
- guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, message, prefix);
+ guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, text, prefix);
break;
}
case CHAT_MSG_WHISPER:
{
- if (!normalizePlayerName(targetName))
+ if (!normalizePlayerName(target))
break;
- Player* receiver = sObjectAccessor->FindPlayerByName(targetName);
+
+ Player* receiver = sObjectAccessor->FindPlayerByName(target);
if (!receiver)
break;
- sender->WhisperAddon(message, prefix, receiver);
+ sender->WhisperAddon(text, prefix, receiver);
break;
}
// Messages sent to "RAID" while in a party will get delivered to "PARTY"
@@ -657,12 +440,12 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
{
Group* group = sender->GetGroup();
- if (!group || group->isBGGroup())
+ if (!group)
break;
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix);
- group->BroadcastAddonMessagePacket(&data, prefix, true, -1, sender->GetGUID());
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, text, 0U, "", DEFAULT_LOCALE, prefix);
+ group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID());
break;
}
default:
@@ -673,6 +456,72 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
}
}
+void WorldSession::HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& packet)
+{
+ Player* sender = GetPlayer();
+
+ if (sender->IsInCombat())
+ return;
+
+ if (sender->HasAura(GM_SILENCE_AURA))
+ {
+ SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
+ return;
+ }
+
+ if (sender->isAFK()) // Already AFK
+ {
+ if (packet.Text.empty())
+ sender->ToggleAFK(); // Remove AFK
+ else
+ sender->autoReplyMsg = packet.Text; // Update message
+ }
+ else // New AFK mode
+ {
+ sender->autoReplyMsg = packet.Text.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : packet.Text;
+
+ if (sender->isDND())
+ sender->ToggleDND();
+
+ sender->ToggleAFK();
+ }
+
+ sScriptMgr->OnPlayerChat(sender, CHAT_MSG_AFK, LANG_UNIVERSAL, packet.Text);
+}
+
+void WorldSession::HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& packet)
+{
+ Player* sender = GetPlayer();
+
+ if (sender->IsInCombat())
+ return;
+
+ if (sender->HasAura(GM_SILENCE_AURA))
+ {
+ SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
+ return;
+ }
+
+ if (sender->isDND()) // Already DND
+ {
+ if (packet.Text.empty())
+ sender->ToggleDND(); // Remove DND
+ else
+ sender->autoReplyMsg = packet.Text; // Update message
+ }
+ else // New DND mode
+ {
+ sender->autoReplyMsg = packet.Text.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : packet.Text;
+
+ if (sender->isAFK())
+ sender->ToggleAFK();
+
+ sender->ToggleDND();
+ }
+
+ sScriptMgr->OnPlayerChat(sender, CHAT_MSG_DND, LANG_UNIVERSAL, packet.Text);
+}
+
void WorldSession::HandleEmoteOpcode(WorldPacket& recvData)
{
if (!GetPlayer()->IsAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED))
@@ -689,55 +538,46 @@ namespace Trinity
class EmoteChatBuilder
{
public:
- EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target)
- : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { }
+ EmoteChatBuilder(Player const& player, uint32 soundIndex, uint32 emoteID, Unit const* target)
+ : _player(player), _soundIndex(soundIndex), _emoteID(emoteID), _target(target) { }
void operator()(WorldPacket& data, LocaleConstant loc_idx)
{
- std::string const name(i_target ? i_target->GetNameForLocaleIdx(loc_idx) : "");
- uint32 namlen = name.size();
-
- data.Initialize(SMSG_TEXT_EMOTE, 20 + namlen);
- data << i_player.GetGUID();
- data << uint32(i_text_emote);
- data << uint32(i_emote_num);
- data << uint32(namlen);
- if (namlen > 1)
- data << name;
- else
- data << uint8(0x00);
+ WorldPackets::Chat::STextEmote packet;
+ packet.SourceGUID = _player.GetGUID();
+ packet.SourceAccountGUID = _player.GetSession()->GetAccountGUID();
+ if (_target)
+ packet.TargetGUID = _target->GetGUID();
+ packet.EmoteID = _emoteID;
+ packet.SoundIndex = _soundIndex;
+ data = *packet.Write();
}
private:
- Player const& i_player;
- uint32 i_text_emote;
- uint32 i_emote_num;
- Unit const* i_target;
+ Player const& _player;
+ uint32 _soundIndex;
+ uint32 _emoteID;
+ Unit const* _target;
};
-} // namespace Trinity
+}
-void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData)
+void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet)
{
- if (!GetPlayer()->IsAlive())
+ Player* player = GetPlayer();
+
+ if (!player->IsAlive())
return;
- if (!GetPlayer()->CanSpeak())
+ if (!player->CanSpeak())
{
std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
return;
}
- uint32 text_emote, emoteNum;
- ObjectGuid guid;
-
- recvData >> text_emote;
- recvData >> emoteNum;
- recvData >> guid;
-
- sScriptMgr->OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid);
+ sScriptMgr->OnPlayerTextEmote(player, packet.SoundIndex, packet.EmoteID, packet.Target);
- EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(text_emote);
+ EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.EmoteID);
if (!em)
return;
@@ -752,34 +592,34 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData)
break;
case EMOTE_STATE_DANCE:
case EMOTE_STATE_READ:
- GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim);
+ player->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim);
break;
default:
// Only allow text-emotes for "dead" entities (feign death included)
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
+ if (player->HasUnitState(UNIT_STATE_DIED))
break;
- GetPlayer()->HandleEmoteCommand(emote_anim);
+ player->HandleEmoteCommand(emote_anim);
break;
}
- Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
+ Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target);
- CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
+ CellCoord p = Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY());
Cell cell(p);
cell.SetNoCreate();
- Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
+ Trinity::EmoteChatBuilder emote_builder(*player, packet.SoundIndex, packet.EmoteID, unit);
Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > emote_do(emote_builder);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > > emote_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do);
+ Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > > emote_worker(player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do);
TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder> >, WorldTypeMapContainer> message(emote_worker);
- cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
+ cell.Visit(p, message, *player->GetMap(), *player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
- GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, 0, unit);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit);
//Send scripted event call
if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI())
- ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote);
+ ((Creature*)unit)->AI()->ReceiveEmote(player, packet.SoundIndex);
}
void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData)
@@ -811,9 +651,9 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData)
if (!player || !player->GetSession())
return;
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName());
- player->GetSession()->SendPacket(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName());
+ player->SendDirectMessage(packet.Write());
}
void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket)
diff --git a/src/server/game/Handlers/CombatHandler.cpp b/src/server/game/Handlers/CombatHandler.cpp
index 99aae6f5d0d..deac92d1b0b 100644
--- a/src/server/game/Handlers/CombatHandler.cpp
+++ b/src/server/game/Handlers/CombatHandler.cpp
@@ -27,15 +27,13 @@
#include "VehicleDefines.h"
#include "Player.h"
#include "Opcodes.h"
+#include "CombatPackets.h"
-void WorldSession::HandleAttackSwingOpcode(WorldPacket& recvData)
+void WorldSession::HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet)
{
- ObjectGuid guid;
- recvData >> guid;
+ TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_ATTACKSWING Message %s", packet.Victim.ToString().c_str());
- TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_ATTACKSWING Message %s", guid.ToString().c_str());
-
- Unit* pEnemy = ObjectAccessor::GetUnit(*_player, guid);
+ Unit* pEnemy = ObjectAccessor::GetUnit(*_player, packet.Victim);
if (!pEnemy)
{
@@ -68,7 +66,7 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket& recvData)
_player->Attack(pEnemy, true);
}
-void WorldSession::HandleAttackStopOpcode(WorldPacket & /*recvData*/)
+void WorldSession::HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& /*recvData*/)
{
GetPlayer()->AttackStop();
}
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 95bcecbfdeb..54fb865c017 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -28,6 +28,8 @@
#include "ObjectAccessor.h"
#include "SpellInfo.h"
#include "DB2Stores.h"
+#include "NPCPackets.h"
+#include "ItemPackets.h"
#include <vector>
void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData)
@@ -560,18 +562,14 @@ void WorldSession::HandleBuyItemOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "WORLD: received wrong itemType (%u) in HandleBuyItemOpcode", itemType);
}
-void WorldSession::HandleListInventoryOpcode(WorldPacket& recvData)
+void WorldSession::HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet)
{
- ObjectGuid guid;
-
- recvData >> guid;
+ TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_LIST_INVENTORY");
if (!GetPlayer()->IsAlive())
return;
- TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_LIST_INVENTORY");
-
- SendListInventory(guid);
+ SendListInventory(packet.Unit);
}
void WorldSession::SendListInventory(ObjectGuid vendorGuid)
@@ -597,12 +595,10 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)
VendorItemData const* vendorItems = vendor->GetVendorItems();
uint32 rawItemCount = vendorItems ? vendorItems->GetItemCount() : 0;
- //if (rawItemCount > 300),
- // rawItemCount = 300; // client cap but uint8 max value is 255
+ WorldPackets::NPC::VendorInventory packet;
+ packet.Vendor = vendor->GetGUID();
- ByteBuffer itemsData(32 * rawItemCount);
- std::vector<bool> enablers;
- enablers.reserve(2 * rawItemCount);
+ packet.Items.resize(rawItemCount);
const float discountMod = _player->GetReputationPriceDiscount(vendor);
uint8 count = 0;
@@ -612,13 +608,15 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)
if (!vendorItem)
continue;
+ WorldPackets::NPC::VendorItem& item = packet.Items[count];
+
if (vendorItem->Type == ITEM_VENDOR_TYPE_ITEM)
{
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(vendorItem->item);
if (!itemTemplate)
continue;
- uint32 leftInStock = !vendorItem->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(vendorItem);
+ int32 leftInStock = !vendorItem->maxcount ? -1 : vendor->GetVendorItemCurrentCount(vendorItem);
if (!_player->IsGameMaster()) // ignore conditions if GM on
{
// Respect allowed class
@@ -647,29 +645,15 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)
if (int32 priceMod = _player->GetTotalAuraModifier(SPELL_AURA_MOD_VENDOR_ITEMS_PRICES))
price -= CalculatePct(price, priceMod);
- itemsData << uint32(slot + 1); // client expects counting to start at 1
- itemsData << uint32(itemTemplate->MaxDurability);
+ item.MuID = slot + 1; // client expects counting to start at 1
+ item.Durability = itemTemplate->MaxDurability;
+ item.ExtendedCostID = vendorItem->ExtendedCost;
+ item.Type = vendorItem->Type;
+ item.Quantity = leftInStock;
+ item.StackCount = itemTemplate->BuyCount;
+ item.Price = price;
- if (vendorItem->ExtendedCost)
- {
- enablers.push_back(0);
- itemsData << uint32(vendorItem->ExtendedCost);
- }
- else
- enablers.push_back(1);
-
- enablers.push_back(1); // item is unlocked
-
- itemsData << uint32(vendorItem->item);
- itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency
- itemsData << uint32(price);
- itemsData << uint32(itemTemplate->DisplayInfoID);
- // if (!unk "enabler") data << uint32(something);
- itemsData << int32(leftInStock);
- itemsData << uint32(itemTemplate->BuyCount);
-
- if (++count >= MAX_VENDOR_ITEMS)
- break;
+ item.Item.ItemID = vendorItem->item;
}
else if (vendorItem->Type == ITEM_VENDOR_TYPE_CURRENCY)
{
@@ -680,70 +664,23 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)
if (!vendorItem->ExtendedCost)
continue; // there's no price defined for currencies, only extendedcost is used
- itemsData << uint32(slot + 1); // client expects counting to start at 1
- itemsData << uint32(0); // max durability
-
- enablers.push_back(0);
- itemsData << uint32(vendorItem->ExtendedCost);
-
- enablers.push_back(1); // item is unlocked
-
- itemsData << uint32(vendorItem->item);
- itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency
- itemsData << uint32(0); // price, only seen currency types that have Extended cost
- itemsData << uint32(0); // displayId
- // if (!unk "enabler") data << uint32(something);
- itemsData << int32(-1);
- itemsData << uint32(vendorItem->maxcount);
-
- if (++count >= MAX_VENDOR_ITEMS)
- break;
+ item.MuID = slot + 1; // client expects counting to start at 1
+ item.ExtendedCostID = vendorItem->ExtendedCost;
+ item.Item.ItemID = vendorItem->item;
+ item.Type = vendorItem->Type;
+ item.StackCount = vendorItem->maxcount;
}
- // else error
- }
-
- ObjectGuid guid = vendorGuid;
-
- WorldPacket data(SMSG_LIST_INVENTORY, 12 + itemsData.size());
-
- data.WriteBit(guid[1]);
- data.WriteBit(guid[0]);
-
- data.WriteBits(count, 21); // item count
-
- data.WriteBit(guid[3]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[7]);
-
- for (std::vector<bool>::const_iterator itr = enablers.begin(); itr != enablers.end(); ++itr)
- data.WriteBit(*itr);
-
- data.WriteBit(guid[4]);
+ else
+ continue;
- data.FlushBits();
- data.append(itemsData);
-
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[6]);
-
- // It doesn't matter what value is used here (PROBABLY its full vendor size)
- // What matters is that if count of items we can see is 0 and this field is 1
- // then client will open the vendor list, otherwise it won't
- if (rawItemCount)
- data << uint8(rawItemCount);
- else
- data << uint8(vendor->IsArmorer());
+ if (++count >= MAX_VENDOR_ITEMS)
+ break;
+ }
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[7]);
+ // Resize vector to real size (some items can be skipped due to checks)
+ packet.Items.resize(count);
- SendPacket(&data);
+ SendPacket(packet.Write());
}
void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData)
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index ab906fa956f..3a48c29ce03 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -57,6 +57,7 @@
#include "BattlefieldMgr.h"
#include "DB2Stores.h"
#include "CharacterPackets.h"
+#include "ClientConfigPackets.h"
#include "MiscPackets.h"
void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData)
@@ -537,12 +538,9 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/)
SendPacket(&data);
}
-void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData)
+void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet)
{
- ObjectGuid guid;
- recvData >> guid;
-
- _player->SetSelection(guid);
+ _player->SetSelection(packet.Selection);
}
void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData)
@@ -967,97 +965,70 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recvData)
player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT);
}
-void WorldSession::HandleUpdateAccountData(WorldPacket& recvData)
+void WorldSession::HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_UPDATE_ACCOUNT_DATA");
-
- uint32 type, timestamp, decompressedSize;
- recvData >> type >> timestamp >> decompressedSize;
-
- TC_LOG_DEBUG("network", "UAD: type %u, time %u, decompressedSize %u", type, timestamp, decompressedSize);
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_UPDATE_ACCOUNT_DATA: type %u, time %u, decompressedSize %u",
+ packet.DataType, packet.Time, packet.Size);
- if (type > NUM_ACCOUNT_DATA_TYPES)
+ if (packet.DataType > NUM_ACCOUNT_DATA_TYPES)
return;
- if (decompressedSize == 0) // erase
+ if (packet.Size == 0) // erase
{
- SetAccountData(AccountDataType(type), 0, "");
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
-
+ SetAccountData(AccountDataType(packet.DataType), 0, "");
return;
}
- if (decompressedSize > 0xFFFF)
+ if (packet.Size > 0xFFFF)
{
- recvData.rfinish(); // unnneded warning spam in this case
- TC_LOG_ERROR("network", "UAD: Account data packet too big, size %u", decompressedSize);
+ TC_LOG_ERROR("network", "UAD: Account data packet too big, size %u", packet.Size);
return;
}
ByteBuffer dest;
- dest.resize(decompressedSize);
+ dest.resize(packet.Size);
- uLongf realSize = decompressedSize;
- if (uncompress(dest.contents(), &realSize, recvData.contents() + recvData.rpos(), recvData.size() - recvData.rpos()) != Z_OK)
+ uLongf realSize = packet.Size;
+ if (uncompress(dest.contents(), &realSize, packet.CompressedData.contents(), packet.CompressedData.size()) != Z_OK)
{
- recvData.rfinish(); // unnneded warning spam in this case
TC_LOG_ERROR("network", "UAD: Failed to decompress account data");
return;
}
- recvData.rfinish(); // uncompress read (recvData.size() - recvData.rpos())
-
std::string adata;
dest >> adata;
- SetAccountData(AccountDataType(type), timestamp, adata);
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
+ SetAccountData(AccountDataType(packet.DataType), packet.Time, adata);
}
-void WorldSession::HandleRequestAccountData(WorldPacket& recvData)
+void WorldSession::HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_ACCOUNT_DATA");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_ACCOUNT_DATA: type %u", request.DataType);
- uint32 type;
- recvData >> type;
-
- TC_LOG_DEBUG("network", "RAD: type %u", type);
-
- if (type >= NUM_ACCOUNT_DATA_TYPES)
+ if (request.DataType >= NUM_ACCOUNT_DATA_TYPES)
return;
- AccountData* adata = GetAccountData(AccountDataType(type));
+ AccountData const* adata = GetAccountData(AccountDataType(request.DataType));
- uint32 size = adata->Data.size();
+ WorldPackets::ClientConfig::UpdateAccountData data;
+ data.Player = _player ? _player->GetGUID() : ObjectGuid::Empty;
+ data.Time = adata->Time;
+ data.Size = adata->Data.size();
+ data.DataType = request.DataType;
- uLongf destSize = compressBound(size);
+ uLongf destSize = compressBound(data.Size);
- ByteBuffer dest;
- dest.resize(destSize);
+ data.CompressedData.resize(destSize);
- if (size && compress(dest.contents(), &destSize, (uint8 const*)adata->Data.c_str(), size) != Z_OK)
+ if (data.Size && compress(data.CompressedData.contents(), &destSize, (uint8 const*)adata->Data.c_str(), data.Size) != Z_OK)
{
- TC_LOG_DEBUG("network", "RAD: Failed to compress account data");
+ TC_LOG_ERROR("network", "RAD: Failed to compress account data");
return;
}
- dest.resize(destSize);
+ data.CompressedData.resize(destSize);
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA, 8+4+4+4+destSize);
- data << (_player ? _player->GetGUID() : ObjectGuid::Empty);
- data << uint32(type); // type (0-7)
- data << uint32(adata->Time); // unix time
- data << uint32(size); // decompressed length
- data.append(dest); // compressed data
- SendPacket(&data);
+ SendPacket(data.Write());
}
int32 WorldSession::HandleEnableNagleAlgorithm()
@@ -1522,24 +1493,21 @@ void WorldSession::HandleSetTitleOpcode(WorldPacket& recvData)
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleTimeSyncResp(WorldPacket& recvData)
+void WorldSession::HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet)
{
TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESP");
- uint32 counter, clientTicks;
- recvData >> counter >> clientTicks;
-
- if (counter != _player->m_timeSyncQueue.front())
+ if (packet.SequenceIndex != _player->m_timeSyncQueue.front())
TC_LOG_ERROR("network", "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str());
- TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient);
+ TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", packet.SequenceIndex, packet.ClientTime, packet.ClientTime - _player->m_timeSyncClient);
- uint32 ourTicks = clientTicks + (getMSTime() - _player->m_timeSyncServer);
+ uint32 ourTicks = packet.ClientTime + (getMSTime() - _player->m_timeSyncServer);
// diff should be small
- TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - clientTicks, GetLatency());
+ TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - packet.ClientTime, GetLatency());
- _player->m_timeSyncClient = clientTicks;
+ _player->m_timeSyncClient = packet.ClientTime;
_player->m_timeSyncQueue.pop();
}
@@ -1756,9 +1724,9 @@ void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& /*recvData*/)
// empty opcode
TC_LOG_DEBUG("network", "WORLD: CMSG_WORLD_STATE_UI_TIMER_UPDATE");
- WorldPacket data(SMSG_WORLD_STATE_UI_TIMER_UPDATE, 4);
- data << uint32(time(NULL));
- SendPacket(&data);
+ WorldPackets::Misc::UITime response;
+ response.Time = time(NULL);
+ SendPacket(response.Write());
}
void WorldSession::SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<uint32> const& terrainswaps, std::set<uint32> const& worldMapAreaSwaps)
@@ -1896,74 +1864,6 @@ void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket)
_player->SetPendingBind(0, 0);
}
-void WorldSession::HandleRequestHotfix(WorldPacket& recvPacket)
-{
- uint32 type, count;
- recvPacket >> type;
-
- DB2StorageBase const* store = GetDB2Storage(type);
- if (!store)
- {
- TC_LOG_ERROR("network", "CMSG_REQUEST_HOTFIX: Received unknown hotfix type: %u", type);
- recvPacket.rfinish();
- return;
- }
-
- count = recvPacket.ReadBits(23);
-
- ObjectGuid* guids = new ObjectGuid[count];
- for (uint32 i = 0; i < count; ++i)
- {
- guids[i][0] = recvPacket.ReadBit();
- guids[i][4] = recvPacket.ReadBit();
- guids[i][7] = recvPacket.ReadBit();
- guids[i][2] = recvPacket.ReadBit();
- guids[i][5] = recvPacket.ReadBit();
- guids[i][3] = recvPacket.ReadBit();
- guids[i][6] = recvPacket.ReadBit();
- guids[i][1] = recvPacket.ReadBit();
- }
-
- uint32 entry;
- for (uint32 i = 0; i < count; ++i)
- {
- recvPacket.ReadByteSeq(guids[i][5]);
- recvPacket.ReadByteSeq(guids[i][6]);
- recvPacket.ReadByteSeq(guids[i][7]);
- recvPacket.ReadByteSeq(guids[i][0]);
- recvPacket.ReadByteSeq(guids[i][1]);
- recvPacket.ReadByteSeq(guids[i][3]);
- recvPacket.ReadByteSeq(guids[i][4]);
- recvPacket >> entry;
- recvPacket.ReadByteSeq(guids[i][2]);
-
- if (!store->HasRecord(entry))
- {
- WorldPacket data(SMSG_DB_REPLY, 4 * 4);
- data << -int32(entry);
- data << uint32(store->GetHash());
- data << uint32(time(NULL));
- data << uint32(0);
- SendPacket(&data);
- continue;
- }
-
- WorldPacket data(SMSG_DB_REPLY);
- data << int32(entry);
- data << uint32(store->GetHash());
- data << uint32(sObjectMgr->GetHotfixDate(entry, store->GetHash()));
-
- size_t sizePos = data.wpos();
- data << uint32(0); // size of next block
- store->WriteRecord(entry, uint32(GetSessionDbcLocale()), data);
- data.put<uint32>(sizePos, data.wpos() - sizePos - 4);
-
- SendPacket(&data);
- }
-
- delete[] guids;
-}
-
void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket)
{
TC_LOG_DEBUG("network", "WORLD: CMSG_UPDATE_MISSILE_TRAJECTORY");
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index adc2e185591..1ccd7294cc8 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -36,7 +36,7 @@
#define MOVEMENT_PACKET_TIME_DELAY 0
-void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recvData*/)
+void WorldSession::HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortAck& /*packet*/)
{
TC_LOG_DEBUG("network", "WORLD: got MSG_MOVE_WORLDPORT_ACK.");
HandleMoveWorldportAckOpcode();
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index cc82063e074..90af94f9754 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -37,6 +37,7 @@
#include "ScriptMgr.h"
#include "CreatureAI.h"
#include "SpellInfo.h"
+#include "NPCPackets.h"
enum StableResultCode
{
@@ -75,18 +76,14 @@ void WorldSession::SendTabardVendorActivate(ObjectGuid guid)
SendPacket(&data);
}
-void WorldSession::HandleBankerActivateOpcode(WorldPacket& recvData)
+void WorldSession::HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet)
{
- ObjectGuid guid;
-
TC_LOG_DEBUG("network", "WORLD: Received CMSG_BANKER_ACTIVATE");
- recvData >> guid;
-
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_BANKER);
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_BANKER);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleBankerActivateOpcode - %s not found or you can not interact with him.", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleBankerActivateOpcode - %s not found or you can not interact with him.", packet.Unit.ToString().c_str());
return;
}
@@ -94,7 +91,7 @@ void WorldSession::HandleBankerActivateOpcode(WorldPacket& recvData)
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
- SendShowBank(guid);
+ SendShowBank(packet.Unit);
}
void WorldSession::SendShowBank(ObjectGuid guid)
@@ -112,12 +109,9 @@ void WorldSession::SendShowMailBox(ObjectGuid guid)
SendPacket(&data);
}
-void WorldSession::HandleTrainerListOpcode(WorldPacket& recvData)
+void WorldSession::HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet)
{
- ObjectGuid guid;
-
- recvData >> guid;
- SendTrainerList(guid);
+ SendTrainerList(packet.Unit);
}
void WorldSession::SendTrainerList(ObjectGuid guid)
@@ -148,18 +142,16 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle)
return;
}
- WorldPacket data(SMSG_TRAINER_LIST, 8+4+4+trainer_spells->spellList.size()*38 + strTitle.size()+1);
- data << guid;
- data << uint32(trainer_spells->trainerType);
- data << uint32(1); // different value for each trainer, also found in CMSG_TRAINER_BUY_SPELL
-
- size_t count_pos = data.wpos();
- data << uint32(trainer_spells->spellList.size());
+ WorldPackets::NPC::TrainerList packet;
+ packet.TrainerGUID = guid;
+ packet.TrainerType = trainer_spells->trainerType;
+ packet.Greeting = strTitle;
// reputation discount
float fDiscountMod = _player->GetReputationPriceDiscount(unit);
bool can_learn_primary_prof = GetPlayer()->GetFreePrimaryProfessionPoints() > 0;
+ packet.Spells.resize(trainer_spells->spellList.size());
uint32 count = 0;
for (TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr)
{
@@ -185,22 +177,23 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle)
TrainerSpellState state = _player->GetTrainerSpellState(tSpell);
- data << uint32(tSpell->SpellID); // learned spell (or cast-spell in profession case)
- data << uint8(state == TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state);
- data << uint32(floor(tSpell->MoneyCost * fDiscountMod));
+ WorldPackets::NPC::TrainerListSpell& spell = packet.Spells[count];
+ spell.SpellID = tSpell->SpellID;
+ spell.MoneyCost = floor(tSpell->MoneyCost * fDiscountMod);
+ spell.ReqSkillLine = tSpell->ReqSkillLine;
+ spell.ReqSkillRank = tSpell->ReqSkillRank;
+ spell.ReqLevel = tSpell->ReqLevel;
+ spell.Usable = (state == TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state);
- data << uint8(tSpell->ReqLevel);
- data << uint32(tSpell->ReqSkillLine);
- data << uint32(tSpell->ReqSkillRank);
- //prev + req or req + 0
uint8 maxReq = 0;
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ /// @todo Update this when new spell system is ready
+ /*for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
if (!tSpell->ReqAbility[i])
continue;
if (uint32 prevSpellId = sSpellMgr->GetPrevSpellInChain(tSpell->ReqAbility[i]))
{
- data << uint32(prevSpellId);
+ spell.ReqAbility[maxReq] = prevSpellId;
++maxReq;
}
if (maxReq == 2)
@@ -208,29 +201,25 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle)
SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(tSpell->ReqAbility[i]);
for (SpellsRequiringSpellMap::const_iterator itr2 = spellsRequired.first; itr2 != spellsRequired.second && maxReq < 3; ++itr2)
{
- data << uint32(itr2->second);
+ spell.ReqAbility[maxReq] = itr2->second;
++maxReq;
}
if (maxReq == 2)
break;
- }
- while (maxReq < 2)
+ }*/
+ while (maxReq < MAX_TRAINERSPELL_ABILITY_REQS)
{
- data << uint32(0);
+ spell.ReqAbility[maxReq] = 0;
++maxReq;
}
- data << uint32(primary_prof_first_rank && can_learn_primary_prof ? 1 : 0);
- // primary prof. learn confirmation dialog
- data << uint32(primary_prof_first_rank ? 1 : 0); // must be equal prev. field to have learn button in enabled state
-
++count;
}
- data << strTitle;
+ // Shrink to actual data size
+ packet.Spells.resize(count);
- data.put<uint32>(count_pos, count);
- SendPacket(&data);
+ SendPacket(packet.Write());
}
void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recvData)
@@ -312,17 +301,14 @@ void WorldSession::SendTrainerBuyFailed(ObjectGuid guid, uint32 spellId, uint32
SendPacket(&data);
}
-void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData)
+void WorldSession::HandleGossipHelloOpcode(WorldPackets::NPC::Hello& packet)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_GOSSIP_HELLO");
- ObjectGuid guid;
- recvData >> guid;
-
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE);
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_NONE);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleGossipHelloOpcode - %s not found or you can not interact with him.", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleGossipHelloOpcode - %s not found or you can not interact with him.", packet.Unit.ToString().c_str());
return;
}
@@ -453,18 +439,15 @@ void WorldSession::SendSpiritResurrect()
_player->UpdateObjectVisibility();
}
-void WorldSession::HandleBinderActivateOpcode(WorldPacket& recvData)
+void WorldSession::HandleBinderActivateOpcode(WorldPackets::NPC::Hello& packet)
{
- ObjectGuid npcGUID;
- recvData >> npcGUID;
-
if (!GetPlayer()->IsInWorld() || !GetPlayer()->IsAlive())
return;
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(npcGUID, UNIT_NPC_FLAG_INNKEEPER);
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_INNKEEPER);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleBinderActivateOpcode - %s not found or you can not interact with him.", npcGUID.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleBinderActivateOpcode - %s not found or you can not interact with him.", packet.Unit.ToString().c_str());
return;
}
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 490097ec647..81dc9e6cec0 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -39,7 +39,7 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid)
Player* player = ObjectAccessor::FindConnectedPlayer(guid);
CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid);
- WorldPackets::Character::PlayerNameResponse response;
+ WorldPackets::Query::QueryPlayerNameResponse response;
response.Player = guid;
if (characterInfo)
@@ -68,7 +68,7 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid)
SendPacket(response.Write());
}
-void WorldSession::HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet)
+void WorldSession::HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet)
{
SendNameQueryOpcode(packet.Player);
}
@@ -239,128 +239,65 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket& /*recvData*/)
SendPacket(&data);
}
-void WorldSession::HandleNpcTextQueryOpcode(WorldPacket& recvData)
+void WorldSession::HandleNpcTextQueryOpcode(WorldPackets::Query::QueryNPCText& packet)
{
- uint32 textID;
- uint64 guid;
+ TC_LOG_DEBUG("network", "WORLD: CMSG_NPC_TEXT_QUERY TextId: %u", packet.TextID);
- recvData >> textID;
- TC_LOG_DEBUG("network", "WORLD: CMSG_NPC_TEXT_QUERY TextId: %u", textID);
+ GossipText const* gossip = sObjectMgr->GetGossipText(packet.TextID);
- recvData >> guid;
-
- GossipText const* gossip = sObjectMgr->GetGossipText(textID);
-
- WorldPacket data(SMSG_NPC_TEXT_UPDATE, 100); // guess size
- data << textID;
-
- if (!gossip)
+ WorldPackets::Query::QueryNPCTextResponse response;
+ response.TextID = packet.TextID;
+
+ if (gossip)
{
for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
{
- data << float(0);
- data << "Greetings $N";
- data << "Greetings $N";
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
+ response.Probabilities[i] = gossip->Options[i].Probability;
+ response.BroadcastTextID[i] = gossip->Options[i].BroadcastTextID;
}
- }
- else
- {
- std::string text0[MAX_GOSSIP_TEXT_OPTIONS], text1[MAX_GOSSIP_TEXT_OPTIONS];
- LocaleConstant locale = GetSessionDbLocaleIndex();
-
- for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
- {
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(gossip->Options[i].BroadcastTextID);
- if (bct)
- {
- text0[i] = bct->GetText(locale, GENDER_MALE, true);
- text1[i] = bct->GetText(locale, GENDER_FEMALE, true);
- }
- else
- {
- text0[i] = gossip->Options[i].Text_0;
- text1[i] = gossip->Options[i].Text_1;
- }
-
- if (locale != DEFAULT_LOCALE && !bct)
- {
- if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textID))
- {
- ObjectMgr::GetLocaleString(npcTextLocale->Text_0[i], locale, text0[i]);
- ObjectMgr::GetLocaleString(npcTextLocale->Text_1[i], locale, text1[i]);
- }
- }
-
- data << gossip->Options[i].Probability;
-
- if (text0[i].empty())
- data << text1[i];
- else
- data << text0[i];
-
- if (text1[i].empty())
- data << text0[i];
- else
- data << text1[i];
-
- data << gossip->Options[i].Language;
- for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
- {
- data << gossip->Options[i].Emotes[j]._Delay;
- data << gossip->Options[i].Emotes[j]._Emote;
- }
- }
+ response.Allow = true;
}
- SendPacket(&data);
+ SendPacket(response.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_NPC_TEXT_UPDATE");
}
/// Only _static_ data is sent in this packet !!!
-void WorldSession::HandlePageTextQueryOpcode(WorldPacket& recvData)
+void WorldSession::HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_PAGE_TEXT_QUERY");
-
- uint32 pageID;
- recvData >> pageID;
- recvData.read_skip<uint64>(); // guid
+
+ uint32 pageID = packet.PageTextID;
while (pageID)
{
PageText const* pageText = sObjectMgr->GetPageText(pageID);
- // guess size
- WorldPacket data(SMSG_PAGE_TEXT_QUERY_RESPONSE, 50);
- data << pageID;
+
+ WorldPackets::Query::QueryPageTextResponse response;
+ response.PageTextID = pageID;
if (!pageText)
{
- data << "Item page missing.";
- data << uint32(0);
+ response.Allow = false;
pageID = 0;
}
else
{
- std::string Text = pageText->Text;
-
+ response.Allow = true;
+ response.Info.ID = pageID;
+
int loc_idx = GetSessionDbLocaleIndex();
if (loc_idx >= 0)
if (PageTextLocale const* player = sObjectMgr->GetPageTextLocale(pageID))
- ObjectMgr::GetLocaleString(player->Text, loc_idx, Text);
+ ObjectMgr::GetLocaleString(player->Text, loc_idx, response.Info.Text);
- data << Text;
- data << uint32(pageText->NextPageID);
+ response.Info.NextPageID = pageText->NextPageID;
pageID = pageText->NextPageID;
}
- SendPacket(&data);
+
+ SendPacket(response.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_PAGE_TEXT_QUERY_RESPONSE");
}
@@ -494,3 +431,35 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData)
SendPacket(&data);
}
+
+void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet)
+{
+ DB2StorageBase const* store = GetDB2Storage(packet.TableHash);
+ if (!store)
+ {
+ TC_LOG_ERROR("network", "CMSG_DB_QUERY_BULK: Received unknown hotfix type: %u", packet.TableHash);
+ return;
+ }
+
+ for (WorldPackets::Query::DBQueryRecord const& rec : packet.Queries)
+ {
+ WorldPackets::Query::DBReply response;
+ response.TableHash = packet.TableHash;
+
+ if (store->HasRecord(rec.RecordID))
+ {
+ response.RecordID = rec.RecordID;
+ response.Locale = GetSessionDbcLocale();
+ response.Timestamp = sObjectMgr->GetHotfixDate(rec.RecordID, packet.TableHash);
+ response.Data = store;
+ }
+ else
+ {
+ TC_LOG_ERROR("network", "CMSG_DB_QUERY_BULK: Entry %u does not exist in datastore: %u", rec.RecordID, packet.TableHash);
+ response.RecordID = -rec.RecordID;
+ response.Timestamp = time(NULL);
+ }
+
+ SendPacket(response.Write());
+ }
+}
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 26451751b5d..f591a5fa988 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -31,17 +31,16 @@
#include "Battleground.h"
#include "ScriptMgr.h"
#include "GameObjectAI.h"
+#include "QuestPackets.h"
-void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData)
+void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet)
{
- ObjectGuid guid;
- recvData >> guid;
uint32 questStatus = DIALOG_STATUS_NONE;
- Object* questGiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
+ Object* questGiver = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
if (!questGiver)
{
- TC_LOG_INFO("network", "Error in CMSG_QUESTGIVER_STATUS_QUERY, called for non-existing questgiver (%s)", guid.ToString().c_str());
+ TC_LOG_INFO("network", "Error in CMSG_QUESTGIVER_STATUS_QUERY, called for non-existing questgiver (%s)", packet.QuestGiverGUID.ToString().c_str());
return;
}
@@ -66,7 +65,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData)
}
//inform client about status of quest
- _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid);
+ _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, packet.QuestGiverGUID);
}
void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData)
@@ -639,19 +638,14 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket)
}
}
-void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& /*packet*/)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY");
- uint32 count = 0;
-
- WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4 + 8 + 4);
- data << uint32(count); // placeholder
+ WorldPackets::Quest::QuestGiverStatusMultiple response;
for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr)
{
- uint32 questStatus = DIALOG_STATUS_NONE;
-
if (itr->IsAnyTypeCreature())
{
// need also pet quests case support
@@ -661,11 +655,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket
if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))
continue;
- questStatus = _player->GetQuestDialogStatus(questgiver);
-
- data << questgiver->GetGUID();
- data << uint32(questStatus);
- ++count;
+ response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver));
}
else if (itr->IsGameObject())
{
@@ -673,16 +663,11 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket
if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
continue;
- questStatus = _player->GetQuestDialogStatus(questgiver);
-
- data << questgiver->GetGUID();
- data << uint32(questStatus);
- ++count;
+ response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver));
}
}
- data.put<uint32>(0, count); // write real count
- SendPacket(&data);
+ SendPacket(response.Write());
}
void WorldSession::HandleQueryQuestsCompleted(WorldPacket& /*recvData*/)
diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index ef1e9031cb9..f0c1b28117b 100644
--- a/src/server/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
@@ -26,6 +26,7 @@
#include "UpdateMask.h"
#include "WorldPacket.h"
#include "WorldSession.h"
+#include "TalentPackets.h"
void WorldSession::HandleLearnTalentOpcode(WorldPacket& recvData)
{
@@ -126,3 +127,36 @@ void WorldSession::HandleUnlearnSkillOpcode(WorldPacket& recvData)
GetPlayer()->SetSkill(skillId, 0, 0, 0);
}
+
+void WorldSession::HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet)
+{
+ Player* player = GetPlayer();
+
+ if (packet.SpecGroupIndex >= MAX_SPECIALIZATIONS)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization index %u out of range", packet.SpecGroupIndex);
+ return;
+ }
+
+ ChrSpecializationEntry const* chrSpec = sChrSpecializationByIndexStore[player->getClass()][packet.SpecGroupIndex];
+
+ if (!chrSpec)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization index %u not found", packet.SpecGroupIndex);
+ return;
+ }
+
+ if (chrSpec->ClassID != player->getClass())
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization %u does not belong to class %u", chrSpec->ID, player->getClass());
+ return;
+ }
+
+ if (player->getLevel() < MIN_SPECIALIZATION_LEVEL)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - player level too low for specializations");
+ return;
+ }
+
+ player->LearnTalentSpecialization(chrSpec->ID);
+}
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 0e243064cc2..79b213e2829 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -458,6 +458,10 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
uint32 spellId;
recvPacket >> spellId;
+ ObjectGuid guid;
+ recvPacket >> guid;
+
+
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo)
return;
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index a8255d62777..1c968a495e9 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -128,7 +128,7 @@ void InstanceScript::LoadObjectData(ObjectData const* creatureData, ObjectData c
if (gameObjectData)
LoadObjectData(gameObjectData, _gameObjectInfo);
- TC_LOG_ERROR("scripts", "InstanceScript::LoadObjectData: " SZFMTD " objects loaded.", _creatureInfo.size() + _gameObjectInfo.size());
+ TC_LOG_DEBUG("scripts", "InstanceScript::LoadObjectData: " SZFMTD " objects loaded.", _creatureInfo.size() + _gameObjectInfo.size());
}
void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objectInfo)
diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index 34733613c28..ede70719652 100644
--- a/src/server/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
@@ -22,6 +22,7 @@
#include "Spline.h"
#include "DBCStores.h"
#include "ObjectGuid.h"
+#include "DB2Structure.h"
struct KeyFrame;
struct GameObjectTemplate;
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 22bc3b079a3..7d32555e651 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -87,9 +87,10 @@ enum Expansions
enum Gender
{
- GENDER_MALE = 0,
- GENDER_FEMALE = 1,
- GENDER_NONE = 2
+ GENDER_UNKNOWN = -1,
+ GENDER_MALE = 0,
+ GENDER_FEMALE = 1,
+ GENDER_NONE = 2
};
// ChrRaces.dbc (6.0.2.18988)
@@ -844,12 +845,13 @@ enum SpellAttr13
SPELL_ATTR13_UNK23 = 0x00800000 // 23
};
-#define MIN_TALENT_GROUP 0
-#define MAX_TALENT_GROUP 1
-#define MIN_TALENT_GROUPS 1
-#define MAX_TALENT_GROUPS 2
-#define MAX_GLYPH_SLOT_INDEX 9
-#define REQ_PRIMARY_TREE_TALENTS 31
+#define MIN_TALENT_GROUP 0
+#define MAX_TALENT_GROUP 1
+#define MIN_TALENT_GROUPS 1
+#define MAX_TALENT_GROUPS 2
+#define MAX_GLYPH_SLOT_INDEX 6
+#define MIN_SPECIALIZATION_LEVEL 10
+#define MAX_SPECIALIZATIONS 4
// Custom values
enum SpellClickUserTypes
@@ -4156,8 +4158,22 @@ enum ChatMsg
CHAT_MSG_CURRENCY = 0x40
};
+#define GM_SILENCE_AURA 1852
+
#define MAX_CHAT_MSG_TYPE 0x41
+enum ChatFlags
+{
+ CHAT_FLAG_NONE = 0x00,
+ CHAT_FLAG_AFK = 0x01,
+ CHAT_FLAG_DND = 0x02,
+ CHAT_FLAG_GM = 0x04,
+ CHAT_FLAG_COM = 0x08, // Commentator
+ CHAT_FLAG_DEV = 0x10,
+ CHAT_FLAG_BOSS_SOUND = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper
+ CHAT_FLAG_MOBILE = 0x40
+};
+
enum ChatLinkColors
{
CHAT_LINK_COLOR_TRADE = 0xffffd000, // orange
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 749b6be4ee5..560f40143bb 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -24,6 +24,7 @@
#include "Vehicle.h"
#include "WorldPacket.h"
#include "Opcodes.h"
+#include "MovementPackets.h"
namespace Movement
{
@@ -115,17 +116,11 @@ namespace Movement
unit->m_movementInfo.SetMovementFlags(moveFlags);
move_spline.Initialize(args);
- WorldPacket data(SMSG_MONSTER_MOVE, 64);
- data << unit->GetPackGUID();
- if (!unit->GetTransGUID().IsEmpty())
- {
- data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
- data << unit->GetTransGUID().WriteAsPacked();
- data << int8(unit->GetTransSeat());
- }
-
- PacketBuilder::WriteMonsterMove(move_spline, data);
- unit->SendMessageToSet(&data, true);
+ WorldPackets::Movement::MonsterMove packet;
+ packet.MoverGUID = unit->GetGUID();
+ packet.Pos = real_position;
+ PacketBuilder::WriteMonsterMove(move_spline, packet.SplineData);
+ unit->SendMessageToSet(packet.Write(), true);
return move_spline.Duration();
}
@@ -161,17 +156,18 @@ namespace Movement
move_spline.onTransport = transport;
move_spline.Initialize(args);
- WorldPacket data(SMSG_MONSTER_MOVE, 64);
- data << unit->GetPackGUID();
+ WorldPackets::Movement::MonsterMove packet;
+ packet.MoverGUID = unit->GetGUID();
+ packet.Pos = loc;
+ packet.SplineData.ID = move_spline.GetId();
+
if (transport)
{
- data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
- data << unit->GetTransGUID().WriteAsPacked();
- data << int8(unit->GetTransSeat());
+ packet.SplineData.Move.TransportGUID = unit->GetTransGUID();
+ packet.SplineData.Move.VehicleSeat = unit->GetTransSeat();
}
- PacketBuilder::WriteStopMovement(loc, args.splineId, data);
- unit->SendMessageToSet(&data, true);
+ unit->SendMessageToSet(packet.Write(), true);
}
MoveSplineInit::MoveSplineInit(Unit* m) : unit(m)
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
index 02fdabb3938..f13c69b97fd 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
@@ -21,132 +21,90 @@
#include "MoveSpline.h"
#include "WorldPacket.h"
#include "Object.h"
+#include "MovementPackets.h"
namespace Movement
{
- inline void operator << (ByteBuffer& b, const Vector3& v)
+ void PacketBuilder::WriteMonsterMove(const MoveSpline& move_spline, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline)
{
- b << v.x << v.y << v.z;
- }
-
- inline void operator >> (ByteBuffer& b, Vector3& v)
- {
- b >> v.x >> v.y >> v.z;
- }
+ movementMonsterSpline.ID = move_spline.m_Id;
+ WorldPackets::Movement::MovementSpline& movementSpline = movementMonsterSpline.Move;
- enum MonsterMoveType
- {
- MonsterMoveNormal = 0,
- MonsterMoveStop = 1,
- MonsterMoveFacingSpot = 2,
- MonsterMoveFacingTarget = 3,
- MonsterMoveFacingAngle = 4
- };
-
- void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, WorldPacket& data)
- {
MoveSplineFlag splineflags = move_spline.splineflags;
+ splineflags.enter_cycle = move_spline.isCyclic();
+ movementSpline.Flags = uint32(splineflags & uint32(~MoveSplineFlag::Mask_No_Monster_Move));
- data << uint8(0); // sets/unsets MOVEMENTFLAG2_UNK7 (0x40)
- data << move_spline.spline.getPoint(move_spline.spline.first());
- data << move_spline.GetId();
-
- switch (splineflags & MoveSplineFlag::Mask_Final_Facing)
+ switch (move_spline.splineflags & MoveSplineFlag::Mask_Final_Facing)
{
+ case MoveSplineFlag::Final_Point:
+ movementSpline.Face = MONSTER_MOVE_FACING_SPOT;
+ movementSpline.FaceSpot = move_spline.facing.f;
+ break;
case MoveSplineFlag::Final_Target:
- data << uint8(MonsterMoveFacingTarget);
- data << move_spline.facing.target;
+ movementSpline.Face = MONSTER_MOVE_FACING_TARGET;
+ movementSpline.FaceGUID = move_spline.facing.target;
break;
case MoveSplineFlag::Final_Angle:
- data << uint8(MonsterMoveFacingAngle);
- data << move_spline.facing.angle;
- break;
- case MoveSplineFlag::Final_Point:
- data << uint8(MonsterMoveFacingSpot);
- data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z;
+ movementSpline.Face = MONSTER_MOVE_FACING_ANGLE;
+ movementSpline.FaceDirection = move_spline.facing.angle;
break;
default:
- data << uint8(MonsterMoveNormal);
+ movementSpline.Face = MONSTER_MOVE_NORMAL;
break;
}
- // add fake Enter_Cycle flag - needed for client-side cyclic movement (client will erase first spline vertex after first cycle done)
- splineflags.enter_cycle = move_spline.isCyclic();
- data << uint32(splineflags & uint32(~MoveSplineFlag::Mask_No_Monster_Move));
-
if (splineflags.animation)
{
- data << splineflags.getAnimationId();
- data << move_spline.effect_start_time;
+ movementSpline.AnimTier = splineflags.getAnimationId();
+ movementSpline.TierTransStartTime = move_spline.effect_start_time;
}
- data << move_spline.Duration();
+ movementSpline.MoveTime = move_spline.Duration();
if (splineflags.parabolic)
{
- data << move_spline.vertical_acceleration;
- data << move_spline.effect_start_time;
+ movementSpline.JumpGravity = move_spline.vertical_acceleration;
+ movementSpline.SpecialTime = move_spline.effect_start_time;
}
- }
-
- void PacketBuilder::WriteStopMovement(Vector3 const& pos, uint32 splineId, ByteBuffer& data)
- {
- data << uint8(0); // sets/unsets MOVEMENTFLAG2_UNK7 (0x40)
- data << pos;
- data << splineId;
- data << uint8(MonsterMoveStop);
- }
-
- void WriteLinearPath(Spline<int32> const& spline, ByteBuffer& data)
- {
- uint32 last_idx = spline.getPointCount() - 3;
- Vector3 const* real_path = &spline.getPoint(1);
-
- data << last_idx;
- data << real_path[last_idx]; // destination
- if (last_idx > 1)
- {
- Vector3 middle = (real_path[0] + real_path[last_idx]) / 2.f;
- Vector3 offset;
- // first and last points already appended
- for (uint32 i = 1; i < last_idx; ++i)
- {
- offset = middle - real_path[i];
- data.appendPackXYZ(offset.x, offset.y, offset.z);
- }
- }
- }
-
- void WriteUncompressedPath(Spline<int32> const& spline, ByteBuffer& data)
- {
- uint32 count = spline.getPointCount() - 3;
- data << count;
- data.append<Vector3>(&spline.getPoint(2), count);
- }
-
- void WriteUncompressedCyclicPath(Spline<int32> const& spline, ByteBuffer& data)
- {
- uint32 count = spline.getPointCount() - 3;
- data << uint32(count + 1);
- data << spline.getPoint(1); // fake point, client will erase it from the spline after first cycle done
- data.append<Vector3>(&spline.getPoint(1), count);
- }
-
- void PacketBuilder::WriteMonsterMove(const MoveSpline& move_spline, WorldPacket& data)
- {
- WriteCommonMonsterMovePart(move_spline, data);
Spline<int32> const& spline = move_spline.spline;
- MoveSplineFlag splineflags = move_spline.splineflags;
+ std::vector<Vector3> const& array = spline.getPoints();
+
if (splineflags & MoveSplineFlag::UncompressedPath)
{
if (!splineflags.cyclic)
- WriteUncompressedPath(spline, data);
+ {
+ uint32 count = spline.getPointCount() - 3;
+ for (uint32 i = 2; i < count; ++i)
+ movementSpline.Points.push_back(array[i]);
+ }
else
- WriteUncompressedCyclicPath(spline, data);
+ {
+ uint32 count = spline.getPointCount() - 3;
+ movementSpline.Points.push_back(array[1]);
+ for (uint32 i = 1; i < count; ++i)
+ movementSpline.Points.push_back(array[i]);
+ }
}
else
- WriteLinearPath(spline, data);
+ {
+ uint32 last_idx = spline.getPointCount() - 3;
+ Vector3 const* real_path = &spline.getPoint(1);
+
+ movementSpline.Points.push_back(real_path[last_idx]);
+
+ if (last_idx > 1)
+ {
+ Vector3 middle = (real_path[0] + real_path[last_idx]) / 2.f;
+ Vector3 offset;
+ // first and last points already appended
+ for (uint32 i = 1; i < last_idx; ++i)
+ {
+ offset = middle - real_path[i];
+ movementSpline.PackedDeltas.push_back(offset);
+ }
+ }
+ }
}
void PacketBuilder::WriteCreate(MoveSpline const& moveSpline, ByteBuffer& data)
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h
index 2878a330f67..83172b2c3e0 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.h
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h
@@ -22,6 +22,7 @@
#include "Define.h" // for uint32
#include "G3D/Vector3.h"
+#include "MovementPackets.h"
using G3D::Vector3;
class ByteBuffer;
@@ -35,7 +36,7 @@ namespace Movement
static void WriteCommonMonsterMovePart(const MoveSpline& mov, WorldPacket& data);
public:
- static void WriteMonsterMove(const MoveSpline& mov, WorldPacket& data);
+ static void WriteMonsterMove(const MoveSpline& mov, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline);
static void WriteStopMovement(Vector3 const& loc, uint32 splineId, ByteBuffer& data);
static void WriteCreate(MoveSpline const& moveSpline, ByteBuffer& data);
};
diff --git a/src/server/game/Movement/Spline/MovementTypedefs.h b/src/server/game/Movement/Spline/MovementTypedefs.h
index a69af9e3a83..14c4e19b19b 100644
--- a/src/server/game/Movement/Spline/MovementTypedefs.h
+++ b/src/server/game/Movement/Spline/MovementTypedefs.h
@@ -21,6 +21,14 @@
#include "Common.h"
+enum MonsterMoveType
+{
+ MONSTER_MOVE_NORMAL = 0,
+ MONSTER_MOVE_FACING_SPOT = 1,
+ MONSTER_MOVE_FACING_TARGET = 2,
+ MONSTER_MOVE_FACING_ANGLE = 3
+};
+
namespace G3D
{
class Vector3;
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index 359a8f3946a..3bf3464f016 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -18,6 +18,7 @@
#include "DatabaseEnv.h"
#include "ReputationMgr.h"
+#include "ReputationPackets.h"
#include "DBCStores.h"
#include "Player.h"
#include "WorldPacket.h"
@@ -199,38 +200,17 @@ void ReputationMgr::SendState(FactionState const* faction)
void ReputationMgr::SendInitialReputations()
{
- uint16 count = 256;
- WorldPacket data(SMSG_INITIALIZE_FACTIONS, 4 + count * 5);
- data << uint32(count);
-
- RepListID a = 0;
+ WorldPackets::Reputation::InitializeFactions initFactions;
for (FactionStateList::iterator itr = _factions.begin(); itr != _factions.end(); ++itr)
{
- // fill in absent fields
- for (; a != itr->first; ++a)
- {
- data << uint8(0);
- data << uint32(0);
- }
-
- // fill in encountered data
- data << uint8(itr->second.Flags);
- data << uint32(itr->second.Standing);
-
+ initFactions.FactionFlags[itr->first] = itr->second.Flags;
+ initFactions.FactionStandings[itr->first] = itr->second.Standing;
+ /// @todo faction bonus
itr->second.needSend = false;
-
- ++a;
}
- // fill in absent fields
- for (; a != count; ++a)
- {
- data << uint8(0);
- data << uint32(0);
- }
-
- _player->SendDirectMessage(&data);
+ _player->SendDirectMessage(initFactions.Write());
}
void ReputationMgr::SendStates()
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index 2bb1760b31c..a69e684438f 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -65,20 +65,20 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
if (SuccessInfo.HasValue)
{
- _worldPacket << uint32(SuccessInfo.value.VirtualRealmAddress);
- _worldPacket << uint32(SuccessInfo.value.VirtualRealms.size());
- _worldPacket << uint32(SuccessInfo.value.TimeRemain);
- _worldPacket << uint32(SuccessInfo.value.TimeOptions);
- _worldPacket << uint32(SuccessInfo.value.TimeRested);
- _worldPacket << uint8(SuccessInfo.value.ActiveExpansionLevel);
- _worldPacket << uint8(SuccessInfo.value.AccountExpansionLevel);
- _worldPacket << uint32(SuccessInfo.value.TimeSecondsUntilPCKick);
- _worldPacket << uint32(SuccessInfo.value.AvailableRaces->size());
- _worldPacket << uint32(SuccessInfo.value.AvailableClasses->size());
- _worldPacket << uint32(SuccessInfo.value.Templates.size());
- _worldPacket << uint32(SuccessInfo.value.CurrencyID);
-
- for (auto& realm : SuccessInfo.value.VirtualRealms)
+ _worldPacket << uint32(SuccessInfo.Value.VirtualRealmAddress);
+ _worldPacket << uint32(SuccessInfo.Value.VirtualRealms.size());
+ _worldPacket << uint32(SuccessInfo.Value.TimeRemain);
+ _worldPacket << uint32(SuccessInfo.Value.TimeOptions);
+ _worldPacket << uint32(SuccessInfo.Value.TimeRested);
+ _worldPacket << uint8(SuccessInfo.Value.ActiveExpansionLevel);
+ _worldPacket << uint8(SuccessInfo.Value.AccountExpansionLevel);
+ _worldPacket << uint32(SuccessInfo.Value.TimeSecondsUntilPCKick);
+ _worldPacket << uint32(SuccessInfo.Value.AvailableRaces->size());
+ _worldPacket << uint32(SuccessInfo.Value.AvailableClasses->size());
+ _worldPacket << uint32(SuccessInfo.Value.Templates.size());
+ _worldPacket << uint32(SuccessInfo.Value.CurrencyID);
+
+ for (auto& realm : SuccessInfo.Value.VirtualRealms)
{
_worldPacket << uint32(realm.RealmAddress);
_worldPacket.WriteBit(realm.IsLocal);
@@ -89,19 +89,19 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket.WriteString(realm.RealmNameNormalized);
}
- for (auto& race : *SuccessInfo.value.AvailableRaces)
+ for (auto& race : *SuccessInfo.Value.AvailableRaces)
{
_worldPacket << uint8(race.first); /// the current race
_worldPacket << uint8(race.second); /// the required Expansion
}
- for (auto& klass : *SuccessInfo.value.AvailableClasses)
+ for (auto& klass : *SuccessInfo.Value.AvailableClasses)
{
_worldPacket << uint8(klass.first); /// the current class
_worldPacket << uint8(klass.second); /// the required Expansion
}
- for (auto& templat : SuccessInfo.value.Templates)
+ for (auto& templat : SuccessInfo.Value.Templates)
{
_worldPacket << uint32(templat.TemplateSetId);
_worldPacket << uint32(templat.TemplateClasses.size());
@@ -117,23 +117,23 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket.WriteString(templat.Description);
}
- _worldPacket.WriteBit(SuccessInfo.value.IsExpansionTrial);
- _worldPacket.WriteBit(SuccessInfo.value.ForceCharacterTemplate);
- _worldPacket.WriteBit(SuccessInfo.value.NumPlayersHorde != 0);
- _worldPacket.WriteBit(SuccessInfo.value.NumPlayersAlliance != 0);
- _worldPacket.WriteBit(SuccessInfo.value.IsVeteranTrial);
+ _worldPacket.WriteBit(SuccessInfo.Value.IsExpansionTrial);
+ _worldPacket.WriteBit(SuccessInfo.Value.ForceCharacterTemplate);
+ _worldPacket.WriteBit(SuccessInfo.Value.NumPlayersHorde.HasValue);
+ _worldPacket.WriteBit(SuccessInfo.Value.NumPlayersAlliance.HasValue);
+ _worldPacket.WriteBit(SuccessInfo.Value.IsVeteranTrial);
- if (SuccessInfo.value.NumPlayersHorde)
- _worldPacket << uint16(SuccessInfo.value.NumPlayersHorde);
+ if (SuccessInfo.Value.NumPlayersHorde.HasValue)
+ _worldPacket << uint16(SuccessInfo.Value.NumPlayersHorde.Value);
- if (SuccessInfo.value.NumPlayersAlliance)
- _worldPacket << uint16(SuccessInfo.value.NumPlayersAlliance);
+ if (SuccessInfo.Value.NumPlayersAlliance.HasValue)
+ _worldPacket << uint16(SuccessInfo.Value.NumPlayersAlliance.Value);
}
if (WaitInfo.HasValue)
{
- _worldPacket << uint32(WaitInfo.value.WaitCount);
- _worldPacket.WriteBit(WaitInfo.value.HasFCM);
+ _worldPacket << uint32(WaitInfo.Value.WaitCount);
+ _worldPacket.WriteBit(WaitInfo.Value.HasFCM);
}
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index e24c06396e0..eb44064750a 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -118,8 +118,8 @@ namespace WorldPackets
bool IsExpansionTrial = false;
bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement
- uint16 NumPlayersHorde = 0; ///< number of horde players in this realm. @todo implement
- uint16 NumPlayersAlliance = 0; ///< number of alliance players in this realm. @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
bool IsVeteranTrial = false; ///< @todo research
};
diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp
new file mode 100644
index 00000000000..2ece521b42b
--- /dev/null
+++ b/src/server/game/Server/Packets/ChannelPackets.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ChannelPackets.h"
+#include "Channel.h"
+
+void WorldPackets::Channel::ChannelListRequest::Read()
+{
+ ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7));
+}
+
+WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write()
+{
+ _worldPacket.WriteBit(Display);
+ _worldPacket.WriteBits(Channel.length(), 7);
+ _worldPacket << uint8(ChannelFlags);
+ _worldPacket << uint32(Members.size());
+ _worldPacket.WriteString(Channel);
+
+ for (ChannelPlayer const& player : Members)
+ {
+ _worldPacket << player.Guid;
+ _worldPacket << uint32(player.VirtualRealmAddress);
+ _worldPacket << uint8(player.Flags);
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Channel::ChannelNotify::Write()
+{
+ _worldPacket.WriteBits(Type, 6);
+ _worldPacket.WriteBits(Channel.length(), 7);
+ _worldPacket.WriteBits(Sender.length(), 6);
+
+ _worldPacket << SenderGuid;
+ _worldPacket << SenderAccountID;
+ _worldPacket << uint32(SenderVirtualRealm);
+ _worldPacket << TargetGuid;
+ _worldPacket << uint32(TargetVirtualRealm);
+ _worldPacket << int32(ChatChannelID);
+
+ if (Type == CHAT_MODE_CHANGE_NOTICE)
+ {
+ _worldPacket << uint8(OldFlags);
+ _worldPacket << uint8(NewFlags);
+ }
+
+ _worldPacket.WriteString(Channel);
+ _worldPacket.WriteString(Sender);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Channel::ChannelNotifyJoined::Write()
+{
+ _worldPacket.WriteBits(Channel.length(), 7);
+ _worldPacket.WriteBits(ChannelWelcomeMsg.length(), 10);
+ _worldPacket << uint8(ChannelFlags);
+ _worldPacket << int32(ChatChannelID);
+ _worldPacket << uint64(InstanceID);
+ _worldPacket.WriteString(Channel);
+ _worldPacket.WriteString(ChannelWelcomeMsg);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Channel::ChannelNotifyLeft::Write()
+{
+ _worldPacket.WriteBits(Channel.length(), 7);
+ _worldPacket.WriteBit(Suspended);
+ _worldPacket << int32(ChatChannelID);
+ _worldPacket.WriteString(Channel);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Channel::JoinChannel::Read()
+{
+ _worldPacket >> ChatChannelId;
+ CreateVoiceSession = _worldPacket.ReadBit();
+ Internal = _worldPacket.ReadBit();
+ uint32 channelLength = _worldPacket.ReadBits(7);
+ uint32 passwordLength = _worldPacket.ReadBits(7);
+ ChannelName = _worldPacket.ReadString(channelLength);
+ Password = _worldPacket.ReadString(passwordLength);
+}
+
+void WorldPackets::Channel::LeaveChannel::Read()
+{
+ _worldPacket >> ZoneChannelID;
+ ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7));
+}
diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h
new file mode 100644
index 00000000000..36a0a516928
--- /dev/null
+++ b/src/server/game/Server/Packets/ChannelPackets.h
@@ -0,0 +1,137 @@
+/*
+* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef ChannelPackets_h__
+#define ChannelPackets_h__
+
+#include "Packet.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets
+{
+ namespace Channel
+ {
+ class ChannelListRequest final : public ClientPacket
+ {
+ public:
+ ChannelListRequest(WorldPacket&& packet) : ClientPacket(std::move(packet))
+ {
+ ASSERT(packet.GetOpcode() == CMSG_CHANNEL_LIST || packet.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST);
+ }
+
+ void Read() override;
+
+ std::string ChannelName;
+ };
+
+ class ChannelListResponse final : public ServerPacket
+ {
+ public:
+ struct ChannelPlayer
+ {
+ ChannelPlayer(ObjectGuid const& guid, uint32 realm, uint8 flags) :
+ Guid(guid), VirtualRealmAddress(realm), Flags(flags) { }
+
+ ObjectGuid Guid; ///< Player Guid
+ uint32 VirtualRealmAddress;
+ uint8 Flags = 0; ///< @see enum ChannelMemberFlags
+ };
+
+ ChannelListResponse() : ServerPacket(SMSG_CHANNEL_LIST) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<ChannelPlayer> Members;
+ std::string Channel; ///< Channel Name
+ uint8 ChannelFlags = 0; ///< @see enum ChannelFlags
+ bool Display = false;
+ };
+
+ class ChannelNotify final : public ServerPacket
+ {
+ public:
+ ChannelNotify() : ServerPacket(SMSG_CHANNEL_NOTIFY, 80) { }
+
+ WorldPacket const* Write() override;
+
+ std::string Sender;
+ ObjectGuid SenderGuid;
+ ObjectGuid SenderAccountID;
+ uint8 Type = 0; ///< @see enum ChatNotify
+ uint8 OldFlags = 0; ///< @see enum ChannelMemberFlags
+ uint8 NewFlags = 0; ///< @see enum ChannelMemberFlags
+ std::string Channel; ///< Channel Name
+ uint32 SenderVirtualRealm = 0;
+ ObjectGuid TargetGuid;
+ uint32 TargetVirtualRealm = 0;
+ int32 ChatChannelID = 0;
+ };
+
+ class ChannelNotifyJoined final : public ServerPacket
+ {
+ public:
+ ChannelNotifyJoined() : ServerPacket(SMSG_CHANNEL_NOTIFY_JOINED, 50) { }
+
+ WorldPacket const* Write() override;
+
+ std::string ChannelWelcomeMsg;
+ int32 ChatChannelID = 0;
+ int32 InstanceID = 0;
+ uint8 ChannelFlags = 0; ///< @see enum ChannelFlags
+ std::string Channel; ///< Channel Name
+ };
+
+ class ChannelNotifyLeft final : public ServerPacket
+ {
+ public:
+ ChannelNotifyLeft() : ServerPacket(SMSG_CHANNEL_NOTIFY_LEFT, 30) { }
+
+ WorldPacket const* Write() override;
+
+ std::string Channel; ///< Channel Name
+ int32 ChatChannelID = 0;
+ bool Suspended = false; ///< User Leave - false, On Zone Change - true
+ };
+
+ class JoinChannel final : public ClientPacket
+ {
+ public:
+ JoinChannel(WorldPacket&& packet) : ClientPacket(CMSG_JOIN_CHANNEL, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Password;
+ std::string ChannelName;
+ bool CreateVoiceSession = false;
+ int32 ChatChannelId = 0;
+ bool Internal = false;
+ };
+
+ class LeaveChannel final : public ClientPacket
+ {
+ public:
+ LeaveChannel(WorldPacket&& packet) : ClientPacket(CMSG_LEAVE_CHANNEL, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 ZoneChannelID = 0;
+ std::string ChannelName;
+ };
+ }
+}
+
+#endif // ChannelPackets_h__
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index 9876da54ae3..b5d26bf2968 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -200,7 +200,7 @@ void WorldPackets::Character::CreateChar::Read()
_worldPacket >> CreateInfo->OutfitId;
CreateInfo->Name = _worldPacket.ReadString(nameLength);
if (CreateInfo->TemplateSet.HasValue)
- _worldPacket >> CreateInfo->TemplateSet.value;
+ _worldPacket >> CreateInfo->TemplateSet.Value;
}
WorldPacket const* WorldPackets::Character::CharacterCreateResponse::Write()
@@ -234,7 +234,7 @@ WorldPacket const* WorldPackets::Character::CharacterRenameResult::Write()
_worldPacket.WriteBits(Name.length(), 6);
if (Guid.HasValue)
- _worldPacket << Guid.value;
+ _worldPacket << Guid.Value;
_worldPacket.WriteString(Name);
return &_worldPacket;
@@ -274,19 +274,19 @@ void WorldPackets::Character::CharRaceOrFactionChange::Read()
RaceOrFactionChangeInfo->Name = _worldPacket.ReadString(nameLength);
if (RaceOrFactionChangeInfo->SkinID.HasValue)
- _worldPacket >> RaceOrFactionChangeInfo->SkinID.value;
+ _worldPacket >> RaceOrFactionChangeInfo->SkinID.Value;
if (RaceOrFactionChangeInfo->HairColorID.HasValue)
- _worldPacket >> RaceOrFactionChangeInfo->HairColorID.value;
+ _worldPacket >> RaceOrFactionChangeInfo->HairColorID.Value;
if (RaceOrFactionChangeInfo->HairStyleID.HasValue)
- _worldPacket >> RaceOrFactionChangeInfo->HairStyleID.value;
+ _worldPacket >> RaceOrFactionChangeInfo->HairStyleID.Value;
if (RaceOrFactionChangeInfo->FacialHairStyleID.HasValue)
- _worldPacket >> RaceOrFactionChangeInfo->FacialHairStyleID.value;
+ _worldPacket >> RaceOrFactionChangeInfo->FacialHairStyleID.Value;
if (RaceOrFactionChangeInfo->FaceID.HasValue)
- _worldPacket >> RaceOrFactionChangeInfo->FaceID.value;
+ _worldPacket >> RaceOrFactionChangeInfo->FaceID.Value;
}
WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write()
@@ -298,15 +298,15 @@ WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write()
if (Display.HasValue)
{
- _worldPacket.WriteBits(Display.value.Name.length(), 6);
- _worldPacket << uint8(Display.value.SexID);
- _worldPacket << uint8(Display.value.SkinID);
- _worldPacket << uint8(Display.value.HairColorID);
- _worldPacket << uint8(Display.value.HairStyleID);
- _worldPacket << uint8(Display.value.FacialHairStyleID);
- _worldPacket << uint8(Display.value.FaceID);
- _worldPacket << uint8(Display.value.RaceID);
- _worldPacket.WriteString(Display.value.Name);
+ _worldPacket.WriteBits(Display.Value.Name.length(), 6);
+ _worldPacket << uint8(Display.Value.SexID);
+ _worldPacket << uint8(Display.Value.SkinID);
+ _worldPacket << uint8(Display.Value.HairColorID);
+ _worldPacket << uint8(Display.Value.HairStyleID);
+ _worldPacket << uint8(Display.Value.FacialHairStyleID);
+ _worldPacket << uint8(Display.Value.FaceID);
+ _worldPacket << uint8(Display.Value.RaceID);
+ _worldPacket.WriteString(Display.Value.Name);
}
return &_worldPacket;
@@ -395,46 +395,3 @@ void WorldPackets::Character::LoadingScreenNotify::Read()
_worldPacket >> MapID;
Showing = _worldPacket.ReadBit();
}
-
-void WorldPackets::Character::QueryPlayerName::Read()
-{
- _worldPacket >> Player;
-
- Hint.VirtualRealmAddress.HasValue = _worldPacket.ReadBit();
- Hint.NativeRealmAddress.HasValue = _worldPacket.ReadBit();
-
- if (Hint.VirtualRealmAddress.HasValue)
- _worldPacket >> Hint.VirtualRealmAddress.value;
-
- if (Hint.NativeRealmAddress.HasValue)
- _worldPacket >> Hint.NativeRealmAddress.value;
-}
-
-WorldPacket const* WorldPackets::Character::PlayerNameResponse::Write()
-{
- _worldPacket << Result;
- _worldPacket << Player;
-
- if (Result == 0)
- {
- _worldPacket.WriteBits(Data.Name.length(), 7);
-
- for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
- _worldPacket.WriteBits(Data.DeclinedNames.name[i].length(), 7);
-
- for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
- _worldPacket.WriteString(Data.DeclinedNames.name[i]);
-
- _worldPacket << Data.AccountID;
- _worldPacket << Data.BnetAccountID;
- _worldPacket << Data.GuidActual;
- _worldPacket << Data.VirtualRealmAddress;
- _worldPacket << Data.Race;
- _worldPacket << Data.Sex;
- _worldPacket << Data.ClassID;
- _worldPacket << Data.Level;
- _worldPacket.WriteString(Data.Name);
- }
-
- return &_worldPacket;
-}
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index 8ffd3622539..386c407b10f 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -473,50 +473,6 @@ namespace WorldPackets
int32 MapID = -1;
bool Showing = false;
};
-
- struct PlayerGuidLookupHint
- {
- Optional<uint32> VirtualRealmAddress; ///< current realm (?) (identifier made from the Index, BattleGroup and Region)
- Optional<uint32> NativeRealmAddress; ///< original realm (?) (identifier made from the Index, BattleGroup and Region)
- };
-
- struct PlayerGuidLookupData
- {
- bool IsDeleted = false;
- ObjectGuid AccountID;
- ObjectGuid BnetAccountID;
- ObjectGuid GuidActual;
- std::string Name;
- uint32 VirtualRealmAddress = 0;
- uint8 Race = RACE_NONE;
- uint8 Sex = GENDER_NONE;
- uint8 ClassID = CLASS_NONE;
- uint8 Level = 0;
- DeclinedName DeclinedNames;
- };
-
- class QueryPlayerName final : public ClientPacket
- {
- public:
- QueryPlayerName(WorldPacket&& packet) : ClientPacket(CMSG_NAME_QUERY, std::move(packet)) { }
-
- void Read() override;
-
- ObjectGuid Player;
- PlayerGuidLookupHint Hint;
- };
-
- class PlayerNameResponse final : public ServerPacket
- {
- public:
- PlayerNameResponse() : ServerPacket(SMSG_NAME_QUERY_RESPONSE, 60) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Player;
- uint8 Result = 0; // 0 - full packet, != 0 - only guid
- PlayerGuidLookupData Data;
- };
}
}
diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp
new file mode 100644
index 00000000000..7590a092b2c
--- /dev/null
+++ b/src/server/game/Server/Packets/ChatPackets.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ChatPackets.h"
+
+void WorldPackets::Chat::ChatMessage::Read()
+{
+ _worldPacket >> Language;
+ uint32 len = _worldPacket.ReadBits(8);
+ Text = _worldPacket.ReadString(len);
+}
+
+void WorldPackets::Chat::ChatMessageWhisper::Read()
+{
+ _worldPacket >> Language;
+ uint32 targetLen = _worldPacket.ReadBits(9);
+ uint32 textLen = _worldPacket.ReadBits(8);
+ Target = _worldPacket.ReadString(targetLen);
+ Text = _worldPacket.ReadString(textLen);
+}
+
+void WorldPackets::Chat::ChatMessageChannel::Read()
+{
+ _worldPacket >> Language;
+ uint32 targetLen = _worldPacket.ReadBits(9);
+ uint32 textLen = _worldPacket.ReadBits(8);
+ _worldPacket.ResetBitPos();
+ Target = _worldPacket.ReadString(targetLen);
+ Text = _worldPacket.ReadString(textLen);
+}
+
+void WorldPackets::Chat::ChatAddonMessage::Read()
+{
+ uint32 prefixLen = _worldPacket.ReadBits(5);
+ uint32 textLen = _worldPacket.ReadBits(8);
+ Prefix = _worldPacket.ReadString(prefixLen);
+ Text = _worldPacket.ReadString(textLen);
+}
+
+void WorldPackets::Chat::ChatAddonMessageWhisper::Read()
+{
+ uint32 targetLen = _worldPacket.ReadBits(9);
+ uint32 prefixLen = _worldPacket.ReadBits(5);
+ uint32 textLen = _worldPacket.ReadBits(8);
+ Target = _worldPacket.ReadString(targetLen);
+ Prefix = _worldPacket.ReadString(prefixLen);
+ Text = _worldPacket.ReadString(textLen);
+}
+
+void WorldPackets::Chat::ChatMessageDND::Read()
+{
+ uint32 len = _worldPacket.ReadBits(8);
+ Text = _worldPacket.ReadString(len);
+}
+
+void WorldPackets::Chat::ChatMessageAFK::Read()
+{
+ uint32 len = _worldPacket.ReadBits(8);
+ Text = _worldPacket.ReadString(len);
+}
+
+void WorldPackets::Chat::ChatMessageEmote::Read()
+{
+ uint32 len = _worldPacket.ReadBits(8);
+ Text = _worldPacket.ReadString(len);
+}
+
+WorldPacket const* WorldPackets::Chat::Chat::Write()
+{
+ _worldPacket << SlashCmd;
+ _worldPacket << Language;
+ _worldPacket << SenderGUID;
+ _worldPacket << SenderGuildGUID;
+ _worldPacket << SenderAccountGUID;
+ _worldPacket << TargetGUID;
+ _worldPacket << TargetVirtualAddress;
+ _worldPacket << SenderVirtualAddress;
+ _worldPacket << PartyGUID;
+ _worldPacket << AchievementID;
+ _worldPacket << DisplayTime;
+ _worldPacket.WriteBits(SenderName.length(), 11);
+ _worldPacket.WriteBits(TargetName.length(), 11);
+ _worldPacket.WriteBits(Prefix.length(), 5);
+ _worldPacket.WriteBits(Channel.length(), 7);
+ _worldPacket.WriteBits(ChatText.length(), 12);
+ _worldPacket.WriteBits(ChatFlags, 10);
+ _worldPacket.WriteBit(HideChatLog);
+ _worldPacket.WriteBit(FakeSenderName);
+ _worldPacket.WriteString(SenderName);
+ _worldPacket.WriteString(TargetName);
+ _worldPacket.WriteString(Prefix);
+ _worldPacket.WriteString(Channel);
+ _worldPacket.WriteString(ChatText);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Chat::Emote::Write()
+{
+ _worldPacket << Guid;
+ _worldPacket << EmoteID;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Chat::CTextEmote::Read()
+{
+ _worldPacket >> Target;
+ _worldPacket >> EmoteID;
+ _worldPacket >> SoundIndex;
+}
+
+WorldPacket const* WorldPackets::Chat::STextEmote::Write()
+{
+ _worldPacket << SourceGUID;
+ _worldPacket << SourceAccountGUID;
+ _worldPacket << EmoteID;
+ _worldPacket << SoundIndex;
+ _worldPacket << TargetGUID;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h
new file mode 100644
index 00000000000..3d65bb04c54
--- /dev/null
+++ b/src/server/game/Server/Packets/ChatPackets.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ChatPackets_h__
+#define ChatPackets_h__
+
+#include "Packet.h"
+#include "SharedDefines.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets
+{
+ namespace Chat
+ {
+ // CMSG_MESSAGECHAT_GUILD
+ // CMSG_MESSAGECHAT_OFFICER
+ // CMSG_MESSAGECHAT_YELL
+ // CMSG_MESSAGECHAT_SAY
+ // CMSG_MESSAGECHAT_PARTY
+ // CMSG_MESSAGECHAT_RAID
+ // CMSG_MESSAGECHAT_RAID_WARNING
+ class ChatMessage final : public ClientPacket
+ {
+ public:
+ ChatMessage(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Text;
+ int32 Language = LANG_UNIVERSAL;
+ };
+
+ // CMSG_MESSAGECHAT_WHISPER
+ class ChatMessageWhisper final : public ClientPacket
+ {
+ public:
+ ChatMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ int32 Language = LANG_UNIVERSAL;
+ std::string Text;
+ std::string Target;
+ };
+
+ // CMSG_MESSAGECHAT_CHANNEL
+ class ChatMessageChannel final : public ClientPacket
+ {
+ public:
+ ChatMessageChannel(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ int32 Language = LANG_UNIVERSAL;
+ std::string Text;
+ std::string Target;
+ };
+
+ // CMSG_MESSAGECHAT_ADDON_GUILD
+ // CMSG_MESSAGECHAT_ADDON_OFFICER
+ // CMSG_MESSAGECHAT_ADDON_PARTY
+ // CMSG_MESSAGECHAT_ADDON_RAID
+ class ChatAddonMessage final : public ClientPacket
+ {
+ public:
+ ChatAddonMessage(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Prefix;
+ std::string Text;
+ };
+
+ // CMSG_MESSAGECHAT_ADDON_WHISPER
+ class ChatAddonMessageWhisper final : public ClientPacket
+ {
+ public:
+ ChatAddonMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Prefix;
+ std::string Target;
+ std::string Text;
+ };
+
+ class ChatMessageDND final : public ClientPacket
+ {
+ public:
+ ChatMessageDND(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_DND, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Text;
+ };
+
+ class ChatMessageAFK final : public ClientPacket
+ {
+ public:
+ ChatMessageAFK(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_AFK, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Text;
+ };
+
+ class ChatMessageEmote final : public ClientPacket
+ {
+ public:
+ ChatMessageEmote(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_EMOTE, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Text;
+ };
+
+ // SMSG_MESSAGECHAT
+ class Chat final : public ServerPacket
+ {
+ public:
+ Chat() : ServerPacket(SMSG_MESSAGECHAT, 100) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 SlashCmd = 0;
+ uint8 Language = LANG_UNIVERSAL;
+ ObjectGuid SenderGUID;
+ ObjectGuid SenderGuildGUID;
+ ObjectGuid SenderAccountGUID;
+ ObjectGuid TargetGUID;
+ ObjectGuid PartyGUID;
+ uint32 SenderVirtualAddress;
+ uint32 TargetVirtualAddress;
+ std::string SenderName;
+ std::string TargetName;
+ std::string Prefix;
+ std::string Channel;
+ std::string ChatText;
+ uint32 AchievementID = 0;
+ uint8 ChatFlags = 0;
+ float DisplayTime = 0.0f;
+ bool HideChatLog = false;
+ bool FakeSenderName = false;
+ };
+
+ class Emote final : public ServerPacket
+ {
+ public:
+ Emote() : ServerPacket(SMSG_EMOTE, 18 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ int32 EmoteID;
+ };
+
+ class CTextEmote final : public ClientPacket
+ {
+ public:
+ CTextEmote(WorldPacket&& packet) : ClientPacket(CMSG_TEXT_EMOTE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Target;
+ int32 EmoteID;
+ int32 SoundIndex;
+ };
+
+ class STextEmote final : public ServerPacket
+ {
+ public:
+ STextEmote() : ServerPacket(SMSG_TEXT_EMOTE, 3 * 18 + 2 * 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid SourceGUID;
+ ObjectGuid SourceAccountGUID;
+ ObjectGuid TargetGUID;
+ int32 SoundIndex;
+ int32 EmoteID;
+ };
+ }
+}
+
+#endif // ChatPackets_h__
diff --git a/src/server/game/Server/Packets/ClientConfigPackets.cpp b/src/server/game/Server/Packets/ClientConfigPackets.cpp
index b46288f86cb..693f8e773df 100644
--- a/src/server/game/Server/Packets/ClientConfigPackets.cpp
+++ b/src/server/game/Server/Packets/ClientConfigPackets.cpp
@@ -94,3 +94,36 @@ WorldPacket const* WorldPackets::ClientConfig::ClientCacheVersion::Write()
return &_worldPacket;
}
+
+void WorldPackets::ClientConfig::RequestAccountData::Read()
+{
+ _worldPacket >> PlayerGuid;
+ DataType = _worldPacket.ReadBits(3);
+}
+
+WorldPacket const* WorldPackets::ClientConfig::UpdateAccountData::Write()
+{
+ _worldPacket << Player;
+ _worldPacket << uint32(Time);
+ _worldPacket << uint32(Size);
+ _worldPacket.WriteBits(DataType, 3);
+ _worldPacket << uint32(CompressedData.size());
+ _worldPacket.append(CompressedData);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::ClientConfig::UserClientUpdateAccountData::Read()
+{
+ _worldPacket >> PlayerGuid;
+ _worldPacket >> Time;
+ _worldPacket >> Size;
+ DataType = _worldPacket.ReadBits(3);
+
+ uint32 compressedSize = _worldPacket.read<uint32>();
+ if (compressedSize)
+ {
+ CompressedData.resize(compressedSize);
+ _worldPacket.read(CompressedData.contents(), compressedSize);
+ }
+}
diff --git a/src/server/game/Server/Packets/ClientConfigPackets.h b/src/server/game/Server/Packets/ClientConfigPackets.h
index 0dbcfd7d577..8a29b1fb175 100644
--- a/src/server/game/Server/Packets/ClientConfigPackets.h
+++ b/src/server/game/Server/Packets/ClientConfigPackets.h
@@ -60,6 +60,45 @@ namespace WorldPackets
uint32 CacheVersion = 0;
};
+
+ class RequestAccountData final : public ClientPacket
+ {
+ public:
+ RequestAccountData(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_ACCOUNT_DATA, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid PlayerGuid;
+ uint8 DataType = 0; ///< @see enum AccountDataType
+ };
+
+ class UpdateAccountData final : public ServerPacket
+ {
+ public:
+ UpdateAccountData() : ServerPacket(SMSG_UPDATE_ACCOUNT_DATA) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Player;
+ uint32 Time = 0; ///< UnixTime
+ uint32 Size = 0; ///< decompressed size
+ uint8 DataType = 0; ///< @see enum AccountDataType
+ ByteBuffer CompressedData;
+ };
+
+ class UserClientUpdateAccountData final : public ClientPacket
+ {
+ public:
+ UserClientUpdateAccountData(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_ACCOUNT_DATA, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid PlayerGuid;
+ uint32 Time = 0; ///< UnixTime
+ uint32 Size = 0; ///< decompressed size
+ uint8 DataType = 0; ///< @see enum AccountDataType
+ ByteBuffer CompressedData;
+ };
}
}
diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp
new file mode 100644
index 00000000000..7793ef4ae30
--- /dev/null
+++ b/src/server/game/Server/Packets/CombatPackets.cpp
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "CombatPackets.h"
+#include "SpellPackets.h"
+
+void WorldPackets::Combat::AttackSwing::Read()
+{
+ _worldPacket >> Victim;
+}
+
+WorldPacket const* WorldPackets::Combat::AttackStart::Write()
+{
+ _worldPacket << Attacker;
+ _worldPacket << Victim;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::SAttackStop::Write()
+{
+ _worldPacket << Attacker;
+ _worldPacket << Victim;
+ _worldPacket.WriteBit(Dead);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::ThreatUpdate::Write()
+{
+ _worldPacket << UnitGUID;
+ _worldPacket << int32(ThreatList.size());
+ for (WorldPackets::Combat::ThreatInfo const& threatInfo : ThreatList)
+ {
+ _worldPacket << threatInfo.UnitGUID;
+ _worldPacket << threatInfo.Threat;
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::HighestThreatUpdate::Write()
+{
+ _worldPacket << UnitGUID;
+ _worldPacket << HighestThreatGUID;
+ _worldPacket << int32(ThreatList.size());
+ for (WorldPackets::Combat::ThreatInfo const& threatInfo : ThreatList)
+ {
+ _worldPacket << threatInfo.UnitGUID;
+ _worldPacket << threatInfo.Threat;
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::ThreatRemove::Write()
+{
+ _worldPacket << UnitGUID;
+ _worldPacket << AboutGUID;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::AIReaction::Write()
+{
+ _worldPacket << UnitGUID;
+ _worldPacket << Reaction;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Combat::AttackerStateUpdate::Write()
+{
+ if (_worldPacket.WriteBit(LogData.HasValue))
+ _worldPacket << LogData.Value;
+
+ // Placeholder for size which will be calculated at the end based on packet size
+ // Client uses this size to copy remaining packet to another CDataStore
+ _worldPacket << int32(0);
+ size_t pos = _worldPacket.wpos();
+
+ _worldPacket << HitInfo;
+ _worldPacket << AttackerGUID;
+ _worldPacket << VictimGUID;
+ _worldPacket << Damage;
+ _worldPacket << OverDamage;
+ if (_worldPacket.WriteBit(SubDmg.HasValue))
+ {
+ _worldPacket << SubDmg.Value.SchoolMask;
+ _worldPacket << SubDmg.Value.FDamage;
+ _worldPacket << SubDmg.Value.Damage;
+ if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB))
+ _worldPacket << SubDmg.Value.Absorbed;
+ if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST))
+ _worldPacket << SubDmg.Value.Resisted;
+ }
+
+ _worldPacket << VictimState;
+ _worldPacket << AttackerState;
+ _worldPacket << MeleeSpellID;
+ if (HitInfo & HITINFO_BLOCK)
+ _worldPacket << BlockAmount;
+ if (HitInfo & HITINFO_RAGE_GAIN)
+ _worldPacket << RageGained;
+ if (HitInfo & HITINFO_UNK1)
+ {
+ _worldPacket << UnkState.State1;
+ _worldPacket << UnkState.State2;
+ _worldPacket << UnkState.State3;
+ _worldPacket << UnkState.State4;
+ _worldPacket << UnkState.State5;
+ _worldPacket << UnkState.State6;
+ _worldPacket << UnkState.State7;
+ _worldPacket << UnkState.State8;
+ _worldPacket << UnkState.State9;
+ _worldPacket << UnkState.State10;
+ _worldPacket << UnkState.State11;
+ _worldPacket << UnkState.State12;
+ }
+ if (HitInfo & (HITINFO_BLOCK|HITINFO_UNK12))
+ _worldPacket << Unk;
+
+ // Update size placeholder
+ _worldPacket.put<int32>(pos - sizeof(int32), _worldPacket.wpos() - pos);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h
new file mode 100644
index 00000000000..14648297342
--- /dev/null
+++ b/src/server/game/Server/Packets/CombatPackets.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CombatPackets_h__
+#define CombatPackets_h__
+
+#include "Packet.h"
+#include "ObjectGuid.h"
+#include "SpellPackets.h"
+
+namespace WorldPackets
+{
+ namespace Combat
+ {
+ class AttackSwing final : public ClientPacket
+ {
+ public:
+ AttackSwing(WorldPacket&& packet) : ClientPacket(CMSG_ATTACKSWING, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Victim;
+ };
+
+ class AttackStop final : public ClientPacket
+ {
+ public:
+ AttackStop(WorldPacket&& packet) : ClientPacket(CMSG_ATTACKSTOP, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class AttackStart final : public ServerPacket
+ {
+ public:
+ AttackStart() : ServerPacket(SMSG_ATTACKSTART, 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Attacker;
+ ObjectGuid Victim;
+ };
+
+ class SAttackStop final : public ServerPacket
+ {
+ public:
+ SAttackStop() : ServerPacket(SMSG_ATTACKSTOP, 17) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Attacker;
+ ObjectGuid Victim;
+ bool Dead = false;
+ };
+
+ struct ThreatInfo
+ {
+ ObjectGuid UnitGUID;
+ int32 Threat = 0;
+ };
+
+ class ThreatUpdate final : public ServerPacket
+ {
+ public:
+ ThreatUpdate() : ServerPacket(SMSG_THREAT_UPDATE, 24) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid UnitGUID;
+ std::vector<ThreatInfo> ThreatList;
+ };
+
+ class HighestThreatUpdate final : public ServerPacket
+ {
+ public:
+ HighestThreatUpdate() : ServerPacket(SMSG_HIGHEST_THREAT_UPDATE, 44) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid UnitGUID;
+ std::vector<ThreatInfo> ThreatList;
+ ObjectGuid HighestThreatGUID;
+ };
+
+ class ThreatRemove final : public ServerPacket
+ {
+ public:
+ ThreatRemove() : ServerPacket(SMSG_THREAT_REMOVE, 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid AboutGUID; // Unit to remove threat from (e.g. player, pet, guardian)
+ ObjectGuid UnitGUID; // Unit being attacked (e.g. creature, boss)
+ };
+
+ class AIReaction final : public ServerPacket
+ {
+ public:
+ AIReaction() : ServerPacket(SMSG_AI_REACTION, 12) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid UnitGUID;
+ uint32 Reaction = 0;
+ };
+
+ struct SubDamage
+ {
+ int32 SchoolMask = 0;
+ float FDamage = 0.0f; // Float damage (Most of the time equals to Damage)
+ int32 Damage = 0;
+ int32 Absorbed = 0;
+ int32 Resisted = 0;
+ };
+
+ struct UnkAttackerState
+ {
+ int32 State1 = 0;
+ float State2 = 0.0f;
+ float State3 = 0.0f;
+ float State4 = 0.0f;
+ float State5 = 0.0f;
+ float State6 = 0.0f;
+ float State7 = 0.0f;
+ float State8 = 0.0f;
+ float State9 = 0.0f;
+ float State10 = 0.0f;
+ float State11 = 0.0f;
+ int32 State12 = 0;
+ };
+
+ class AttackerStateUpdate final : public ServerPacket
+ {
+ public:
+ AttackerStateUpdate() : ServerPacket(SMSG_ATTACKERSTATEUPDATE, 70) { }
+
+ WorldPacket const* Write() override;
+
+ Optional<WorldPackets::Spell::SpellCastLogData> LogData;
+ uint32 HitInfo = 0; // Flags
+ ObjectGuid AttackerGUID;
+ ObjectGuid VictimGUID;
+ int32 Damage = 0;
+ int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive
+ Optional<SubDamage> SubDmg;
+ uint8 VictimState = 0;
+ int32 AttackerState = -1;
+ int32 MeleeSpellID = 0;
+ int32 BlockAmount = 0;
+ int32 RageGained = 0;
+ UnkAttackerState UnkState;
+ float Unk = 0.0f;
+ };
+ }
+}
+
+#endif // CombatPackets_h__
diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp
new file mode 100644
index 00000000000..07cab20debf
--- /dev/null
+++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "EquipmentSetPackets.h"
+
+WorldPacket const* WorldPackets::EquipmentSet::EquipmentSetID::Write()
+{
+ _worldPacket << uint64(GUID);
+ _worldPacket << uint32(SetID);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write()
+{
+ _worldPacket << uint32(SetData.size());
+
+ for (EquipmentSetInfo::EquipmentSetData const* equipSet : SetData)
+ {
+ _worldPacket << uint64(equipSet->Guid);
+ _worldPacket << uint32(equipSet->SetID);
+ _worldPacket << uint32(equipSet->IgnoreMask);
+
+ for (ObjectGuid const& guid : equipSet->Pieces)
+ _worldPacket << guid;
+
+ _worldPacket.WriteBits(equipSet->SetName.length(), 8);
+ _worldPacket.WriteBits(equipSet->SetIcon.length(), 9);
+ _worldPacket.WriteString(equipSet->SetName);
+ _worldPacket.WriteString(equipSet->SetIcon);
+ _worldPacket.FlushBits();
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::EquipmentSet::SaveEquipmentSet::Read()
+{
+ _worldPacket >> Set.Guid;
+ _worldPacket >> Set.SetID;
+ _worldPacket >> Set.IgnoreMask;
+
+ for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ _worldPacket >> Set.Pieces[i];
+
+ uint32 setNameLength = _worldPacket.ReadBits(8);
+ uint32 setIconLength = _worldPacket.ReadBits(9);
+
+ Set.SetName = _worldPacket.ReadString(setNameLength);
+ Set.SetIcon = _worldPacket.ReadString(setIconLength);
+}
diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h
new file mode 100644
index 00000000000..b01c483f5ac
--- /dev/null
+++ b/src/server/game/Server/Packets/EquipmentSetPackets.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "Packet.h"
+#include "Player.h"
+
+namespace WorldPackets
+{
+ namespace EquipmentSet
+ {
+ class EquipmentSetID final : public ServerPacket
+ {
+ public:
+ EquipmentSetID() : ServerPacket(SMSG_EQUIPMENT_SET_SAVED, 8 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint64 GUID = 0; ///< Set Identifier
+ uint32 SetID = 0; ///< Index
+ };
+
+ class LoadEquipmentSet final : public ServerPacket
+ {
+ public:
+ LoadEquipmentSet() : ServerPacket(SMSG_EQUIPMENT_SET_LIST, 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<EquipmentSetInfo::EquipmentSetData const*> SetData;
+ };
+
+ class SaveEquipmentSet final : public ClientPacket
+ {
+ public:
+ SaveEquipmentSet(WorldPacket&& packet) : ClientPacket(CMSG_EQUIPMENT_SET_SAVE, std::move(packet)) { }
+
+ void Read() override;
+
+ EquipmentSetInfo::EquipmentSetData Set;
+ };
+ }
+}
diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
index c853cf4cc19..f4159927543 100644
--- a/src/server/game/Server/Packets/GuildPackets.cpp
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -33,16 +33,16 @@ WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
if (Info.HasValue)
{
- _worldPacket << Info.value.GuildGUID;
- _worldPacket << uint32(Info.value.VirtualRealmAddress);
- _worldPacket << uint32(Info.value.Ranks.size());
- _worldPacket << uint32(Info.value.EmblemStyle);
- _worldPacket << uint32(Info.value.EmblemColor);
- _worldPacket << uint32(Info.value.BorderStyle);
- _worldPacket << uint32(Info.value.BorderColor);
- _worldPacket << uint32(Info.value.BackgroundColor);
-
- for (GuildInfo::GuildInfoRank const& rank : Info.value.Ranks)
+ _worldPacket << Info.Value.GuildGUID;
+ _worldPacket << uint32(Info.Value.VirtualRealmAddress);
+ _worldPacket << uint32(Info.Value.Ranks.size());
+ _worldPacket << uint32(Info.Value.EmblemStyle);
+ _worldPacket << uint32(Info.Value.EmblemColor);
+ _worldPacket << uint32(Info.Value.BorderStyle);
+ _worldPacket << uint32(Info.Value.BorderColor);
+ _worldPacket << uint32(Info.Value.BackgroundColor);
+
+ for (GuildInfo::GuildInfoRank const& rank : Info.Value.Ranks)
{
_worldPacket << uint32(rank.RankID);
_worldPacket << uint32(rank.RankOrder);
@@ -51,8 +51,8 @@ WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
_worldPacket.WriteString(rank.RankName);
}
- _worldPacket.WriteBits(Info.value.GuildName.size(), 7);
- _worldPacket.WriteString(Info.value.GuildName);
+ _worldPacket.WriteBits(Info.Value.GuildName.size(), 7);
+ _worldPacket.WriteString(Info.Value.GuildName);
}
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
new file mode 100644
index 00000000000..924a9eec352
--- /dev/null
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ItemPackets.h"
+
+WorldPacket const* WorldPackets::Item::SetProficiency::Write()
+{
+ _worldPacket << ProficiencyMask;
+ _worldPacket << ProficiencyClass;
+
+ return &_worldPacket;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData)
+{
+ data << itemBonusInstanceData.Context;
+ data << uint32(itemBonusInstanceData.BonusListIDs.size());
+ for (uint32 bonusID : itemBonusInstanceData.BonusListIDs)
+ data << bonusID;
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance)
+{
+ data << itemInstance.ItemID;
+ data << itemInstance.RandomPropertiesSeed;
+ data << itemInstance.RandomPropertiesID;
+
+ data.WriteBit(itemInstance.ItemBonus.HasValue);
+ data.WriteBit(!itemInstance.Modifications.empty());
+ data.FlushBits();
+
+ if (itemInstance.ItemBonus.HasValue)
+ data << itemInstance.ItemBonus.Value;
+
+ if (!itemInstance.Modifications.empty())
+ {
+ data << uint32(itemInstance.Modifications.size() * sizeof(uint32));
+ for (uint32 itemMod : itemInstance.Modifications)
+ data << itemMod;
+ }
+
+ return data;
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
new file mode 100644
index 00000000000..cb87bc0c586
--- /dev/null
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ItemPackets_h__
+#define ItemPackets_h__
+
+#include "Packet.h"
+
+namespace WorldPackets
+{
+ namespace Item
+ {
+ class SetProficiency final : public ServerPacket
+ {
+ public:
+ SetProficiency() : ServerPacket(SMSG_SET_PROFICIENCY, 5) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 ProficiencyMask;
+ uint8 ProficiencyClass;
+ };
+
+ struct ItemBonusInstanceData
+ {
+ uint8 Context = 0;
+ std::vector<int32> BonusListIDs;
+ };
+
+ struct ItemInstance
+ {
+ uint32 ItemID = 0;
+ uint32 RandomPropertiesSeed = 0;
+ uint32 RandomPropertiesID = 0;
+ Optional<ItemBonusInstanceData> ItemBonus;
+ std::vector<int32> Modifications;
+ };
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance);
+
+#endif // ItemPackets_h__
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index 66128354884..154ff134a6a 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -17,7 +17,101 @@
#include "MiscPackets.h"
+WorldPacket const* WorldPackets::Misc::BindPointUpdate::Write()
+{
+ _worldPacket << float(BindPosition.x);
+ _worldPacket << float(BindPosition.y);
+ _worldPacket << float(BindPosition.z);
+ _worldPacket << uint32(BindMapID);
+ _worldPacket << uint32(BindAreaID);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::InvalidatePlayer::Write()
+{
+ _worldPacket << Guid;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write()
+{
+ _worldPacket.AppendPackedTime(ServerTime);
+ _worldPacket.AppendPackedTime(GameTime);
+ _worldPacket << float(NewSpeed);
+ _worldPacket << uint32(ServerTimeHolidayOffset);
+ _worldPacket << uint32(GameTimeHolidayOffset);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::SetSelection::Read()
+{
+ _worldPacket >> Selection;
+}
+
void WorldPackets::Misc::ViolenceLevel::Read()
{
_worldPacket >> ViolenceLvl;
}
+
+WorldPacket const* WorldPackets::Misc::TimeSyncRequest::Write()
+{
+ _worldPacket << SequenceIndex;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::TimeSyncResponse::Read()
+{
+ _worldPacket >> SequenceIndex;
+ _worldPacket >> ClientTime;
+}
+
+WorldPacket const* WorldPackets::Misc::UITime::Write()
+{
+ _worldPacket << Time;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::TutorialFlags::Write()
+{
+ _worldPacket.append(TutorialData, MAX_ACCOUNT_TUTORIAL_VALUES);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::TutorialSetFlag::Read()
+{
+ Action = _worldPacket.ReadBits(2);
+ _worldPacket >> TutorialBit;
+}
+
+WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write()
+{
+ _worldPacket << uint32(DifficultyID);
+ _worldPacket << uint8(IsTournamentRealm);
+ _worldPacket << uint32(WeeklyReset);
+ _worldPacket.WriteBit(IneligibleForLootMask.HasValue);
+ _worldPacket.WriteBit(InstanceGroupSize.HasValue);
+ _worldPacket.WriteBit(RestrictedAccountMaxLevel.HasValue);
+ _worldPacket.WriteBit(RestrictedAccountMaxMoney.HasValue);
+
+ if (IneligibleForLootMask.HasValue)
+ _worldPacket << uint32(IneligibleForLootMask.Value);
+
+ if (InstanceGroupSize.HasValue)
+ _worldPacket << uint32(InstanceGroupSize.Value);
+
+ if (RestrictedAccountMaxLevel.HasValue)
+ _worldPacket << uint32(RestrictedAccountMaxLevel.Value);
+
+ if (RestrictedAccountMaxMoney.HasValue)
+ _worldPacket << uint32(RestrictedAccountMaxMoney.Value);
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 8b78074090f..dfff0e331fc 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -19,11 +19,61 @@
#define MiscPackets_h__
#include "Packet.h"
+#include "ObjectGuid.h"
+#include "WorldSession.h"
+#include "G3D/Vector3.h"
+#include "Object.h"
namespace WorldPackets
{
namespace Misc
{
+ class BindPointUpdate final : public ServerPacket
+ {
+ public:
+ BindPointUpdate() : ServerPacket(SMSG_BINDPOINTUPDATE, 20) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 BindMapID = MAPID_INVALID;
+ G3D::Vector3 BindPosition;
+ uint32 BindAreaID = 0;
+ };
+
+ class InvalidatePlayer final : public ServerPacket
+ {
+ public:
+ InvalidatePlayer() : ServerPacket(SMSG_INVALIDATE_PLAYER, 18) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ };
+
+ class LoginSetTimeSpeed final : public ServerPacket
+ {
+ public:
+ LoginSetTimeSpeed() : ServerPacket(SMSG_LOGIN_SETTIMESPEED, 20) { }
+
+ WorldPacket const* Write() override;
+
+ float NewSpeed = 0.0f;
+ int32 ServerTimeHolidayOffset = 0;
+ uint32 GameTime = 0;
+ uint32 ServerTime = 0;
+ int32 GameTimeHolidayOffset = 0;
+ };
+
+ class SetSelection final : public ClientPacket
+ {
+ public:
+ SetSelection(WorldPacket&& packet) : ClientPacket(CMSG_SET_SELECTION, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Selection; ///< Target
+ };
+
class ViolenceLevel final : public ClientPacket
{
public:
@@ -33,6 +83,77 @@ namespace WorldPackets
int8 ViolenceLvl = -1; ///< 0 - no combat effects, 1 - display some combat effects, 2 - blood, 3 - bloody, 4 - bloodier, 5 - bloodiest
};
+
+ class TimeSyncRequest final : public ServerPacket
+ {
+ public:
+ TimeSyncRequest() : ServerPacket(SMSG_TIME_SYNC_REQ, 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 SequenceIndex = 0;
+ };
+
+ class TimeSyncResponse final : public ClientPacket
+ {
+ public:
+ TimeSyncResponse(WorldPacket&& packet) : ClientPacket(CMSG_TIME_SYNC_RESP, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 ClientTime = 0; // Client ticks in ms
+ uint32 SequenceIndex = 0; // Same index as in request
+ };
+
+ class UITime final : public ServerPacket
+ {
+ public:
+ UITime() : ServerPacket(SMSG_WORLD_STATE_UI_TIMER_UPDATE, 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 Time = 0;
+ };
+
+ class TutorialFlags : public ServerPacket
+ {
+ public:
+ TutorialFlags() : ServerPacket(SMSG_TUTORIAL_FLAGS, 32)
+ {
+ std::memset(TutorialData, 0, sizeof(TutorialData));
+ }
+
+ WorldPacket const* Write() override;
+
+ uint32 TutorialData[MAX_ACCOUNT_TUTORIAL_VALUES];
+ };
+
+ class TutorialSetFlag final : public ClientPacket
+ {
+ public:
+ TutorialSetFlag(WorldPacket&& packet) : ClientPacket(CMSG_TUTORIAL_FLAG, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 Action = 0;
+ uint32 TutorialBit = 0;
+ };
+
+ class WorldServerInfo final : public ServerPacket
+ {
+ public:
+ WorldServerInfo() : ServerPacket(SMSG_WORLD_SERVER_INFO, 26) { }
+
+ WorldPacket const* Write() override;
+
+ Optional<uint32> IneligibleForLootMask; ///< Encountermask?
+ uint32 WeeklyReset = 0; ///< UnixTime of last Weekly Reset Time
+ Optional<uint32> InstanceGroupSize;
+ uint8 IsTournamentRealm = 0;
+ Optional<uint32> RestrictedAccountMaxLevel;
+ Optional<uint32> RestrictedAccountMaxMoney;
+ uint32 DifficultyID = 0;
+ };
}
}
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 487e230a4a1..972a52dc41c 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -16,162 +16,308 @@
*/
#include "MovementPackets.h"
+#include "MovementTypedefs.h"
+#include "Unit.h"
-void WorldPackets::Movement::ClientPlayerMovement::Read()
+ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v)
+{
+ data << v.x << v.y << v.z;
+ return data;
+}
+
+ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v)
+{
+ data >> v.x >> v.y >> v.z;
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo)
+{
+ bool hasTransportData = !movementInfo.transport.guid.IsEmpty();
+ bool hasTransportPrevTime = hasTransportData && movementInfo.transport.prevTime != 0;
+ bool hasTransportVehicleId = hasTransportData && movementInfo.transport.vehicleId != 0;
+ bool hasFallDirection = movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR);
+ bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
+
+ data << movementInfo.guid;
+ data << movementInfo.time;
+ data << movementInfo.pos.PositionXYZOStream();
+ data << movementInfo.pitch;
+ data << movementInfo.splineElevation;
+
+ uint32 removeMovementForcesCount = 0;
+ data << removeMovementForcesCount;
+
+ uint32 int168 = 0;
+ data << int168;
+
+ /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
+ {
+ data << ObjectGuid;
+ }*/
+
+ data.WriteBits(movementInfo.flags, 30);
+ data.WriteBits(movementInfo.flags2, 15);
+
+ data.WriteBit(hasTransportData);
+ data.WriteBit(hasFallData);
+
+ data.WriteBit(0); // HeightChangeFailed
+ data.WriteBit(0); // RemoteTimeValid
+
+ if (hasTransportData)
+ {
+ data << movementInfo.transport.guid;
+ data << movementInfo.transport.pos.PositionXYZOStream();
+ data << movementInfo.transport.seat;
+ data << movementInfo.transport.time;
+
+ data.WriteBit(hasTransportPrevTime);
+ data.WriteBit(hasTransportVehicleId);
+
+ if (hasTransportPrevTime)
+ data << movementInfo.transport.prevTime;
+
+ if (hasTransportVehicleId)
+ data << movementInfo.transport.vehicleId;
+ }
+
+ if (hasFallData)
+ {
+ data << movementInfo.jump.fallTime;
+ data << movementInfo.jump.zspeed;
+
+ data.WriteBit(hasFallDirection);
+ if (hasFallDirection)
+ {
+ data << movementInfo.jump.sinAngle;
+ data << movementInfo.jump.cosAngle;
+ data << movementInfo.jump.xyspeed;
+ }
+ }
+
+ data.FlushBits();
+
+ return data;
+}
+
+ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo)
{
- _worldPacket >> movementInfo.guid;
- _worldPacket >> movementInfo.time;
- _worldPacket >> movementInfo.pos.m_positionX;
- _worldPacket >> movementInfo.pos.m_positionY;
- _worldPacket >> movementInfo.pos.m_positionZ;
- _worldPacket >> movementInfo.pos.m_orientation;
- _worldPacket >> movementInfo.pitch;
- _worldPacket >> movementInfo.splineElevation;
+ data >> movementInfo.guid;
+ data >> movementInfo.time;
+ data >> movementInfo.pos.PositionXYZOStream();
+ data >> movementInfo.pitch;
+ data >> movementInfo.splineElevation;
uint32 removeMovementForcesCount;
- _worldPacket >> removeMovementForcesCount;
+ data >> removeMovementForcesCount;
uint32 int168;
- _worldPacket >> int168;
+ data >> int168;
for (uint32 i = 0; i < removeMovementForcesCount; ++i)
{
ObjectGuid guid;
- _worldPacket >> guid;
+ data >> guid;
}
- // ResetBitReader
+ movementInfo.flags = data.ReadBits(30);
+ movementInfo.flags2 = data.ReadBits(15);
- movementInfo.flags = _worldPacket.ReadBits(30);
- movementInfo.flags2 = _worldPacket.ReadBits(15);
-
- bool hasTransport = _worldPacket.ReadBit();
- bool hasFall = _worldPacket.ReadBit();
+ bool hasTransport = data.ReadBit();
+ bool hasFall = data.ReadBit();
- _worldPacket.ReadBit(); // HeightChangeFailed
- _worldPacket.ReadBit(); // RemoteTimeValid
+ data.ReadBit(); // HeightChangeFailed
+ data.ReadBit(); // RemoteTimeValid
if (hasTransport)
{
- _worldPacket >> movementInfo.transport.guid;
- _worldPacket >> movementInfo.transport.pos.m_positionX;
- _worldPacket >> movementInfo.transport.pos.m_positionY;
- _worldPacket >> movementInfo.transport.pos.m_positionZ;
- _worldPacket >> movementInfo.transport.pos.m_orientation;
- _worldPacket >> movementInfo.transport.seat;
- _worldPacket >> movementInfo.transport.time;
+ data >> movementInfo.transport.guid;
+ data >> movementInfo.transport.pos.PositionXYZOStream();
+ data >> movementInfo.transport.seat;
+ data >> movementInfo.transport.time;
- bool hasPrevTime = _worldPacket.ReadBit();
- bool hasVehicleId = _worldPacket.ReadBit();
+ bool hasPrevTime = data.ReadBit();
+ bool hasVehicleId = data.ReadBit();
if (hasPrevTime)
- _worldPacket >> movementInfo.transport.prevTime;
+ data >> movementInfo.transport.prevTime;
if (hasVehicleId)
- _worldPacket >> movementInfo.transport.vehicleId;
+ data >> movementInfo.transport.vehicleId;
}
if (hasFall)
{
- _worldPacket >> movementInfo.jump.fallTime;
- _worldPacket >> movementInfo.jump.zspeed;
+ data >> movementInfo.jump.fallTime;
+ data >> movementInfo.jump.zspeed;
// ResetBitReader
- bool hasFallDirection = _worldPacket.ReadBit();
+ bool hasFallDirection = data.ReadBit();
if (hasFallDirection)
{
- _worldPacket >> movementInfo.jump.sinAngle;
- _worldPacket >> movementInfo.jump.cosAngle;
- _worldPacket >> movementInfo.jump.xyspeed;
+ data >> movementInfo.jump.sinAngle;
+ data >> movementInfo.jump.cosAngle;
+ data >> movementInfo.jump.xyspeed;
}
}
+
+ return data;
}
-WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+void WorldPackets::Movement::ClientPlayerMovement::Read()
{
- MovementInfo const movementInfo = mover->m_movementInfo;
+ _worldPacket >> movementInfo;
+}
- bool hasMovementFlags = mover->GetUnitMovementFlags() != 0;
- bool hasMovementFlags2 = mover->GetExtraUnitMovementFlags() != 0;
- bool hasTransportData = !mover->GetTransGUID().IsEmpty();
- bool hasSpline = mover->IsSplineEnabled();
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilterKey& monsterSplineFilterKey)
+{
+ data << monsterSplineFilterKey.Idx;
+ data << monsterSplineFilterKey.Speed;
- bool hasTransportPrevTime = hasTransportData && movementInfo.transport.prevTime != 0;
- bool hasTransportVehicleId = hasTransportData && movementInfo.transport.vehicleId != 0;
- bool hasPitch = mover->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING);
- bool hasFallDirection = mover->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
- bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
- bool hasSplineElevation = mover->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);
+ return data;
+}
- _worldPacket << movementInfo.guid;
- _worldPacket << movementInfo.time;
- _worldPacket << movementInfo.pos.m_positionX;
- _worldPacket << movementInfo.pos.m_positionY;
- _worldPacket << movementInfo.pos.m_positionZ;
- _worldPacket << movementInfo.pos.m_orientation;
- _worldPacket << movementInfo.pitch;
- _worldPacket << movementInfo.splineElevation;
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilter& monsterSplineFilter)
+{
+ data << uint32(monsterSplineFilter.FilterKeys.size());
+ data << monsterSplineFilter.BaseSpeed;
+ data << monsterSplineFilter.StartOffset;
+ data << monsterSplineFilter.DistToPrevFilterKey;
+ for (WorldPackets::Movement::MonsterSplineFilterKey& filterKey : monsterSplineFilter.FilterKeys)
+ data << filterKey;
+ data << monsterSplineFilter.AddedToStart;
+ data.WriteBits(monsterSplineFilter.FilterFlags, 2);
+ data.FlushBits();
+
+ return data;
+}
- uint32 removeMovementForcesCount = 0;
- _worldPacket << removeMovementForcesCount;
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& movementSpline)
+{
+ data << movementSpline.Flags;
+ data << movementSpline.AnimTier;
+ data << movementSpline.TierTransStartTime;
+ data << movementSpline.Elapsed;
+ data << movementSpline.MoveTime;
+ data << movementSpline.JumpGravity;
+ data << movementSpline.SpecialTime;
+ data << int32(movementSpline.Points.size());
+ data << movementSpline.Mode;
+ data << movementSpline.VehicleExitVoluntary;
+ data << movementSpline.TransportGUID;
+ data << movementSpline.VehicleSeat;
+ data << int32(movementSpline.PackedDeltas.size());
+ for (G3D::Vector3 const& pos : movementSpline.Points)
+ data << pos;
+ for (G3D::Vector3 const& pos : movementSpline.PackedDeltas)
+ data.appendPackXYZ(pos.x, pos.y, pos.z);
+ data.WriteBits(movementSpline.Face, 2);
+ data.WriteBit(movementSpline.SplineFilter.HasValue);
+ data.FlushBits();
+
+ switch (movementSpline.Face)
+ {
+ case MONSTER_MOVE_FACING_SPOT:
+ data << movementSpline.FaceSpot;
+ break;
+ case MONSTER_MOVE_FACING_TARGET:
+ data << movementSpline.FaceDirection;
+ data << movementSpline.FaceGUID;
+ break;
+ case MONSTER_MOVE_FACING_ANGLE:
+ data << movementSpline.FaceDirection;
+ break;
+ }
- uint32 int168 = 0;
- _worldPacket << int168;
+ if (movementSpline.SplineFilter.HasValue)
+ data << movementSpline.SplineFilter.Value;
- /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
- {
- _worldPacket << ObjectGuid;
- }*/
+ return data;
+}
- _worldPacket.FlushBits();
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline)
+{
+ data << movementMonsterSpline.ID;
+ data << movementMonsterSpline.Destination;
+ data << movementMonsterSpline.Move;
+ data.WriteBit(movementMonsterSpline.CrzTeleport);
- _worldPacket.WriteBits(movementInfo.flags, 30);
- _worldPacket.WriteBits(movementInfo.flags2, 15);
+ // Unk bits. 0 if monster is moving, 1 or 2 if stopped
+ if (movementMonsterSpline.Move.Flags)
+ data.WriteBits(0, 2);
+ else
+ data.WriteBits(2, 2);
- _worldPacket.WriteBit(hasTransportData);
- _worldPacket.WriteBit(hasFallData);
+ data.FlushBits();
- _worldPacket.WriteBit(0); // HeightChangeFailed
- _worldPacket.WriteBit(0); // RemoteTimeValid
+ return data;
+}
- if (hasTransportData)
- {
- _worldPacket << movementInfo.transport.guid;
- _worldPacket << movementInfo.transport.pos.m_positionX;
- _worldPacket << movementInfo.transport.pos.m_positionY;
- _worldPacket << movementInfo.transport.pos.m_positionZ;
- _worldPacket << movementInfo.transport.pos.m_orientation;
- _worldPacket << movementInfo.transport.seat;
- _worldPacket << movementInfo.transport.time;
+WorldPacket const* WorldPackets::Movement::MonsterMove::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << Pos;
+ _worldPacket << SplineData;
+ return &_worldPacket;
+}
- _worldPacket.WriteBit(hasTransportPrevTime);
- _worldPacket.WriteBit(hasTransportVehicleId);
+WorldPacket const* WorldPackets::Movement::MoveSplineSet::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << Speed;
+ return &_worldPacket;
+}
- if (hasTransportPrevTime)
- _worldPacket << movementInfo.transport.prevTime;
+WorldPacket const* WorldPackets::Movement::MoveUpdate::Write()
+{
+ _worldPacket << movementInfo;
+ _worldPacket << Speed;
+ return &_worldPacket;
+}
- if (hasTransportVehicleId)
- _worldPacket << movementInfo.transport.vehicleId;
- }
+WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+{
+ MovementInfo movementInfo = mover->m_movementInfo;
- if (hasFallData)
- {
- _worldPacket << movementInfo.jump.fallTime;
- _worldPacket << movementInfo.jump.zspeed;
+ _worldPacket << movementInfo;
- _worldPacket.FlushBits();
+ return &_worldPacket;
+}
- _worldPacket.WriteBit(hasFallDirection);
- if (hasFallDirection)
- {
- _worldPacket << movementInfo.jump.sinAngle;
- _worldPacket << movementInfo.jump.cosAngle;
- _worldPacket << movementInfo.jump.xyspeed;
- }
+WorldPacket const* WorldPackets::Movement::TransferPending::Write()
+{
+ _worldPacket << int32(MapID);
+ _worldPacket.WriteBit(Ship.HasValue);
+ _worldPacket.WriteBit(TransferSpellID.HasValue);
+ if (Ship.HasValue)
+ {
+ _worldPacket << uint32(Ship.Value.ID);
+ _worldPacket << int32(Ship.Value.OriginMapID);
}
-
+
+ if (TransferSpellID.HasValue)
+ _worldPacket << int32(TransferSpellID.Value);
+
_worldPacket.FlushBits();
return &_worldPacket;
-} \ No newline at end of file
+}
+
+WorldPacket const* WorldPackets::Movement::TransferAborted::Write()
+{
+ _worldPacket << uint32(MapID);
+ _worldPacket << uint8(Arg);
+ _worldPacket.WriteBits(TransfertAbort, 5);
+ _worldPacket.FlushBits();
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::NewWorld::Write()
+{
+ _worldPacket << MapID;
+ _worldPacket << Pos.PositionXYZOStream();
+ _worldPacket << Reason;
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index f018757eada..6f3b19a661d 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -19,6 +19,8 @@
#define MovementPackets_h__
#include "Packet.h"
+#include "Object.h"
+#include <G3D/Vector3.h>
namespace WorldPackets
{
@@ -37,13 +39,154 @@ namespace WorldPackets
class ServerPlayerMovement final : public ServerPacket
{
public:
- ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) {}
+ ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) { }
WorldPacket const* Write() override;
Unit* mover;
};
+
+ struct MonsterSplineFilterKey
+ {
+ int16 Idx;
+ int16 Speed;
+ };
+
+ struct MonsterSplineFilter
+ {
+ std::vector<MonsterSplineFilterKey> FilterKeys;
+ uint8 FilterFlags;
+ float BaseSpeed;
+ int16 StartOffset;
+ float DistToPrevFilterKey;
+ int16 AddedToStart;
+ };
+
+ struct MovementSpline
+ {
+ uint32 Flags = 0; // Spline flags
+ uint8 Face = 0; // Movement direction (see MonsterMoveType enum)
+ uint8 AnimTier = 0;
+ uint32 TierTransStartTime = 0;
+ uint32 Elapsed = 0;
+ uint32 MoveTime = 0;
+ float JumpGravity = 0.0f;
+ uint32 SpecialTime = 0;
+ std::vector<G3D::Vector3> Points; // Spline path
+ uint8 Mode = 0;
+ uint8 VehicleExitVoluntary = 0;
+ ObjectGuid TransportGUID;
+ uint8 VehicleSeat = 255;
+ std::vector<G3D::Vector3> PackedDeltas;
+ Optional<MonsterSplineFilter> SplineFilter;
+ float FaceDirection = 0.0f;
+ ObjectGuid FaceGUID;
+ G3D::Vector3 FaceSpot;
+ };
+
+ struct MovementMonsterSpline
+ {
+ uint32 ID;
+ G3D::Vector3 Destination;
+ bool CrzTeleport = false;
+ MovementSpline Move;
+ };
+
+ class MonsterMove final : public ServerPacket
+ {
+ public:
+ MonsterMove() : ServerPacket(SMSG_MONSTER_MOVE) { }
+
+ WorldPacket const* Write() override;
+
+ MovementMonsterSpline SplineData;
+ ObjectGuid MoverGUID;
+ G3D::Vector3 Pos;
+ };
+
+ class MoveSplineSet : public ServerPacket
+ {
+ public:
+ MoveSplineSet(OpcodeServer opcode) : ServerPacket(opcode, 12) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid MoverGUID;
+ float Speed;
+ };
+
+ class MoveUpdate : public ServerPacket
+ {
+ public:
+ MoveUpdate(OpcodeServer opcode) : ServerPacket(opcode) { }
+
+ WorldPacket const* Write() override;
+
+ MovementInfo movementInfo;
+ float Speed;
+ };
+
+ class TransferPending final : public ServerPacket
+ {
+ struct ShipTransferPending
+ {
+ uint32 ID = 0; ///< gameobject_template.entry of the transport the player is teleporting on
+ int32 OriginMapID = -1; ///< Map id the player is currently on (before teleport)
+ };
+
+ public:
+ TransferPending() : ServerPacket(SMSG_TRANSFER_PENDING, 16) { }
+
+ WorldPacket const* Write() override;
+
+ int32 MapID = -1;
+ Optional<ShipTransferPending> Ship;
+ Optional<int32> TransferSpellID;
+ };
+
+ class TransferAborted final : public ServerPacket
+ {
+ public:
+ TransferAborted() : ServerPacket(SMSG_TRANSFER_ABORTED, 4 + 1 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 TransfertAbort = 0;
+ uint8 Arg = 0;
+ uint32 MapID = 0;
+ };
+
+ class NewWorld final : public ServerPacket
+ {
+ public:
+ NewWorld() : ServerPacket(SMSG_NEW_WORLD, 24) { }
+
+ WorldPacket const* Write() override;
+
+ int32 MapID = 0;
+ uint32 Reason = 0;
+ Position Pos;
+ };
+
+ class WorldPortAck final : public ClientPacket
+ {
+ public:
+ WorldPortAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_WORLDPORT_ACK, std::move(packet)) { }
+
+ void Read() override { }
+ };
}
}
+ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v);
+ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v);
+
+ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo);
+ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo);
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilterKey const& monsterSplineFilterKey);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilter const& monsterSplineFilter);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline const& movementSpline);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonsterSpline const& movementMonsterSpline);
+
#endif // MovementPackets_h__
diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp
new file mode 100644
index 00000000000..60dbed09f1b
--- /dev/null
+++ b/src/server/game/Server/Packets/NPCPackets.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "NPCPackets.h"
+#include "ItemPackets.h"
+
+void WorldPackets::NPC::Hello::Read()
+{
+ _worldPacket >> Unit;
+}
+
+WorldPacket const* WorldPackets::NPC::GossipMessage::Write()
+{
+ _worldPacket << GossipGUID;
+ _worldPacket << GossipID;
+ _worldPacket << FriendshipFactionID;
+ _worldPacket << TextID;
+
+ _worldPacket << int32(GossipOptions.size());
+ _worldPacket << int32(GossipText.size());
+
+ for (ClientGossipOptions const& options : GossipOptions)
+ {
+ _worldPacket << options.ClientOption;
+ _worldPacket << options.OptionNPC;
+ _worldPacket << options.OptionFlags;
+ _worldPacket << options.OptionCost;
+
+ _worldPacket.WriteBits(options.Text.size(), 12);
+ _worldPacket.WriteBits(options.Confirm.size(), 12);
+ _worldPacket.FlushBits();
+
+ _worldPacket.WriteString(options.Text);
+ _worldPacket.WriteString(options.Confirm);
+ }
+
+ for (ClientGossipText const& text : GossipText)
+ {
+ _worldPacket << text.QuestID;
+ _worldPacket << text.QuestType;
+ _worldPacket << text.QuestLevel;
+ _worldPacket << text.QuestFlags[0];
+ _worldPacket << text.QuestFlags[1];
+
+ _worldPacket.WriteBit(text.Repeatable);
+ _worldPacket.WriteBits(text.QuestTitle.size(), 9);
+ _worldPacket.FlushBits();
+
+ _worldPacket.WriteString(text.QuestTitle);
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::NPC::VendorInventory::Write()
+{
+ _worldPacket << Vendor;
+ _worldPacket << Reason;
+
+ _worldPacket << int32(Items.size());
+ for (VendorItem const& item : Items)
+ {
+ _worldPacket << item.MuID;
+ _worldPacket << item.Type;
+ _worldPacket << item.Item;
+ _worldPacket << item.Quantity;
+ _worldPacket << item.Price;
+ _worldPacket << item.Durability;
+ _worldPacket << item.StackCount;
+ _worldPacket << item.ExtendedCostID;
+ _worldPacket << item.PlayerConditionFailed;
+
+ _worldPacket.WriteBit(item.DoNotFilterOnVendor);
+ _worldPacket.FlushBits();
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::NPC::TrainerList::Write()
+{
+ _worldPacket << TrainerGUID;
+ _worldPacket << TrainerType;
+ _worldPacket << TrainerID;
+
+ _worldPacket << int32(Spells.size());
+ for (TrainerListSpell const& spell : Spells)
+ {
+ _worldPacket << spell.SpellID;
+ _worldPacket << spell.MoneyCost;
+ _worldPacket << spell.ReqSkillLine;
+ _worldPacket << spell.ReqSkillRank;
+
+ for (uint32 i = 0; i < MAX_TRAINERSPELL_ABILITY_REQS; ++i)
+ _worldPacket << spell.ReqAbility[i];
+
+ _worldPacket << spell.Usable;
+ _worldPacket << spell.ReqLevel;
+ }
+
+ _worldPacket.WriteBits(Greeting.length(), 11);
+ _worldPacket.FlushBits();
+ _worldPacket.WriteString(Greeting);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h
new file mode 100644
index 00000000000..221cb454765
--- /dev/null
+++ b/src/server/game/Server/Packets/NPCPackets.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NPCPackets_h__
+#define NPCPackets_h__
+
+#include "Packet.h"
+#include "ItemPackets.h"
+#include "Creature.h"
+
+namespace WorldPackets
+{
+ namespace NPC
+ {
+ // CMSG_BANKER_ACTIVATE
+ // CMSG_BINDER_ACTIVATE
+ // CMSG_BINDER_CONFIRM
+ // CMSG_GOSSIP_HELLO
+ // CMSG_LIST_INVENTORY
+ // CMSG_TRAINER_LIST
+ class Hello final : public ClientPacket
+ {
+ public:
+ Hello(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Unit;
+ };
+
+ struct ClientGossipOptions
+ {
+ int32 ClientOption = 0;
+ uint8 OptionNPC = 0;
+ uint8 OptionFlags = 0;
+ int32 OptionCost = 0;
+ std::string Text;
+ std::string Confirm;
+ };
+
+ struct ClientGossipText
+ {
+ int32 QuestID = 0;
+ int32 QuestType = 0;
+ int32 QuestLevel = 0;
+ bool Repeatable = false;
+ std::string QuestTitle;
+ int32 QuestFlags[2];
+ };
+
+ class GossipMessage final : public ServerPacket
+ {
+ public:
+ GossipMessage() : ServerPacket(SMSG_GOSSIP_MESSAGE, 200) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<ClientGossipOptions> GossipOptions;
+ int32 FriendshipFactionID = 0;
+ ObjectGuid GossipGUID;
+ std::vector<ClientGossipText> GossipText;
+ int32 TextID = 0;
+ int32 GossipID = 0;
+ };
+
+ struct VendorItem
+ {
+ int32 MuID = 0;
+ int32 Type = 0;
+ WorldPackets::Item::ItemInstance Item;
+ int32 Quantity = -1;
+ int32 Price = 0;
+ int32 Durability = 0;
+ int32 StackCount = 0;
+ int32 ExtendedCostID = 0;
+ int32 PlayerConditionFailed = 0;
+ bool DoNotFilterOnVendor = false;
+ };
+
+ class VendorInventory final : public ServerPacket
+ {
+ public:
+ VendorInventory() : ServerPacket(SMSG_LIST_INVENTORY, 600) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 Reason = 0;
+ std::vector<VendorItem> Items;
+ ObjectGuid Vendor;
+ };
+
+ struct TrainerListSpell
+ {
+ int32 SpellID = 0;
+ int32 MoneyCost = 0;
+ int32 ReqSkillLine = 0;
+ int32 ReqSkillRank = 0;
+ int32 ReqAbility[MAX_TRAINERSPELL_ABILITY_REQS];
+ uint8 Usable = 0;
+ uint8 ReqLevel = 0;
+ };
+
+ class TrainerList final : public ServerPacket
+ {
+ public:
+ TrainerList() : ServerPacket(SMSG_TRAINER_LIST, 150) { }
+
+ WorldPacket const* Write() override;
+
+ std::string Greeting;
+ int32 TrainerType = 0;
+ ObjectGuid TrainerGUID;
+ int32 TrainerID = 1;
+ std::vector<TrainerListSpell> Spells;
+ };
+ }
+}
+
+#endif // NPCPackets_h__
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index 3076c221c71..335d261651a 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -88,3 +88,123 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
return &_worldPacket;
}
+
+void WorldPackets::Query::QueryPlayerName::Read()
+{
+ _worldPacket >> Player;
+
+ Hint.VirtualRealmAddress.HasValue = _worldPacket.ReadBit();
+ Hint.NativeRealmAddress.HasValue = _worldPacket.ReadBit();
+
+ if (Hint.VirtualRealmAddress.HasValue)
+ _worldPacket >> Hint.VirtualRealmAddress.Value;
+
+ if (Hint.NativeRealmAddress.HasValue)
+ _worldPacket >> Hint.NativeRealmAddress.Value;
+}
+
+WorldPacket const* WorldPackets::Query::QueryPlayerNameResponse::Write()
+{
+ _worldPacket << Result;
+ _worldPacket << Player;
+
+ if (Result == RESPONSE_SUCCESS)
+ {
+ _worldPacket.WriteBits(Data.Name.length(), 7);
+
+ for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
+ _worldPacket.WriteBits(Data.DeclinedNames.name[i].length(), 7);
+
+ for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
+ _worldPacket.WriteString(Data.DeclinedNames.name[i]);
+
+ _worldPacket << Data.AccountID;
+ _worldPacket << Data.BnetAccountID;
+ _worldPacket << Data.GuidActual;
+ _worldPacket << Data.VirtualRealmAddress;
+ _worldPacket << Data.Race;
+ _worldPacket << Data.Sex;
+ _worldPacket << Data.ClassID;
+ _worldPacket << Data.Level;
+ _worldPacket.WriteString(Data.Name);
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Query::QueryPageText::Read()
+{
+ _worldPacket >> PageTextID;
+ _worldPacket >> ItemGUID;
+}
+
+WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write()
+{
+ _worldPacket << PageTextID;
+ _worldPacket.WriteBit(Allow);
+
+ if (Allow)
+ {
+ _worldPacket << Info.ID;
+ _worldPacket << Info.NextPageID;
+ _worldPacket.WriteBits(Info.Text.length(), 12);
+ _worldPacket.WriteString(Info.Text);
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Query::QueryNPCText::Read()
+{
+ _worldPacket >> TextID;
+ _worldPacket >> Guid;
+}
+
+WorldPacket const* WorldPackets::Query::QueryNPCTextResponse::Write()
+{
+ _worldPacket << TextID;
+ _worldPacket.WriteBit(Allow);
+
+ if (Allow)
+ {
+ _worldPacket << int32(MAX_GOSSIP_TEXT_OPTIONS * (4 + 4));
+ for (uint32 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
+ _worldPacket << Probabilities[i];
+ for (uint32 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
+ _worldPacket << BroadcastTextID[i];
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Query::DBQueryBulk::Read()
+{
+ _worldPacket >> TableHash;
+
+ uint32 count = _worldPacket.ReadBits(13);
+ _worldPacket.ResetBitPos();
+
+ Queries.resize(count);
+ for (uint32 i = 0; i < count; ++i)
+ {
+ _worldPacket >> Queries[i].GUID;
+ _worldPacket >> Queries[i].RecordID;
+ }
+}
+
+WorldPacket const* WorldPackets::Query::DBReply::Write()
+{
+ _worldPacket << TableHash;
+ _worldPacket << RecordID;
+ _worldPacket << Timestamp;
+
+ size_t sizePos = _worldPacket.wpos();
+ _worldPacket << int32(0); // size of next block
+
+ if (Data)
+ Data->WriteRecord(RecordID, Locale, _worldPacket);
+
+ _worldPacket.put<int32>(sizePos, _worldPacket.wpos() - sizePos - 4);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index 49bb5847400..b9e04ec4260 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -20,6 +20,8 @@
#include "Packet.h"
#include "Creature.h"
+#include "NPCHandler.h"
+#include "DB2Stores.h"
namespace WorldPackets
{
@@ -59,7 +61,7 @@ namespace WorldPackets
class QueryCreatureResponse final : public ServerPacket
{
public:
- QueryCreatureResponse() : ServerPacket(SMSG_CREATURE_QUERY_RESPONSE, 2+4+4+4+12) { }
+ QueryCreatureResponse() : ServerPacket(SMSG_CREATURE_QUERY_RESPONSE, 76) { }
WorldPacket const* Write() override;
@@ -67,6 +69,137 @@ namespace WorldPackets
CreatureStats Stats;
uint32 CreatureID = 0;
};
+
+ struct PlayerGuidLookupHint
+ {
+ Optional<uint32> VirtualRealmAddress; ///< current realm (?) (identifier made from the Index, BattleGroup and Region)
+ Optional<uint32> NativeRealmAddress; ///< original realm (?) (identifier made from the Index, BattleGroup and Region)
+ };
+
+ class QueryPlayerName final : public ClientPacket
+ {
+ public:
+ QueryPlayerName(WorldPacket&& packet) : ClientPacket(CMSG_NAME_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Player;
+ PlayerGuidLookupHint Hint;
+ };
+
+ struct PlayerGuidLookupData
+ {
+ bool IsDeleted = false;
+ ObjectGuid AccountID;
+ ObjectGuid BnetAccountID;
+ ObjectGuid GuidActual;
+ std::string Name;
+ uint32 VirtualRealmAddress = 0;
+ uint8 Race = RACE_NONE;
+ uint8 Sex = GENDER_NONE;
+ uint8 ClassID = CLASS_NONE;
+ uint8 Level = 0;
+ DeclinedName DeclinedNames;
+ };
+
+ class QueryPlayerNameResponse final : public ServerPacket
+ {
+ public:
+ QueryPlayerNameResponse() : ServerPacket(SMSG_NAME_QUERY_RESPONSE, 60) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Player;
+ uint8 Result = 0; // 0 - full packet, != 0 - only guid
+ PlayerGuidLookupData Data;
+ };
+
+ class QueryPageText final : public ClientPacket
+ {
+ public:
+ QueryPageText(WorldPacket&& packet) : ClientPacket(CMSG_PAGE_TEXT_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid ItemGUID;
+ uint32 PageTextID = 0;
+ };
+
+ struct PageTextInfo
+ {
+ uint32 ID = 0;
+ uint32 NextPageID = 0;
+ std::string Text;
+ };
+
+ class QueryPageTextResponse final : public ServerPacket
+ {
+ public:
+ QueryPageTextResponse() : ServerPacket(SMSG_PAGE_TEXT_QUERY_RESPONSE, 15) { }
+
+ WorldPacket const* Write() override;
+
+ bool Allow = false;
+ PageTextInfo Info;
+ uint32 PageTextID = 0;
+ };
+
+ class QueryNPCText final : public ClientPacket
+ {
+ public:
+ QueryNPCText(WorldPacket&& packet) : ClientPacket(CMSG_NPC_TEXT_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Guid;
+ uint32 TextID = 0;
+ };
+
+ class QueryNPCTextResponse final : public ServerPacket
+ {
+ public:
+ QueryNPCTextResponse() : ServerPacket(SMSG_NPC_TEXT_UPDATE, 73) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 TextID = 0;
+ bool Allow = false;
+ float Probabilities[MAX_GOSSIP_TEXT_OPTIONS];
+ uint32 BroadcastTextID[MAX_GOSSIP_TEXT_OPTIONS];
+ };
+
+ struct DBQueryRecord
+ {
+ ObjectGuid GUID;
+ uint32 RecordID;
+ };
+
+ class DBQueryBulk final : public ClientPacket
+ {
+ public:
+ DBQueryBulk(WorldPacket&& packet) : ClientPacket(CMSG_DB_QUERY_BULK, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 TableHash;
+ std::vector<DBQueryRecord> Queries;
+ };
+
+ class DBReply final : public ServerPacket
+ {
+ public:
+ DBReply() : ServerPacket(SMSG_DB_REPLY, 12) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 TableHash = 0;
+ uint32 Timestamp = 0;
+ int32 RecordID = 0;
+
+ // These are not sent directly
+ uint32 Locale = 0;
+ DB2StorageBase const* Data = nullptr;
+ };
}
}
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
new file mode 100644
index 00000000000..e20023d3dd2
--- /dev/null
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "QuestPackets.h"
+
+void WorldPackets::Quest::QuestGiverStatusQuery::Read()
+{
+ _worldPacket >> QuestGiverGUID;
+}
+
+WorldPacket const* WorldPackets::Quest::QuestGiverStatus::Write()
+{
+ _worldPacket << QuestGiver.Guid;
+ _worldPacket << QuestGiver.Status;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Quest::QuestGiverStatusMultiple::Write()
+{
+ _worldPacket << int32(QuestGiver.size());
+ for (QuestGiverInfo const& questGiver : QuestGiver)
+ {
+ _worldPacket << questGiver.Guid;
+ _worldPacket << questGiver.Status;
+ }
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
new file mode 100644
index 00000000000..12410380c3a
--- /dev/null
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef QuestPackets_h__
+#define QuestPackets_h__
+
+#include "Packet.h"
+#include "QuestDef.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets
+{
+ namespace Quest
+ {
+ class QuestGiverStatusQuery final : public ClientPacket
+ {
+ public:
+ QuestGiverStatusQuery(WorldPacket&& packet) : ClientPacket(CMSG_QUESTGIVER_STATUS_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid QuestGiverGUID;
+ };
+
+ // Empty packet, server replies with quest giver status of visible creatures
+ class QuestGiverStatusMultipleQuery final : public ClientPacket
+ {
+ public:
+ QuestGiverStatusMultipleQuery(WorldPacket&& packet) : ClientPacket(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ struct QuestGiverInfo
+ {
+ QuestGiverInfo() { }
+ QuestGiverInfo(ObjectGuid const& guid, uint32 status)
+ : Guid(guid), Status(status) { }
+
+ ObjectGuid Guid;
+ uint32 Status = DIALOG_STATUS_NONE;
+ };
+
+ class QuestGiverStatus final : public ServerPacket
+ {
+ public:
+ QuestGiverStatus() : ServerPacket(SMSG_QUESTGIVER_STATUS, 22) { }
+
+ WorldPacket const* Write() override;
+
+ QuestGiverInfo QuestGiver;
+ };
+
+ class QuestGiverStatusMultiple final : public ServerPacket
+ {
+ public:
+ QuestGiverStatusMultiple() : ServerPacket(SMSG_QUESTGIVER_STATUS_MULTIPLE, 24) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<QuestGiverInfo> QuestGiver;
+ };
+ }
+}
+
+#endif // QuestPackets_h__
diff --git a/src/server/game/Server/Packets/ReputationPackets.cpp b/src/server/game/Server/Packets/ReputationPackets.cpp
new file mode 100644
index 00000000000..4acecf851f4
--- /dev/null
+++ b/src/server/game/Server/Packets/ReputationPackets.cpp
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ReputationPackets.h"
+
+WorldPacket const* WorldPackets::Reputation::InitializeFactions::Write()
+{
+ for (uint16 i = 0; i < FactionCount; ++i)
+ {
+ _worldPacket << uint8(FactionFlags[i]);
+ _worldPacket << int32(FactionStandings[i]);
+ }
+
+ for (uint16 i = 0; i < FactionCount; ++i)
+ _worldPacket.WriteBit(FactionHasBonus[i]);
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h
new file mode 100644
index 00000000000..387ae9b0318
--- /dev/null
+++ b/src/server/game/Server/Packets/ReputationPackets.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "Packet.h"
+
+namespace WorldPackets
+{
+ namespace Reputation
+ {
+ static uint16 const FactionCount = 256;
+
+ class InitializeFactions final : public ServerPacket
+ {
+ public:
+ InitializeFactions() : ServerPacket(SMSG_INITIALIZE_FACTIONS, 1312)
+ {
+ for (uint16 i = 0; i < FactionCount; ++i)
+ {
+ FactionStandings[i] = 0;
+ FactionHasBonus[i] = false;
+ FactionFlags[i] = 0;
+ }
+ }
+
+ WorldPacket const* Write() override;
+
+ int32 FactionStandings[FactionCount];
+ bool FactionHasBonus[FactionCount]; ///< @todo: implement faction bonus
+ uint8 FactionFlags[FactionCount]; ///< @see enum FactionFlags
+ };
+ }
+}
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 9cf5bca318d..e56e73fb036 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -46,6 +46,43 @@ WorldPacket const* WorldPackets::Spell::SendKnownSpells::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Spell::UpdateActionButtons::Write()
+{
+ for (uint32 i = 0; i < MAX_ACTION_BUTTONS; ++i)
+ _worldPacket << ActionButtons[i];
+
+ _worldPacket << Reason;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Spell::SendUnlearnSpells::Write()
+{
+ _worldPacket << uint32(Spells.size());
+ for (uint32 spellId : Spells)
+ _worldPacket << uint32(spellId);
+
+ return &_worldPacket;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& spellCastLogData)
+{
+ data << spellCastLogData.Health;
+ data << spellCastLogData.AttackPower;
+ data << spellCastLogData.SpellPower;
+ data << int32(spellCastLogData.PowerData.size());
+ for (WorldPackets::Spell::SpellLogPowerData const& powerData : spellCastLogData.PowerData)
+ {
+ data << powerData.PowerType;
+ data << powerData.Amount;
+ }
+ data.WriteBit(false);
+ // data << float // Unk data if bit is true
+ data.FlushBits();
+
+ return data;
+}
+
WorldPacket const* WorldPackets::Spell::SendAuraUpdate::Write()
{
return &_worldPacket;
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index 15b13f66eba..8aee276021c 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -19,6 +19,7 @@
#define SpellPackets_h__
#include "Packet.h"
+#include "Player.h"
#include "SpellAuras.h"
namespace WorldPackets
@@ -55,6 +56,50 @@ namespace WorldPackets
std::vector<uint32> KnownSpells;
};
+ class UpdateActionButtons final : public ServerPacket
+ {
+ public:
+ UpdateActionButtons() : ServerPacket(SMSG_ACTION_BUTTONS, MAX_ACTION_BUTTONS * 8 + 1)
+ {
+ std::memset(ActionButtons, 0, sizeof(ActionButtons));
+ }
+
+ WorldPacket const* Write() override;
+
+ uint64 ActionButtons[MAX_ACTION_BUTTONS];
+ uint8 Reason = 0;
+ /*
+ Reason can be 0, 1, 2
+ 0 - Sends initial action buttons, client does not validate if we have the spell or not
+ 1 - Used used after spec swaps, client validates if a spell is known.
+ 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
+ */
+ };
+
+ class SendUnlearnSpells final : public ServerPacket
+ {
+ public:
+ SendUnlearnSpells() : ServerPacket(SMSG_SEND_UNLEARN_SPELLS, 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<uint32> Spells;
+ };
+
+ struct SpellLogPowerData
+ {
+ int32 PowerType = 0;
+ int32 Amount = 0;
+ };
+
+ struct SpellCastLogData
+ {
+ int32 Health = 0;
+ int32 AttackPower = 0;
+ int32 SpellPower = 0;
+ std::vector<SpellLogPowerData> PowerData;
+ };
+
class SendAuraUpdate final : public ServerPacket
{
public:
@@ -63,8 +108,10 @@ namespace WorldPackets
WorldPacket const* Write() override;
void Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count);
void BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level);
- };
+ };
}
}
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& spellCastLogData);
+
#endif // SpellPackets_h__
diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp
index 7c8ecce3db7..4a7be4ed591 100644
--- a/src/server/game/Server/Packets/SystemPackets.cpp
+++ b/src/server/game/Server/Packets/SystemPackets.cpp
@@ -43,22 +43,22 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
if (EuropaTicketSystemStatus.HasValue)
{
- _worldPacket.WriteBit(EuropaTicketSystemStatus.value.UnkBit0);
- _worldPacket.WriteBit(EuropaTicketSystemStatus.value.UnkBit1);
- _worldPacket.WriteBit(EuropaTicketSystemStatus.value.TicketSystemEnabled);
- _worldPacket.WriteBit(EuropaTicketSystemStatus.value.SubmitBugEnabled);
-
- _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.MaxTries);
- _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.PerMilliseconds);
- _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.TryCount);
- _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.LastResetTimeBeforeNow);
+ _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.UnkBit0);
+ _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.UnkBit1);
+ _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.TicketSystemEnabled);
+ _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.SubmitBugEnabled);
+
+ _worldPacket << uint32(EuropaTicketSystemStatus.Value.ThrottleState.MaxTries);
+ _worldPacket << uint32(EuropaTicketSystemStatus.Value.ThrottleState.PerMilliseconds);
+ _worldPacket << uint32(EuropaTicketSystemStatus.Value.ThrottleState.TryCount);
+ _worldPacket << uint32(EuropaTicketSystemStatus.Value.ThrottleState.LastResetTimeBeforeNow);
}
if (SessionAlert.HasValue)
{
- _worldPacket << int32(SessionAlert.value.Delay);
- _worldPacket << int32(SessionAlert.value.Period);
- _worldPacket << int32(SessionAlert.value.DisplayTime);
+ _worldPacket << int32(SessionAlert.Value.Delay);
+ _worldPacket << int32(SessionAlert.Value.Period);
+ _worldPacket << int32(SessionAlert.Value.DisplayTime);
}
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp
index 3410fb273f7..4855f663662 100644
--- a/src/server/game/Server/Packets/TalentPackets.cpp
+++ b/src/server/game/Server/Packets/TalentPackets.cpp
@@ -36,3 +36,8 @@ WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write()
return &_worldPacket;
}
+
+void WorldPackets::Talent::SetSpecialization::Read()
+{
+ _worldPacket >> SpecGroupIndex;
+}
diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h
index c756c6962bb..21753e22c8d 100644
--- a/src/server/game/Server/Packets/TalentPackets.h
+++ b/src/server/game/Server/Packets/TalentPackets.h
@@ -20,7 +20,6 @@
#include "Packet.h"
#include "Player.h"
-#include <vector>
namespace WorldPackets
{
@@ -48,6 +47,16 @@ namespace WorldPackets
TalentInfoUpdate Info;
};
+
+ class SetSpecialization final : public ClientPacket
+ {
+ public:
+ SetSpecialization(WorldPacket&& packet) : ClientPacket(CMSG_SET_SPECIALIZATION, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 SpecGroupIndex = 0;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 4711bf4f306..1ca8938b4eb 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -19,11 +19,19 @@
#include "Opcodes.h"
#include "WorldSession.h"
#include "Packets/CharacterPackets.h"
+#include "Packets/ChannelPackets.h"
+#include "Packets/ChatPackets.h"
+#include "Packets/ClientConfigPackets.h"
+#include "Packets/CombatPackets.h"
+#include "Packets/EquipmentSetPackets.h"
#include "Packets/GuildPackets.h"
-#include "Packets/TradePackets.h"
#include "Packets/MiscPackets.h"
-#include "Packets/QueryPackets.h"
#include "Packets/MovementPackets.h"
+#include "Packets/NPCPackets.h"
+#include "Packets/QueryPackets.h"
+#include "Packets/QuestPackets.h"
+#include "Packets/TalentPackets.h"
+#include "Packets/TradePackets.h"
template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)>
class PacketHandler : public OpcodeHandler
@@ -132,8 +140,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_ARENA_TEAM_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamQueryOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ARENA_TEAM_REMOVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamRemoveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ARENA_TEAM_ROSTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamRosterOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ATTACKSTOP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleAttackStopOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ATTACKSWING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleAttackSwingOpcode );
+ DEFINE_HANDLER(CMSG_ATTACKSTOP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackStop, &WorldSession::HandleAttackStopOpcode);
+ DEFINE_HANDLER(CMSG_ATTACKSWING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackSwing, &WorldSession::HandleAttackSwingOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionHelloOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListBidderItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListItems );
@@ -151,7 +159,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutostoreLootItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTO_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDeclineGuildInvites );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BANKER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBankerActivateOpcode );
+ DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse );
@@ -167,9 +175,12 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_RATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_GET_PRODUCT_LIST_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_GET_PURCHASE_LIST_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_DELETE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BEGIN_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BINDER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBinderActivateOpcode );
+ DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBugOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUYBACK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuybackItem );
@@ -205,10 +216,10 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_BAN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_DISPLAY_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery );
+ DEFINE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelInvite );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_KICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelKick );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelList );
+ DEFINE_HANDLER(CMSG_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATOR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelModerator );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MUTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelMute );
@@ -228,7 +239,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CreateChar, &WorldSession::HandleCharCreateOpcode);
DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode);
DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::DeleteChar, &WorldSession::HandleCharDeleteOpcode);
- DEFINE_HANDLER(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharEnumOpcode );
+ DEFINE_HANDLER(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharEnumOpcode);
DEFINE_HANDLER(CMSG_CHAR_RACE_OR_FACTION_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharRaceOrFactionChange, &WorldSession::HandleCharRaceOrFactionChangeOpcode);
DEFINE_HANDLER(CMSG_CHAR_RENAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_UNDELETE_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteEnumOpcode );
@@ -254,7 +265,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseMapPositionQuery );
DEFINE_HANDLER(CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryCreature, &WorldSession::HandleCreatureQuery);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DANCE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_DB_QUERY_BULK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::DBQueryBulk, &WorldSession::HandleDBQueryBulk);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -269,7 +280,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLETAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_SAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave );
+ DEFINE_HANDLER(CMSG_EQUIPMENT_SET_SAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave);
DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse );
DEFINE_OPCODE_HANDLER_OLD(CMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode );
@@ -288,7 +299,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_SYSTEMSTATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketSystemStatusOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_UPDATETEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_REPORT_LAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportLag );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GOSSIP_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipHelloOpcode );
+ DEFINE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GOSSIP_SELECT_OPTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipSelectOptionOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GRANT_LEVEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGrantLevel );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupAssistantLeaderOpcode);
@@ -354,12 +365,12 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefundInfoRequest );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel );
+ DEFINE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::JoinChannel, &WorldSession::HandleJoinChannel);
DEFINE_OPCODE_HANDLER_OLD(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalents );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsPet );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel );
+ DEFINE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::LeaveChannel, &WorldSession::HandleLeaveChannel);
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode );
@@ -379,7 +390,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_POST_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderPostRequest );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LIST_INVENTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListInventoryOpcode );
+ DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode);
DEFINE_HANDLER(CMSG_LOAD_SCREEN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::LoadingScreenNotify, &WorldSession::HandleLoadScreenOpcode);
DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode);
DEFINE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutRequest, &WorldSession::HandleLogoutRequestOpcode);
@@ -397,25 +408,23 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_OFFICER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_DND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_OFFICER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_RAID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_SAY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_YELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode );
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessageWhisper, &WorldSession::HandleChatAddonMessageWhisperOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageAFK, &WorldSession::HandleChatMessageAFKOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageChannel, &WorldSession::HandleChatMessageChannelOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_DND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageDND, &WorldSession::HandleChatMessageDNDOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageEmote, &WorldSession::HandleChatMessageEmoteOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageWhisper, &WorldSession::HandleChatMessageWhisperOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIGAME_MOVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode );
@@ -465,19 +474,20 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TELEPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WORLDPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
- DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::QueryPlayerName, &WorldSession::HandleNameQueryOpcode);
+ DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode);
+ DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_NPC_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNpcTextQueryOpcode );
+ DEFINE_HANDLER(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_RESCUED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOfferPetitionOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_PAGE_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePageTextQueryOpcode );
+ DEFINE_HANDLER(CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandlePageTextQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_SILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNSILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_BUY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionBuyOpcode );
@@ -517,8 +527,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverHelloOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQueryQuestOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverRequestRewardOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverStatusMultipleQuery);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleQuestgiverStatusQueryOpcode);
+ DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery);
+ DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogRemoveQuest );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_NPC_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery );
@@ -531,15 +541,15 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_NAME_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_SPLIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_RECLAIM_CORPSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_RECRUIT_A_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REFORGE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleReforgeItemOpcode );
DEFINE_HANDLER(CMSG_REORDER_CHARACTERS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::ReorderCharacters, &WorldSession::HandleReorderCharacters);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REPAIR_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRepairItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REPOP_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_PVP_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_ACCOUNT_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData );
+ DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::RequestAccountData, &WorldSession::HandleRequestAccountData);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CEMETERY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_HOTFIX, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestHotfix );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode );
@@ -584,9 +594,9 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SELECTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode );
+ DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TITLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTitleOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TRADE_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -614,26 +624,24 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXINODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXIQUERYAVAILABLENODES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TEXT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTextEmoteOpcode );
+ DEFINE_HANDLER(CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleTimeSyncResp );
+ DEFINE_HANDLER(CMSG_TIME_SYNC_RESP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResp);
DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TOGGLE_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TOTEM_DESTROYED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_BUY_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerBuySpellOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode );
+ DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_CLEAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_FLAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_RESET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset );
+ DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode );
DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_ACCOUNT_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData );
+ DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition );
DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -649,7 +657,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_WARGAME_START, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WHO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WHOIS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoisOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ZONEUPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleZoneUpdateOpcode );
@@ -657,8 +665,6 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(MSG_INSPECT_ARENA_TEAMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectArenaTeamsOpcode );
DEFINE_OPCODE_HANDLER_OLD(MSG_LIST_STABLED_PETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode );
DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -689,13 +695,15 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MESSAGE, STATUS_UNHANDLED);
@@ -709,9 +717,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_QUERY_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_ROSTER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_STATS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKERSTATEUPDATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTART, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTOP, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKERSTATEUPDATE, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTART, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTOP, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_BADFACING, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_CANT_ATTACK, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_DEADTARGET, STATUS_UNHANDLED);
@@ -721,7 +729,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_RESULT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_LIST_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_NOTIFICATION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REMOVED_NOTIFICATION, STATUS_UNHANDLED);
@@ -753,6 +761,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED);
@@ -760,7 +769,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_NAME_QUERY_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDPOINTUPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDPOINTUPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDZONEREPLY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED);
@@ -791,9 +800,11 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_START, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED);
@@ -819,6 +830,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PARTY_INFO, STATUS_UNHANDLED);
@@ -850,7 +862,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAMAGE_CALC_LOG, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_QUERY_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_RUNE_REGEN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED);
@@ -862,6 +874,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNTRESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DROP_NEW_CONNECTION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_UNHANDLED);
@@ -873,12 +886,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUMP_RIDE_TICKETS_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ECHO_PARTY_SQUELCH, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_USE_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED);
@@ -896,8 +909,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_SET_VEHICLE_REC_ID, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORGE_MASTER_SET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_PAGETEXT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_RESET_STATE, STATUS_UNHANDLED);
@@ -905,7 +920,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_SET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED);
@@ -916,10 +932,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_UPDATETEXT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUPACTION_THROTTLED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_CANCEL, STATUS_UNHANDLED);
@@ -945,8 +963,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT_2, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DATA, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED);
@@ -977,10 +997,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP_GAIN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_INFO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_CURRENCY, STATUS_UNHANDLED);
@@ -989,12 +1009,13 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULTS_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_TALENT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_LOCK_WARNING_QUERY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET_FAILED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_SAVE_CREATED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_DANCE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ADD_PASSIVE, STATUS_UNHANDLED);
@@ -1034,9 +1055,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST_UPDATED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIST_INVENTORY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIST_INVENTORY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER);
@@ -1057,9 +1078,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED);
@@ -1068,7 +1090,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONEY_NOTIFY, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE_TRANSPORT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTRESULT, STATUS_UNHANDLED);
@@ -1099,6 +1121,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED);
@@ -1107,30 +1130,30 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD_ABORT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFICATION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DANCE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTYKILLLOG, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS, STATUS_UNHANDLED);
@@ -1193,8 +1216,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_INVALID, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_LIST, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_KILL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_PVP_KILL, STATUS_UNHANDLED);
@@ -1225,6 +1248,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFORGE_RESULT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED);
@@ -1242,13 +1266,17 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_INFO_RESPONSE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED);
@@ -1256,13 +1284,14 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED);
@@ -1300,20 +1329,20 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_ANIM, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FEATHER_FALL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLYING, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_HOVER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_LAND_WALK, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_NORMAL_FALL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_MODE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_TURN_RATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_MODE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WATER_WALK, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_START_SWIM, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_STOP_SWIM, STATUS_UNHANDLED);
@@ -1322,6 +1351,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED);
@@ -1334,16 +1364,16 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_ERROR, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INFO, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INFO, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TAXINODE_STATUS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEST_DROP_RATE_RESULT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOGGLE_XP_GAIN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_UNHANDLED);
@@ -1351,19 +1381,18 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS_EXTENDED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_SUCCEEDED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_HEALTH_FREQUENT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_SPELLCAST_START, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_COMBO_POINTS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CURRENCY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, STATUS_UNHANDLED);
@@ -1373,6 +1402,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED);
@@ -1400,8 +1430,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE_UPDATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHOIS, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_UNHANDLED);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index be7f810eb6f..9a7c8ed8ae3 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -78,35 +78,38 @@ enum OpcodeClient : uint32
CMSG_AUCTION_SELL_ITEM = 0xBADD,
CMSG_AUTH_CONTINUED_SESSION = 0x0485,
CMSG_AUTH_SESSION = 0x0487,
- CMSG_AUTOBANK_ITEM = 0xBADD,
+ CMSG_AUTOBANK_ITEM = 0x0751,
CMSG_AUTOEQUIP_GROUND_ITEM = 0xBADD,
- CMSG_AUTOEQUIP_ITEM = 0xBADD,
+ CMSG_AUTOEQUIP_ITEM = 0x0F35,
CMSG_AUTOEQUIP_ITEM_SLOT = 0xBADD,
- CMSG_AUTOSTORE_BAG_ITEM = 0xBADD,
- CMSG_AUTOSTORE_BANK_ITEM = 0xBADD,
+ CMSG_AUTOSTORE_BAG_ITEM = 0x0F18,
+ CMSG_AUTOSTORE_BANK_ITEM = 0x0732,
CMSG_AUTOSTORE_GROUND_ITEM = 0xBADD,
- CMSG_AUTOSTORE_LOOT_ITEM = 0xBADD,
+ CMSG_AUTOSTORE_LOOT_ITEM = 0x0609,
CMSG_AUTO_DECLINE_GUILD_INVITE = 0xBADD,
CMSG_AUTO_DECLINE_GUILD_INVITES = 0xBADD,
CMSG_BANKER_ACTIVATE = 0x1B24,
CMSG_BATTLEFIELD_JOIN = 0xBADD,
CMSG_BATTLEFIELD_LEAVE = 0xBADD,
CMSG_BATTLEFIELD_LIST = 0x03B1,
- CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE = 0xBADD,
- CMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0xBADD,
- CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE = 0xBADD,
+ CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE = 0x059A,
+ CMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0x1381,
+ CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE = 0x122A,
CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST = 0xBADD,
- CMSG_BATTLEFIELD_PORT = 0xBADD,
+ CMSG_BATTLEFIELD_PORT = 0x11EB,
CMSG_BATTLEFIELD_REQUEST_SCORE_DATA = 0xBADD,
CMSG_BATTLEFIELD_STATUS = 0xBADD,
CMSG_BATTLEGROUND_PLAYER_POSITIONS = 0xBADD,
- CMSG_BATTLEMASTER_JOIN = 0xBADD,
- CMSG_BATTLEMASTER_JOIN_ARENA = 0xBADD,
+ CMSG_BATTLEMASTER_JOIN = 0x0D2E,
+ CMSG_BATTLEMASTER_JOIN_ARENA = 0x0DAE,
CMSG_BATTLEMASTER_JOIN_RATED = 0xBADD,
CMSG_BATTLEMASTER_HELLO = 0xBADD,
CMSG_BATTLE_PAY_GET_PRODUCT_LIST_QUERY = 0x1389,
CMSG_BATTLE_PAY_GET_PURCHASE_LIST_QUERY = 0x120C,
+ CMSG_BATTLE_PET_DELETE_PET = 0x07B9,
+ CMSG_BATTLE_PET_MODIFY_NAME = 0x03A9,
CMSG_BATTLE_PET_NAME_QUERY = 0x041C,
+ CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x120B,
CMSG_BEGIN_TRADE = 0xBADD,
CMSG_BINDER_ACTIVATE = 0x02F3,
CMSG_BOT_DETECTED2 = 0xBADD,
@@ -146,10 +149,10 @@ enum OpcodeClient : uint32
CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD,
CMSG_CHANNEL_ANNOUNCEMENTS = 0xBADD,
CMSG_CHANNEL_BAN = 0xBADD,
- CMSG_CHANNEL_DISPLAY_LIST = 0xBADD,
+ CMSG_CHANNEL_DISPLAY_LIST = 0x093B,
CMSG_CHANNEL_INVITE = 0xBADD,
CMSG_CHANNEL_KICK = 0xBADD,
- CMSG_CHANNEL_LIST = 0xBADD,
+ CMSG_CHANNEL_LIST = 0x093B,
CMSG_CHANNEL_MODERATE = 0xBADD,
CMSG_CHANNEL_MODERATOR = 0xBADD,
CMSG_CHANNEL_MUTE = 0xBADD,
@@ -190,7 +193,7 @@ enum OpcodeClient : uint32
CMSG_COMPLAIN = 0xBADD,
CMSG_COMPLETE_CINEMATIC = 0xBADD,
CMSG_COMPLETE_MOVIE = 0xBADD,
- CMSG_CONNECT_TO_FAILED = 0xBADD,
+ CMSG_CONNECT_TO_FAILED = 0x0135,
CMSG_CONTACT_LIST = 0xBADD,
CMSG_CORPSE_MAP_POSITION_QUERY = 0xBADD,
CMSG_CREATURE_QUERY = 0x0505,
@@ -277,7 +280,7 @@ enum OpcodeClient : uint32
CMSG_GUILD_EVENT_LOG_QUERY = 0xBADD,
CMSG_GUILD_INFO = 0xBADD,
CMSG_GUILD_INFO_TEXT = 0xBADD,
- CMSG_GUILD_INVITE = 0xBADD,
+ CMSG_GUILD_INVITE = 0x19A4,
CMSG_GUILD_LEAVE = 0xBADD,
CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0xBADD,
CMSG_GUILD_MOTD = 0xBADD,
@@ -312,7 +315,7 @@ enum OpcodeClient : uint32
CMSG_LEARN_PREVIEW_TALENTS = 0xBADD,
CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD,
CMSG_LEARN_TALENT = 0xBADD,
- CMSG_LEAVE_CHANNEL = 0xBADD,
+ CMSG_LEAVE_CHANNEL = 0x19F2,
CMSG_LFG_GET_STATUS = 0xBADD,
CMSG_LFG_JOIN = 0xBADD,
CMSG_LFG_LEAVE = 0xBADD,
@@ -332,7 +335,7 @@ enum OpcodeClient : uint32
CMSG_LF_GUILD_POST_REQUEST = 0xBADD,
CMSG_LF_GUILD_REMOVE_RECRUIT = 0xBADD,
CMSG_LF_GUILD_SET_GUILD_POST = 0xBADD,
- CMSG_LIST_INVENTORY = 0xBADD,
+ CMSG_LIST_INVENTORY = 0x0B39,
CMSG_LOAD_SCREEN = 0x0B08,
CMSG_LOGOUT_CANCEL = 0x03C2,
CMSG_LOGOUT_REQUEST = 0x1911,
@@ -344,29 +347,27 @@ enum OpcodeClient : uint32
CMSG_LOOT_MONEY = 0xBADD,
CMSG_LOOT_RELEASE = 0xBADD,
CMSG_LOOT_ROLL = 0xBADD,
- CMSG_MAIL_CREATE_TEXT_ITEM = 0xBADD,
- CMSG_MAIL_DELETE = 0xBADD,
+ CMSG_MAIL_CREATE_TEXT_ITEM = 0x13D1,
+ CMSG_MAIL_DELETE = 0x068C,
CMSG_MAIL_MARK_AS_READ = 0xBADD,
CMSG_MAIL_RETURN_TO_SENDER = 0xBADD,
CMSG_MAIL_TAKE_ITEM = 0xBADD,
CMSG_MAIL_TAKE_MONEY = 0xBADD,
CMSG_MEETINGSTONE_INFO = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_BATTLEGROUND = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_GUILD = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_OFFICER = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_PARTY = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_RAID = 0xBADD,
- CMSG_MESSAGECHAT_ADDON_WHISPER = 0xBADD,
+ CMSG_MESSAGECHAT_ADDON_GUILD = 0x137C,
+ CMSG_MESSAGECHAT_ADDON_OFFICER = 0x188A,
+ CMSG_MESSAGECHAT_ADDON_PARTY = 0x015C,
+ CMSG_MESSAGECHAT_ADDON_RAID = 0x082C,
+ CMSG_MESSAGECHAT_ADDON_WHISPER = 0x18A2,
CMSG_MESSAGECHAT_AFK = 0x1BDC,
- CMSG_MESSAGECHAT_BATTLEGROUND = 0xBADD,
CMSG_MESSAGECHAT_CHANNEL = 0x0913,
CMSG_MESSAGECHAT_DND = 0x0AAB,
CMSG_MESSAGECHAT_EMOTE = 0x113C,
CMSG_MESSAGECHAT_GUILD = 0x0B1B,
- CMSG_MESSAGECHAT_OFFICER = 0xBADD,
+ CMSG_MESSAGECHAT_OFFICER = 0x0114,
CMSG_MESSAGECHAT_PARTY = 0x0134,
- CMSG_MESSAGECHAT_RAID = 0xBADD,
- CMSG_MESSAGECHAT_RAID_WARNING = 0xBADD,
+ CMSG_MESSAGECHAT_RAID = 0x0B33,
+ CMSG_MESSAGECHAT_RAID_WARNING = 0x0313,
CMSG_MESSAGECHAT_SAY = 0x1884,
CMSG_MESSAGECHAT_WHISPER = 0x1829,
CMSG_MESSAGECHAT_YELL = 0x1161,
@@ -423,6 +424,7 @@ enum OpcodeClient : uint32
CMSG_MOVE_STOP_STRAFE = 0x01D1,
CMSG_MOVE_STOP_SWIM = 0x097C,
CMSG_MOVE_STOP_TURN = 0x0964,
+ CMSG_MOVE_TELEPORT_ACK = 0x0D01,
CMSG_MOVE_TIME_SKIPPED = 0x19C2,
CMSG_MOVE_TOGGLE_COLLISION_ACK = 0xBADD,
CMSG_MOVE_WATER_WALK_ACK = 0xBADD,
@@ -457,7 +459,7 @@ enum OpcodeClient : uint32
CMSG_PET_SPELL_AUTOCAST = 0xBADD,
CMSG_PET_STOP_ATTACK = 0xBADD,
CMSG_PING = 0x0416,
- CMSG_PLAYED_TIME = 0xBADD,
+ CMSG_PLAYED_TIME = 0x1BB2,
CMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD,
CMSG_PLAYER_LOGIN = 0x0B1D,
CMSG_PLAYER_LOGOUT = 0xBADD,
@@ -483,7 +485,7 @@ enum OpcodeClient : uint32
CMSG_QUESTGIVER_QUEST_AUTOLAUNCH = 0xBADD,
CMSG_QUESTGIVER_REQUEST_REWARD = 0xBADD,
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x0131,
- CMSG_QUESTGIVER_STATUS_QUERY = 0x0704,
+ CMSG_QUESTGIVER_STATUS_QUERY = 0x01E2,
CMSG_QUESTLOG_REMOVE_QUEST = 0xBADD,
CMSG_QUESTLOG_SWAP_QUEST = 0xBADD,
CMSG_QUEST_CONFIRM_ACCEPT = 0xBADD,
@@ -497,6 +499,7 @@ enum OpcodeClient : uint32
CMSG_REALM_NAME_QUERY = 0x1189,
CMSG_REALM_SPLIT = 0xBADD,
CMSG_RECLAIM_CORPSE = 0xBADD,
+ CMSG_RECRUIT_A_FRIEND = 0x07BA,
CMSG_REFORGE_ITEM = 0xBADD,
CMSG_REORDER_CHARACTERS = 0x0DAA,
CMSG_REPAIR_ITEM = 0x0B54,
@@ -505,8 +508,7 @@ enum OpcodeClient : uint32
CMSG_REPORT_PVP_AFK = 0xBADD,
CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E,
CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD,
- CMSG_REQUEST_CEMETERY_LIST = 0xBADD,
- CMSG_REQUEST_HOTFIX = 0xBADD,
+ CMSG_REQUEST_CEMETERY_LIST = 0x10A2,
CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0xBADD,
CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD,
CMSG_REQUEST_PET_INFO = 0xBADD,
@@ -540,7 +542,7 @@ enum OpcodeClient : uint32
CMSG_SET_ACTIONBAR_TOGGLES = 0xBADD,
CMSG_SET_ACTION_BUTTON = 0x0599,
CMSG_SET_ACTIVE_MOVER = 0xBADD,
- CMSG_SET_ACTIVE_VOICE_CHANNEL = 0xBADD,
+ CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x031E,
CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xBADD,
CMSG_SET_ALLOW_LOW_LEVEL_RAID2 = 0xBADD,
CMSG_SET_CHANNEL_WATCH = 0xBADD,
@@ -605,9 +607,7 @@ enum OpcodeClient : uint32
CMSG_TRANSMOGRIFY_ITEMS = 0x0A85,
CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD,
CMSG_TURN_IN_PETITION = 0xBADD,
- CMSG_TUTORIAL_CLEAR = 0xBADD,
- CMSG_TUTORIAL_FLAG = 0xBADD,
- CMSG_TUTORIAL_RESET = 0xBADD,
+ CMSG_TUTORIAL_FLAG = 0x0B16,
CMSG_UNACCEPT_TRADE = 0xBADD,
CMSG_UNDELETE_CHARACTER = 0x0D99,
CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9,
@@ -620,7 +620,7 @@ enum OpcodeClient : uint32
CMSG_USED_FOLLOW = 0xBADD,
CMSG_USE_ITEM = 0x08B6,
CMSG_VIOLENCE_LEVEL = 0x098D,
- CMSG_VOICE_SESSION_ENABLE = 0xBADD,
+ CMSG_VOICE_SESSION_ENABLE = 0x1102,
CMSG_VOID_STORAGE_QUERY = 0x019E,
CMSG_VOID_STORAGE_TRANSFER = 0x0463,
CMSG_VOID_STORAGE_UNLOCK = 0x13BB,
@@ -630,7 +630,7 @@ enum OpcodeClient : uint32
CMSG_WARGAME_START = 0xBADD,
CMSG_WHO = 0x1322,
CMSG_WHOIS = 0xBADD,
- CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0xBADD,
+ CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x0302,
CMSG_WORLD_TELEPORT = 0xBADD,
CMSG_WRAP_ITEM = 0xBADD,
CMSG_ZONEUPDATE = 0xBADD,
@@ -650,8 +650,6 @@ enum OpcodeClient : uint32
MSG_MOVE_SET_SWIM_SPEED_CHEAT = 0xBADD,
MSG_MOVE_SET_TURN_RATE_CHEAT = 0xBADD,
MSG_MOVE_SET_WALK_SPEED_CHEAT = 0xBADD,
- MSG_MOVE_TELEPORT = 0xBADD,
- MSG_MOVE_TELEPORT_ACK = 0xBADD,
MSG_MOVE_TELEPORT_CHEAT = 0xBADD,
MSG_MOVE_TIME_SKIPPED = 0xBADD,
MSG_MOVE_TOGGLE_COLLISION_CHEAT = 0xBADD,
@@ -684,12 +682,14 @@ enum OpcodeServer : uint32
SMSG_ACCOUNT_INFO_RESPONSE = 0xBADD,
SMSG_ACCOUNT_MOUNT_UPDATE = 0x0140,
SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD,
+ SMSG_ACCOUNT_TOYS_UPDATE = 0x0590,
SMSG_ACHIEVEMENT_DELETED = 0xBADD,
SMSG_ACHIEVEMENT_EARNED = 0xBADD,
SMSG_ACTION_BUTTONS = 0x1D1F,
SMSG_ACTIVATETAXIREPLY = 0xBADD,
SMSG_ADDON_INFO = 0x1D9F,
SMSG_ADD_RUNE_POWER = 0xBADD,
+ SMSG_ADJUST_SPLINE_DURATION = 0x0104,
SMSG_AI_REACTION = 0x0BA1,
SMSG_ALL_ACHIEVEMENT_DATA = 0xBADD,
SMSG_ALL_ACHIEVEMENT_DATA_ACCOUNT = 0x0123,
@@ -718,16 +718,16 @@ enum OpcodeServer : uint32
SMSG_AUCTION_COMMAND_RESULT = 0x0B2D,
SMSG_AUCTION_HELLO = 0x011F,
SMSG_AUCTION_LIST_PENDING_SALES = 0xBADD,
- SMSG_AUCTION_LIST_RESULT = 0x19D2,
+ SMSG_AUCTION_LIST_ITEMS_RESULT = 0x0BA4,
SMSG_AUCTION_OWNER_LIST_RESULT = 0xBADD,
SMSG_AUCTION_OWNER_NOTIFICATION = 0xBADD,
SMSG_AUCTION_REMOVED_NOTIFICATION = 0xBADD,
SMSG_AURACASTLOG = 0xBADD,
- SMSG_AURA_POINTS_DEPLETED = 0xBADD,
+ SMSG_AURA_POINTS_DEPLETED = 0x093B,
SMSG_AURA_UPDATE = 0x091C,
SMSG_AUTH_CHALLENGE = 0x1759,
SMSG_AUTH_RESPONSE = 0x0DA9,
- SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD,
+ SMSG_AVAILABLE_VOICE_CHANNEL = 0x04D4,
SMSG_AVERAGE_ITEM_LEVEL_INFORM = 0xBADD,
SMSG_BARBER_SHOP_RESULT = 0xBADD,
SMSG_BATTLEFIELD_LIST = 0xBADD,
@@ -751,6 +751,7 @@ enum OpcodeServer : uint32
SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD,
SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD,
SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD,
+ SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BE3,
SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0F2A,
SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x12A4,
SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x168A,
@@ -785,16 +786,17 @@ enum OpcodeServer : uint32
SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD,
SMSG_CALENDAR_SEND_CALENDAR = 0xBADD,
SMSG_CALENDAR_SEND_EVENT = 0xBADD,
- SMSG_CALENDAR_SEND_NUM_PENDING = 0xBADD,
+ SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A,
SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD,
SMSG_CAMERA_SHAKE = 0xBADD,
SMSG_CANCEL_AUTO_REPEAT = 0xBADD,
SMSG_CANCEL_COMBAT = 0xBADD,
- SMSG_CAST_FAILED = 0xBADD,
- SMSG_CHANNEL_LIST = 0xBADD,
+ SMSG_CAST_FAILED = 0x1A89,
+ SMSG_CHANNEL_LIST = 0x1411,
SMSG_CHANNEL_MEMBER_COUNT = 0xBADD,
SMSG_CHANNEL_NOTIFY = 0x0643,
SMSG_CHANNEL_NOTIFY_JOINED = 0x1602,
+ SMSG_CHANNEL_NOTIFY_LEFT = 0x1452,
SMSG_CHANNEL_START = 0x016C,
SMSG_CHANNEL_UPDATE = 0x19DB,
SMSG_CHARACTER_LOGIN_FAILED = 0xBADD,
@@ -822,6 +824,7 @@ enum OpcodeServer : uint32
SMSG_CLEAR_TARGET = 0xBADD,
SMSG_CLIENTCACHE_VERSION = 0x080D,
SMSG_CLIENT_CONTROL_UPDATE = 0xBADD,
+ SMSG_COIN_REMOVED = 0x0D30,
SMSG_COMBAT_EVENT_FAILED = 0xBADD,
SMSG_COMBAT_LOG_MULTIPLE = 0xBADD,
SMSG_COMMENTATOR_MAP_INFO = 0xBADD,
@@ -836,7 +839,7 @@ enum OpcodeServer : uint32
SMSG_COMSAT_CONNECT_FAIL = 0xBADD,
SMSG_COMSAT_DISCONNECT = 0xBADD,
SMSG_COMSAT_RECONNECT_TRY = 0xBADD,
- SMSG_CONTACT_LIST = 0xBADD,
+ SMSG_CONTACT_LIST = 0x0210,
SMSG_CONTACT_STATUS = 0x1BEA,
SMSG_CONVERT_RUNE = 0xBADD,
SMSG_COOLDOWN_CHEAT = 0xBADD,
@@ -870,6 +873,7 @@ enum OpcodeServer : uint32
SMSG_DISMOUNTRESULT = 0xBADD,
SMSG_DISPEL_FAILED = 0xBADD,
SMSG_DISPLAY_GAME_ERROR = 0xBADD,
+ SMSG_DISPLAY_PROMOTION = 0x151D,
SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0xBADD,
SMSG_DROP_NEW_CONNECTION = 0xBADD,
SMSG_DUEL_COMPLETE = 0xBADD,
@@ -905,8 +909,10 @@ enum OpcodeServer : uint32
SMSG_FORCE_SET_VEHICLE_REC_ID = 0xBADD,
SMSG_FORGE_MASTER_SET = 0xBADD,
SMSG_FRIEND_STATUS = 0xBADD,
- SMSG_GAMEOBJECT_CUSTOM_ANIM = 0xBADD,
+ SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT = 0x038C,
+ SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x03EB,
SMSG_GAMEOBJECT_DESPAWN_ANIM = 0xBADD,
+ SMSG_GAMEOBJECT_DESPAWN = 0x0D29,
SMSG_GAMEOBJECT_PAGETEXT = 0xBADD,
SMSG_GAMEOBJECT_QUERY_RESPONSE = 0xBADD,
SMSG_GAMEOBJECT_RESET_STATE = 0xBADD,
@@ -914,7 +920,8 @@ enum OpcodeServer : uint32
SMSG_GAMETIME_SET = 0xBADD,
SMSG_GAMETIME_UPDATE = 0xBADD,
SMSG_GAME_EVENT_DEBUG_LOG = 0xBADD,
- SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0xBADD,
+ SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0952,
+ SMSG_GARRISON_REMOTE_INFO = 0x0151,
SMSG_GMRESPONSE_DB_ERROR = 0xBADD,
SMSG_GMRESPONSE_RECEIVED = 0xBADD,
SMSG_GMRESPONSE_STATUS_UPDATE = 0xBADD,
@@ -925,7 +932,9 @@ enum OpcodeServer : uint32
SMSG_GMTICKET_UPDATETEXT = 0xBADD,
SMSG_GM_MESSAGECHAT = 0xBADD,
SMSG_GM_PLAYER_INFO = 0xBADD,
+ SMSG_GM_TICKET_CASE_STATUS = 0x1D8D,
SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD,
+ SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229,
SMSG_GODMODE = 0xBADD,
SMSG_GOSSIP_COMPLETE = 0x15D1,
SMSG_GOSSIP_MESSAGE = 0x1746,
@@ -934,7 +943,7 @@ enum OpcodeServer : uint32
SMSG_GROUP_CANCEL = 0xBADD,
SMSG_GROUP_DECLINE = 0xBADD,
SMSG_GROUP_DESTROYED = 0xBADD,
- SMSG_GROUP_INVITE = 0xBADD,
+ SMSG_GROUP_INVITE = 0x0920,
SMSG_GROUP_LIST = 0x15BE,
SMSG_GROUP_SET_LEADER = 0xBADD,
SMSG_GROUP_SET_ROLE = 0xBADD,
@@ -955,8 +964,10 @@ enum OpcodeServer : uint32
SMSG_GUILD_COMMAND_RESULT_2 = 0xBADD,
SMSG_GUILD_CRITERIA_DATA = 0xBADD,
SMSG_GUILD_CRITERIA_DELETED = 0xBADD,
+ SMSG_GUILD_CRITERIA_UPDATE = 0x1208,
SMSG_GUILD_DECLINE = 0xBADD,
SMSG_GUILD_EVENT = 0x1027,
+ SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1077,
SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD,
SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228,
SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD,
@@ -983,7 +994,7 @@ enum OpcodeServer : uint32
SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD,
SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD,
SMSG_GUILD_RESET = 0xBADD,
- SMSG_GUILD_REWARDS_LIST = 0xBADD,
+ SMSG_GUILD_REWARDS_LIST = 0x1818,
SMSG_GUILD_ROSTER = 0x1026,
SMSG_GUILD_SET_NOTE = 0xBADD,
SMSG_GUILD_TRADESKILL_UPDATE = 0xBADD,
@@ -1007,12 +1018,13 @@ enum OpcodeServer : uint32
SMSG_INSPECT_RATED_BG_STATS = 0xBADD,
SMSG_INSPECT_RESULTS_UPDATE = 0xBADD,
SMSG_INSPECT_TALENT = 0xBADD,
+ SMSG_INSTANCE_INFO = 0x0DA0,
SMSG_INSTANCE_LOCK_WARNING_QUERY = 0xBADD,
SMSG_INSTANCE_RESET = 0xBADD,
SMSG_INSTANCE_RESET_FAILED = 0xBADD,
SMSG_INSTANCE_SAVE_CREATED = 0xBADD,
SMSG_INVALIDATE_DANCE = 0xBADD,
- SMSG_INVALIDATE_PLAYER = 0xBADD,
+ SMSG_INVALIDATE_PLAYER = 0x0B37,
SMSG_INVALID_PROMOTION_CODE = 0xBADD,
SMSG_INVENTORY_CHANGE_FAILURE = 0xBADD,
SMSG_ITEM_ADD_PASSIVE = 0xBADD,
@@ -1078,6 +1090,7 @@ enum OpcodeServer : uint32
SMSG_LOOT_SLOT_CHANGED = 0xBADD,
SMSG_LOOT_START_ROLL = 0xBADD,
SMSG_MAIL_LIST_RESULT = 0x0B3F,
+ SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x153D,
SMSG_MAP_OBJ_EVENTS = 0xBADD,
SMSG_MEETINGSTONE_COMPLETE = 0xBADD,
SMSG_MEETINGSTONE_IN_PROGRESS = 0xBADD,
@@ -1092,7 +1105,7 @@ enum OpcodeServer : uint32
SMSG_MISSILE_CANCEL = 0xBADD,
SMSG_MODIFY_COOLDOWN = 0xBADD,
SMSG_MONEY_NOTIFY = 0xBADD,
- SMSG_MONSTER_MOVE = 0xBADD,
+ SMSG_MONSTER_MOVE = 0x0994,
SMSG_MONSTER_MOVE_TRANSPORT = 0xBADD,
SMSG_MOTD = 0x0442,
SMSG_MOUNTRESULT = 0xBADD,
@@ -1125,6 +1138,7 @@ enum OpcodeServer : uint32
SMSG_MOVE_SET_VEHICLE_REC_ID = 0xBADD,
SMSG_MOVE_SET_WALK_IN_AIR = 0xBADD,
SMSG_MOVE_SET_WALK_SPEED = 0xBADD,
+ SMSG_MOVE_TELEPORT = 0x03A6,
SMSG_MOVE_UNROOT = 0xBADD,
SMSG_MOVE_UNSET_CAN_FLY = 0xBADD,
SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD,
@@ -1134,14 +1148,14 @@ enum OpcodeServer : uint32
SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0xBADD,
SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0xBADD,
SMSG_MOVE_UPDATE_KNOCK_BACK = 0xBADD,
- SMSG_MOVE_UPDATE_PITCH_RATE = 0xBADD,
- SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0xBADD,
- SMSG_MOVE_UPDATE_RUN_SPEED = 0xBADD,
- SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0xBADD,
- SMSG_MOVE_UPDATE_SWIM_SPEED = 0xBADD,
+ SMSG_MOVE_UPDATE_PITCH_RATE = 0x13D9,
+ SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x09DE,
+ SMSG_MOVE_UPDATE_RUN_SPEED = 0x09AD,
+ SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x1083,
+ SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0B95,
SMSG_MOVE_UPDATE_TELEPORT = 0x03D5,
- SMSG_MOVE_UPDATE_TURN_RATE = 0xBADD,
- SMSG_MOVE_UPDATE_WALK_SPEED = 0xBADD,
+ SMSG_MOVE_UPDATE_TURN_RATE = 0x08BE,
+ SMSG_MOVE_UPDATE_WALK_SPEED = 0x01E5,
SMSG_MOVE_WATER_WALK = 0xBADD,
SMSG_MULTIPLE_PACKETS = 0xBADD,
SMSG_NAME_QUERY_RESPONSE = 0x0828,
@@ -1162,7 +1176,7 @@ enum OpcodeServer : uint32
SMSG_PAGE_TEXT_QUERY_RESPONSE = 0x05A0,
SMSG_PARTYKILLLOG = 0xBADD,
SMSG_PARTY_COMMAND_RESULT = 0xBADD,
- SMSG_PARTY_MEMBER_STATS = 0xBADD,
+ SMSG_PARTY_MEMBER_STATS = 0x1729,
SMSG_PARTY_MEMBER_STATS_FULL = 0xBADD,
SMSG_PAUSE_MIRROR_TIMER = 0xBADD,
SMSG_PERIODICAURALOG = 0x0B1B,
@@ -1201,7 +1215,7 @@ enum OpcodeServer : uint32
SMSG_PLAY_OBJECT_SOUND = 0xBADD,
SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0xBADD,
SMSG_PLAY_SOUND = 0x02D2,
- SMSG_PLAY_SPELL_VISUAL = 0xBADD,
+ SMSG_PLAY_SPELL_VISUAL = 0x1A84,
SMSG_PLAY_SPELL_VISUAL_KIT = 0x0171,
SMSG_PLAY_TIME_WARNING = 0xBADD,
SMSG_PONG = 0x17CA,
@@ -1216,7 +1230,7 @@ enum OpcodeServer : uint32
SMSG_PVP_SEASON = 0x09E3,
SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0xBADD,
SMSG_QUERY_TIME_RESPONSE = 0x1DB0,
- SMSG_QUESTGIVER_OFFER_REWARD = 0xBADD,
+ SMSG_QUESTGIVER_OFFER_REWARD = 0x17B2,
SMSG_QUESTGIVER_QUEST_COMPLETE = 0x1773,
SMSG_QUESTGIVER_QUEST_DETAILS = 0x15B3,
SMSG_QUESTGIVER_QUEST_FAILED = 0xBADD,
@@ -1227,7 +1241,7 @@ enum OpcodeServer : uint32
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x17C6,
SMSG_QUESTLOG_FULL = 0xBADD,
SMSG_QUESTUPDATE_ADD_ITEM = 0xBADD,
- SMSG_QUESTUPDATE_ADD_KILL = 0xBADD,
+ SMSG_QUESTUPDATE_ADD_KILL = 0x1515,
SMSG_QUESTUPDATE_ADD_PVP_KILL = 0xBADD,
SMSG_QUESTUPDATE_COMPLETE = 0xBADD,
SMSG_QUESTUPDATE_FAILED = 0xBADD,
@@ -1256,9 +1270,10 @@ enum OpcodeServer : uint32
SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD,
SMSG_REFER_A_FRIEND_FAILURE = 0xBADD,
SMSG_REFORGE_RESULT = 0xBADD,
+ SMSG_REFRESH_SPELL_HISTORY = 0x0A2A,
SMSG_REMOVED_SPELL = 0xBADD,
SMSG_REPORT_PVP_AFK_RESULT = 0xBADD,
- SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0xBADD,
+ SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x059E,
SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD,
SMSG_RESEARCH_COMPLETE = 0xBADD,
SMSG_RESEARCH_SETUP_HISTORY = 0x0A25,
@@ -1274,20 +1289,25 @@ enum OpcodeServer : uint32
SMSG_RWHOIS = 0xBADD,
SMSG_SELL_ITEM = 0xBADD,
SMSG_SEND_MAIL_RESULT = 0x0302,
- SMSG_SEND_UNLEARN_SPELLS = 0x1A82,
+ SMSG_SEND_SPELL_CHARGES = 0x1A82,
+ SMSG_SEND_SPELL_HISTORY = 0x1933,
+ SMSG_SEND_UNLEARN_SPELLS = 0x0BCB,
SMSG_SERVERTIME = 0xBADD,
SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD,
SMSG_SERVER_INFO_RESPONSE = 0xBADD,
SMSG_SERVER_MESSAGE = 0x0683,
SMSG_SERVER_PERF = 0xBADD,
- SMSG_SET_AI_ANIM_KIT = 0xBADD,
+ SMSG_SET_AI_ANIM_KIT = 0x0335,
+ SMSG_SET_ALL_TASK_PROGRESS = 0x1B52,
+ SMSG_SET_CURRENCY = 0x17BE,
SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD,
SMSG_SET_FACTION_ATWAR = 0xBADD,
SMSG_SET_FACTION_NOT_VISIBLE = 0xBADD,
SMSG_SET_FACTION_STANDING = 0xBADD,
- SMSG_SET_FACTION_VISIBLE = 0xBADD,
+ SMSG_SET_FACTION_VISIBLE = 0x138B,
SMSG_SET_FLAT_SPELL_MODIFIER = 0x1884,
SMSG_SET_FORCED_REACTIONS = 0x09A9,
+ SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1489,
SMSG_SET_MELEE_ANIM_KIT = 0xBADD,
SMSG_SET_MOVEMENT_ANIM_KIT = 0xBADD,
SMSG_SET_PCT_SPELL_MODIFIER = 0x113C,
@@ -1319,8 +1339,8 @@ enum OpcodeServer : uint32
SMSG_SPELL_CATEGORY_COOLDOWN = 0x082A,
SMSG_SPELL_COOLDOWN = 0xBADD,
SMSG_SPELL_DELAYED = 0xBADD,
- SMSG_SPELL_FAILED_OTHER = 0xBADD,
- SMSG_SPELL_FAILURE = 0xBADD,
+ SMSG_SPELL_FAILED_OTHER = 0x1A03,
+ SMSG_SPELL_FAILURE = 0x11DB,
SMSG_SPELL_GO = 0x1161,
SMSG_SPELL_START = 0x0803,
SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x0374,
@@ -1356,6 +1376,7 @@ enum OpcodeServer : uint32
SMSG_SPLINE_MOVE_WATER_WALK = 0xBADD,
SMSG_STABLE_RESULT = 0xBADD,
SMSG_STANDSTATE_UPDATE = 0x1311,
+ SMSG_START_ELAPSED_TIMERS = 0x093F,
SMSG_START_MIRROR_TIMER = 0xBADD,
SMSG_START_TIMER = 0xBADD,
SMSG_STOP_DANCE = 0xBADD,
@@ -1370,11 +1391,11 @@ enum OpcodeServer : uint32
SMSG_TALENTS_ERROR = 0xBADD,
SMSG_TALENTS_INFO = 0x012D,
SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD,
- SMSG_TAXINODE_STATUS = 0xBADD,
+ SMSG_TAXINODE_STATUS = 0x0338,
SMSG_TEST_DROP_RATE_RESULT = 0xBADD,
SMSG_TEXT_EMOTE = 0x0383,
SMSG_THREAT_CLEAR = 0xBADD,
- SMSG_THREAT_REMOVE = 0xBADD,
+ SMSG_THREAT_REMOVE = 0x0F3D,
SMSG_THREAT_UPDATE = 0x03A9,
SMSG_TIME_ADJUSTMENT = 0xBADD,
SMSG_TIME_SYNC_REQ = 0x03B1,
@@ -1386,7 +1407,7 @@ enum OpcodeServer : uint32
SMSG_TRAINER_BUY_FAILED = 0xBADD,
SMSG_TRAINER_BUY_SUCCEEDED = 0xBADD,
SMSG_TRAINER_LIST = 0x0BA9,
- SMSG_TRANSFER_ABORTED = 0xBADD,
+ SMSG_TRANSFER_ABORTED = 0x03C2,
SMSG_TRANSFER_PENDING = 0x172A,
SMSG_TRIGGER_CINEMATIC = 0xBADD,
SMSG_TRIGGER_MOVIE = 0xBADD,
@@ -1397,7 +1418,6 @@ enum OpcodeServer : uint32
SMSG_UNIT_HEALTH_FREQUENT = 0xBADD,
SMSG_UNIT_SPELLCAST_START = 0xBADD,
SMSG_UPDATE_ACCOUNT_DATA = 0x1520,
- SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0xBADD,
SMSG_UPDATE_COMBO_POINTS = 0xBADD,
SMSG_UPDATE_CURRENCY = 0xBADD,
SMSG_UPDATE_CURRENCY_WEEK_LIMIT = 0xBADD,
@@ -1407,6 +1427,7 @@ enum OpcodeServer : uint32
SMSG_UPDATE_LAST_INSTANCE = 0xBADD,
SMSG_UPDATE_OBJECT = 0x122C,
SMSG_UPDATE_SERVER_PLAYER_POSITION = 0xBADD,
+ SMSG_UPDATE_TASK_PROGRESS = 0x1209,
SMSG_UPDATE_WORLD_STATE = 0x03EC,
SMSG_USERLIST_ADD = 0xBADD,
SMSG_USERLIST_REMOVE = 0xBADD,
@@ -1414,7 +1435,7 @@ enum OpcodeServer : uint32
SMSG_VOICESESSION_FULL = 0xBADD,
SMSG_VOICE_CHAT_STATUS = 0xBADD,
SMSG_VOICE_PARENTAL_CONTROLS = 0xBADD,
- SMSG_VOICE_SESSION_LEAVE = 0xBADD,
+ SMSG_VOICE_SESSION_LEAVE = 0x0403,
SMSG_VOICE_SESSION_ROSTER_UPDATE = 0xBADD,
SMSG_VOICE_SET_TALKER_MUTED = 0xBADD,
SMSG_VOID_ITEM_SWAP_RESPONSE = 0x1131,
@@ -1422,8 +1443,8 @@ enum OpcodeServer : uint32
SMSG_VOID_STORAGE_FAILED = 0xBADD,
SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x0321,
SMSG_VOID_TRANSFER_RESULT = 0x0539,
- SMSG_WAIT_QUEUE_FINISH = 0xBADD,
- SMSG_WAIT_QUEUE_UPDATE = 0xBADD,
+ SMSG_WAIT_QUEUE_FINISH = 0x198A,
+ SMSG_WAIT_QUEUE_UPDATE = 0x00D4,
SMSG_WARDEN_DATA = 0x0BEC,
SMSG_WARGAME_CHECK_ENTRY = 0xBADD,
SMSG_WARGAME_REQUEST_SENT = 0xBADD,
@@ -1435,7 +1456,7 @@ enum OpcodeServer : uint32
SMSG_WHO = 0x0601,
SMSG_WHOIS = 0xBADD,
SMSG_WORLD_SERVER_INFO = 0x11AC,
- SMSG_WORLD_STATE_UI_TIMER_UPDATE = 0xBADD,
+ SMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x0B83,
SMSG_XP_GAIN_ABORTED = 0xBADD,
SMSG_ZONE_UNDER_ATTACK = 0x1401
};
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 4dcd2430642..12ba71c4423 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -50,6 +50,7 @@
#include "BattlenetServerManager.h"
#include "CharacterPackets.h"
#include "ClientConfigPackets.h"
+#include "MiscPackets.h"
namespace {
@@ -120,7 +121,7 @@ WorldSession::WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr
m_sessionDbLocaleIndex(locale),
m_latency(0),
m_clientTimeDelay(0),
- m_TutorialsChanged(false),
+ _tutorialsChanged(false),
_filterAddonMessages(false),
recruiterId(recruiter),
isRecruiter(isARecruiter),
@@ -129,7 +130,7 @@ WorldSession::WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr
forceExit(false),
m_currentBankerGUID()
{
- memset(m_Tutorials, 0, sizeof(m_Tutorials));
+ memset(_tutorials, 0, sizeof(_tutorials));
if (sock)
{
@@ -694,7 +695,7 @@ void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask)
{
for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i)
if (mask & (1 << i))
- m_accountData[i] = AccountData();
+ _accountData[i] = AccountData();
if (!result)
return;
@@ -717,20 +718,20 @@ void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask)
continue;
}
- m_accountData[type].Time = time_t(fields[1].GetUInt32());
- m_accountData[type].Data = fields[2].GetString();
+ _accountData[type].Time = time_t(fields[1].GetUInt32());
+ _accountData[type].Data = fields[2].GetString();
}
while (result->NextRow());
}
-void WorldSession::SetAccountData(AccountDataType type, time_t tm, std::string const& data)
+void WorldSession::SetAccountData(AccountDataType type, uint32 time, std::string const& data)
{
if ((1 << type) & GLOBAL_CACHE_MASK)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_ACCOUNT_DATA);
stmt->setUInt32(0, GetAccountId());
stmt->setUInt8(1, type);
- stmt->setUInt32(2, uint32(tm));
+ stmt->setUInt32(2, time);
stmt->setString(3, data);
CharacterDatabase.Execute(stmt);
}
@@ -743,39 +744,38 @@ void WorldSession::SetAccountData(AccountDataType type, time_t tm, std::string c
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PLAYER_ACCOUNT_DATA);
stmt->setUInt64(0, m_GUIDLow);
stmt->setUInt8(1, type);
- stmt->setUInt32(2, uint32(tm));
+ stmt->setUInt32(2, time);
stmt->setString(3, data);
CharacterDatabase.Execute(stmt);
}
- m_accountData[type].Time = tm;
- m_accountData[type].Data = data;
+ _accountData[type].Time = time_t(time);
+ _accountData[type].Data = data;
}
void WorldSession::LoadTutorialsData()
{
- memset(m_Tutorials, 0, sizeof(uint32) * MAX_ACCOUNT_TUTORIAL_VALUES);
+ memset(_tutorials, 0, sizeof(uint32) * MAX_ACCOUNT_TUTORIAL_VALUES);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_TUTORIALS);
stmt->setUInt32(0, GetAccountId());
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
- m_Tutorials[i] = (*result)[i].GetUInt32();
+ _tutorials[i] = (*result)[i].GetUInt32();
- m_TutorialsChanged = false;
+ _tutorialsChanged = false;
}
void WorldSession::SendTutorialsData()
{
- WorldPacket data(SMSG_TUTORIAL_FLAGS, 4 * MAX_ACCOUNT_TUTORIAL_VALUES);
- for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
- data << m_Tutorials[i];
- SendPacket(&data);
+ WorldPackets::Misc::TutorialFlags packet;
+ memcpy(packet.TutorialData, _tutorials, sizeof(_tutorials));
+ SendPacket(packet.Write());
}
-void WorldSession::SaveTutorialsData(SQLTransaction &trans)
+void WorldSession::SaveTutorialsData(SQLTransaction& trans)
{
- if (!m_TutorialsChanged)
+ if (!_tutorialsChanged)
return;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_HAS_TUTORIALS);
@@ -784,11 +784,11 @@ void WorldSession::SaveTutorialsData(SQLTransaction &trans)
// Modify data in DB
stmt = CharacterDatabase.GetPreparedStatement(hasTutorials ? CHAR_UPD_TUTORIALS : CHAR_INS_TUTORIALS);
for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
- stmt->setUInt32(i, m_Tutorials[i]);
+ stmt->setUInt32(i, _tutorials[i]);
stmt->setUInt32(MAX_ACCOUNT_TUTORIAL_VALUES, GetAccountId());
trans->Append(stmt);
- m_TutorialsChanged = false;
+ _tutorialsChanged = false;
}
void WorldSession::ReadAddonsInfo(ByteBuffer& data)
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 5b5cde1bc63..baeace23b40 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -94,7 +94,43 @@ namespace WorldPackets
class LogoutRequest;
class LogoutCancel;
class LoadingScreenNotify;
- class QueryPlayerName;
+ }
+
+ namespace ClientConfig
+ {
+ class RequestAccountData;
+ class UserClientUpdateAccountData;
+ }
+
+ namespace Channel
+ {
+ class ChannelListRequest;
+ class JoinChannel;
+ class LeaveChannel;
+ }
+
+ namespace Chat
+ {
+ class ChatMessage;
+ class ChatMessageWhisper;
+ class ChatMessageChannel;
+ class ChatAddonMessage;
+ class ChatAddonMessageWhisper;
+ class ChatMessageAFK;
+ class ChatMessageDND;
+ class ChatMessageEmote;
+ class CTextEmote;
+ }
+
+ namespace Combat
+ {
+ class AttackSwing;
+ class AttackStop;
+ }
+
+ namespace EquipmentSet
+ {
+ class SaveEquipmentSet;
}
namespace Guild
@@ -102,6 +138,11 @@ namespace WorldPackets
class QueryGuildInfo;
}
+ namespace Talent
+ {
+ class SetSpecialization;
+ }
+
namespace Trade
{
class CancelTrade;
@@ -109,17 +150,36 @@ namespace WorldPackets
namespace Misc
{
+ class SetSelection;
class ViolenceLevel;
+ class TimeSyncResponse;
+ class TutorialSetFlag;
+ }
+
+ namespace NPC
+ {
+ class Hello;
}
namespace Query
{
class QueryCreature;
+ class QueryPlayerName;
+ class QueryPageText;
+ class QueryNPCText;
+ class DBQueryBulk;
+ }
+
+ namespace Quest
+ {
+ class QuestGiverStatusQuery;
+ class QuestGiverStatusMultipleQuery;
}
namespace Movement
{
class ClientPlayerMovement;
+ class WorldPortAck;
}
}
@@ -142,11 +202,44 @@ enum AccountDataType
#define REGISTERED_ADDON_PREFIX_SOFTCAP 64
-struct AccountData
+enum TutorialAction
+{
+ TUTORIAL_ACTION_UPDATE = 0,
+ TUTORIAL_ACTION_CLEAR = 1,
+ TUTORIAL_ACTION_RESET = 2
+};
+
+/*
+enum Tutorials
{
- AccountData() : Time(0), Data("") { }
+ TUTORIAL_TALENT = 0,
+ TUTORIAL_SPEC = 1,
+ TUTORIAL_GLYPH = 2,
+ TUTORIAL_SPELLBOOK = 3,
+ TUTORIAL_PROFESSIONS = 4,
+ TUTORIAL_CORE_ABILITITES = 5,
+ TUTORIAL_PET_JOURNAL = 6,
+ TUTORIAL_WHAT_HAS_CHANGED = 7,
+ TUTORIAL_GARRISON_BUILDING = 8,
+ TUTORIAL_GARRISON_MISSION_LIST = 9,
+ TUTORIAL_GARRISON_MISSION_PAGE = 10,
+ TUTORIAL_GARRISON_LANDING = 11,
+ TUTORIAL_GARRISON_ZONE_ABILITY = 12,
+ TUTORIAL_WORLD_MAP_FRAME = 13,
+ TUTORIAL_CLEAN_UP_BAGS = 14,
+ TUTORIAL_BAG_SETTINGS = 15,
+ TUTORIAL_REAGENT_BANK_UNLOCK = 16,
+ TUTORIAL_TOYBOX_FAVORITE = 17,
+ TUTORIAL_TOYBOX_MOUSEWHEEL_PAGING = 18,
+ TUTORIAL_LFG_LIST = 19
+};
+*/
+
+#define MAX_ACCOUNT_TUTORIAL_VALUES 8
- time_t Time;
+struct AccountData
+{
+ time_t Time = 0;
std::string Data;
};
@@ -285,7 +378,9 @@ class WorldSession
AccountTypes GetSecurity() const { return _security; }
uint32 GetAccountId() const { return _accountId; }
+ ObjectGuid GetAccountGUID() const { return ObjectGuid::Create<HighGuid::WowAccount>(GetAccountId()); }
uint32 GetBattlenetAccountId() const { return _battlenetAccountId; }
+ ObjectGuid GetBattlenetAccountGUID() const { return ObjectGuid::Create<HighGuid::BNetAccount>(GetBattlenetAccountId()); }
Player* GetPlayer() const { return _player; }
std::string const& GetPlayerName() const;
std::string GetPlayerInfo() const;
@@ -360,21 +455,21 @@ class WorldSession
bool CheckStableMaster(ObjectGuid guid);
// Account Data
- AccountData* GetAccountData(AccountDataType type) { return &m_accountData[type]; }
- void SetAccountData(AccountDataType type, time_t tm, std::string const& data);
+ AccountData const* GetAccountData(AccountDataType type) const { return &_accountData[type]; }
+ void SetAccountData(AccountDataType type, uint32 time, std::string const& data);
void LoadGlobalAccountData();
void LoadAccountData(PreparedQueryResult result, uint32 mask);
void LoadTutorialsData();
void SendTutorialsData();
void SaveTutorialsData(SQLTransaction& trans);
- uint32 GetTutorialInt(uint8 index) const { return m_Tutorials[index]; }
+ uint32 GetTutorialInt(uint8 index) const { return _tutorials[index]; }
void SetTutorialInt(uint8 index, uint32 value)
{
- if (m_Tutorials[index] != value)
+ if (_tutorials[index] != value)
{
- m_Tutorials[index] = value;
- m_TutorialsChanged = true;
+ _tutorials[index] = value;
+ _tutorialsChanged = true;
}
}
//used with item_page table
@@ -558,7 +653,7 @@ class WorldSession
void HandleTogglePvP(WorldPacket& recvPacket);
void HandleZoneUpdateOpcode(WorldPacket& recvPacket);
- void HandleSetSelectionOpcode(WorldPacket& recvPacket);
+ void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet);
void HandleStandStateChangeOpcode(WorldPacket& recvPacket);
void HandleEmoteOpcode(WorldPacket& recvPacket);
void HandleContactListOpcode(WorldPacket& recvPacket);
@@ -578,23 +673,22 @@ class WorldSession
void HandleSetWatchedFactionOpcode(WorldPacket& recvData);
void HandleSetFactionInactiveOpcode(WorldPacket& recvData);
- void HandleUpdateAccountData(WorldPacket& recvPacket);
- void HandleRequestAccountData(WorldPacket& recvPacket);
+ void HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet);
+ void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request);
void HandleSetActionButtonOpcode(WorldPacket& recvPacket);
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
void HandleMeetingStoneInfo(WorldPacket& recPacket);
void HandleGameobjectReportUse(WorldPacket& recvPacket);
- void HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet);
-
+ void HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet);
void HandleQueryTimeOpcode(WorldPacket& recvPacket);
-
void HandleCreatureQuery(WorldPackets::Query::QueryCreature& packet);
+ void HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet);
void HandleGameObjectQueryOpcode(WorldPacket& recvPacket);
- void HandleMoveWorldportAckOpcode(WorldPacket& recvPacket);
+ void HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortAck& packet);
void HandleMoveWorldportAckOpcode(); // for server-side calls
void HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMovement& packet);
@@ -689,16 +783,16 @@ class WorldSession
void SendActivateTaxiReply(ActivateTaxiReply reply);
void HandleTabardVendorActivateOpcode(WorldPacket& recvPacket);
- void HandleBankerActivateOpcode(WorldPacket& recvPacket);
+ void HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet);
void HandleBuyBankSlotOpcode(WorldPacket& recvPacket);
- void HandleTrainerListOpcode(WorldPacket& recvPacket);
+ void HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet);
void HandleTrainerBuySpellOpcode(WorldPacket& recvPacket);
void HandlePetitionShowListOpcode(WorldPacket& recvPacket);
- void HandleGossipHelloOpcode(WorldPacket& recvPacket);
+ void HandleGossipHelloOpcode(WorldPackets::NPC::Hello& packet);
void HandleGossipSelectOptionOpcode(WorldPacket& recvPacket);
void HandleSpiritHealerActivateOpcode(WorldPacket& recvPacket);
- void HandleNpcTextQueryOpcode(WorldPacket& recvPacket);
- void HandleBinderActivateOpcode(WorldPacket& recvPacket);
+ void HandleNpcTextQueryOpcode(WorldPackets::Query::QueryNPCText& packet);
+ void HandleBinderActivateOpcode(WorldPackets::NPC::Hello& packet);
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
void HandleStablePet(WorldPacket& recvPacket);
void HandleStablePetCallback(PreparedQueryResult result);
@@ -753,7 +847,7 @@ class WorldSession
void HandleSellItemOpcode(WorldPacket& recvPacket);
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
void HandleBuyItemOpcode(WorldPacket& recvPacket);
- void HandleListInventoryOpcode(WorldPacket& recvPacket);
+ void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet);
void HandleAutoStoreBagItemOpcode(WorldPacket& recvPacket);
void HandleReadItem(WorldPacket& recvPacket);
void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket);
@@ -763,8 +857,8 @@ class WorldSession
void HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket);
void HandleWrapItemOpcode(WorldPacket& recvPacket);
- void HandleAttackSwingOpcode(WorldPacket& recvPacket);
- void HandleAttackStopOpcode(WorldPacket& recvPacket);
+ void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet);
+ void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet);
void HandleSetSheathedOpcode(WorldPacket& recvPacket);
void HandleUseItemOpcode(WorldPacket& recvPacket);
@@ -779,9 +873,10 @@ class WorldSession
void HandleLearnPreviewTalents(WorldPacket& recvPacket);
void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
+ void HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet);
- void HandleQuestgiverStatusQueryOpcode(WorldPacket& recvPacket);
- void HandleQuestgiverStatusMultipleQuery(WorldPacket& recvPacket);
+ void HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet);
+ void HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& packet);
void HandleQuestgiverHelloOpcode(WorldPacket& recvPacket);
void HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvPacket);
void HandleQuestgiverQueryQuestOpcode(WorldPacket& recvPacket);
@@ -797,13 +892,21 @@ class WorldSession
void HandlePushQuestToParty(WorldPacket& recvPacket);
void HandleQuestPushResult(WorldPacket& recvPacket);
- void HandleMessagechatOpcode(WorldPacket& recvPacket);
- void HandleAddonMessagechatOpcode(WorldPacket& recvPacket);
+ void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& packet);
+ void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& packet);
+ void HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& packet);
+ void HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, std::string target = "");
+ void HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& packet);
+ void HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatAddonMessageWhisper& packet);
+ void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target = "");
+ void HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& packet);
+ void HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& packet);
+ void HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& packet);
void SendPlayerNotFoundNotice(std::string const& name);
void SendPlayerAmbiguousNotice(std::string const& name);
void SendWrongFactionNotice();
void SendChatRestrictedNotice(ChatRestrictionType restriction);
- void HandleTextEmoteOpcode(WorldPacket& recvPacket);
+ void HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet);
void HandleChatIgnoredOpcode(WorldPacket& recvPacket);
void HandleUnregisterAddonPrefixesOpcode(WorldPacket& recvPacket);
@@ -815,9 +918,9 @@ class WorldSession
void HandleResurrectResponseOpcode(WorldPacket& recvPacket);
void HandleSummonResponseOpcode(WorldPacket& recvData);
- void HandleJoinChannel(WorldPacket& recvPacket);
- void HandleLeaveChannel(WorldPacket& recvPacket);
- void HandleChannelList(WorldPacket& recvPacket);
+ void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet);
+ void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet);
+ void HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet);
void HandleChannelPassword(WorldPacket& recvPacket);
void HandleChannelSetOwner(WorldPacket& recvPacket);
void HandleChannelOwner(WorldPacket& recvPacket);
@@ -832,18 +935,15 @@ class WorldSession
void HandleChannelAnnouncements(WorldPacket& recvPacket);
void HandleChannelModerate(WorldPacket& recvPacket);
void HandleChannelDeclineInvite(WorldPacket& recvPacket);
- void HandleChannelDisplayListQuery(WorldPacket& recvPacket);
void HandleGetChannelMemberCount(WorldPacket& recvPacket);
void HandleSetChannelWatch(WorldPacket& recvPacket);
void HandleCompleteCinematic(WorldPacket& recvPacket);
void HandleNextCinematicCamera(WorldPacket& recvPacket);
- void HandlePageTextQueryOpcode(WorldPacket& recvPacket);
+ void HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet);
- void HandleTutorialFlag (WorldPacket& recvData);
- void HandleTutorialClear(WorldPacket& recvData);
- void HandleTutorialReset(WorldPacket& recvData);
+ void HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet);
//Pet
void HandlePetAction(WorldPacket& recvData);
@@ -899,7 +999,7 @@ class WorldSession
void HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData);
void HandleSetTitleOpcode(WorldPacket& recvData);
void HandleRealmSplitOpcode(WorldPacket& recvData);
- void HandleTimeSyncResp(WorldPacket& recvData);
+ void HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet);
void HandleWhoisOpcode(WorldPacket& recvData);
void HandleResetInstancesOpcode(WorldPacket& recvData);
void HandleHearthAndResurrect(WorldPacket& recvData);
@@ -1028,7 +1128,7 @@ class WorldSession
void HandleRemoveGlyph(WorldPacket& recvData);
void HandleQueryInspectAchievements(WorldPacket& recvData);
void HandleGuildAchievementProgressQuery(WorldPacket& recvData);
- void HandleEquipmentSetSave(WorldPacket& recvData);
+ void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet);
void HandleEquipmentSetDelete(WorldPacket& recvData);
void HandleEquipmentSetUse(WorldPacket& recvData);
void HandleWorldStateUITimerUpdate(WorldPacket& recvData);
@@ -1038,7 +1138,6 @@ class WorldSession
void HandleEjectPassenger(WorldPacket& data);
void HandleEnterPlayerVehicle(WorldPacket& data);
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
- void HandleRequestHotfix(WorldPacket& recvPacket);
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);
void HandleViolenceLevel(WorldPackets::Misc::ViolenceLevel& violenceLevel);
void HandleObjectUpdateFailedOpcode(WorldPacket& recvPacket);
@@ -1147,9 +1246,9 @@ class WorldSession
LocaleConstant m_sessionDbLocaleIndex;
std::atomic<uint32> m_latency;
std::atomic<uint32> m_clientTimeDelay;
- AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
- uint32 m_Tutorials[MAX_ACCOUNT_TUTORIAL_VALUES];
- bool m_TutorialsChanged;
+ AccountData _accountData[NUM_ACCOUNT_DATA_TYPES];
+ uint32 _tutorials[MAX_ACCOUNT_TUTORIAL_VALUES];
+ bool _tutorialsChanged;
AddonsList m_addonsList;
std::vector<std::string> _registeredAddonPrefixes;
bool _filterAddonMessages;
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 5729cea131d..aa1426d5fd2 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -440,7 +440,6 @@ uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet)
return 0;
}
-
return bufferSize - _compressionStream->avail_out;
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 819af225fe4..6451111d0b8 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -273,6 +273,9 @@ Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMa
uint32 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
if (!effMask)
return NULL;
+
+ TC_LOG_ERROR("spells", "TryRefreshStackOrCreate spell %u tryEffMask %u effMask %u", spellproto->Id, tryEffMask, effMask);
+
if (Aura* foundAura = owner->ToUnit()->_TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID))
{
// we've here aura, which script triggered removal after modding stack amount
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index bd577af2b5a..65eb54122f9 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -5618,21 +5618,13 @@ void Spell::EffectBind(SpellEffIndex effIndex)
homeLoc = player->GetWorldLocation();
player->SetHomebind(homeLoc, areaId);
-
- // binding
- WorldPacket data(SMSG_BINDPOINTUPDATE, 4 + 4 + 4 + 4 + 4);
- data << float(homeLoc.GetPositionX());
- data << float(homeLoc.GetPositionY());
- data << float(homeLoc.GetPositionZ());
- data << uint32(homeLoc.GetMapId());
- data << uint32(areaId);
- player->SendDirectMessage(&data);
+ player->SendBindPointUpdate();
TC_LOG_DEBUG("spells", "EffectBind: New homebind X: %f, Y: %f, Z: %f, MapId: %u, AreaId: %u",
homeLoc.GetPositionX(), homeLoc.GetPositionY(), homeLoc.GetPositionZ(), homeLoc.GetMapId(), areaId);
// zone update
- data.Initialize(SMSG_PLAYERBOUND, 8 + 4);
+ WorldPacket data(SMSG_PLAYERBOUND, 8 + 4);
data << m_caster->GetGUID();
data << uint32(areaId);
player->SendDirectMessage(&data);
@@ -5709,4 +5701,4 @@ void Spell::EffectCreateAreaTrigger(SpellEffIndex effIndex)
AreaTrigger * areaTrigger = new AreaTrigger;
if (!areaTrigger->CreateAreaTrigger(sObjectMgr->GetGenerator<HighGuid::AreaTrigger>()->Generate(), triggerEntry, GetCaster(), GetSpellInfo(), pos))
delete areaTrigger;
-} \ No newline at end of file
+}
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index bcca2203cb8..85ad4a67d3f 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -358,6 +358,7 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con
MiscValue = _effect ? _effect->EffectMiscValue : 0;
MiscValueB = _effect ? _effect->EffectMiscValueB : 0;
Mechanic = Mechanics(_effect ? _effect->EffectMechanic : 0);
+ PositionFacing = _effect ? _effect->EffectPosFacing : 0.0f;
TargetA = SpellImplicitTargetInfo(_effect ? _effect->ImplicitTarget[0] : 0);
TargetB = SpellImplicitTargetInfo(_effect ? _effect->ImplicitTarget[1] : 0);
RadiusEntry = _effect && _effect->EffectRadiusIndex ? sSpellRadiusStore.LookupEntry(_effect->EffectRadiusIndex) : NULL;
@@ -511,19 +512,6 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
value = caster->ApplyEffectModifiers(_spellInfo, EffectIndex, value);
// amount multiplication based on caster's level
-/* REVIEW - MERGE <<<<<<< HEAD
- if (!_spellInfo->GetSpellScaling() && !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION && _spellInfo->SpellLevel) &&
- Effect != SPELL_EFFECT_WEAPON_PERCENT_DAMAGE &&
- Effect != SPELL_EFFECT_KNOCK_BACK &&
- Effect != SPELL_EFFECT_ADD_EXTRA_ATTACKS &&
- ApplyAuraName != SPELL_AURA_MOD_SPEED_ALWAYS &&
- ApplyAuraName != SPELL_AURA_MOD_SPEED_NOT_STACK &&
- ApplyAuraName != SPELL_AURA_MOD_INCREASE_SPEED &&
- ApplyAuraName != SPELL_AURA_MOD_DECREASE_SPEED)
- //there are many more: slow speed, -healing pct
- value *= 0.25f * exp(caster->getLevel() * (70 - _spellInfo->SpellLevel) / 1000.0f);
- //value = int32(value * (int32)getLevel() / (int32)(_spellInfo->spellLevel ? _spellInfo->spellLevel : 1));
-======= */
if (!caster->IsControlledByPlayer() &&
_spellInfo->SpellLevel && _spellInfo->SpellLevel != caster->getLevel() &&
!basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
@@ -574,7 +562,6 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
value *= casterScaler->ratio / spellScaler->ratio;
}
}
-// REVIEW - MERGE >>>>>>> master
}
return int32(value);
@@ -3104,4 +3091,4 @@ SpellEffectInfo const* SpellInfo::GetEffect(uint32 difficulty, uint32 index) con
return nullptr;
return effects[index];
-} \ No newline at end of file
+}
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 632f2ce639e..a49f956bc57 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -245,6 +245,7 @@ public:
int32 MiscValue;
int32 MiscValueB;
Mechanics Mechanic;
+ float PositionFacing;
SpellImplicitTargetInfo TargetA;
SpellImplicitTargetInfo TargetB;
SpellRadiusEntry const* RadiusEntry;
@@ -261,8 +262,8 @@ public:
SpellEffectInfo() : _spellInfo(NULL), EffectIndex(0), Effect(0), ApplyAuraName(0), ApplyAuraPeriod(0), DieSides(0),
RealPointsPerLevel(0), BasePoints(0), PointsPerResource(0), Amplitude(0), ChainAmplitude(0),
- BonusCoefficient(0), MiscValue(0), MiscValueB(0), Mechanic(MECHANIC_NONE), RadiusEntry(NULL), ChainTargets(0),
- ItemType(0), TriggerSpell(0), ImplicitTargetConditions(NULL) {}
+ BonusCoefficient(0), MiscValue(0), MiscValueB(0), Mechanic(MECHANIC_NONE), PositionFacing(0),
+ RadiusEntry(NULL), ChainTargets(0), ItemType(0), TriggerSpell(0), ImplicitTargetConditions(NULL) { }
SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect);
bool IsEffect() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 28ff52e4926..3211ff389e8 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1600,8 +1600,8 @@ void SpellMgr::LoadSpellTargetPositions()
mSpellTargetPositions.clear(); // need for reload case
- // 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.Query("SELECT id, effIndex, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM spell_target_position");
+ // 0 1 2 3 4 5
+ QueryResult result = WorldDatabase.Query("SELECT ID, EffectIndex, MapID, PositionX, PositionY, PositionZ FROM spell_target_position");
if (!result)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 spell target coordinates. DB table `spell_target_position` is empty.");
@@ -1622,36 +1622,46 @@ void SpellMgr::LoadSpellTargetPositions()
st.target_X = fields[3].GetFloat();
st.target_Y = fields[4].GetFloat();
st.target_Z = fields[5].GetFloat();
- st.target_Orientation = fields[6].GetFloat();
MapEntry const* mapEntry = sMapStore.LookupEntry(st.target_mapId);
if (!mapEntry)
{
- TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) target map (ID: %u) does not exist in `Map.dbc`.", Spell_ID, effIndex, st.target_mapId);
+ TC_LOG_ERROR("sql.sql", "Spell (ID: %u, EffectIndex: %u) is using a non-existant MapID (ID: %u).", Spell_ID, effIndex, st.target_mapId);
continue;
}
- if (st.target_X==0 && st.target_Y==0 && st.target_Z==0)
+ if (st.target_X == 0 && st.target_Y == 0 && st.target_Z == 0)
{
- TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) target coordinates not provided.", Spell_ID, effIndex);
+ TC_LOG_ERROR("sql.sql", "Spell (ID: %u, EffectIndex: %u): target coordinates not provided.", Spell_ID, effIndex);
continue;
}
SpellInfo const* spellInfo = GetSpellInfo(Spell_ID);
if (!spellInfo)
{
- TC_LOG_ERROR("sql.sql", "Spell (Id: %u) listed in `spell_target_position` does not exist.", Spell_ID);
+ TC_LOG_ERROR("sql.sql", "Spell (ID: %u) listed in `spell_target_position` does not exist.", Spell_ID);
continue;
}
SpellEffectInfo const* effect = spellInfo->GetEffect(effIndex);
-
if (!effect)
{
TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have an effect at index %u.", Spell_ID, effIndex, effIndex);
continue;
}
+ // target facing is in degrees for 6484 & 9268... (blizz sucks)
+ if (effect->PositionFacing > 2 * M_PI)
+ st.target_Orientation = effect->PositionFacing * M_PI / 180;
+ else
+ st.target_Orientation = effect->PositionFacing;
+
+ if (effect->TargetA.GetTarget() == TARGET_DEST_DB || effect->TargetB.GetTarget() == TARGET_DEST_DB)
+ {
+ TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have TARGET_DEST_DB as target at index %u.", Spell_ID, effIndex, effIndex);
+ continue;
+ }
+
if (effect->TargetA.GetTarget() == TARGET_DEST_DB || effect->TargetB.GetTarget() == TARGET_DEST_DB)
{
std::pair<uint32, SpellEffIndex> key = std::make_pair(Spell_ID, effIndex);
diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h
index 72f80bb07a3..a4834d555d3 100644
--- a/src/server/game/Texts/ChatTextBuilder.h
+++ b/src/server/game/Texts/ChatTextBuilder.h
@@ -20,6 +20,7 @@
#include "Chat.h"
#include "ObjectMgr.h"
+#include "Packets/ChatPackets.h"
namespace Trinity
{
@@ -32,13 +33,9 @@ namespace Trinity
void operator()(WorldPacket& data, LocaleConstant locale)
{
BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
- ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
- }
-
- size_t operator()(WorldPacket* data, LocaleConstant locale) const
- {
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
- return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
+ data = *packet.Write();
}
private:
@@ -57,7 +54,9 @@ namespace Trinity
void operator()(WorldPacket& data, LocaleConstant locale)
{
- ChatHandler::BuildChatPacket(data, _msgType, _language, _source, _target, _text, 0, "", locale);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, _msgType, _language, _source, _target, _text, 0, "", locale);
+ data = *packet.Write();
}
private:
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 77819b87ec0..07d0bd53629 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -24,6 +24,7 @@
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
#include "CreatureTextMgr.h"
+#include "ChatPackets.h"
class CreatureTextBuilder
{
@@ -31,11 +32,12 @@ class CreatureTextBuilder
CreatureTextBuilder(WorldObject const* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target)
: _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { }
- size_t operator()(WorldPacket* data, LocaleConstant locale) const
+ void operator()(WorldPacket& data, LocaleConstant locale) const
{
std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale);
-
- return ChatHandler::BuildChatPacket(*data, _msgType, Language(_language), _source, _target, text, 0, "", locale);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _source, _target, text, 0, "", locale);
+ data = *packet.Write();
}
private:
@@ -54,11 +56,12 @@ class PlayerTextBuilder
PlayerTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target)
: _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { }
- size_t operator()(WorldPacket* data, LocaleConstant locale) const
+ void operator()(WorldPacket& data, LocaleConstant locale) const
{
std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale);
-
- return ChatHandler::BuildChatPacket(*data, _msgType, Language(_language), _talker, _target, text, 0, "", locale);
+ WorldPackets::Chat::Chat packet;
+ return ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _talker, _target, text, 0, "", locale);
+ data = *packet.Write();
}
private:
diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h
index 06efadb1dc7..647d8249e68 100644
--- a/src/server/game/Texts/CreatureTextMgr.h
+++ b/src/server/game/Texts/CreatureTextMgr.h
@@ -24,6 +24,7 @@
#include "SharedDefines.h"
#include "Opcodes.h"
#include "Group.h"
+#include "Packets/ChatPackets.h"
enum CreatureTextRange
{
@@ -133,50 +134,38 @@ class CreatureTextLocalizer
~CreatureTextLocalizer()
{
for (size_t i = 0; i < _packetCache.size(); ++i)
- {
- if (_packetCache[i])
- delete _packetCache[i]->first;
delete _packetCache[i];
- }
}
void operator()(Player* player)
{
LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex();
- WorldPacket* messageTemplate;
- size_t whisperGUIDpos;
+ WorldPackets::Chat::Chat* messageTemplate;
// create if not cached yet
if (!_packetCache[loc_idx])
{
- messageTemplate = new WorldPacket();
- whisperGUIDpos = _builder(messageTemplate, loc_idx);
- ASSERT(messageTemplate->GetOpcode() != NULL_OPCODE);
- _packetCache[loc_idx] = new std::pair<WorldPacket*, size_t>(messageTemplate, whisperGUIDpos);
+ messageTemplate = new WorldPackets::Chat::Chat();
+ _packetCache[loc_idx] = messageTemplate;
}
else
- {
- messageTemplate = _packetCache[loc_idx]->first;
- whisperGUIDpos = _packetCache[loc_idx]->second;
- }
+ messageTemplate = _packetCache[loc_idx];
- WorldPacket data(*messageTemplate);
switch (_msgType)
{
case CHAT_MSG_MONSTER_WHISPER:
case CHAT_MSG_RAID_BOSS_WHISPER:
- // TODO: Fix this. GUIDs are now always written packed and can have different packed lengths
- //data.put<uint64>(whisperGUIDpos, player->GetGUID().GetRawValue());
+ messageTemplate->TargetGUID = player->GetGUID();
break;
default:
break;
}
- player->SendDirectMessage(&data);
+ player->SendDirectMessage(messageTemplate->Write());
}
private:
- std::vector<std::pair<WorldPacket*, size_t>* > _packetCache;
+ std::vector<WorldPackets::Chat::Chat*> _packetCache;
Builder const& _builder;
ChatMsg _msgType;
};
diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp
index 6f42d41c694..43d4374c544 100644
--- a/src/server/game/Tools/PlayerDump.cpp
+++ b/src/server/game/Tools/PlayerDump.cpp
@@ -519,10 +519,10 @@ DumpReturn PlayerDumpReader::LoadDump(std::string const& file, uint32 account, s
if (!changenth(line, 2, chraccount)) // characters.account update
ROLLBACK(DUMP_FILE_BROKEN);
- race = uint8(atol(getnth(line, 4).c_str()));
- playerClass = uint8(atol(getnth(line, 5).c_str()));
- gender = uint8(atol(getnth(line, 6).c_str()));
- level = uint8(atol(getnth(line, 7).c_str()));
+ race = uint8(atoul(getnth(line, 4).c_str()));
+ playerClass = uint8(atoul(getnth(line, 5).c_str()));
+ gender = uint8(atoul(getnth(line, 6).c_str()));
+ level = uint8(atoul(getnth(line, 7).c_str()));
if (name.empty())
{
// check if the original name already exists
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 098181c76a1..a9d12fd11f8 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -46,6 +46,7 @@
#include "LFGMgr.h"
#include "MapManager.h"
#include "Memory.h"
+#include "MiscPackets.h"
#include "MMapFactory.h"
#include "ObjectMgr.h"
#include "OutdoorPvPMgr.h"
@@ -64,6 +65,7 @@
#include "WaypointMovementGenerator.h"
#include "WeatherMgr.h"
#include "WorldSession.h"
+#include "ChatPackets.h"
#include <boost/algorithm/string.hpp>
@@ -2287,7 +2289,9 @@ namespace Trinity
while (char* line = lineFromMessage(pos))
{
WorldPacket* data = new WorldPacket();
- ChatHandler::BuildChatPacket(*data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ *data = *packet.Write();
data_list.push_back(data);
}
}
@@ -2345,16 +2349,15 @@ void World::SendGMText(uint32 string_id, ...)
/// DEPRECATED, only for debug purpose. Send a System Message to all players (except self if mentioned)
void World::SendGlobalText(const char* text, WorldSession* self)
{
- WorldPacket data;
-
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(text);
char* pos = buf;
while (char* line = ChatHandler::LineFromMessage(pos))
{
- ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- SendGlobalMessage(&data, self);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ SendGlobalMessage(packet.Write(), self);
}
free(buf);
@@ -2386,9 +2389,9 @@ bool World::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession
/// Send a System Message to all players in the zone (except self if mentioned)
void World::SendZoneText(uint32 zone, const char* text, WorldSession* self, uint32 team)
{
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, text);
- SendZoneMessage(zone, &data, self, team);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, text);
+ SendZoneMessage(zone, packet.Write(), self, team);
}
/// Kick (and save) all players
@@ -3305,9 +3308,9 @@ void World::UpdateCharacterInfo(ObjectGuid const& guid, std::string const& name,
if (race != RACE_NONE)
itr->second.Race = race;
- WorldPacket data(SMSG_INVALIDATE_PLAYER, 8);
- data << guid;
- SendGlobalMessage(&data);
+ WorldPackets::Misc::InvalidatePlayer data;
+ data.Guid = guid;
+ SendGlobalMessage(data.Write());
}
void World::UpdateCharacterInfoLevel(ObjectGuid const& guid, uint8 level)
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 0c37b1491c3..22a8fcb67f0 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -481,15 +481,15 @@ public:
char const* msg = "testtest";
uint8 type = atoi(args);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, ChatMsg(type), LANG_UNIVERSAL, handler->GetSession()->GetPlayer(), handler->GetSession()->GetPlayer(), msg, 0, "chan");
- handler->GetSession()->SendPacket(&data);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, ChatMsg(type), LANG_UNIVERSAL, handler->GetSession()->GetPlayer(), handler->GetSession()->GetPlayer(), msg, 0, "chan");
+ handler->GetSession()->SendPacket(packet.Write());
return true;
}
static bool HandleDebugSendQuestPartyMsgCommand(ChatHandler* handler, char const* args)
{
- uint32 msg = atol((char*)args);
+ uint32 msg = atoul(args);
handler->GetSession()->GetPlayer()->SendPushToPartyResponse(handler->GetSession()->GetPlayer(), msg);
return true;
}
@@ -508,7 +508,7 @@ public:
static bool HandleDebugSendQuestInvalidMsgCommand(ChatHandler* handler, char const* args)
{
- QuestFailedReason msg = static_cast<QuestFailedReason>(atol((char*)args));
+ QuestFailedReason msg = static_cast<QuestFailedReason>(atoul(args));
handler->GetSession()->GetPlayer()->SendCanTakeQuestResponse(msg);
return true;
}
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 5a00267d6aa..d802d5a496d 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -118,7 +118,7 @@ public:
if (!id)
return false;
- uint32 objectId = atol(id);
+ uint32 objectId = atoul(id);
if (!objectId)
return false;
@@ -241,7 +241,7 @@ public:
if (!id)
return false;
- uint32 objectId = atol(id);
+ uint32 objectId = atoul(id);
if (objectId)
result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1",
@@ -675,12 +675,8 @@ public:
if (objectType < 4)
object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, objectState);
else if (objectType == 4)
- {
- WorldPacket data(SMSG_GAMEOBJECT_CUSTOM_ANIM, 8+4);
- data << object->GetGUID();
- data << (uint32)(objectState);
- object->SendMessageToSet(&data, true);
- }
+ object->SendCustomAnim(objectState);
+
handler->PSendSysMessage("Set gobject type %d state %d", objectType, objectState);
return true;
}
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index 46929e3967c..7721fed3fba 100644
--- a/src/server/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
@@ -65,7 +65,7 @@ public:
if (!id)
return false;
- uint32 creatureId = atol(id);
+ uint32 creatureId = atoul(id);
if (!creatureId)
{
handler->PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, creatureId);
@@ -82,7 +82,7 @@ public:
}
char* countStr = strtok(NULL, " ");
- uint32 count = countStr ? atol(countStr) : 10;
+ uint32 count = countStr ? atoul(countStr) : 10;
if (count == 0)
return false;
@@ -133,11 +133,11 @@ public:
if (!*args)
return false;
- char* id = handler->extractKeyFromLink((char*)args, "Hitem");
+ char const* id = handler->extractKeyFromLink((char*)args, "Hitem");
if (!id)
return false;
- uint32 itemId = atol(id);
+ uint32 itemId = atoul(id);
if (!itemId)
{
handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
@@ -154,7 +154,7 @@ public:
}
char* countStr = strtok(NULL, " ");
- uint32 count = countStr ? atol(countStr) : 10;
+ uint32 count = countStr ? atoul(countStr) : 10;
if (count == 0)
return false;
@@ -354,7 +354,7 @@ public:
if (!id)
return false;
- uint32 gameObjectId = atol(id);
+ uint32 gameObjectId = atoul(id);
if (!gameObjectId)
{
handler->PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, gameObjectId);
@@ -371,7 +371,7 @@ public:
}
char* countStr = strtok(NULL, " ");
- uint32 count = countStr ? atol(countStr) : 10;
+ uint32 count = countStr ? atoul(countStr) : 10;
if (count == 0)
return false;
diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index 715487eff99..664c8f3d216 100644
--- a/src/server/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
@@ -74,7 +74,7 @@ public:
Player* player = handler->GetSession()->GetPlayer();
Channel* channcel = NULL;
- if (ChannelMgr* cMgr = ChannelMgr::forTeam(player->GetTeam()))
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(player->GetTeam()))
channcel = cMgr->GetChannel(channelStr, player);
if (strcmp(argStr, "on") == 0)
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 0c8dd5813f2..f8c3f43d144 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1135,7 +1135,7 @@ public:
char const* id = handler->extractKeyFromLink((char*)args, "Hitem");
if (!id)
return false;
- itemId = uint32(atol(id));
+ itemId = atoul(id);
}
char const* ccount = strtok(NULL, " ");
@@ -1217,7 +1217,7 @@ public:
if (!id)
return false;
- uint32 itemSetId = atol(id);
+ uint32 itemSetId = atoul(id);
// prevent generation all items with itemset field value '0'
if (itemSetId == 0)
@@ -1358,7 +1358,7 @@ public:
return false;
}
- int32 level = uint32(atol(levelStr));
+ int32 level = atol(levelStr);
Player* target = handler->getSelectedPlayer();
if (!target)
@@ -1380,7 +1380,7 @@ public:
// If our target does not yet have the skill they are trying to add to them, the chosen level also becomes
// the max level of the new profession.
- uint16 max = maxPureSkill ? atol(maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level);
+ uint16 max = maxPureSkill ? atoul(maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level);
if (level <= 0 || level > max || max <= 0)
return false;
@@ -1779,7 +1779,7 @@ public:
uint32 totalmail = uint32(fields[1].GetUInt64());
// ... we have to convert it from Char to int. We can use totalmail as it is
- rmailint = atol(readmail.c_str());
+ rmailint = atoul(readmail.c_str());
// Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given
if (totalmail >= 1)
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 7d42609a2a0..eb64c2f3eaa 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1004,7 +1004,7 @@ public:
if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c'))
moneyToAdd = MoneyStringToMoney(std::string(args));
else
- moneyToAdd = atol(args);
+ moneyToAdd = atoll(args);
uint64 targetMoney = target->GetMoney();
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 9d64ba60bc4..3e841f45f59 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -332,15 +332,15 @@ public:
char* fmaxcount = strtok(NULL, " "); //add maxcount, default: 0
uint32 maxcount = 0;
if (fmaxcount)
- maxcount = atol(fmaxcount);
+ maxcount = atoul(fmaxcount);
char* fincrtime = strtok(NULL, " "); //add incrtime, default: 0
uint32 incrtime = 0;
if (fincrtime)
- incrtime = atol(fincrtime);
+ incrtime = atoul(fincrtime);
char* fextendedcost = strtok(NULL, " "); //add ExtendedCost, default: 0
- uint32 extendedcost = fextendedcost ? atol(fextendedcost) : 0;
+ uint32 extendedcost = fextendedcost ? atoul(fextendedcost) : 0;
Creature* vendor = handler->getSelectedCreature();
if (!vendor)
{
@@ -570,7 +570,7 @@ public:
handler->SetSentErrorMessage(true);
return false;
}
- uint32 itemId = atol(pitem);
+ uint32 itemId = atoul(pitem);
const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument
diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp
index b5186bdb948..8138a755f87 100644
--- a/src/server/scripts/Commands/cs_quest.cpp
+++ b/src/server/scripts/Commands/cs_quest.cpp
@@ -67,7 +67,7 @@ public:
if (!cId)
return false;
- uint32 entry = atol(cId);
+ uint32 entry = atoul(cId);
Quest const* quest = sObjectMgr->GetQuestTemplate(entry);
@@ -112,7 +112,7 @@ public:
if (!cId)
return false;
- uint32 entry = atol(cId);
+ uint32 entry = atoul(cId);
Quest const* quest = sObjectMgr->GetQuestTemplate(entry);
@@ -165,7 +165,7 @@ public:
if (!cId)
return false;
- uint32 entry = atol(cId);
+ uint32 entry = atoul(cId);
Quest const* quest = sObjectMgr->GetQuestTemplate(entry);
@@ -269,7 +269,7 @@ public:
if (!cId)
return false;
- uint32 entry = atol(cId);
+ uint32 entry = atoul(cId);
Quest const* quest = sObjectMgr->GetQuestTemplate(entry);
diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index 4a58a7f7e5d..01a0094bfc7 100644
--- a/src/server/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
@@ -204,9 +204,10 @@ public:
Player* target;
ObjectGuid targetGuid;
std::string targetName;
- /* TODO: 6.x remove/update pet talents
+
if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
{
+ /* TODO: 6.x remove/update pet talents
// Try reset talents as Hunter Pet
Creature* creature = handler->getSelectedCreature();
if (!*args && creature && creature->IsPet())
@@ -223,12 +224,12 @@ public:
}
return true;
}
+ */
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
handler->SetSentErrorMessage(true);
return false;
}
- */
if (target)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index 176c24f6707..bf28ccbb17e 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
@@ -31,6 +31,7 @@ EndScriptData */
#include "WorldPacket.h"
#include "Chat.h"
#include "WorldSession.h"
+#include "Packets/ChatPackets.h"
/* Battle of Mount Hyjal encounters:
0 - Rage Winterchill event
@@ -173,10 +174,9 @@ public:
{
if (Player* player = i->GetSource())
{
- WorldPacket packet;
-
- ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS);
- player->SendDirectMessage(&packet);
+ WorldPackets::Chat::Chat packet;
+ ChatHandler::BuildChatPacket(&packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS);
+ player->SendDirectMessage(packet.Write());
player->PlayDirectSound(10986, player);
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index b84d24d66d3..794496382c2 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -292,6 +292,7 @@ public:
break;
}
player->CLOSE_GOSSIP_MENU();
+ ai->SetDespawnAtFar(false);
creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
return true;
}
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
index 53fbf8f0cf7..1f55abf8a11 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
@@ -21,8 +21,14 @@
DoorData const doorData[] =
{
- { GO_IKISS_DOOR, DATA_TALON_KING_IKISS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_IKISS_DOOR, DATA_TALON_KING_IKISS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
+
+ObjectData const gameObjectData[] =
+{
+ { GO_TALON_KING_COFFER, DATA_TALON_KING_COFFER },
+ { 0, 0 } // END
};
class instance_sethekk_halls : public InstanceMapScript
@@ -37,6 +43,7 @@ class instance_sethekk_halls : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
+ LoadObjectData(nullptr, gameObjectData);
}
void OnCreatureCreate(Creature* creature) override
@@ -50,16 +57,27 @@ class instance_sethekk_halls : public InstanceMapScript
}
}
- void OnGameObjectCreate(GameObject* go) override
+ bool SetBossState(uint32 type, EncounterState state) override
{
- if (go->GetEntry() == GO_IKISS_DOOR)
- AddDoor(go, true);
- }
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
- void OnGameObjectRemove(GameObject* go) override
- {
- if (go->GetEntry() == GO_IKISS_DOOR)
- AddDoor(go, false);
+ switch (type)
+ {
+ case DATA_TALON_KING_IKISS:
+ if (state == DONE)
+ {
+ /// @workaround: GO_FLAG_INTERACT_COND remains on the gob, but it is not handled correctly in this case
+ /// gameobject should have GO_DYNFLAG_LO_ACTIVATE too, which makes gobs interactable with GO_FLAG_INTERACT_COND
+ /// so just removed GO_FLAG_INTERACT_COND
+ if (GameObject* coffer = GetGameObject(DATA_TALON_KING_COFFER))
+ coffer->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE);
+ }
+ break;
+ default:
+ break;
+ }
+ return true;
}
};
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
index 4b6bfab46cb..8cf01fb4635 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
@@ -28,7 +28,10 @@ enum DataTypes
// Encounter States/Boss GUIDs
DATA_DARKWEAVER_SYTH = 0,
DATA_TALON_KING_IKISS = 1,
- DATA_ANZU = 2
+ DATA_ANZU = 2,
+
+ // Additional Data
+ DATA_TALON_KING_COFFER = 3
};
enum CreatureIds
@@ -39,7 +42,8 @@ enum CreatureIds
enum GameObjectIds
{
- GO_IKISS_DOOR = 177203
+ GO_IKISS_DOOR = 177203,
+ GO_TALON_KING_COFFER = 187372
};
template<class AI>
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
index f0884e83baa..794d3a490f6 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
@@ -31,21 +31,25 @@ class go_main_chambers_access_panel : public GameObjectScript
return false;
if (go->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL))
- {
instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL);
- go->SetGoState(GO_STATE_ACTIVE);
- }
if (go->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL))
- {
instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL);
- go->SetGoState(GO_STATE_ACTIVE);
- }
+
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SetGoState(GO_STATE_ACTIVE);
return true;
}
};
+ObjectData const gameObjectData[] =
+{
+ { GO_ACCESS_PANEL_HYDRO, DATA_ACCESS_PANEL_HYDRO },
+ { GO_ACCESS_PANEL_MEK, DATA_ACCESS_PANEL_MEK },
+ { 0, 0 } // END
+};
+
class instance_steam_vault : public InstanceMapScript
{
public:
@@ -57,6 +61,7 @@ class instance_steam_vault : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadObjectData(nullptr, gameObjectData);
DistillerState = 0;
}
@@ -89,6 +94,8 @@ class instance_steam_vault : public InstanceMapScript
default:
break;
}
+
+ InstanceScript::OnGameObjectCreate(go);
}
ObjectGuid GetGuidData(uint32 type) const override
@@ -128,6 +135,9 @@ class instance_steam_vault : public InstanceMapScript
switch (type)
{
case DATA_HYDROMANCER_THESPIA:
+ if (state == DONE)
+ if (GameObject* panel = GetGameObject(DATA_ACCESS_PANEL_HYDRO))
+ panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (state == SPECIAL)
{
if (GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL)
@@ -137,6 +147,9 @@ class instance_steam_vault : public InstanceMapScript
}
break;
case DATA_MEKGINEER_STEAMRIGGER:
+ if (state == DONE)
+ if (GameObject* panel = GetGameObject(DATA_ACCESS_PANEL_MEK))
+ panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (state == SPECIAL)
{
if (GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL)
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
index 58f71b047ef..d18d0406dea 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
@@ -28,7 +28,11 @@ enum DataTypes
DATA_HYDROMANCER_THESPIA = 0,
DATA_MEKGINEER_STEAMRIGGER = 1,
DATA_WARLORD_KALITHRESH = 2,
- DATA_DISTILLER = 3
+ DATA_DISTILLER = 3,
+
+ // Additional Data
+ DATA_ACCESS_PANEL_HYDRO = 4,
+ DATA_ACCESS_PANEL_MEK = 5
};
enum CreatureIds
diff --git a/src/server/scripts/World/action_ip_logger.cpp b/src/server/scripts/World/action_ip_logger.cpp
index 9d2aa868234..c82459d0599 100644
--- a/src/server/scripts/World/action_ip_logger.cpp
+++ b/src/server/scripts/World/action_ip_logger.cpp
@@ -16,13 +16,10 @@
*/
#include "ScriptMgr.h"
-#include "Channel.h"
-#include "Guild.h"
-#include "Group.h"
+#include "Player.h"
enum IPLoggingTypes
{
-
// AccountActionIpLogger();
ACCOUNT_LOGIN = 0,
ACCOUNT_FAIL_LOGIN = 1,
diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h
index 4e23b4a4770..578bc7aa61f 100644
--- a/src/server/shared/Common.h
+++ b/src/server/shared/Common.h
@@ -79,6 +79,9 @@
inline float finiteAlways(float f) { return std::isfinite(f) ? f : 0.0f; }
+inline unsigned long atoul(char const* str) { return strtoul(str, nullptr, 10); }
+inline unsigned long long atoull(char const* str) { return strtoull(str, nullptr, 10); }
+
#define STRINGIZE(a) #a
enum TimeConstants
@@ -118,7 +121,6 @@ const uint8 TOTAL_LOCALES = 9;
#define DEFAULT_LOCALE LOCALE_enUS
#define MAX_LOCALES 8
-#define MAX_ACCOUNT_TUTORIAL_VALUES 8
extern char const* localeNames[TOTAL_LOCALES];
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h
index 92c16d96882..c004295bc1a 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/server/shared/Networking/SocketMgr.h
@@ -47,7 +47,16 @@ public:
return false;
}
- _acceptor = new AsyncAcceptor(service, bindIp, port);
+ try
+ {
+ _acceptor = new AsyncAcceptor(service, bindIp, port);
+ }
+ catch (boost::system::system_error const& err)
+ {
+ TC_LOG_ERROR("network", "Exception caught in SocketMgr.StartNetwork (%s:%u): %s", bindIp.c_str(), port, err.what());
+ return false;
+ }
+
_threads = CreateThreads();
ASSERT(_threads);
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index 069b783a537..67e940e263c 100644
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -303,7 +303,7 @@ class ByteBuffer
{
if (size_t len = value.length())
append((uint8 const*)value.c_str(), len);
- append((uint8)0);
+ append<uint8>(0);
return *this;
}
@@ -311,7 +311,7 @@ class ByteBuffer
{
if (size_t len = (str ? strlen(str) : 0))
append((uint8 const*)str, len);
- append((uint8)0);
+ append<uint8>(0);
return *this;
}
@@ -475,7 +475,7 @@ class ByteBuffer
void read(uint8 *dest, size_t len)
{
- if (_rpos + len > size())
+ if (_rpos + len > size())
throw ByteBufferPositionException(false, _rpos, len, size());
ResetBitPos();
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
index 8a4f7325add..5aaedfb8ffe 100644
--- a/src/server/shared/Utilities/Util.h
+++ b/src/server/shared/Utilities/Util.h
@@ -33,21 +33,21 @@
template<typename T>
struct Optional
{
- Optional() : value(), HasValue(false) { }
+ Optional() : Value(), HasValue(false) { }
- T value;
+ T Value;
bool HasValue;
inline void Set(T const& v)
{
HasValue = true;
- value = v;
+ Value = v;
}
inline void Clear()
{
HasValue = false;
- value = T();
+ Value = T();
}
};