diff options
309 files changed, 45484 insertions, 8689 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 52b6ed42972..5dfa9c5113b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,8 +6,7 @@ Want to contribute? Great! 2. Create a branch (`git checkout -b fixes`) 3. Commit your changes (`git commit -am "Added Snarkdown"`) 4. Push to the branch (`git push origin fixes`) -5. Open a [Pull Request][1] - +5. Open a Pull Request When creating patches read: - [TrinityCore Development Standards](http://www.trinitycore.org/f/topic/6-trinitycore-developing-standards/) @@ -16,28 +15,19 @@ When creating patches read: - [SQL Guidelines](http://collab.kpsn.org/display/tc/SQL+Guidelines) We suggest you to create one branch for each `C++` based fix: on that way you can continue creating more fixes without having to wait to get one pull request merged. -For the `SQL` files of `C++` based fixes the naming schema is: `YYYY_MM_DD_i_database_description.sql`, where `YYYY_MM_DD` is the date of the fix, `i_database` is the *ith* sql created that day for `database`. +For the `SQL` files of `C++` based fixes the naming schema is: `YYYY_MM_DD_i_database.sql`, where `YYYY_MM_DD` is the date of the fix, `i_database` is the *ith* sql created that day for `database` starting on 00. When doing changes to `auth` or `characters` database remember to update the base files (`/sql/base/*`). For SQL only fixes [create a ticket](https://github.com/TrinityCore/TrinityCore/issues/new). -Wiki -==== - -The wiki is located at [http://trinitycore.info](http://trinitycore.info). - -You are welcome to create an account and help us improve and extend the wiki. - - Issues ====== - Read [this](http://www.trinitycore.org/f/topic/37-the-trinitycore-issuetracker-and-you/) before creating a ticket. -If you have problems with TrinityCore instalation, read http://www.trinitycore.org/f/topic/1518-trouble-with-your-trinity-install-readme-1st-faqs/ - +If you have problems with TrinityCore instalation, read +http://www.trinitycore.org/f/topic/10656-updating-or-starting-with-trinitycore-issues/ +http://www.trinitycore.org/f/topic/1518-trouble-with-your-trinity-install-readme-1st-faqs/ Requirements ============ - Platform: Linux, Windows or Mac Processor with SSE2 support Boost ≥ 1.4.9 @@ -45,7 +35,12 @@ MySQL ≥ 5.1.0 CMake ≥ 2.8.11.2 / 2.8.9 (Windows / Linux) OpenSSL ≥ 1.0.0 GCC ≥ 4.7.2 (Linux only) -MS Visual Studio ≥ 12 (2013) (Windows only) +MS Visual Studio ≥ 12 (2013) (Windows only) (we recommend Visual Studio 2013 community edition, free for open source developers) In case you choose Linux, we recommend to use Debian 7, it's the Linux we use to test compilations. -Remember 4.3.4 branch is alpha, only intended for development, we don't recomend this branch to run a server. + +Wiki +==== +The wiki is located at [http://trinitycore.info](http://trinitycore.info). +You are welcome to create an account and help us improve and extend the wiki. + diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000000..8f340d279e8 --- /dev/null +++ b/INSTALL @@ -0,0 +1,6 @@ +For installation instructions read www.trinitycore.info +Remember that TrinityCore needs sse2 capable processor as well c++11 compiler. + +If you still have installation problems check: +http://www.trinitycore.org/f/topic/10656-updating-or-starting-with-trinitycore-issues/ +http://www.trinitycore.org/f/topic/1518-trouble-with-your-trinity-install-readme-1st-faqs/ diff --git a/README.md b/README.md index 41a81c0d7f9..71c78873b03 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [](https://www.bountysource.com/trackers/1310-trinity-core?utm_source=1310&utm_medium=shield&utm_campaign=TRACKER_BADGE) `6.x`: [](https://travis-ci.org/TrinityCore/TrinityCore) `4.3.4`: [](https://travis-ci.org/TrinityCore/TrinityCore) -`3.3.5`: [](https://travis-ci.org/TrinityCore/TrinityCore) +`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..8d6288b0c4b 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.15 Distrib 10.0.13-MariaDB, for Win64 (x86) +-- MySQL dump 10.15 Distrib 10.0.15-MariaDB, for Win64 (x86) -- --- Host: localhost Database: auth_4x +-- Host: localhost Database: authdum -- ------------------------------------------------------ --- Server version 10.0.13-MariaDB +-- Server version 10.0.15-MariaDB /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -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'; @@ -252,7 +252,7 @@ CREATE TABLE `battlenet_components` ( LOCK TABLES `battlenet_components` WRITE; /*!40000 ALTER TABLE `battlenet_components` DISABLE KEYS */; -INSERT INTO `battlenet_components` VALUES ('Bnet','Mc64',37165),('Bnet','Win',37165),('Bnet','Wn64',37165),('WoW','base',19057),('WoW','deDE',0),('WoW','enGB',0),('WoW','enUS',0),('WoW','esES',0),('WoW','esMX',0),('WoW','frFR',0),('WoW','koKR',0),('WoW','Mc64',19116),('WoW','ruRU',0),('WoW','Win',19116),('WoW','Wn64',19116),('WoW','zhCN',0),('WoW','zhTW',0); +INSERT INTO `battlenet_components` VALUES ('Bnet','Mc64',37165),('Bnet','Win',37165),('Bnet','Wn64',37165),('WoW','base',19057),('WoW','deDE',0),('WoW','enGB',0),('WoW','enUS',0),('WoW','esES',0),('WoW','esMX',0),('WoW','frFR',0),('WoW','koKR',0),('WoW','Mc64',19342),('WoW','ruRU',0),('WoW','Win',19342),('WoW','Wn64',19342),('WoW','zhCN',0),('WoW','zhTW',0); /*!40000 ALTER TABLE `battlenet_components` ENABLE KEYS */; UNLOCK TABLES; @@ -455,7 +455,8 @@ DROP TABLE IF EXISTS `rbac_default_permissions`; CREATE TABLE `rbac_default_permissions` ( `secId` int(10) unsigned NOT NULL COMMENT 'Security Level id', `permissionId` int(10) unsigned NOT NULL COMMENT 'permission id', - PRIMARY KEY (`secId`,`permissionId`), + `realmId` int(11) NOT NULL DEFAULT '-1' COMMENT 'Realm Id, -1 means all', + PRIMARY KEY (`secId`,`permissionId`,`realmId`), KEY `fk__rbac_default_permissions__rbac_permissions` (`permissionId`), CONSTRAINT `fk__rbac_default_permissions__rbac_permissions` FOREIGN KEY (`permissionId`) REFERENCES `rbac_permissions` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Default permission to assign to different account security levels'; @@ -467,7 +468,7 @@ CREATE TABLE `rbac_default_permissions` ( LOCK TABLES `rbac_default_permissions` WRITE; /*!40000 ALTER TABLE `rbac_default_permissions` DISABLE KEYS */; -INSERT INTO `rbac_default_permissions` VALUES (3,192),(2,193),(1,194),(0,195); +INSERT INTO `rbac_default_permissions` VALUES (0,195,-1),(1,194,-1),(2,193,-1),(3,192,-1); /*!40000 ALTER TABLE `rbac_default_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -495,7 +496,7 @@ CREATE TABLE `rbac_linked_permissions` ( LOCK TABLES `rbac_linked_permissions` WRITE; /*!40000 ALTER TABLE `rbac_linked_permissions` DISABLE KEYS */; -INSERT INTO `rbac_linked_permissions` VALUES (192,21),(192,42),(192,43),(192,193),(192,196),(192,778),(192,779),(192,780),(192,781),(192,782),(192,783),(192,784),(192,785),(192,786),(192,787),(192,788),(192,789),(192,790),(192,791),(192,792),(192,793),(192,794),(193,48),(193,194),(193,197),(194,1),(194,2),(194,11),(194,13),(194,14),(194,15),(194,16),(194,17),(194,18),(194,19),(194,20),(194,22),(194,23),(194,25),(194,26),(194,27),(194,28),(194,29),(194,30),(194,31),(194,32),(194,33),(194,34),(194,35),(194,36),(194,37),(194,38),(194,39),(194,40),(194,41),(194,44),(194,46),(194,47),(194,195),(194,198),(194,632),(194,798),(195,3),(195,4),(195,5),(195,6),(195,24),(195,49),(195,199),(196,200),(196,201),(196,208),(196,212),(196,213),(196,214),(196,215),(196,216),(196,226),(196,227),(196,230),(196,231),(196,233),(196,234),(196,235),(196,238),(196,239),(196,240),(196,241),(196,242),(196,243),(196,244),(196,245),(196,246),(196,247),(196,248),(196,249),(196,250),(196,251),(196,252),(196,253),(196,254),(196,255),(196,256),(196,257),(196,258),(196,259),(196,260),(196,261),(196,262),(196,264),(196,265),(196,266),(196,267),(196,268),(196,269),(196,270),(196,271),(196,272),(196,279),(196,280),(196,283),(196,287),(196,288),(196,289),(196,290),(196,291),(196,292),(196,293),(196,294),(196,295),(196,296),(196,297),(196,298),(196,299),(196,302),(196,303),(196,304),(196,305),(196,306),(196,307),(196,308),(196,309),(196,310),(196,313),(196,314),(196,319),(196,320),(196,321),(196,322),(196,323),(196,324),(196,325),(196,326),(196,327),(196,328),(196,329),(196,330),(196,331),(196,332),(196,333),(196,334),(196,335),(196,336),(196,337),(196,338),(196,339),(196,340),(196,341),(196,342),(196,343),(196,344),(196,345),(196,346),(196,347),(196,348),(196,349),(196,350),(196,351),(196,352),(196,353),(196,354),(196,355),(196,356),(196,357),(196,358),(196,359),(196,360),(196,361),(196,362),(196,363),(196,364),(196,365),(196,366),(196,373),(196,375),(196,400),(196,401),(196,402),(196,403),(196,404),(196,405),(196,406),(196,407),(196,417),(196,418),(196,419),(196,420),(196,421),(196,422),(196,423),(196,424),(196,425),(196,426),(196,427),(196,428),(196,429),(196,434),(196,435),(196,436),(196,437),(196,438),(196,439),(196,440),(196,441),(196,442),(196,443),(196,444),(196,445),(196,446),(196,447),(196,448),(196,449),(196,450),(196,451),(196,452),(196,453),(196,454),(196,455),(196,456),(196,457),(196,458),(196,459),(196,461),(196,463),(196,464),(196,465),(196,472),(196,473),(196,474),(196,475),(196,476),(196,477),(196,478),(196,488),(196,489),(196,491),(196,492),(196,493),(196,495),(196,497),(196,498),(196,499),(196,500),(196,502),(196,503),(196,505),(196,508),(196,511),(196,513),(196,514),(196,516),(196,519),(196,522),(196,523),(196,526),(196,527),(196,529),(196,530),(196,533),(196,535),(196,536),(196,537),(196,538),(196,539),(196,540),(196,541),(196,556),(196,581),(196,582),(196,592),(196,593),(196,596),(196,602),(196,603),(196,604),(196,605),(196,606),(196,607),(196,608),(196,609),(196,610),(196,611),(196,612),(196,613),(196,614),(196,615),(196,616),(196,617),(196,618),(196,619),(196,620),(196,621),(196,622),(196,623),(196,624),(196,625),(196,626),(196,627),(196,628),(196,629),(196,630),(196,631),(196,633),(196,634),(196,635),(196,636),(196,637),(196,638),(196,639),(196,640),(196,641),(196,642),(196,643),(196,644),(196,645),(196,646),(196,647),(196,648),(196,649),(196,650),(196,651),(196,652),(196,653),(196,654),(196,655),(196,656),(196,657),(196,658),(196,659),(196,660),(196,661),(196,662),(196,663),(196,664),(196,665),(196,666),(196,667),(196,668),(196,669),(196,670),(196,671),(196,672),(196,673),(196,674),(196,675),(196,676),(196,677),(196,678),(196,679),(196,680),(196,681),(196,682),(196,683),(196,684),(196,685),(196,686),(196,687),(196,688),(196,689),(196,690),(196,691),(196,692),(196,693),(196,694),(196,695),(196,696),(196,697),(196,698),(196,699),(196,700),(196,701),(196,702),(196,703),(196,704),(196,705),(196,706),(196,707),(196,708),(196,709),(196,710),(196,711),(196,712),(196,713),(196,714),(196,715),(196,716),(196,717),(196,718),(196,719),(196,721),(196,722),(196,723),(196,724),(196,725),(196,726),(196,727),(196,728),(196,729),(196,730),(196,733),(196,734),(196,735),(196,736),(196,738),(196,739),(196,748),(196,753),(196,757),(196,773),(196,777),(197,232),(197,236),(197,237),(197,273),(197,274),(197,275),(197,276),(197,277),(197,284),(197,285),(197,286),(197,301),(197,311),(197,387),(197,388),(197,389),(197,390),(197,391),(197,392),(197,393),(197,394),(197,395),(197,396),(197,397),(197,398),(197,399),(197,479),(197,480),(197,481),(197,482),(197,485),(197,486),(197,487),(197,494),(197,506),(197,509),(197,510),(197,517),(197,518),(197,521),(197,542),(197,543),(197,550),(197,558),(197,568),(197,571),(197,572),(197,573),(197,574),(197,575),(197,576),(197,577),(197,578),(197,579),(197,580),(197,583),(197,584),(197,585),(197,586),(197,587),(197,588),(197,589),(197,590),(197,591),(197,594),(197,595),(197,601),(197,743),(197,750),(197,758),(197,761),(197,762),(197,763),(197,764),(197,765),(197,766),(197,767),(197,768),(197,769),(197,770),(197,771),(197,772),(197,774),(198,218),(198,300),(198,312),(198,315),(198,316),(198,317),(198,318),(198,367),(198,368),(198,369),(198,370),(198,371),(198,372),(198,374),(198,376),(198,377),(198,378),(198,379),(198,380),(198,381),(198,382),(198,383),(198,384),(198,385),(198,386),(198,408),(198,409),(198,410),(198,411),(198,412),(198,413),(198,414),(198,415),(198,416),(198,430),(198,431),(198,432),(198,433),(198,462),(198,466),(198,467),(198,468),(198,469),(198,470),(198,471),(198,483),(198,484),(198,490),(198,504),(198,512),(198,515),(198,520),(198,524),(198,528),(198,531),(198,532),(198,544),(198,545),(198,546),(198,547),(198,548),(198,549),(198,551),(198,552),(198,553),(198,554),(198,555),(198,557),(198,559),(198,560),(198,561),(198,562),(198,563),(198,564),(198,565),(198,566),(198,567),(198,569),(198,570),(198,597),(198,598),(198,599),(198,600),(198,737),(198,740),(198,741),(198,742),(198,744),(198,745),(198,746),(198,747),(198,749),(198,751),(198,752),(198,754),(198,755),(198,756),(198,759),(198,760),(199,207),(199,209),(199,210),(199,211),(199,217),(199,221),(199,222),(199,223),(199,225),(199,263),(199,496),(199,501),(199,507),(199,525),(199,534),(199,797); +INSERT INTO `rbac_linked_permissions` VALUES (192,21),(192,42),(192,43),(192,193),(192,196),(192,778),(192,779),(192,780),(192,781),(192,782),(192,783),(192,784),(192,785),(192,786),(192,787),(192,788),(192,789),(192,790),(192,791),(192,792),(192,793),(192,794),(193,48),(193,194),(193,197),(194,1),(194,2),(194,11),(194,13),(194,14),(194,15),(194,16),(194,17),(194,18),(194,19),(194,20),(194,22),(194,23),(194,25),(194,26),(194,27),(194,28),(194,29),(194,30),(194,31),(194,32),(194,33),(194,34),(194,35),(194,36),(194,37),(194,38),(194,39),(194,40),(194,41),(194,44),(194,46),(194,47),(194,195),(194,198),(194,632),(194,798),(195,3),(195,4),(195,5),(195,6),(195,24),(195,49),(195,199),(196,200),(196,201),(196,208),(196,212),(196,213),(196,214),(196,215),(196,216),(196,226),(196,227),(196,230),(196,231),(196,233),(196,234),(196,235),(196,238),(196,239),(196,240),(196,241),(196,242),(196,243),(196,244),(196,245),(196,246),(196,247),(196,248),(196,249),(196,250),(196,251),(196,252),(196,253),(196,254),(196,255),(196,256),(196,257),(196,258),(196,259),(196,260),(196,261),(196,262),(196,264),(196,265),(196,266),(196,267),(196,268),(196,269),(196,270),(196,271),(196,272),(196,279),(196,280),(196,283),(196,287),(196,288),(196,289),(196,290),(196,291),(196,292),(196,293),(196,294),(196,295),(196,296),(196,297),(196,298),(196,299),(196,302),(196,303),(196,304),(196,305),(196,306),(196,307),(196,308),(196,309),(196,310),(196,313),(196,314),(196,319),(196,320),(196,321),(196,322),(196,323),(196,324),(196,325),(196,326),(196,327),(196,328),(196,329),(196,330),(196,331),(196,332),(196,333),(196,334),(196,335),(196,336),(196,337),(196,338),(196,339),(196,340),(196,341),(196,342),(196,343),(196,344),(196,345),(196,346),(196,347),(196,348),(196,349),(196,350),(196,351),(196,352),(196,353),(196,354),(196,355),(196,356),(196,357),(196,358),(196,359),(196,360),(196,361),(196,362),(196,363),(196,364),(196,365),(196,366),(196,373),(196,375),(196,400),(196,401),(196,402),(196,403),(196,404),(196,405),(196,406),(196,407),(196,417),(196,418),(196,419),(196,420),(196,421),(196,422),(196,423),(196,424),(196,425),(196,426),(196,427),(196,428),(196,429),(196,434),(196,435),(196,436),(196,437),(196,438),(196,439),(196,440),(196,441),(196,442),(196,443),(196,444),(196,445),(196,446),(196,447),(196,448),(196,449),(196,450),(196,451),(196,452),(196,453),(196,454),(196,455),(196,456),(196,457),(196,458),(196,459),(196,461),(196,463),(196,464),(196,465),(196,472),(196,473),(196,474),(196,475),(196,476),(196,477),(196,478),(196,488),(196,489),(196,491),(196,492),(196,493),(196,495),(196,497),(196,498),(196,499),(196,500),(196,502),(196,503),(196,505),(196,508),(196,511),(196,513),(196,514),(196,516),(196,519),(196,522),(196,523),(196,526),(196,527),(196,529),(196,530),(196,533),(196,535),(196,536),(196,537),(196,538),(196,539),(196,540),(196,541),(196,556),(196,581),(196,582),(196,592),(196,593),(196,596),(196,602),(196,603),(196,604),(196,605),(196,606),(196,607),(196,608),(196,609),(196,610),(196,611),(196,612),(196,613),(196,614),(196,615),(196,616),(196,617),(196,618),(196,619),(196,620),(196,621),(196,622),(196,623),(196,624),(196,625),(196,626),(196,627),(196,628),(196,629),(196,630),(196,631),(196,633),(196,634),(196,635),(196,636),(196,637),(196,638),(196,639),(196,640),(196,641),(196,642),(196,643),(196,644),(196,645),(196,646),(196,647),(196,648),(196,649),(196,650),(196,651),(196,652),(196,653),(196,654),(196,655),(196,656),(196,657),(196,658),(196,659),(196,660),(196,661),(196,662),(196,663),(196,664),(196,665),(196,666),(196,667),(196,668),(196,669),(196,670),(196,671),(196,672),(196,673),(196,674),(196,675),(196,676),(196,677),(196,678),(196,679),(196,680),(196,681),(196,682),(196,683),(196,684),(196,685),(196,686),(196,687),(196,688),(196,689),(196,690),(196,691),(196,693),(196,694),(196,695),(196,696),(196,697),(196,698),(196,699),(196,700),(196,701),(196,702),(196,703),(196,704),(196,705),(196,706),(196,707),(196,708),(196,709),(196,710),(196,711),(196,712),(196,713),(196,714),(196,715),(196,716),(196,717),(196,718),(196,719),(196,721),(196,722),(196,723),(196,724),(196,725),(196,726),(196,727),(196,728),(196,729),(196,730),(196,733),(196,734),(196,735),(196,736),(196,738),(196,739),(196,748),(196,753),(196,757),(196,773),(196,777),(197,232),(197,236),(197,237),(197,273),(197,274),(197,275),(197,276),(197,277),(197,284),(197,285),(197,286),(197,301),(197,311),(197,387),(197,388),(197,389),(197,390),(197,391),(197,392),(197,393),(197,394),(197,395),(197,396),(197,397),(197,398),(197,399),(197,479),(197,480),(197,481),(197,482),(197,485),(197,486),(197,487),(197,494),(197,506),(197,509),(197,510),(197,517),(197,518),(197,521),(197,542),(197,543),(197,550),(197,558),(197,568),(197,571),(197,572),(197,573),(197,574),(197,575),(197,576),(197,577),(197,578),(197,579),(197,580),(197,583),(197,584),(197,585),(197,586),(197,587),(197,588),(197,589),(197,590),(197,591),(197,594),(197,595),(197,601),(197,743),(197,750),(197,758),(197,761),(197,762),(197,763),(197,764),(197,765),(197,766),(197,767),(197,768),(197,769),(197,770),(197,771),(197,772),(197,774),(198,218),(198,300),(198,312),(198,315),(198,316),(198,317),(198,318),(198,367),(198,368),(198,369),(198,370),(198,371),(198,372),(198,374),(198,376),(198,377),(198,378),(198,379),(198,380),(198,381),(198,382),(198,383),(198,384),(198,385),(198,386),(198,408),(198,409),(198,410),(198,411),(198,412),(198,413),(198,414),(198,415),(198,416),(198,430),(198,431),(198,432),(198,433),(198,462),(198,466),(198,467),(198,468),(198,469),(198,470),(198,471),(198,483),(198,484),(198,490),(198,504),(198,512),(198,515),(198,520),(198,524),(198,528),(198,531),(198,532),(198,544),(198,545),(198,546),(198,547),(198,548),(198,549),(198,551),(198,552),(198,553),(198,554),(198,555),(198,557),(198,559),(198,560),(198,561),(198,562),(198,563),(198,564),(198,565),(198,566),(198,567),(198,569),(198,570),(198,597),(198,598),(198,599),(198,600),(198,737),(198,740),(198,741),(198,742),(198,744),(198,745),(198,746),(198,747),(198,749),(198,751),(198,752),(198,754),(198,755),(198,756),(198,759),(198,760),(199,207),(199,209),(199,210),(199,211),(199,217),(199,221),(199,222),(199,223),(199,225),(199,263),(199,496),(199,501),(199,507),(199,525),(199,534),(199,797); /*!40000 ALTER TABLE `rbac_linked_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -519,7 +520,7 @@ CREATE TABLE `rbac_permissions` ( LOCK TABLES `rbac_permissions` WRITE; /*!40000 ALTER TABLE `rbac_permissions` DISABLE KEYS */; -INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'),(192,'Role: Sec Level Administrator'),(193,'Role: Sec Level Gamemaster'),(194,'Role: Sec Level Moderator'),(195,'Role: Sec Level Player'),(196,'Role: Administrator Commands'),(197,'Role: Gamemaster Commands'),(198,'Role: Moderator Commands'),(199,'Role: Player Commands'),(200,'Command: rbac'),(201,'Command: rbac account'),(202,'Command: rbac account list'),(203,'Command: rbac account grant'),(204,'Command: rbac account deny'),(205,'Command: rbac account revoke'),(206,'Command: rbac list'),(207,'Command: battlenetaccount'),(208,'Command: battlenetaccount create'),(209,'Command: battlenetaccount lock country'),(210,'Command: battlenetaccount lock ip'),(211,'Command: battlenetaccount password'),(212,'Command: battlenetaccount set'),(213,'Command: battlenetaccount set password'),(214,'Command: bnetaccount link'),(215,'Command: bnetaccount unlink'),(216,'Command: bnetaccount gameaccountcreate'),(217,'Command: account'),(218,'Command: account addon'),(219,'Command: account create'),(220,'Command: account delete'),(221,'Command: account lock'),(222,'Command: account lock country'),(223,'Command: account lock ip'),(224,'Command: account onlinelist'),(225,'Command: account password'),(226,'Command: account set'),(227,'Command: account set addon'),(228,'Command: account set gmlevel'),(229,'Command: account set password'),(230,'Command: achievement'),(231,'Command: achievement add'),(232,'Command: arena'),(233,'Command: arena captain'),(234,'Command: arena create'),(235,'Command: arena disband'),(236,'Command: arena info'),(237,'Command: arena lookup'),(238,'Command: arena rename'),(239,'Command: ban'),(240,'Command: ban account'),(241,'Command: ban character'),(242,'Command: ban ip'),(243,'Command: ban playeraccount'),(244,'Command: baninfo'),(245,'Command: baninfo account'),(246,'Command: baninfo character'),(247,'Command: baninfo ip'),(248,'Command: banlist'),(249,'Command: banlist account'),(250,'Command: banlist character'),(251,'Command: banlist ip'),(252,'Command: unban'),(253,'Command: unban account'),(254,'Command: unban character'),(255,'Command: unban ip'),(256,'Command: unban playeraccount'),(257,'Command: bf'),(258,'Command: bf start'),(259,'Command: bf stop'),(260,'Command: bf switch'),(261,'Command: bf timer'),(262,'Command: bf enable'),(263,'Command: account email'),(264,'Command: account set sec'),(265,'Command: account set sec email'),(266,'Command: account set sec regmail'),(267,'Command: cast'),(268,'Command: cast back'),(269,'Command: cast dist'),(270,'Command: cast self'),(271,'Command: cast target'),(272,'Command: cast dest'),(273,'Command: character'),(274,'Command: character customize'),(275,'Command: character changefaction'),(276,'Command: character changerace'),(277,'Command: character deleted'),(279,'Command: character deleted list'),(280,'Command: character deleted restore'),(283,'Command: character level'),(284,'Command: character rename'),(285,'Command: character reputation'),(286,'Command: character titles'),(287,'Command: levelup'),(288,'Command: pdump'),(289,'Command: pdump load'),(290,'Command: pdump write'),(291,'Command: cheat'),(292,'Command: cheat casttime'),(293,'Command: cheat cooldown'),(294,'Command: cheat explore'),(295,'Command: cheat god'),(296,'Command: cheat power'),(297,'Command: cheat status'),(298,'Command: cheat taxi'),(299,'Command: cheat waterwalk'),(300,'Command: debug'),(301,'Command: debug anim'),(302,'Command: debug areatriggers'),(303,'Command: debug arena'),(304,'Command: debug bg'),(305,'Command: debug entervehicle'),(306,'Command: debug getitemstate'),(307,'Command: debug getitemvalue'),(308,'Command: debug getvalue'),(309,'Command: debug hostil'),(310,'Command: debug itemexpire'),(311,'Command: debug lootrecipient'),(312,'Command: debug los'),(313,'Command: debug mod32value'),(314,'Command: debug moveflags'),(315,'Command: debug play'),(316,'Command: debug play cinematics'),(317,'Command: debug play movie'),(318,'Command: debug play sound'),(319,'Command: debug send'),(320,'Command: debug send buyerror'),(321,'Command: debug send channelnotify'),(322,'Command: debug send chatmessage'),(323,'Command: debug send equiperror'),(324,'Command: debug send largepacket'),(325,'Command: debug send opcode'),(326,'Command: debug send qinvalidmsg'),(327,'Command: debug send qpartymsg'),(328,'Command: debug send sellerror'),(329,'Command: debug send setphaseshift'),(330,'Command: debug send spellfail'),(331,'Command: debug setaurastate'),(332,'Command: debug setbit'),(333,'Command: debug setitemvalue'),(334,'Command: debug setvalue'),(335,'Command: debug setvid'),(336,'Command: debug spawnvehicle'),(337,'Command: debug threat'),(338,'Command: debug update'),(339,'Command: debug uws'),(340,'Command: wpgps'),(341,'Command: deserter'),(342,'Command: deserter bg'),(343,'Command: deserter bg add'),(344,'Command: deserter bg remove'),(345,'Command: deserter instance'),(346,'Command: deserter instance add'),(347,'Command: deserter instance remove'),(348,'Command: disable'),(349,'Command: disable add'),(350,'Command: disable add achievement_criteria'),(351,'Command: disable add battleground'),(352,'Command: disable add map'),(353,'Command: disable add mmap'),(354,'Command: disable add outdoorpvp'),(355,'Command: disable add quest'),(356,'Command: disable add spell'),(357,'Command: disable add vmap'),(358,'Command: disable remove'),(359,'Command: disable remove achievement_criteria'),(360,'Command: disable remove battleground'),(361,'Command: disable remove map'),(362,'Command: disable remove mmap'),(363,'Command: disable remove outdoorpvp'),(364,'Command: disable remove quest'),(365,'Command: disable remove spell'),(366,'Command: disable remove vmap'),(367,'Command: event'),(368,'Command: event activelist'),(369,'Command: event start'),(370,'Command: event stop'),(371,'Command: gm'),(372,'Command: gm chat'),(373,'Command: gm fly'),(374,'Command: gm ingame'),(375,'Command: gm list'),(376,'Command: gm visible'),(377,'Command: go'),(378,'Command: go creature'),(379,'Command: go graveyard'),(380,'Command: go grid'),(381,'Command: go object'),(382,'Command: go taxinode'),(383,'Command: go ticket'),(384,'Command: go trigger'),(385,'Command: go xyz'),(386,'Command: go zonexy'),(387,'Command: gobject'),(388,'Command: gobject activate'),(389,'Command: gobject add'),(390,'Command: gobject add temp'),(391,'Command: gobject delete'),(392,'Command: gobject info'),(393,'Command: gobject move'),(394,'Command: gobject near'),(395,'Command: gobject set'),(396,'Command: gobject set phase'),(397,'Command: gobject set state'),(398,'Command: gobject target'),(399,'Command: gobject turn'),(400,'debug transport'),(401,'Command: guild'),(402,'Command: guild create'),(403,'Command: guild delete'),(404,'Command: guild invite'),(405,'Command: guild uninvite'),(406,'Command: guild rank'),(407,'Command: guild rename'),(408,'Command: honor'),(409,'Command: honor add'),(410,'Command: honor add kill'),(411,'Command: honor update'),(412,'Command: instance'),(413,'Command: instance listbinds'),(414,'Command: instance unbind'),(415,'Command: instance stats'),(416,'Command: instance savedata'),(417,'Command: learn'),(418,'Command: learn all'),(419,'Command: learn all my'),(420,'Command: learn all my class'),(421,'Command: learn all my pettalents'),(422,'Command: learn all my spells'),(423,'Command: learn all my talents'),(424,'Command: learn all gm'),(425,'Command: learn all crafts'),(426,'Command: learn all default'),(427,'Command: learn all lang'),(428,'Command: learn all recipes'),(429,'Command: unlearn'),(430,'Command: lfg'),(431,'Command: lfg player'),(432,'Command: lfg group'),(433,'Command: lfg queue'),(434,'Command: lfg clean'),(435,'Command: lfg options'),(436,'Command: list'),(437,'Command: list creature'),(438,'Command: list item'),(439,'Command: list object'),(440,'Command: list auras'),(441,'Command: list mail'),(442,'Command: lookup'),(443,'Command: lookup area'),(444,'Command: lookup creature'),(445,'Command: lookup event'),(446,'Command: lookup faction'),(447,'Command: lookup item'),(448,'Command: lookup itemset'),(449,'Command: lookup object'),(450,'Command: lookup quest'),(451,'Command: lookup player'),(452,'Command: lookup player ip'),(453,'Command: lookup player account'),(454,'Command: lookup player email'),(455,'Command: lookup skill'),(456,'Command: lookup spell'),(457,'Command: lookup spell id'),(458,'Command: lookup taxinode'),(459,'Command: lookup tele'),(460,'Command: lookup title'),(461,'Command: lookup map'),(462,'Command: announce'),(463,'Command: channel'),(464,'Command: channel set'),(465,'Command: channel set ownership'),(466,'Command: gmannounce'),(467,'Command: gmnameannounce'),(468,'Command: gmnotify'),(469,'Command: nameannounce'),(470,'Command: notify'),(471,'Command: whispers'),(472,'Command: group'),(473,'Command: group leader'),(474,'Command: group disband'),(475,'Command: group remove'),(476,'Command: group join'),(477,'Command: group list'),(478,'Command: group summon'),(479,'Command: pet'),(480,'Command: pet create'),(481,'Command: pet learn'),(482,'Command: pet unlearn'),(483,'Command: send'),(484,'Command: send items'),(485,'Command: send mail'),(486,'Command: send message'),(487,'Command: send money'),(488,'Command: additem'),(489,'Command: additemset'),(490,'Command: appear'),(491,'Command: aura'),(492,'Command: bank'),(493,'Command: bindsight'),(494,'Command: combatstop'),(495,'Command: cometome'),(496,'Command: commands'),(497,'Command: cooldown'),(498,'Command: damage'),(499,'Command: dev'),(500,'Command: die'),(501,'Command: dismount'),(502,'Command: distance'),(503,'Command: flusharenapoints'),(504,'Command: freeze'),(505,'Command: gps'),(506,'Command: guid'),(507,'Command: help'),(508,'Command: hidearea'),(509,'Command: itemmove'),(510,'Command: kick'),(511,'Command: linkgrave'),(512,'Command: listfreeze'),(513,'Command: maxskill'),(514,'Command: movegens'),(515,'Command: mute'),(516,'Command: neargrave'),(517,'Command: pinfo'),(518,'Command: playall'),(519,'Command: possess'),(520,'Command: recall'),(521,'Command: repairitems'),(522,'Command: respawn'),(523,'Command: revive'),(524,'Command: saveall'),(525,'Command: save'),(526,'Command: setskill'),(527,'Command: showarea'),(528,'Command: summon'),(529,'Command: unaura'),(530,'Command: unbindsight'),(531,'Command: unfreeze'),(532,'Command: unmute'),(533,'Command: unpossess'),(534,'Command: unstuck'),(535,'Command: wchange'),(536,'Command: mmap'),(537,'Command: mmap loadedtiles'),(538,'Command: mmap loc'),(539,'Command: mmap path'),(540,'Command: mmap stats'),(541,'Command: mmap testarea'),(542,'Command: morph'),(543,'Command: demorph'),(544,'Command: modify'),(545,'Command: modify arenapoints'),(546,'Command: modify bit'),(547,'Command: modify drunk'),(548,'Command: modify energy'),(549,'Command: modify faction'),(550,'Command: modify gender'),(551,'Command: modify honor'),(552,'Command: modify hp'),(553,'Command: modify mana'),(554,'Command: modify money'),(555,'Command: modify mount'),(556,'Command: modify phase'),(557,'Command: modify rage'),(558,'Command: modify reputation'),(559,'Command: modify runicpower'),(560,'Command: modify scale'),(561,'Command: modify speed'),(562,'Command: modify speed all'),(563,'Command: modify speed backwalk'),(564,'Command: modify speed fly'),(565,'Command: modify speed walk'),(566,'Command: modify speed swim'),(567,'Command: modify spell'),(568,'Command: modify standstate'),(569,'Command: modify talentpoints'),(570,'Command: npc'),(571,'Command: npc add'),(572,'Command: npc add formation'),(573,'Command: npc add item'),(574,'Command: npc add move'),(575,'Command: npc add temp'),(576,'Command: npc add delete'),(577,'Command: npc add delete item'),(578,'Command: npc add follow'),(579,'Command: npc add follow stop'),(580,'Command: npc set'),(581,'Command: npc set allowmove'),(582,'Command: npc set entry'),(583,'Command: npc set factionid'),(584,'Command: npc set flag'),(585,'Command: npc set level'),(586,'Command: npc set link'),(587,'Command: npc set model'),(588,'Command: npc set movetype'),(589,'Command: npc set phase'),(590,'Command: npc set spawndist'),(591,'Command: npc set spawntime'),(592,'Command: npc set data'),(593,'Command: npc info'),(594,'Command: npc near'),(595,'Command: npc move'),(596,'Command: npc playemote'),(597,'Command: npc say'),(598,'Command: npc textemote'),(599,'Command: npc whisper'),(600,'Command: npc yell'),(601,'Command: npc tame'),(602,'Command: quest'),(603,'Command: quest add'),(604,'Command: quest complete'),(605,'Command: quest remove'),(606,'Command: quest reward'),(607,'Command: reload'),(608,'Command: reload access_requirement'),(609,'Command: reload achievement_criteria_data'),(610,'Command: reload achievement_reward'),(611,'Command: reload all'),(612,'Command: reload all achievement'),(613,'Command: reload all area'),(614,'Command: broadcast_text'),(615,'Command: reload all gossips'),(616,'Command: reload all item'),(617,'Command: reload all locales'),(618,'Command: reload all loot'),(619,'Command: reload all npc'),(620,'Command: reload all quest'),(621,'Command: reload all scripts'),(622,'Command: reload all spell'),(623,'Command: reload areatrigger_involvedrelation'),(624,'Command: reload areatrigger_tavern'),(625,'Command: reload areatrigger_teleport'),(626,'Command: reload auctions'),(627,'Command: reload autobroadcast'),(628,'Command: reload command'),(629,'Command: reload conditions'),(630,'Command: reload config'),(631,'Command: reload battleground_template'),(632,'Command: .mutehistory'),(633,'Command: reload creature_linked_respawn'),(634,'Command: reload creature_loot_template'),(635,'Command: reload creature_onkill_reputation'),(636,'Command: reload creature_questender'),(637,'Command: reload creature_queststarter'),(638,'Command: reload creature_summon_groups'),(639,'Command: reload creature_template'),(640,'Command: reload creature_text'),(641,'Command: reload disables'),(642,'Command: reload disenchant_loot_template'),(643,'Command: reload event_scripts'),(644,'Command: reload fishing_loot_template'),(645,'Command: reload game_graveyard_zone'),(646,'Command: reload game_tele'),(647,'Command: reload gameobject_questender'),(648,'Command: reload gameobject_loot_template'),(649,'Command: reload gameobject_queststarter'),(650,'Command: reload gm_tickets'),(651,'Command: reload gossip_menu'),(652,'Command: reload gossip_menu_option'),(653,'Command: reload item_enchantment_template'),(654,'Command: reload item_loot_template'),(655,'Command: reload item_set_names'),(656,'Command: reload lfg_dungeon_rewards'),(657,'Command: reload locales_achievement_reward'),(658,'Command: reload locales_creature'),(659,'Command: reload locales_creature_text'),(660,'Command: reload locales_gameobject'),(661,'Command: reload locales_gossip_menu_option'),(662,'Command: reload locales_item'),(663,'Command: reload locales_item_set_name'),(664,'Command: reload locales_npc_text'),(665,'Command: reload locales_page_text'),(666,'Command: reload locales_points_of_interest'),(667,'Command: reload locales_quest'),(668,'Command: reload mail_level_reward'),(669,'Command: reload mail_loot_template'),(670,'Command: reload milling_loot_template'),(671,'Command: reload npc_spellclick_spells'),(672,'Command: reload npc_trainer'),(673,'Command: reload npc_vendor'),(674,'Command: reload page_text'),(675,'Command: reload pickpocketing_loot_template'),(676,'Command: reload points_of_interest'),(677,'Command: reload prospecting_loot_template'),(678,'Command: reload quest_poi'),(679,'Command: reload quest_template'),(680,'Command: reload rbac'),(681,'Command: reload reference_loot_template'),(682,'Command: reload reserved_name'),(683,'Command: reload reputation_reward_rate'),(684,'Command: reload reputation_spillover_template'),(685,'Command: reload skill_discovery_template'),(686,'Command: reload skill_extra_item_template'),(687,'Command: reload skill_fishing_base_level'),(688,'Command: reload skinning_loot_template'),(689,'Command: reload smart_scripts'),(690,'Command: reload spell_required'),(691,'Command: reload spell_area'),(692,'Command: reload spell_bonus_data'),(693,'Command: reload spell_group'),(694,'Command: reload spell_learn_spell'),(695,'Command: reload spell_loot_template'),(696,'Command: reload spell_linked_spell'),(697,'Command: reload spell_pet_auras'),(698,'Command: reload spell_proc_event'),(699,'Command: reload spell_proc'),(700,'Command: reload spell_scripts'),(701,'Command: reload spell_target_position'),(702,'Command: reload spell_threats'),(703,'Command: reload spell_group_stack_rules'),(704,'Command: reload trinity_string'),(705,'Command: reload warden_action'),(706,'Command: reload waypoint_scripts'),(707,'Command: reload waypoint_data'),(708,'Command: reload vehicle_accessory'),(709,'Command: reload vehicle_template_accessory'),(710,'Command: reset'),(711,'Command: reset achievements'),(712,'Command: reset honor'),(713,'Command: reset level'),(714,'Command: reset spells'),(715,'Command: reset stats'),(716,'Command: reset talents'),(717,'Command: reset all'),(718,'Command: server'),(719,'Command: server corpses'),(720,'Command: server exit'),(721,'Command: server idlerestart'),(722,'Command: server idlerestart cancel'),(723,'Command: server idleshutdown'),(724,'Command: server idleshutdown cancel'),(725,'Command: server info'),(726,'Command: server plimit'),(727,'Command: server restart'),(728,'Command: server restart cancel'),(729,'Command: server set'),(730,'Command: server set closed'),(731,'Command: server set difftime'),(732,'Command: server set loglevel'),(733,'Command: server set motd'),(734,'Command: server shutdown'),(735,'Command: server shutdown cancel'),(736,'Command: server motd'),(737,'Command: tele'),(738,'Command: tele add'),(739,'Command: tele del'),(740,'Command: tele name'),(741,'Command: tele group'),(742,'Command: ticket'),(743,'Command: ticket assign'),(744,'Command: ticket close'),(745,'Command: ticket closedlist'),(746,'Command: ticket comment'),(747,'Command: ticket complete'),(748,'Command: ticket delete'),(749,'Command: ticket escalate'),(750,'Command: ticket escalatedlist'),(751,'Command: ticket list'),(752,'Command: ticket onlinelist'),(753,'Command: ticket reset'),(754,'Command: ticket response'),(755,'Command: ticket response append'),(756,'Command: ticket response appendln'),(757,'Command: ticket togglesystem'),(758,'Command: ticket unassign'),(759,'Command: ticket viewid'),(760,'Command: ticket viewname'),(761,'Command: titles'),(762,'Command: titles add'),(763,'Command: titles current'),(764,'Command: titles remove'),(765,'Command: titles set'),(766,'Command: titles set mask'),(767,'Command: wp'),(768,'Command: wp add'),(769,'Command: wp event'),(770,'Command: wp load'),(771,'Command: wp modify'),(772,'Command: wp unload'),(773,'Command: wp reload'),(774,'Command: wp show'),(777,'Command: mailbox'),(778,'Command: ahbot'),(779,'Command: ahbot items'),(780,'Command: ahbot items gray'),(781,'Command: ahbot items white'),(782,'Command: ahbot items green'),(783,'Command: ahbot items blue'),(784,'Command: ahbot items purple'),(785,'Command: ahbot items orange'),(786,'Command: ahbot items yellow'),(787,'Command: ahbot ratio'),(788,'Command: ahbot ratio alliance'),(789,'Command: ahbot ratio horde'),(790,'Command: ahbot ratio neutral'),(791,'Command: ahbot rebuild'),(792,'Command: ahbot reload'),(793,'Command: ahbot status'),(794,'Command: .guild info'),(797,'Command: pvpstats'),(798,'Command: .mod xp'); +INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'),(192,'Role: Sec Level Administrator'),(193,'Role: Sec Level Gamemaster'),(194,'Role: Sec Level Moderator'),(195,'Role: Sec Level Player'),(196,'Role: Administrator Commands'),(197,'Role: Gamemaster Commands'),(198,'Role: Moderator Commands'),(199,'Role: Player Commands'),(200,'Command: rbac'),(201,'Command: rbac account'),(202,'Command: rbac account list'),(203,'Command: rbac account grant'),(204,'Command: rbac account deny'),(205,'Command: rbac account revoke'),(206,'Command: rbac list'),(207,'Command: battlenetaccount'),(208,'Command: battlenetaccount create'),(209,'Command: battlenetaccount lock country'),(210,'Command: battlenetaccount lock ip'),(211,'Command: battlenetaccount password'),(212,'Command: battlenetaccount set'),(213,'Command: battlenetaccount set password'),(214,'Command: bnetaccount link'),(215,'Command: bnetaccount unlink'),(216,'Command: bnetaccount gameaccountcreate'),(217,'Command: account'),(218,'Command: account addon'),(219,'Command: account create'),(220,'Command: account delete'),(221,'Command: account lock'),(222,'Command: account lock country'),(223,'Command: account lock ip'),(224,'Command: account onlinelist'),(225,'Command: account password'),(226,'Command: account set'),(227,'Command: account set addon'),(228,'Command: account set gmlevel'),(229,'Command: account set password'),(230,'Command: achievement'),(231,'Command: achievement add'),(232,'Command: arena'),(233,'Command: arena captain'),(234,'Command: arena create'),(235,'Command: arena disband'),(236,'Command: arena info'),(237,'Command: arena lookup'),(238,'Command: arena rename'),(239,'Command: ban'),(240,'Command: ban account'),(241,'Command: ban character'),(242,'Command: ban ip'),(243,'Command: ban playeraccount'),(244,'Command: baninfo'),(245,'Command: baninfo account'),(246,'Command: baninfo character'),(247,'Command: baninfo ip'),(248,'Command: banlist'),(249,'Command: banlist account'),(250,'Command: banlist character'),(251,'Command: banlist ip'),(252,'Command: unban'),(253,'Command: unban account'),(254,'Command: unban character'),(255,'Command: unban ip'),(256,'Command: unban playeraccount'),(257,'Command: bf'),(258,'Command: bf start'),(259,'Command: bf stop'),(260,'Command: bf switch'),(261,'Command: bf timer'),(262,'Command: bf enable'),(263,'Command: account email'),(264,'Command: account set sec'),(265,'Command: account set sec email'),(266,'Command: account set sec regmail'),(267,'Command: cast'),(268,'Command: cast back'),(269,'Command: cast dist'),(270,'Command: cast self'),(271,'Command: cast target'),(272,'Command: cast dest'),(273,'Command: character'),(274,'Command: character customize'),(275,'Command: character changefaction'),(276,'Command: character changerace'),(277,'Command: character deleted'),(279,'Command: character deleted list'),(280,'Command: character deleted restore'),(283,'Command: character level'),(284,'Command: character rename'),(285,'Command: character reputation'),(286,'Command: character titles'),(287,'Command: levelup'),(288,'Command: pdump'),(289,'Command: pdump load'),(290,'Command: pdump write'),(291,'Command: cheat'),(292,'Command: cheat casttime'),(293,'Command: cheat cooldown'),(294,'Command: cheat explore'),(295,'Command: cheat god'),(296,'Command: cheat power'),(297,'Command: cheat status'),(298,'Command: cheat taxi'),(299,'Command: cheat waterwalk'),(300,'Command: debug'),(301,'Command: debug anim'),(302,'Command: debug areatriggers'),(303,'Command: debug arena'),(304,'Command: debug bg'),(305,'Command: debug entervehicle'),(306,'Command: debug getitemstate'),(307,'Command: debug getitemvalue'),(308,'Command: debug getvalue'),(309,'Command: debug hostil'),(310,'Command: debug itemexpire'),(311,'Command: debug lootrecipient'),(312,'Command: debug los'),(313,'Command: debug mod32value'),(314,'Command: debug moveflags'),(315,'Command: debug play'),(316,'Command: debug play cinematics'),(317,'Command: debug play movie'),(318,'Command: debug play sound'),(319,'Command: debug send'),(320,'Command: debug send buyerror'),(321,'Command: debug send channelnotify'),(322,'Command: debug send chatmessage'),(323,'Command: debug send equiperror'),(324,'Command: debug send largepacket'),(325,'Command: debug send opcode'),(326,'Command: debug send qinvalidmsg'),(327,'Command: debug send qpartymsg'),(328,'Command: debug send sellerror'),(329,'Command: debug send setphaseshift'),(330,'Command: debug send spellfail'),(331,'Command: debug setaurastate'),(332,'Command: debug setbit'),(333,'Command: debug setitemvalue'),(334,'Command: debug setvalue'),(335,'Command: debug setvid'),(336,'Command: debug spawnvehicle'),(337,'Command: debug threat'),(338,'Command: debug update'),(339,'Command: debug uws'),(340,'Command: wpgps'),(341,'Command: deserter'),(342,'Command: deserter bg'),(343,'Command: deserter bg add'),(344,'Command: deserter bg remove'),(345,'Command: deserter instance'),(346,'Command: deserter instance add'),(347,'Command: deserter instance remove'),(348,'Command: disable'),(349,'Command: disable add'),(350,'Command: disable add achievement_criteria'),(351,'Command: disable add battleground'),(352,'Command: disable add map'),(353,'Command: disable add mmap'),(354,'Command: disable add outdoorpvp'),(355,'Command: disable add quest'),(356,'Command: disable add spell'),(357,'Command: disable add vmap'),(358,'Command: disable remove'),(359,'Command: disable remove achievement_criteria'),(360,'Command: disable remove battleground'),(361,'Command: disable remove map'),(362,'Command: disable remove mmap'),(363,'Command: disable remove outdoorpvp'),(364,'Command: disable remove quest'),(365,'Command: disable remove spell'),(366,'Command: disable remove vmap'),(367,'Command: event'),(368,'Command: event activelist'),(369,'Command: event start'),(370,'Command: event stop'),(371,'Command: gm'),(372,'Command: gm chat'),(373,'Command: gm fly'),(374,'Command: gm ingame'),(375,'Command: gm list'),(376,'Command: gm visible'),(377,'Command: go'),(378,'Command: go creature'),(379,'Command: go graveyard'),(380,'Command: go grid'),(381,'Command: go object'),(382,'Command: go taxinode'),(383,'Command: go ticket'),(384,'Command: go trigger'),(385,'Command: go xyz'),(386,'Command: go zonexy'),(387,'Command: gobject'),(388,'Command: gobject activate'),(389,'Command: gobject add'),(390,'Command: gobject add temp'),(391,'Command: gobject delete'),(392,'Command: gobject info'),(393,'Command: gobject move'),(394,'Command: gobject near'),(395,'Command: gobject set'),(396,'Command: gobject set phase'),(397,'Command: gobject set state'),(398,'Command: gobject target'),(399,'Command: gobject turn'),(400,'debug transport'),(401,'Command: guild'),(402,'Command: guild create'),(403,'Command: guild delete'),(404,'Command: guild invite'),(405,'Command: guild uninvite'),(406,'Command: guild rank'),(407,'Command: guild rename'),(408,'Command: honor'),(409,'Command: honor add'),(410,'Command: honor add kill'),(411,'Command: honor update'),(412,'Command: instance'),(413,'Command: instance listbinds'),(414,'Command: instance unbind'),(415,'Command: instance stats'),(416,'Command: instance savedata'),(417,'Command: learn'),(418,'Command: learn all'),(419,'Command: learn all my'),(420,'Command: learn all my class'),(421,'Command: learn all my pettalents'),(422,'Command: learn all my spells'),(423,'Command: learn all my talents'),(424,'Command: learn all gm'),(425,'Command: learn all crafts'),(426,'Command: learn all default'),(427,'Command: learn all lang'),(428,'Command: learn all recipes'),(429,'Command: unlearn'),(430,'Command: lfg'),(431,'Command: lfg player'),(432,'Command: lfg group'),(433,'Command: lfg queue'),(434,'Command: lfg clean'),(435,'Command: lfg options'),(436,'Command: list'),(437,'Command: list creature'),(438,'Command: list item'),(439,'Command: list object'),(440,'Command: list auras'),(441,'Command: list mail'),(442,'Command: lookup'),(443,'Command: lookup area'),(444,'Command: lookup creature'),(445,'Command: lookup event'),(446,'Command: lookup faction'),(447,'Command: lookup item'),(448,'Command: lookup itemset'),(449,'Command: lookup object'),(450,'Command: lookup quest'),(451,'Command: lookup player'),(452,'Command: lookup player ip'),(453,'Command: lookup player account'),(454,'Command: lookup player email'),(455,'Command: lookup skill'),(456,'Command: lookup spell'),(457,'Command: lookup spell id'),(458,'Command: lookup taxinode'),(459,'Command: lookup tele'),(460,'Command: lookup title'),(461,'Command: lookup map'),(462,'Command: announce'),(463,'Command: channel'),(464,'Command: channel set'),(465,'Command: channel set ownership'),(466,'Command: gmannounce'),(467,'Command: gmnameannounce'),(468,'Command: gmnotify'),(469,'Command: nameannounce'),(470,'Command: notify'),(471,'Command: whispers'),(472,'Command: group'),(473,'Command: group leader'),(474,'Command: group disband'),(475,'Command: group remove'),(476,'Command: group join'),(477,'Command: group list'),(478,'Command: group summon'),(479,'Command: pet'),(480,'Command: pet create'),(481,'Command: pet learn'),(482,'Command: pet unlearn'),(483,'Command: send'),(484,'Command: send items'),(485,'Command: send mail'),(486,'Command: send message'),(487,'Command: send money'),(488,'Command: additem'),(489,'Command: additemset'),(490,'Command: appear'),(491,'Command: aura'),(492,'Command: bank'),(493,'Command: bindsight'),(494,'Command: combatstop'),(495,'Command: cometome'),(496,'Command: commands'),(497,'Command: cooldown'),(498,'Command: damage'),(499,'Command: dev'),(500,'Command: die'),(501,'Command: dismount'),(502,'Command: distance'),(503,'Command: flusharenapoints'),(504,'Command: freeze'),(505,'Command: gps'),(506,'Command: guid'),(507,'Command: help'),(508,'Command: hidearea'),(509,'Command: itemmove'),(510,'Command: kick'),(511,'Command: linkgrave'),(512,'Command: listfreeze'),(513,'Command: maxskill'),(514,'Command: movegens'),(515,'Command: mute'),(516,'Command: neargrave'),(517,'Command: pinfo'),(518,'Command: playall'),(519,'Command: possess'),(520,'Command: recall'),(521,'Command: repairitems'),(522,'Command: respawn'),(523,'Command: revive'),(524,'Command: saveall'),(525,'Command: save'),(526,'Command: setskill'),(527,'Command: showarea'),(528,'Command: summon'),(529,'Command: unaura'),(530,'Command: unbindsight'),(531,'Command: unfreeze'),(532,'Command: unmute'),(533,'Command: unpossess'),(534,'Command: unstuck'),(535,'Command: wchange'),(536,'Command: mmap'),(537,'Command: mmap loadedtiles'),(538,'Command: mmap loc'),(539,'Command: mmap path'),(540,'Command: mmap stats'),(541,'Command: mmap testarea'),(542,'Command: morph'),(543,'Command: demorph'),(544,'Command: modify'),(545,'Command: modify arenapoints'),(546,'Command: modify bit'),(547,'Command: modify drunk'),(548,'Command: modify energy'),(549,'Command: modify faction'),(550,'Command: modify gender'),(551,'Command: modify honor'),(552,'Command: modify hp'),(553,'Command: modify mana'),(554,'Command: modify money'),(555,'Command: modify mount'),(556,'Command: modify phase'),(557,'Command: modify rage'),(558,'Command: modify reputation'),(559,'Command: modify runicpower'),(560,'Command: modify scale'),(561,'Command: modify speed'),(562,'Command: modify speed all'),(563,'Command: modify speed backwalk'),(564,'Command: modify speed fly'),(565,'Command: modify speed walk'),(566,'Command: modify speed swim'),(567,'Command: modify spell'),(568,'Command: modify standstate'),(569,'Command: modify talentpoints'),(570,'Command: npc'),(571,'Command: npc add'),(572,'Command: npc add formation'),(573,'Command: npc add item'),(574,'Command: npc add move'),(575,'Command: npc add temp'),(576,'Command: npc add delete'),(577,'Command: npc add delete item'),(578,'Command: npc add follow'),(579,'Command: npc add follow stop'),(580,'Command: npc set'),(581,'Command: npc set allowmove'),(582,'Command: npc set entry'),(583,'Command: npc set factionid'),(584,'Command: npc set flag'),(585,'Command: npc set level'),(586,'Command: npc set link'),(587,'Command: npc set model'),(588,'Command: npc set movetype'),(589,'Command: npc set phase'),(590,'Command: npc set spawndist'),(591,'Command: npc set spawntime'),(592,'Command: npc set data'),(593,'Command: npc info'),(594,'Command: npc near'),(595,'Command: npc move'),(596,'Command: npc playemote'),(597,'Command: npc say'),(598,'Command: npc textemote'),(599,'Command: npc whisper'),(600,'Command: npc yell'),(601,'Command: npc tame'),(602,'Command: quest'),(603,'Command: quest add'),(604,'Command: quest complete'),(605,'Command: quest remove'),(606,'Command: quest reward'),(607,'Command: reload'),(608,'Command: reload access_requirement'),(609,'Command: reload achievement_criteria_data'),(610,'Command: reload achievement_reward'),(611,'Command: reload all'),(612,'Command: reload all achievement'),(613,'Command: reload all area'),(614,'Command: broadcast_text'),(615,'Command: reload all gossips'),(616,'Command: reload all item'),(617,'Command: reload all locales'),(618,'Command: reload all loot'),(619,'Command: reload all npc'),(620,'Command: reload all quest'),(621,'Command: reload all scripts'),(622,'Command: reload all spell'),(623,'Command: reload areatrigger_involvedrelation'),(624,'Command: reload areatrigger_tavern'),(625,'Command: reload areatrigger_teleport'),(626,'Command: reload auctions'),(627,'Command: reload autobroadcast'),(628,'Command: reload command'),(629,'Command: reload conditions'),(630,'Command: reload config'),(631,'Command: reload battleground_template'),(632,'Command: .mutehistory'),(633,'Command: reload creature_linked_respawn'),(634,'Command: reload creature_loot_template'),(635,'Command: reload creature_onkill_reputation'),(636,'Command: reload creature_questender'),(637,'Command: reload creature_queststarter'),(638,'Command: reload creature_summon_groups'),(639,'Command: reload creature_template'),(640,'Command: reload creature_text'),(641,'Command: reload disables'),(642,'Command: reload disenchant_loot_template'),(643,'Command: reload event_scripts'),(644,'Command: reload fishing_loot_template'),(645,'Command: reload game_graveyard_zone'),(646,'Command: reload game_tele'),(647,'Command: reload gameobject_questender'),(648,'Command: reload gameobject_loot_template'),(649,'Command: reload gameobject_queststarter'),(650,'Command: reload gm_tickets'),(651,'Command: reload gossip_menu'),(652,'Command: reload gossip_menu_option'),(653,'Command: reload item_enchantment_template'),(654,'Command: reload item_loot_template'),(655,'Command: reload item_set_names'),(656,'Command: reload lfg_dungeon_rewards'),(657,'Command: reload locales_achievement_reward'),(658,'Command: reload locales_creature'),(659,'Command: reload locales_creature_text'),(660,'Command: reload locales_gameobject'),(661,'Command: reload locales_gossip_menu_option'),(662,'Command: reload locales_item'),(663,'Command: reload locales_item_set_name'),(664,'Command: reload locales_npc_text'),(665,'Command: reload locales_page_text'),(666,'Command: reload locales_points_of_interest'),(667,'Command: reload locales_quest'),(668,'Command: reload mail_level_reward'),(669,'Command: reload mail_loot_template'),(670,'Command: reload milling_loot_template'),(671,'Command: reload npc_spellclick_spells'),(672,'Command: reload npc_trainer'),(673,'Command: reload npc_vendor'),(674,'Command: reload page_text'),(675,'Command: reload pickpocketing_loot_template'),(676,'Command: reload points_of_interest'),(677,'Command: reload prospecting_loot_template'),(678,'Command: reload quest_poi'),(679,'Command: reload quest_template'),(680,'Command: reload rbac'),(681,'Command: reload reference_loot_template'),(682,'Command: reload reserved_name'),(683,'Command: reload reputation_reward_rate'),(684,'Command: reload reputation_spillover_template'),(685,'Command: reload skill_discovery_template'),(686,'Command: reload skill_extra_item_template'),(687,'Command: reload skill_fishing_base_level'),(688,'Command: reload skinning_loot_template'),(689,'Command: reload smart_scripts'),(690,'Command: reload spell_required'),(691,'Command: reload spell_area'),(693,'Command: reload spell_group'),(694,'Command: reload spell_learn_spell'),(695,'Command: reload spell_loot_template'),(696,'Command: reload spell_linked_spell'),(697,'Command: reload spell_pet_auras'),(698,'Command: reload spell_proc_event'),(699,'Command: reload spell_proc'),(700,'Command: reload spell_scripts'),(701,'Command: reload spell_target_position'),(702,'Command: reload spell_threats'),(703,'Command: reload spell_group_stack_rules'),(704,'Command: reload trinity_string'),(705,'Command: reload warden_action'),(706,'Command: reload waypoint_scripts'),(707,'Command: reload waypoint_data'),(708,'Command: reload vehicle_accessory'),(709,'Command: reload vehicle_template_accessory'),(710,'Command: reset'),(711,'Command: reset achievements'),(712,'Command: reset honor'),(713,'Command: reset level'),(714,'Command: reset spells'),(715,'Command: reset stats'),(716,'Command: reset talents'),(717,'Command: reset all'),(718,'Command: server'),(719,'Command: server corpses'),(720,'Command: server exit'),(721,'Command: server idlerestart'),(722,'Command: server idlerestart cancel'),(723,'Command: server idleshutdown'),(724,'Command: server idleshutdown cancel'),(725,'Command: server info'),(726,'Command: server plimit'),(727,'Command: server restart'),(728,'Command: server restart cancel'),(729,'Command: server set'),(730,'Command: server set closed'),(731,'Command: server set difftime'),(732,'Command: server set loglevel'),(733,'Command: server set motd'),(734,'Command: server shutdown'),(735,'Command: server shutdown cancel'),(736,'Command: server motd'),(737,'Command: tele'),(738,'Command: tele add'),(739,'Command: tele del'),(740,'Command: tele name'),(741,'Command: tele group'),(742,'Command: ticket'),(743,'Command: ticket assign'),(744,'Command: ticket close'),(745,'Command: ticket closedlist'),(746,'Command: ticket comment'),(747,'Command: ticket complete'),(748,'Command: ticket delete'),(749,'Command: ticket escalate'),(750,'Command: ticket escalatedlist'),(751,'Command: ticket list'),(752,'Command: ticket onlinelist'),(753,'Command: ticket reset'),(754,'Command: ticket response'),(755,'Command: ticket response append'),(756,'Command: ticket response appendln'),(757,'Command: ticket togglesystem'),(758,'Command: ticket unassign'),(759,'Command: ticket viewid'),(760,'Command: ticket viewname'),(761,'Command: titles'),(762,'Command: titles add'),(763,'Command: titles current'),(764,'Command: titles remove'),(765,'Command: titles set'),(766,'Command: titles set mask'),(767,'Command: wp'),(768,'Command: wp add'),(769,'Command: wp event'),(770,'Command: wp load'),(771,'Command: wp modify'),(772,'Command: wp unload'),(773,'Command: wp reload'),(774,'Command: wp show'),(777,'Command: mailbox'),(778,'Command: ahbot'),(779,'Command: ahbot items'),(780,'Command: ahbot items gray'),(781,'Command: ahbot items white'),(782,'Command: ahbot items green'),(783,'Command: ahbot items blue'),(784,'Command: ahbot items purple'),(785,'Command: ahbot items orange'),(786,'Command: ahbot items yellow'),(787,'Command: ahbot ratio'),(788,'Command: ahbot ratio alliance'),(789,'Command: ahbot ratio horde'),(790,'Command: ahbot ratio neutral'),(791,'Command: ahbot rebuild'),(792,'Command: ahbot reload'),(793,'Command: ahbot status'),(794,'Command: .guild info'),(797,'Command: pvpstats'),(798,'Command: .mod xp'); /*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -620,4 +621,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2014-11-11 0:57:33 +-- Dump completed on 2014-12-20 11:26:27 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/auth/2014_12_05_00_auth.sql b/sql/updates/auth/2014_12_05_00_auth.sql new file mode 100644 index 00000000000..95507c411f4 --- /dev/null +++ b/sql/updates/auth/2014_12_05_00_auth.sql @@ -0,0 +1 @@ +UPDATE `battlenet_components` SET `Build`=19243 WHERE `Build`=19116; diff --git a/sql/updates/auth/2014_12_10_00_auth.sql b/sql/updates/auth/2014_12_10_00_auth.sql new file mode 100644 index 00000000000..8068fd3c459 --- /dev/null +++ b/sql/updates/auth/2014_12_10_00_auth.sql @@ -0,0 +1,3 @@ +ALTER TABLE `rbac_default_permissions` +ADD COLUMN `realmId` INT(11) NOT NULL DEFAULT '-1' COMMENT 'Realm Id, -1 means all', +DROP PRIMARY KEY, ADD PRIMARY KEY (`secId`, `permissionId`, `realmId`); diff --git a/sql/updates/auth/2014_12_19_00_auth.sql b/sql/updates/auth/2014_12_19_00_auth.sql new file mode 100644 index 00000000000..1a975e766e5 --- /dev/null +++ b/sql/updates/auth/2014_12_19_00_auth.sql @@ -0,0 +1,2 @@ +DELETE FROM `rbac_permissions` WHERE `id`=692; +DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=692; diff --git a/sql/updates/auth/2014_12_20_00_auth.sql b/sql/updates/auth/2014_12_20_00_auth.sql new file mode 100644 index 00000000000..d5e29712246 --- /dev/null +++ b/sql/updates/auth/2014_12_20_00_auth.sql @@ -0,0 +1 @@ +UPDATE `battlenet_components` SET `Build`=19342 WHERE `Build`=19243; 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/sql/updates/world/2014_11_30_00_world.sql b/sql/updates/world/2014_11_30_00_world.sql new file mode 100644 index 00000000000..d946231922c --- /dev/null +++ b/sql/updates/world/2014_11_30_00_world.sql @@ -0,0 +1,30 @@ +ALTER TABLE `creature_template` CHANGE `minlevel` `minlevel` SMALLINT(5) NOT NULL DEFAULT '1' AFTER `gossip_menu_id`; +ALTER TABLE `creature_template` CHANGE `maxlevel` `maxlevel` SMALLINT(5) NOT NULL DEFAULT '1' AFTER `minlevel`; + +UPDATE `creature_template` SET `exp`=-1 WHERE `entry` IN (68, 309, 347, 352, 523, 603, 853, 857, 907, 931, 1233, 1284, 1387, 1571, 1572, 1573, 1642, 1652, 1735, 1736, 1737, 1739, 1740, 1741, 1756, 1976, 2041, 2225, 2226, 2299, 2302, 2389, 2409, 2432, 2804, 2835, 2851, 2858, 2859, 2861, 2941, 2995, 3083, 3084, 3210, 3211, 3213, 3214, 3296, 3305, 3310, 3343, 3468, 3469, 3502, 3575, 3615, 3625, 3838, 3841, 3890, 3936, 4255, 4257, 4262, 4267, 4309, 4310, 4312, 4314, 4317, 4319, 4321, 4407, 4423, 4551, 4624, 4968, 5118, 5134, 5135, 5139, 5595, 5597, 5603, 5624, 5952, 6026, 6526, 6706, 6726, 7410, 7427, 7823, 7824, 7975, 7980, 7999, 8018, 8019, 8020, 8055, 8096, 8609, 8610, 8670, 8719, 9297, 9460, 9521, 9526, 9527, 10038, 10181, 10360, 10364, 10367, 10583, 10897, 10981, 10982, 10985, 10986, 10987, 10989, 10990, 10991, 11099, 11102, 11138, 11139, 11190, 11194, 11600, 11602, 11603, 11604, 11605, 11606, 11657, 11675, 11676, 11677, 11678, 11822, 11837, 11838, 11839, 11840, 11899, 11900, 11901, 11946, 11947, 11948, 11949, 11997, 11998, 12047, 12048, 12050, 12051, 12052, 12053, 12096, 12097, 12121, 12122, 12127, 12159, 12160, 12197, 12198, 12577, 12578, 12596, 12616, 12617, 12636, 12740, 13078, 13079, 13080, 13081, 13086, 13087, 13088, 13089, 13096, 13097, 13098, 13099, 13116, 13117, 13137, 13138, 13139, 13140, 13143, 13144, 13145, 13146, 13147, 13149, 13150, 13151, 13152, 13153, 13154, 13155, 13161, 13176, 13177, 13178, 13179, 13180, 13181, 13216, 13218, 13221, 13236, 13256, 13257, 13281, 13284, 13296, 13297, 13298, 13299, 13300, 13316, 13317, 13318, 13319, 13320, 13324, 13325, 13326, 13327, 13328, 13329, 13330, 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13356, 13357, 13358, 13359, 13377, 13378, 13396, 13397, 13416, 13419, 13421, 13422, 13424, 13425, 13426, 13427, 13428, 13437, 13438, 13439, 13440, 13441, 13442, 13443, 13446, 13447, 13448, 13449, 13496, 13516, 13517, 13518, 13519, 13520, 13521, 13522, 13523, 13524, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13534, 13535, 13536, 13537, 13538, 13539, 13540, 13541, 13542, 13543, 13544, 13545, 13546, 13547, 13548, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13576, 13577, 13597, 13598, 13616, 13617, 13618, 13676, 13777, 13797, 13798, 13839, 13959, 13977, 14016, 14018, 14019, 14026, 14027, 14028, 14029, 14030, 14031, 14141, 14142, 14185, 14186, 14187, 14188, 14242, 14282, 14283, 14284, 14285, 14304, 14363, 14365, 14367, 14375, 14376, 14377, 14378, 14379, 14380, 14402, 14403, 14404, 14423, 14438, 14439, 14440, 14441, 14442, 14622, 14717, 14762, 14763, 14764, 14765, 14766, 14767, 14768, 14769, 14770, 14771, 14772, 14773, 14774, 14775, 14776, 14777, 14832, 14848, 14913, 14942, 14943, 14944, 14945, 14946, 14947, 14948, 14981, 14982, 15006, 15007, 15008, 15088, 15139, 15177, 15178, 15184, 15193, 15195, 15371, 15466, 15467, 15518, 15519, 15659, 15961, 16096, 16189, 16192, 16222, 16227, 16378, 16392, 16587, 16694, 16695, 16696, 16711, 16733, 16800, 16801, 16802, 16822, 16921, 17468, 17506, 17507, 17554, 17555, 17855, 18103, 18139, 18785, 18788, 18789, 18791, 18807, 18808, 18809, 18895, 18930, 18931, 18937, 18938, 18939, 18940, 18942, 18953, 18989, 19317, 19504, 19529, 19541, 19558, 19581, 19583, 19855, 19858, 19859, 19905, 19906, 19907, 19908, 19909, 19910, 19911, 19912, 19915, 19923, 19925, 20118, 20119, 20120, 20234, 20269, 20271, 20272, 20273, 20274, 20276, 20362, 20374, 20381, 20382, 20383, 20384, 20385, 20386, 20388, 20390, 20447, 20497, 20499, 20515, 20556, 20674, 20762, 21107, 21235, 21766, 21984, 21986, 22216, 22407, 22455, 22485, 22494, 22522, 22931, 22935, 22937, 23090, 23115, 23612, 23619, 23623, 23624, 23625, 23626, 23636, 23736, 23775, 23859, 24032, 24061, 24155, 24366, 24470, 24795, 24851, 25040, 25145, 25148, 25149, 25150, 25151, 25152, 25288, 25499, 25991, 26016, 26017, 26019, 26020, 26021, 26024, 26027, 26028, 26029, 26030, 26031, 26032, 26033, 26037, 26038, 26253, 26560, 26566, 26602, 26844, 26845, 26847, 26848, 26850, 26851, 26852, 26853, 26876, 26877, 26878, 26879, 26880, 26881, 27046, 27170, 27175, 27344, 27881, 27894, 27946, 27953, 28037, 28094, 28195, 28196, 28197, 28312, 28319, 28366, 28574, 28613, 28615, 28618, 28621, 28623, 28624, 28674, 28781, 28801, 28818, 28863, 28865, 29260, 29262, 29480, 29533, 29568, 29611, 29617, 29712, 29721, 29749, 29750, 29757, 29762, 29910, 29950, 29951, 30231, 30269, 30271, 30280, 30312, 30314, 30400, 30433, 30488, 30489, 30499, 30560, 30569, 30578, 30579, 30580, 30581, 30582, 30583, 30584, 30586, 30587, 30590, 30610, 30611, 30626, 30737, 30739, 30740, 30853, 30869, 30870, 31036, 31051, 31052, 31053, 31054, 31069, 31078, 31091, 31101, 31102, 31106, 31107, 31108, 31109, 31146, 31151, 31153, 31250, 31416, 31426, 31430, 31708, 31715, 31841, 31842, 32169, 32170, 32294, 32296, 32307, 32308, 32330, 32332, 32333, 32571, 32615, 32616, 32617, 32618, 32619, 32620, 32621, 32622, 32623, 32624, 32625, 32626, 32627, 32629, 33253, 33254, 33502, 33504, 33505, 33506, 33508, 33510, 33511, 33849, 34018, 34019, 34021, 34022, 34024, 34025, 34026, 34027, 34028, 34029, 34374, 34378, 34429, 34775, 34776, 34777, 34778, 34793, 34802, 34918, 34919, 34922, 34924, 34927, 34929, 34935, 34943, 34944, 34955, 34971, 34972, 34973, 34976, 34978, 34983, 34985, 34986, 34987, 34988, 34989, 34991, 34993, 34997, 34998, 34999, 35000, 35001, 35002, 35007, 35008, 35017, 35019, 35020, 35021, 35022, 35023, 35024, 35025, 35026, 35027, 35069, 35136, 35137, 35138, 35139, 35140, 35141, 35273, 35315, 35322, 35345, 35346, 35450, 35478, 35480, 35481, 35556, 35562, 35596, 35597, 35600, 35601, 35602, 35603, 35611, 35612, 35819, 36151, 36152, 36162, 36164, 36165, 36166, 36213, 36217, 36224, 36225, 36226, 36273, 36355, 36356, 36481, 36648, 36728, 37005, 37058, 37790, 37825, 37860, 37869, 37888, 37915, 37944, 38217, 38831, 38898, 38899, 38966, 39172, 39173, 39175, 39196, 39210, 39211, 39212, 39330, 39340, 39605, 39656, 39898, 39934, 40138, 40333, 40358, 40367, 40413, 40473, 40552, 40553, 40558, 40768, 40769, 40809, 40827, 40851, 40852, 40866, 40867, 40871, 40873, 40966, 41140, 41142, 41214, 41215, 41240, 41246, 41321, 41322, 41323, 41325, 41332, 41383, 41580, 41605, 41860, 41861, 41896, 42129, 42131, 42316, 42317, 42319, 42406, 42426, 42623, 42928, 42974, 42983, 43000, 43042, 43043, 43045, 43049, 43052, 43053, 43072, 43073, 43079, 43085, 43086, 43087, 43088, 43104, 43107, 43114, 43121, 43124, 43216, 43220, 43225, 43287, 43289, 43290, 43293, 43295, 43328, 43371, 43375, 43427, 43440, 43481, 43549, 43570, 43573, 43690, 43695, 43697, 43701, 43702, 43841, 43842, 43845, 43867, 43889, 43931, 43991, 44036, 44059, 44060, 44230, 44231, 44232, 44233, 44244, 44399, 44407, 44408, 44409, 44410, 44440, 44441, 44451, 44787, 44825, 44865, 44866, 44867, 44868, 44871, 44872, 44874, 44876, 44877, 44878, 45015, 45042, 45082, 45111, 45230, 45250, 45253, 45344, 45382, 45479, 45564, 45659, 45814, 45822, 45827, 45829, 46004, 46006, 46011, 46071, 46077, 46142, 46180, 46181, 46190, 46236, 46552, 46637, 46638, 46639, 46640, 46667, 46717, 46757, 46833, 46844, 46986, 47060, 47061, 47116, 47118, 47119, 47121, 47133, 47147, 47154, 47155, 47156, 47174, 47434, 47581, 47582, 47584, 47586, 47587, 47588, 47589, 47644, 47655, 47661, 47663, 47665, 47688, 47718, 47736, 47745, 47844, 47875, 47927, 48075, 48273, 48274, 48275, 48318, 48321, 48546, 48572, 48736, 48738, 48874, 48883, 49038, 49420, 49533, 49573, 49809, 49820, 50043, 50083, 50084, 50369, 50440, 50441, 50442, 50443, 50445, 50463, 50546, 50548, 50549, 50550, 50551, 50552, 50553, 50668, 50670, 50674, 50676, 50678, 50683, 50684, 51257, 51309, 51310, 51323, 51334, 51346, 51348, 51355, 51371, 51372, 51383, 51384, 51429, 51450, 51451, 51468, 51471, 51472, 51473, 51474, 51475, 51476, 51478, 51507, 51508, 51509, 51510, 51511, 51513, 51514, 51515, 51516, 51517, 51518, 51519, 51520, 51521, 51522, 51523, 51524, 51525, 51532, 51533, 51534, 51535, 51536, 51537, 51538, 51539, 51540, 51541, 51542, 51543, 51544, 51545, 51546, 51547, 51548, 51549, 51554, 51571, 51605, 51610, 51666, 51732, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, 51777, 51778, 51779, 51780, 51781, 51782, 51783, 51784, 51785, 51786, 51787, 51788, 51789, 51790, 51791, 51792, 51793, 51794, 51795, 51796, 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51804, 51805, 51806, 51807, 51808, 51809, 51810, 51811, 51812, 51813, 51814, 51815, 51816, 51817, 51818, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51827, 51828, 51829, 51830, 51831, 51832, 51834, 51835, 51837, 51838, 51839, 51840, 51841, 51842, 51843, 51844, 51845, 51846, 51847, 51848, 51849, 51850, 51851, 51852, 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, 51863, 51864, 51867, 51868, 51869, 51870, 51871, 51872, 51873, 51874, 51875, 51876, 51877, 51878, 51879, 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, 51900, 51901, 51902, 51903, 51904, 51905, 51906, 51907, 51908, 51909, 51910, 51911, 51912, 51913, 51914, 51915, 51916, 51917, 51918, 51919, 51920, 51921, 51922, 51923, 51924, 51925, 51938, 51986, 52009, 52010, 52011, 52012, 52013, 52018, 52060, 52084, 52184, 52280, 52404, 52410, 52646, 52670, 52700, 52753, 52767, 52792, 52817, 52821, 52983, 52996, 53000, 53008, 53352, 53518, 53537, 53562, 53563, 53598, 53649, 53657, 53660, 53663, 53667, 53669, 53676, 53736, 53755, 53783, 53905, 53956, 53957, 53958, 53959, 53960, 54116, 54168, 54208, 54209, 54226, 54260, 54297, 54300, 54301, 54302, 54306, 54313, 54334, 54344, 54345, 54346, 54392, 54393, 54441, 54442, 54443, 54471, 54472, 54473, 54499, 54502, 54509, 54519, 54523, 54524, 54548, 54601, 54788, 55003, 55382, 55396, 55402, 55520, 55561, 55568, 55577, 55578, 55657, 55660, 55778, 55779, 55805, 55810, 55842, 55844, 55860, 55861, 55904, 55911, 55912, 55913, 55914, 55967, 55968, 55969, 55971, 55996, 56041, 56139, 56140, 56141, 56142, 56143, 56144, 56160, 56737, 56771, 57281, 57287, 57288, 57289, 57473, 57474, 57475, 57629, 57630, 57800, 57801, 58181, 58255, 58336, 58505, 58612, 58765, 58770, 58777, 58782, 58784, 58787, 58788, 58792, 58816, 58840, 58855, 58870, 58877, 58878, 58912, 58913, 58914, 58929, 58934, 58936, 58939, 58948, 59048, 59086, 59087, 59088, 59089, 59317, 59375, 59471, 59595, 59596, 59604, 59654, 59658, 59812, 59922, 59923, 59952, 60152, 60219, 60226, 60227, 60228, 60969, 60971, 61138, 61478, 61744, 61745, 61759, 62087, 62092, 62334, 62742, 62808, 62824, 62827, 62841, 62911, 62912, 62913, 62926, 63351, 63357, 63364, 63372, 63373, 64044, 64045, 64250, 64479, 64519, 64526, 64529, 64560, 64564, 64565, 64573, 64574, 64584, 64586, 64587, 64600, 64615, 64629, 64709, 64727, 64728, 64729, 64732, 64733, 64734, 64735, 64736, 64900, 64923, 64956, 64957, 64997, 64998, 65138, 65151, 65152, 65154, 65227, 65228, 65232, 65236, 65237, 65238, 65239, 65240, 65241, 65310, 65442, 65444, 65474, 65494, 65507, 65510, 65539, 65540, 65548, 65549, 65609, 65610, 65611, 65643, 65654, 65680, 65785, 65786, 65801, 65807, 65863, 65865, 65867, 66091, 66458, 66666, 66913, 67013, 67014, 67149, 67150, 67195, 67196, 67197, 67198, 67199, 67200, 67260, 67267, 67418, 67560, 67580, 67581, 67754, 67785, 67790, 67796, 67840, 67864, 67867, 67923, 67944, 67945, 67947, 67953, 67965, 67968, 67973, 67979, 67987, 67989, 67992, 68003, 68008, 68023, 68025, 68053, 68054, 68059, 68072, 68084, 68085, 68086, 68088, 68108, 68144, 68216, 68223, 68226, 68235, 68236, 68237, 68242, 68278, 68287, 68293, 68315, 68323, 68329, 68336, 68339, 68357, 68363, 68364, 68365, 68370, 68372, 68392, 68399, 68403, 68404, 68405, 68406, 68408, 68424, 68425, 68429, 68430, 68496, 68514, 68538, 68544, 68586, 68589, 68590, 68592, 68593, 68609, 68631, 68633, 68634, 68637, 68642, 68643, 68644, 68645, 68651, 68652, 68677, 68678, 68679, 68689, 68690, 68749, 68764, 68765, 68767, 68768, 68777, 68792, 68794, 68842, 68882, 68920, 68921, 68922, 68924, 68930, 68941, 68955, 68966, 68970, 68972, 68975, 68979, 68980, 68981, 68982, 68990, 68991, 68992, 68994, 68995, 68996, 69026, 69359, 69360, 69422, 69797, 69799, 69838, 70085, 70086, 70087, 70088, 70131, 70132, 70245, 70253, 70309, 70337, 70354, 70362, 70363, 70370, 70371, 70381, 70498, 70643, 70682, 70690, 70691, 70705, 70706, 70741, 70799, 70822, 70824, 70877, 70959, 70978, 71042, 71111, 71112, 71123, 71147, 71148, 71149, 71151, 71177, 71210, 71246, 71249, 71250, 71265, 71280, 71302, 71303, 71340, 71344, 71358, 71359, 71360, 71369, 71487, 71490, 71491, 71492, 71589, 71592, 71718, 71719, 71794, 71837, 71972, 71973, 71974, 71982, 71992, 72005, 72038, 72227, 72302, 72311, 72312, 72313, 72318, 72366, 72371, 72376, 72392, 72394, 72422, 72423, 72424, 72425, 72501, 72515, 72534, 72548, 72549, 72559, 72560, 72561, 72570, 72579, 72580, 72581, 72614, 72774, 72886, 72911, 72912, 73082, 73120, 73121, 73122, 73343, 73347, 73361, 73362, 73385, 73386, 73554, 73558, 73561, 73562, 73563, 73584, 73585, 73586, 73587, 73588, 73600, 73602, 73614, 73664, 73709, 73710, 73711, 73712, 73713, 73714, 73715, 73726, 73727, 73728, 73811, 73818, 73820, 73909, 73910, 73927, 73929, 73941, 73942, 73957, 73962, 74060, 74061, 74089, 74217, 74219, 76357); + +UPDATE `creature_template` SET `minlevel`=-10 WHERE `entry` IN (10981, 10990, 13618, 13676, 25499); +UPDATE `creature_template` SET `maxlevel`=-10 WHERE `entry` IN (10981, 10990); +UPDATE `creature_template` SET `maxlevel`=-9 WHERE `entry` IN (13618, 13676); +UPDATE `creature_template` SET `minlevel`=-6 WHERE `entry` IN (11602, 11605, 13080, 13081, 13087, 13089, 13096, 13097, 13098, 13099); +UPDATE `creature_template` SET `minlevel`=-5 WHERE `entry` IN (2225, 3343, 3625, 4255, 4257, 5134, 5135, 5139, 10364, 10367, 12047, 12048, 12052, 12096, 12097, 13149); +UPDATE `creature_template` SET `maxlevel`=-5 WHERE `entry` IN (2225, 3343, 3625, 4255, 4257, 5134, 5135, 5139, 10364, 10367, 11602, 11605, 12047, 12048, 12052, 12096, 12097, 13080, 13081, 13087, 13089, 13096, 13097, 13098, 13099); +UPDATE `creature_template` SET `minlevel`=-4 WHERE `entry` IN (10989, 11838, 11839, 13325, 13327, 13330, 13448, 13534, 13537, 13540, 13543, 13546, 13549, 13552, 13555); +UPDATE `creature_template` SET `maxlevel`=-4 WHERE `entry` IN (13149, 13325, 13327, 13330); +UPDATE `creature_template` SET `minlevel`=-3 WHERE `entry` IN (12051, 12127, 13150, 13335, 13336, 13337); +UPDATE `creature_template` SET `maxlevel`=-3 WHERE `entry` IN (11838, 11839, 12051, 12127, 13335, 13336, 13337, 13448, 13534, 13537, 13540, 13543, 13546, 13549, 13552, 13555); +UPDATE `creature_template` SET `minlevel`=-2 WHERE `entry` IN (11657, 11677, 11840, 12050, 12053, 13078, 13079, 13086, 13088, 13180, 13216, 13218, 13221, 13284, 13324, 13329, 13426, 13427, 13428, 13438, 13440, 13447, 13516, 13520, 13524, 13528, 13535, 13538, 13541, 13544, 13547, 13550, 13553, 13556, 13576, 13777, 14141, 14142, 30739, 30740); +UPDATE `creature_template` SET `maxlevel`=-2 WHERE `entry` IN (10989, 11657, 11677, 12050, 12053, 13078, 13079, 13086, 13088, 13150, 13180, 13216, 13218, 13221, 13284, 13324, 13329, 13426, 13427, 13428, 13438, 13440, 13447, 13516, 13520, 13524, 13528, 13576, 14141, 14142, 30739, 30740); +UPDATE `creature_template` SET `minlevel`=-1 WHERE `entry` IN (13137, 13138, 13143, 13144, 13145, 13146, 13147, 13179, 13296, 13297, 13298, 13299, 13300, 13326, 13328, 13333, 13334, 13358, 13359, 13439, 13517, 13521, 13525, 13529, 14185, 14188, 15466, 56160, 58181, 58255, 64584, 65867, 67979, 70253, 70309, 70337, 70682, 72312, 72313, 72318, 72371, 72534, 72548, 72549, 72579, 72580, 72581, 72911, 72912, 73561, 73562, 73563, 73726, 73727, 73728, 73929, 74089); +UPDATE `creature_template` SET `maxlevel`=-1 WHERE `entry` IN (11840, 13137, 13138, 13143, 13144, 13145, 13146, 13147, 13179, 13296, 13297, 13298, 13299, 13300, 13326, 13328, 13333, 13334, 13439, 13517, 13521, 13525, 13529, 13535, 13538, 13541, 13544, 13547, 13550, 13553, 13556, 13777, 14185, 14188, 58181, 58255, 64584, 65867, 67979, 70253, 70309, 70337, 70682, 72312, 72313, 72318, 72534, 72548, 72549, 72579, 72580, 72581, 72911, 72912, 73561, 73562, 73563, 73726, 73727, 73728, 73929, 74089); +UPDATE `creature_template` SET `minlevel`=0 WHERE `entry` IN (68, 309, 347, 352, 523, 603, 857, 907, 931, 1233, 1387, 1571, 1572, 1573, 1652, 1735, 1756, 1976, 2041, 2226, 2299, 2302, 2389, 2409, 2432, 2804, 2835, 2851, 2858, 2859, 2861, 2941, 2995, 3083, 3084, 3296, 3305, 3310, 3468, 3469, 3502, 3575, 3615, 3838, 3841, 3890, 4262, 4267, 4309, 4310, 4312, 4314, 4317, 4319, 4321, 4407, 4423, 4551, 4624, 5118, 5595, 5597, 5603, 5624, 6026, 6526, 6706, 6726, 7410, 7427, 7823, 7824, 7980, 8018, 8019, 8020, 8055, 8096, 8609, 8610, 8670, 8719, 9297, 9460, 9521, 9526, 9527, 10038, 10360, 10583, 10897, 11099, 11102, 11138, 11139, 11190, 11194, 11822, 11899, 11900, 11901, 11947, 11949, 11997, 11998, 12121, 12122, 12197, 12198, 12577, 12578, 12596, 12616, 12617, 12636, 12740, 13116, 13117, 13151, 13155, 13161, 13176, 13177, 13178, 13181, 13236, 13257, 13281, 13331, 13332, 13377, 13378, 13416, 13424, 13425, 13437, 13441, 13442, 13443, 13518, 13522, 13526, 13530, 13536, 13539, 13542, 13545, 13548, 13551, 13554, 13557, 13577, 13616, 13617, 13797, 13798, 13839, 14026, 14027, 14028, 14029, 14030, 14031, 14186, 14187, 14242, 14284, 14285, 14304, 14363, 14365, 14367, 14375, 14376, 14377, 14378, 14379, 14380, 14402, 14403, 14404, 14423, 14438, 14439, 14440, 14441, 14442, 14622, 14717, 14762, 14763, 14764, 14765, 14766, 14767, 14768, 14769, 14770, 14771, 14772, 14773, 14774, 14775, 14776, 14777, 14832, 14848, 14913, 14942, 14943, 14944, 14945, 14946, 14947, 14948, 14981, 14982, 15006, 15007, 15008, 15139, 15177, 15178, 15184, 15195, 15518, 15519, 15659, 15961, 16096, 16189, 16192, 16222, 16227, 16378, 16392, 16587, 16694, 16695, 16696, 16711, 16733, 16822, 17506, 17507, 17554, 17555, 17855, 18103, 18139, 18785, 18788, 18789, 18791, 18807, 18808, 18809, 18895, 18930, 18931, 18937, 18938, 18939, 18940, 18942, 18953, 18989, 19317, 19504, 19529, 19541, 19558, 19581, 19583, 19855, 19858, 19859, 19905, 19906, 19907, 19908, 19909, 19910, 19911, 19912, 19915, 19923, 19925, 20118, 20119, 20120, 20234, 20269, 20271, 20272, 20273, 20274, 20276, 20362, 20374, 20381, 20382, 20383, 20384, 20385, 20386, 20388, 20390, 20447, 20497, 20499, 20515, 20556, 20674, 20762, 21107, 21235, 21766, 21986, 22216, 22407, 22455, 22485, 22494, 22931, 22935, 22937, 23090, 23115, 23612, 23619, 23623, 23624, 23625, 23626, 23636, 23736, 23859, 24032, 24061, 24155, 24366, 24470, 24795, 24851, 25040, 25145, 25148, 25149, 25150, 25151, 25152, 25288, 25991, 26016, 26017, 26019, 26020, 26021, 26024, 26027, 26028, 26029, 26030, 26031, 26032, 26033, 26037, 26038, 26253, 26560, 26566, 26602, 26844, 26845, 26847, 26848, 26850, 26851, 26852, 26853, 26876, 26877, 26878, 26879, 26880, 26881, 27046, 27170, 27175, 27344, 27881, 27894, 27946, 27953, 28037, 28094, 28195, 28196, 28197, 28312, 28319, 28366, 28574, 28613, 28615, 28618, 28621, 28623, 28624, 28674, 28781, 28801, 28818, 28863, 28865, 29260, 29262, 29480, 29533, 29568, 29617, 29712, 29721, 29749, 29750, 29757, 29762, 29910, 29950, 29951, 30231, 30269, 30271, 30280, 30312, 30314, 30400, 30433, 30488, 30489, 30499, 30560, 30569, 30578, 30579, 30580, 30581, 30582, 30583, 30584, 30586, 30587, 30590, 30610, 30611, 30626, 30737, 30853, 30869, 30870, 31036, 31051, 31052, 31053, 31054, 31069, 31078, 31091, 31101, 31102, 31106, 31107, 31108, 31109, 31151, 31153, 31250, 31416, 31426, 31430, 31708, 31715, 31841, 31842, 32169, 32170, 32294, 32296, 32307, 32308, 32330, 32332, 32333, 32571, 32615, 32616, 32617, 32618, 32619, 32620, 32621, 32622, 32623, 32624, 32625, 32626, 32627, 32629, 33253, 33254, 33502, 33504, 33505, 33506, 33508, 33510, 33511, 33849, 34018, 34019, 34021, 34022, 34024, 34025, 34026, 34027, 34028, 34029, 34374, 34378, 34429, 34775, 34776, 34777, 34778, 34793, 34802, 34918, 34919, 34927, 34929, 34935, 34943, 34944, 34955, 34971, 34972, 34973, 34976, 34978, 34983, 34985, 34986, 34987, 34988, 34989, 34991, 34993, 34997, 34998, 34999, 35000, 35001, 35002, 35007, 35008, 35017, 35019, 35020, 35021, 35022, 35023, 35024, 35025, 35026, 35027, 35069, 35136, 35137, 35138, 35139, 35140, 35141, 35273, 35315, 35322, 35345, 35346, 35450, 35478, 35480, 35481, 35556, 35562, 35596, 35597, 35600, 35601, 35602, 35603, 35611, 35612, 35819, 36151, 36152, 36162, 36164, 36165, 36166, 36213, 36217, 36224, 36225, 36226, 36273, 36355, 36356, 36481, 36728, 37005, 37790, 37825, 37860, 37869, 37888, 37915, 37944, 38831, 39172, 39173, 39175, 39210, 39211, 39212, 39330, 39340, 39898, 39934, 40138, 40333, 40358, 40367, 40413, 40473, 40552, 40553, 40558, 40768, 40769, 40809, 40827, 40851, 40852, 40866, 40867, 40871, 40873, 40966, 41140, 41142, 41214, 41215, 41240, 41246, 41321, 41322, 41323, 41325, 41332, 41383, 41580, 41605, 41860, 41861, 41896, 42319, 42406, 42426, 42623, 42974, 42983, 43000, 43042, 43043, 43045, 43049, 43052, 43053, 43072, 43073, 43079, 43085, 43086, 43087, 43088, 43104, 43107, 43114, 43121, 43124, 43216, 43220, 43225, 43287, 43289, 43290, 43293, 43295, 43328, 43371, 43375, 43427, 43440, 43481, 43549, 43570, 43573, 43690, 43695, 43697, 43701, 43702, 43841, 43842, 43889, 43991, 44036, 44059, 44060, 44230, 44231, 44232, 44233, 44244, 44399, 44407, 44408, 44409, 44410, 44440, 44787, 44825, 44865, 44866, 44867, 44868, 44871, 44872, 44874, 44876, 44877, 44878, 45015, 45082, 45230, 45344, 45479, 45564, 45659, 45814, 45822, 45827, 45829, 46004, 46006, 46011, 46071, 46077, 46142, 46180, 46181, 46190, 46552, 46637, 46638, 46639, 46640, 46667, 46986, 47060, 47061, 47116, 47118, 47119, 47121, 47133, 47147, 47154, 47155, 47156, 47174, 47434, 47581, 47582, 47584, 47586, 47587, 47588, 47589, 47644, 47655, 47661, 47663, 47665, 47688, 47844, 47875, 47927, 48075, 48273, 48274, 48275, 48318, 48321, 48874, 48883, 49038, 49573, 50083, 50084, 50440, 50441, 50442, 50443, 50445, 50463, 50546, 50548, 50549, 50550, 50551, 50552, 50553, 50668, 50670, 50674, 50676, 50678, 50683, 50684, 51257, 51309, 51310, 51323, 51334, 51346, 51348, 51371, 51372, 51383, 51384, 51429, 51450, 51451, 51468, 51471, 51472, 51473, 51474, 51475, 51476, 51478, 51507, 51508, 51509, 51510, 51511, 51513, 51514, 51515, 51516, 51517, 51518, 51519, 51520, 51521, 51522, 51523, 51524, 51525, 51532, 51533, 51534, 51535, 51536, 51537, 51538, 51539, 51540, 51541, 51542, 51543, 51544, 51545, 51546, 51547, 51548, 51549, 51554, 51605, 51610, 51732, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, 51777, 51778, 51779, 51780, 51781, 51782, 51783, 51784, 51785, 51786, 51789, 51790, 51791, 51792, 51793, 51794, 51795, 51796, 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51804, 51805, 51806, 51807, 51808, 51809, 51810, 51811, 51812, 51813, 51814, 51815, 51816, 51817, 51818, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51827, 51828, 51829, 51830, 51831, 51832, 51834, 51835, 51837, 51838, 51839, 51840, 51841, 51842, 51843, 51844, 51845, 51846, 51847, 51848, 51849, 51850, 51851, 51852, 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, 51863, 51864, 51867, 51868, 51869, 51870, 51871, 51872, 51873, 51874, 51875, 51876, 51877, 51878, 51879, 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, 51900, 51901, 51902, 51903, 51904, 51905, 51906, 51907, 51908, 51909, 51910, 51911, 51912, 51913, 51914, 51915, 51916, 51917, 51918, 51919, 51920, 51921, 51922, 51923, 51924, 51925, 51986, 52009, 52010, 52011, 52012, 52013, 52018, 52060, 52084, 52184, 52280, 52404, 52410, 52646, 52670, 52753, 52817, 52821, 52983, 52996, 53000, 53008, 53352, 53562, 53563, 53598, 53783, 54208, 54209, 54334, 54345, 54346, 54392, 54393, 54441, 54442, 54443, 54471, 54472, 54473, 54502, 54509, 54519, 54523, 54524, 54548, 54601, 54788, 55003, 55382, 55396, 55402, 55568, 55577, 55578, 55657, 55660, 55778, 55779, 55805, 55810, 55842, 55844, 55860, 55861, 55904, 55996, 56041, 56737, 56771, 57287, 57288, 57289, 57473, 57474, 57475, 57629, 57630, 57800, 57801, 58505, 58612, 58770, 58782, 58784, 58788, 58792, 58816, 58855, 58877, 58912, 58913, 58914, 58929, 58934, 58939, 59048, 59317, 59471, 59595, 59596, 59604, 59654, 59658, 59812, 59922, 59923, 59952, 60152, 60969, 60971, 61744, 61745, 61759, 62334, 62824, 62913, 62926, 63351, 63357, 63364, 63372, 63373, 64044, 64045, 64519, 64573, 64574, 64586, 64587, 64615, 64709, 64728, 64729, 64732, 64733, 64734, 64735, 64736, 64923, 64956, 64957, 64997, 64998, 65138, 65232, 65236, 65237, 65238, 65239, 65240, 65241, 65474, 65494, 65507, 65510, 65548, 65549, 65610, 65611, 65643, 65654, 65680, 65785, 65786, 65801, 65807, 65863, 65865, 66666, 66913, 67013, 67014, 67149, 67150, 67195, 67196, 67197, 67198, 67199, 67200, 67260, 67267, 67418, 67754, 67785, 67790, 67796, 67923, 67944, 67945, 67965, 67987, 68008, 68053, 68054, 68216, 68226, 68293, 68323, 68363, 68364, 68365, 68372, 68403, 68404, 68405, 68406, 68408, 68424, 68425, 68678, 68764, 68765, 68767, 68768, 68792, 68794, 68979, 68980, 68981, 68982, 68990, 68991, 68992, 68994, 68995, 68996, 69359, 69360, 69422, 70085, 70086, 70087, 70088, 70354, 70381, 70498, 70643, 70690, 70705, 70706, 70741, 70824, 70877, 71111, 71112, 71210, 71246, 71265, 71280, 71302, 71303, 71340, 71358, 71359, 71369, 71487, 71490, 71491, 71589, 71718, 71719, 71794, 71837, 71972, 71973, 71974, 72005, 72038, 72366, 72376, 72422, 72423, 72424, 72425, 72501, 72515, 72559, 72570, 72614, 72774, 72886, 73082, 73120, 73121, 73122, 73343, 73361, 73362, 73385, 73386, 73600, 73602, 73664, 73811, 73818, 73820, 74219); +UPDATE `creature_template` SET `maxlevel`=0 WHERE `entry` IN (68, 309, 347, 352, 523, 603, 857, 907, 931, 1233, 1387, 1571, 1572, 1573, 1652, 1735, 1756, 1976, 2041, 2226, 2299, 2302, 2389, 2409, 2432, 2804, 2835, 2851, 2858, 2859, 2861, 2941, 2995, 3083, 3084, 3296, 3305, 3310, 3468, 3469, 3502, 3575, 3615, 3838, 3841, 3890, 4262, 4267, 4309, 4310, 4312, 4314, 4317, 4319, 4321, 4407, 4423, 4551, 4624, 5118, 5595, 5597, 5603, 5624, 6026, 6526, 6706, 6726, 7410, 7427, 7823, 7824, 7980, 8018, 8019, 8020, 8055, 8096, 8609, 8610, 8670, 8719, 9297, 9460, 9521, 9526, 9527, 10038, 10360, 10583, 10897, 11099, 11102, 11138, 11139, 11190, 11194, 11822, 11899, 11900, 11901, 11947, 11949, 11997, 11998, 12121, 12122, 12197, 12198, 12577, 12578, 12596, 12616, 12617, 12636, 12740, 13116, 13117, 13151, 13155, 13161, 13176, 13177, 13178, 13181, 13236, 13257, 13281, 13331, 13332, 13358, 13359, 13377, 13378, 13416, 13424, 13425, 13437, 13441, 13442, 13443, 13518, 13522, 13526, 13530, 13536, 13539, 13542, 13545, 13548, 13551, 13554, 13557, 13577, 13616, 13617, 13839, 14026, 14027, 14028, 14029, 14030, 14031, 14186, 14187, 14242, 14284, 14285, 14304, 14363, 14365, 14367, 14375, 14376, 14377, 14378, 14379, 14380, 14402, 14403, 14404, 14423, 14438, 14439, 14440, 14441, 14442, 14622, 14717, 14762, 14763, 14764, 14765, 14766, 14767, 14768, 14769, 14770, 14771, 14772, 14773, 14774, 14775, 14776, 14777, 14832, 14848, 14913, 14942, 14943, 14944, 14945, 14946, 14947, 14948, 14981, 14982, 15006, 15007, 15008, 15139, 15177, 15178, 15184, 15195, 15466, 15518, 15519, 15659, 15961, 16096, 16189, 16192, 16222, 16227, 16378, 16392, 16587, 16694, 16695, 16696, 16711, 16733, 16822, 17506, 17507, 17554, 17555, 17855, 18103, 18139, 18785, 18788, 18789, 18791, 18807, 18808, 18809, 18895, 18930, 18931, 18937, 18938, 18939, 18940, 18942, 18953, 18989, 19317, 19504, 19529, 19541, 19558, 19581, 19583, 19855, 19858, 19859, 19905, 19906, 19907, 19908, 19909, 19910, 19911, 19912, 19915, 19923, 19925, 20118, 20119, 20120, 20234, 20269, 20271, 20272, 20273, 20274, 20276, 20362, 20374, 20381, 20382, 20383, 20384, 20385, 20386, 20388, 20390, 20447, 20497, 20499, 20515, 20556, 20674, 20762, 21107, 21235, 21766, 21986, 22216, 22407, 22455, 22485, 22494, 22931, 22935, 22937, 23090, 23115, 23612, 23619, 23623, 23624, 23625, 23626, 23636, 23736, 23859, 24032, 24061, 24155, 24366, 24470, 24795, 24851, 25040, 25145, 25148, 25149, 25150, 25151, 25152, 25288, 25499, 25991, 26016, 26017, 26019, 26020, 26021, 26024, 26027, 26028, 26029, 26030, 26031, 26032, 26033, 26037, 26038, 26253, 26560, 26566, 26602, 26844, 26845, 26847, 26848, 26850, 26851, 26852, 26853, 26876, 26877, 26878, 26879, 26880, 26881, 27046, 27170, 27175, 27344, 27881, 27894, 27946, 27953, 28037, 28094, 28195, 28196, 28197, 28312, 28319, 28366, 28574, 28613, 28615, 28618, 28621, 28623, 28624, 28674, 28781, 28801, 28818, 28863, 28865, 29260, 29262, 29480, 29533, 29568, 29617, 29712, 29721, 29749, 29750, 29757, 29762, 29910, 29950, 29951, 30231, 30269, 30271, 30280, 30312, 30314, 30400, 30433, 30488, 30489, 30499, 30560, 30569, 30578, 30579, 30580, 30581, 30582, 30583, 30584, 30586, 30587, 30590, 30610, 30611, 30626, 30737, 30853, 30869, 30870, 31036, 31051, 31052, 31053, 31054, 31069, 31078, 31091, 31101, 31102, 31106, 31107, 31108, 31109, 31151, 31153, 31250, 31416, 31426, 31430, 31708, 31715, 31841, 31842, 32169, 32170, 32294, 32296, 32307, 32308, 32330, 32332, 32333, 32571, 32615, 32616, 32617, 32618, 32619, 32620, 32621, 32622, 32623, 32624, 32625, 32626, 32627, 32629, 33253, 33254, 33502, 33504, 33505, 33506, 33508, 33510, 33511, 33849, 34018, 34019, 34021, 34022, 34024, 34025, 34026, 34027, 34028, 34029, 34374, 34378, 34429, 34775, 34776, 34777, 34778, 34793, 34802, 34918, 34919, 34927, 34929, 34935, 34943, 34944, 34955, 34971, 34972, 34973, 34976, 34978, 34983, 34985, 34986, 34987, 34988, 34989, 34991, 34993, 34997, 34998, 34999, 35000, 35001, 35002, 35007, 35008, 35017, 35019, 35020, 35021, 35022, 35023, 35024, 35025, 35026, 35027, 35069, 35136, 35137, 35138, 35139, 35140, 35141, 35273, 35315, 35322, 35345, 35346, 35450, 35478, 35480, 35481, 35556, 35562, 35596, 35597, 35600, 35601, 35602, 35603, 35611, 35612, 35819, 36151, 36152, 36162, 36164, 36165, 36166, 36213, 36217, 36224, 36225, 36226, 36273, 36355, 36356, 36481, 36728, 37005, 37790, 37825, 37860, 37869, 37888, 37915, 37944, 38831, 39172, 39173, 39175, 39210, 39211, 39212, 39330, 39340, 39898, 39934, 40138, 40333, 40358, 40367, 40413, 40473, 40552, 40553, 40558, 40768, 40769, 40809, 40827, 40851, 40852, 40866, 40867, 40871, 40873, 40966, 41140, 41142, 41214, 41215, 41240, 41246, 41321, 41322, 41323, 41325, 41332, 41383, 41580, 41605, 41860, 41861, 41896, 42319, 42406, 42426, 42623, 42974, 42983, 43000, 43042, 43043, 43045, 43049, 43052, 43053, 43072, 43073, 43079, 43085, 43086, 43087, 43088, 43104, 43107, 43114, 43121, 43124, 43216, 43220, 43225, 43287, 43289, 43290, 43293, 43295, 43328, 43371, 43375, 43427, 43440, 43481, 43549, 43570, 43573, 43690, 43695, 43697, 43701, 43702, 43841, 43842, 43889, 43991, 44036, 44059, 44060, 44230, 44231, 44232, 44233, 44244, 44399, 44407, 44408, 44409, 44410, 44440, 44787, 44825, 44865, 44866, 44867, 44868, 44871, 44872, 44874, 44876, 44877, 44878, 45015, 45082, 45230, 45344, 45479, 45564, 45659, 45814, 45822, 45827, 45829, 46004, 46006, 46011, 46071, 46077, 46142, 46180, 46181, 46190, 46552, 46637, 46638, 46639, 46640, 46667, 46986, 47060, 47061, 47116, 47118, 47119, 47121, 47133, 47147, 47154, 47155, 47156, 47174, 47434, 47581, 47582, 47584, 47586, 47587, 47588, 47589, 47644, 47655, 47661, 47663, 47665, 47688, 47844, 47875, 47927, 48075, 48273, 48274, 48275, 48318, 48321, 48874, 48883, 49038, 49573, 50083, 50084, 50440, 50441, 50442, 50443, 50445, 50463, 50546, 50548, 50549, 50550, 50551, 50552, 50553, 50668, 50670, 50674, 50676, 50678, 50683, 50684, 51257, 51309, 51310, 51323, 51334, 51346, 51348, 51371, 51372, 51383, 51384, 51429, 51450, 51451, 51468, 51471, 51472, 51473, 51474, 51475, 51476, 51478, 51507, 51508, 51509, 51510, 51511, 51513, 51514, 51515, 51516, 51517, 51518, 51519, 51520, 51521, 51522, 51523, 51524, 51525, 51532, 51533, 51534, 51535, 51536, 51537, 51538, 51539, 51540, 51541, 51542, 51543, 51544, 51545, 51546, 51547, 51548, 51549, 51554, 51605, 51610, 51732, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, 51777, 51778, 51779, 51780, 51781, 51782, 51783, 51784, 51785, 51786, 51789, 51790, 51791, 51792, 51793, 51794, 51795, 51796, 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51804, 51805, 51806, 51807, 51808, 51809, 51810, 51811, 51812, 51813, 51814, 51815, 51816, 51817, 51818, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51827, 51828, 51829, 51830, 51831, 51832, 51834, 51835, 51837, 51838, 51839, 51840, 51841, 51842, 51843, 51844, 51845, 51846, 51847, 51848, 51849, 51850, 51851, 51852, 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, 51863, 51864, 51867, 51868, 51869, 51870, 51871, 51872, 51873, 51874, 51875, 51876, 51877, 51878, 51879, 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, 51900, 51901, 51902, 51903, 51904, 51905, 51906, 51907, 51908, 51909, 51910, 51911, 51912, 51913, 51914, 51915, 51916, 51917, 51918, 51919, 51920, 51921, 51922, 51923, 51924, 51925, 51986, 52009, 52010, 52011, 52012, 52013, 52018, 52060, 52084, 52184, 52280, 52404, 52410, 52646, 52670, 52753, 52817, 52821, 52983, 52996, 53000, 53008, 53352, 53562, 53563, 53598, 53783, 54208, 54209, 54334, 54345, 54346, 54392, 54393, 54441, 54442, 54443, 54471, 54472, 54473, 54502, 54509, 54519, 54523, 54524, 54548, 54601, 54788, 55003, 55382, 55396, 55402, 55568, 55577, 55578, 55657, 55660, 55778, 55779, 55805, 55810, 55842, 55844, 55860, 55861, 55904, 55996, 56041, 56160, 56737, 56771, 57287, 57288, 57289, 57473, 57474, 57475, 57629, 57630, 57800, 57801, 58505, 58612, 58770, 58782, 58784, 58788, 58792, 58816, 58855, 58877, 58912, 58913, 58914, 58929, 58934, 58939, 59048, 59317, 59471, 59595, 59596, 59604, 59654, 59658, 59812, 59922, 59923, 59952, 60152, 60969, 60971, 61744, 61745, 61759, 62334, 62824, 62913, 62926, 63351, 63357, 63364, 63372, 63373, 64044, 64045, 64519, 64573, 64574, 64586, 64587, 64615, 64709, 64728, 64729, 64732, 64733, 64734, 64735, 64736, 64923, 64956, 64957, 64997, 64998, 65138, 65232, 65236, 65237, 65238, 65239, 65240, 65241, 65474, 65494, 65507, 65510, 65548, 65549, 65610, 65611, 65643, 65654, 65680, 65785, 65786, 65801, 65807, 65863, 65865, 66666, 66913, 67013, 67014, 67149, 67150, 67195, 67196, 67197, 67198, 67199, 67200, 67260, 67267, 67418, 67754, 67785, 67790, 67796, 67923, 67944, 67945, 67965, 67987, 68008, 68053, 68054, 68216, 68226, 68293, 68323, 68363, 68364, 68365, 68372, 68403, 68404, 68405, 68406, 68408, 68424, 68425, 68678, 68764, 68765, 68767, 68768, 68792, 68794, 68979, 68980, 68981, 68982, 68990, 68991, 68992, 68994, 68995, 68996, 69359, 69360, 69422, 70085, 70086, 70087, 70088, 70354, 70381, 70498, 70643, 70690, 70705, 70706, 70741, 70824, 70877, 71111, 71112, 71210, 71246, 71265, 71280, 71302, 71303, 71340, 71358, 71359, 71369, 71487, 71490, 71491, 71589, 71718, 71719, 71794, 71837, 71972, 71973, 71974, 72005, 72038, 72366, 72371, 72376, 72422, 72423, 72424, 72425, 72501, 72515, 72559, 72570, 72614, 72774, 72886, 73082, 73120, 73121, 73122, 73343, 73361, 73362, 73385, 73386, 73600, 73602, 73664, 73811, 73818, 73820, 74219); +UPDATE `creature_template` SET `minlevel`=1 WHERE `entry` IN (10985, 11946, 11948, 13139, 13140, 13152, 13153, 13154, 13256, 13318, 13319, 13320, 13356, 13357, 13419, 13421, 13422, 13446, 13449, 13496, 13519, 13523, 13527, 13531, 13597, 13598, 13959, 13977, 34922, 34924); +UPDATE `creature_template` SET `maxlevel`=1 WHERE `entry` IN (10985, 11946, 11948, 13139, 13140, 13152, 13153, 13154, 13256, 13318, 13319, 13320, 13356, 13357, 13419, 13421, 13422, 13446, 13449, 13496, 13519, 13523, 13527, 13531, 13597, 13598, 13797, 13798, 13959, 13977, 34922, 34924); + +UPDATE `creature_template` SET `minlevel`=-84, `maxlevel`=-84 WHERE `entry` IN (60226, 60227, 60228); +UPDATE `creature_template` SET `minlevel`=-8, `maxlevel`=-7 WHERE `entry` IN (10982, 10986, 10987, 10991, 11603, 11606, 11678, 13316, 13317, 13396, 13397, 76357); +UPDATE `creature_template` SET `minlevel`=-7, `maxlevel`=-6 WHERE `entry` IN (11600, 11604, 11675, 11837, 14282, 14283); +UPDATE `creature_template` SET `minlevel`=2, `maxlevel`=2 WHERE `entry` IN (11676, 12159, 23775); +UPDATE `creature_template` SET `minlevel`=3, `maxlevel`=3 WHERE `entry` IN (1284, 3936, 4968, 7999, 10181, 15088, 15193, 15467, 16800, 16801, 16802, 17468, 21984, 22522, 29611, 31146, 36648, 37058, 38966, 39605, 39656, 42129, 42131, 42317, 42928, 43845, 43867, 43931, 44441, 44451, 45042, 45111, 45250, 45253, 45382, 46236, 46717, 46757, 46833, 46844, 47718, 47736, 47745, 48546, 48572, 48736, 48738, 49420, 49533, 49809, 49820, 50043, 50369, 51355, 51571, 51666, 52700, 52767, 52792, 53518, 53537, 53649, 53657, 53660, 53663, 53667, 53669, 53676, 53736, 53755, 53905, 53956, 53957, 53958, 53959, 53960, 54131, 54132, 54168, 54226, 54260, 54297, 54300, 54301, 54302, 54306, 54313, 54344, 54499, 54611, 54631, 55148, 55150, 55189, 55561, 56730, 57164, 57205, 58336, 60219, 61138, 61170, 62087, 62092, 62163, 62742, 62808, 62827, 62841, 62911, 62912, 64402, 64526, 64529, 64560, 64564, 64565, 64600, 64629, 64727, 65227, 65228, 65539, 65540, 65659, 65660, 65661, 66154, 66155, 66156, 66458, 67560, 67580, 67581, 67840, 67864, 67867, 67947, 67953, 67968, 67973, 67989, 67992, 68003, 68023, 68025, 68059, 68072, 68084, 68085, 68086, 68088, 68108, 68144, 68223, 68235, 68236, 68237, 68242, 68278, 68287, 68315, 68329, 68336, 68339, 68357, 68370, 68392, 68399, 68429, 68496, 68514, 68538, 68544, 68567, 68568, 68569, 68570, 68571, 68572, 68573, 68575, 68586, 68589, 68590, 68592, 68593, 68609, 68631, 68633, 68634, 68637, 68642, 68643, 68644, 68645, 68651, 68652, 68677, 68679, 68689, 68690, 68749, 68777, 68842, 68882, 68920, 68921, 68922, 68924, 68930, 68941, 68955, 68966, 68970, 68972, 68975, 69026, 69797, 69799, 70131, 70132, 70245, 70362, 70363, 70370, 70371, 70799, 70978, 71042, 71147, 71148, 71149, 71151, 71177, 71249, 71250, 71344, 71592, 71992, 72302, 72311, 72392, 72394, 72560, 72561, 73554, 73558, 73709, 73710, 73909, 73910, 73927, 73941, 73942, 73957, 73962, 74217); +UPDATE `creature_template` SET `minlevel`=5, `maxlevel`=5 WHERE `entry` IN (3210, 3211, 3213, 3214, 5952, 7975, 12160, 15371, 16921, 38217, 38898, 38899, 39196, 42316); diff --git a/sql/updates/world/2014_12_01_00_world.sql b/sql/updates/world/2014_12_01_00_world.sql new file mode 100644 index 00000000000..6e96a1bfe9a --- /dev/null +++ b/sql/updates/world/2014_12_01_00_world.sql @@ -0,0 +1,423 @@ +DELETE FROM `playercreateinfo_action`; +INSERT INTO `playercreateinfo_action` (`race`, `class`, `button`, `action`, `type`) VALUES +(10, 10, 0, 100780, 0), +(10, 10, 9, 129597, 0), +(10, 10, 72, 100780, 0), +(10, 10, 81, 129597, 0), +(10, 8, 0, 44614, 0), +(10, 8, 9, 28730, 0), +(10, 9, 0, 686, 0), +(10, 9, 9, 28730, 0), +(10, 9, 10, 10, 48), +(10, 2, 0, 35395, 0), +(10, 2, 9, 155145, 0), +(10, 3, 0, 3044, 0), +(10, 3, 9, 80483, 0), +(10, 3, 10, 9, 48), +(10, 3, 11, 982, 0), +(10, 1, 0, 88163, 0), +(10, 1, 1, 78, 0), +(10, 1, 9, 69179, 0), +(10, 1, 72, 88163, 0), +(10, 1, 73, 78, 0), +(10, 1, 81, 69179, 0), +(10, 4, 0, 1752, 0), +(10, 4, 9, 25046, 0), +(10, 5, 0, 585, 0), +(10, 5, 9, 28730, 0), +(4, 6, 0, 6603, 0), +(4, 6, 1, 49576, 0), +(4, 6, 2, 45477, 0), +(4, 6, 3, 45462, 0), +(4, 6, 4, 50842, 0), +(4, 6, 5, 47541, 0), +(4, 6, 10, 58984, 0), +(4, 6, 83, 58984, 0), +(7, 6, 0, 6603, 0), +(7, 6, 1, 49576, 0), +(7, 6, 2, 45477, 0), +(7, 6, 3, 45462, 0), +(7, 6, 4, 50842, 0), +(7, 6, 5, 47541, 0), +(7, 6, 10, 20589, 0), +(7, 6, 72, 6603, 0), +(7, 6, 83, 117, 128), +(7, 6, 84, 6603, 0), +(7, 6, 96, 6603, 0), +(7, 6, 108, 6603, 0), +(3, 6, 0, 6603, 0), +(3, 6, 1, 49576, 0), +(3, 6, 2, 45477, 0), +(3, 6, 3, 45462, 0), +(3, 6, 4, 50842, 0), +(3, 6, 5, 47541, 0), +(1, 6, 0, 6603, 0), +(1, 6, 1, 49576, 0), +(1, 6, 2, 45477, 0), +(1, 6, 3, 45462, 0), +(1, 6, 4, 50842, 0), +(1, 6, 5, 47541, 0), +(1, 6, 11, 59752, 0), +(6, 6, 0, 6603, 0), +(6, 6, 1, 49576, 0), +(6, 6, 2, 45477, 0), +(6, 6, 3, 45462, 0), +(6, 6, 4, 50842, 0), +(6, 6, 5, 47541, 0), +(6, 6, 10, 20549, 0), +(6, 6, 75, 20549, 0), +(2, 6, 0, 6603, 0), +(2, 6, 1, 49576, 0), +(2, 6, 2, 45477, 0), +(2, 6, 3, 45462, 0), +(2, 6, 4, 50842, 0), +(2, 6, 5, 47541, 0), +(2, 6, 10, 20572, 0), +(22, 6, 0, 6603, 0), +(22, 6, 1, 49576, 0), +(22, 6, 2, 45477, 0), +(22, 6, 3, 45462, 0), +(22, 6, 4, 50842, 0), +(22, 6, 5, 47541, 0), +(22, 6, 9, 68992, 0), +(22, 6, 10, 68996, 0), +(22, 6, 11, 87840, 0), +(5, 6, 0, 6603, 0), +(5, 6, 1, 49576, 0), +(5, 6, 2, 45477, 0), +(5, 6, 3, 45462, 0), +(5, 6, 4, 50842, 0), +(5, 6, 5, 47541, 0), +(5, 6, 10, 20577, 0), +(10, 6, 0, 6603, 0), +(10, 6, 1, 49576, 0), +(10, 6, 2, 45477, 0), +(10, 6, 3, 45462, 0), +(10, 6, 4, 50842, 0), +(10, 6, 5, 47541, 0), +(10, 6, 6, 50613, 0), +(8, 6, 0, 6603, 0), +(8, 6, 1, 49576, 0), +(8, 6, 2, 45477, 0), +(8, 6, 3, 45462, 0), +(8, 6, 4, 50842, 0), +(8, 6, 5, 47541, 0), +(8, 6, 10, 26297, 0), +(9, 6, 0, 6603, 0), +(9, 6, 1, 49576, 0), +(9, 6, 2, 45477, 0), +(9, 6, 3, 45462, 0), +(9, 6, 4, 50842, 0), +(9, 6, 5, 47541, 0), +(9, 6, 9, 69070, 0), +(9, 6, 10, 69041, 0), +(9, 6, 11, 69046, 0), +(11, 6, 0, 6603, 0), +(11, 6, 1, 49576, 0), +(11, 6, 2, 45477, 0), +(11, 6, 3, 45462, 0), +(11, 6, 4, 50842, 0), +(11, 6, 5, 47541, 0), +(11, 6, 10, 59545, 0), +(11, 3, 0, 3044, 0), +(11, 3, 9, 59543, 0), +(11, 3, 10, 9, 48), +(11, 3, 11, 982, 0), +(11, 3, 72, 6603, 0), +(11, 3, 74, 75, 0), +(11, 3, 82, 159, 128), +(11, 3, 83, 4540, 128), +(11, 2, 0, 35395, 0), +(11, 2, 9, 59542, 0), +(11, 2, 83, 4540, 128), +(11, 1, 0, 88163, 0), +(11, 1, 1, 78, 0), +(11, 1, 9, 28880, 0), +(11, 1, 72, 88163, 0), +(11, 1, 73, 78, 0), +(11, 1, 81, 28880, 0), +(11, 5, 0, 585, 0), +(11, 5, 9, 59544, 0), +(11, 5, 83, 4540, 128), +(11, 7, 0, 403, 0), +(11, 7, 9, 59547, 0), +(11, 10, 0, 100780, 0), +(11, 10, 72, 100780, 0), +(11, 10, 81, 121093, 0), +(11, 8, 0, 44614, 0), +(11, 8, 9, 59548, 0), +(11, 8, 83, 4540, 128), +(3, 3, 0, 3044, 0), +(3, 3, 9, 20594, 0), +(3, 3, 10, 9, 48), +(3, 3, 11, 982, 0), +(3, 3, 75, 20594, 0), +(3, 2, 0, 35395, 0), +(3, 2, 9, 20594, 0), +(3, 1, 0, 88163, 0), +(3, 1, 1, 78, 0), +(3, 1, 9, 20594, 0), +(3, 1, 72, 88163, 0), +(3, 1, 73, 78, 0), +(3, 1, 81, 20594, 0), +(3, 7, 0, 403, 0), +(3, 7, 9, 20594, 0), +(3, 7, 72, 403, 0), +(3, 5, 0, 585, 0), +(3, 5, 9, 20594, 0), +(3, 4, 0, 1752, 0), +(3, 4, 9, 20594, 0), +(3, 10, 0, 100780, 0), +(3, 10, 72, 100780, 0), +(3, 10, 81, 20594, 0), +(3, 9, 0, 686, 0), +(3, 9, 9, 20594, 0), +(3, 9, 10, 10, 48), +(3, 8, 0, 44614, 0), +(3, 8, 9, 20594, 0), +(7, 5, 0, 585, 0), +(7, 4, 0, 1752, 0), +(7, 1, 0, 88163, 0), +(7, 1, 1, 78, 0), +(7, 1, 72, 88163, 0), +(7, 1, 73, 78, 0), +(7, 1, 81, 20589, 0), +(7, 10, 0, 100780, 0), +(7, 10, 72, 100780, 0), +(7, 10, 81, 20589, 0), +(7, 9, 0, 686, 0), +(7, 9, 10, 10, 48), +(7, 8, 0, 44614, 0), +(9, 9, 0, 686, 0), +(9, 9, 9, 69070, 0), +(9, 9, 10, 69041, 0), +(9, 9, 11, 10, 48), +(9, 8, 0, 44614, 0), +(9, 8, 9, 69070, 0), +(9, 8, 10, 69041, 0), +(9, 1, 0, 88163, 0), +(9, 1, 1, 78, 0), +(9, 1, 9, 69070, 0), +(9, 1, 10, 69041, 0), +(9, 1, 72, 88163, 0), +(9, 1, 73, 78, 0), +(9, 1, 81, 69070, 0), +(9, 1, 82, 69041, 0), +(9, 3, 0, 3044, 0), +(9, 3, 8, 982, 0), +(9, 3, 9, 69070, 0), +(9, 3, 10, 69041, 0), +(9, 3, 11, 9, 48), +(9, 5, 0, 585, 0), +(9, 5, 9, 69070, 0), +(9, 5, 10, 69041, 0), +(9, 4, 0, 1752, 0), +(9, 4, 9, 69070, 0), +(9, 4, 10, 69041, 0), +(9, 7, 0, 403, 0), +(9, 7, 9, 69070, 0), +(9, 7, 10, 69041, 0), +(9, 7, 72, 403, 0), +(1, 1, 0, 88163, 0), +(1, 1, 1, 78, 0), +(1, 1, 9, 59752, 0), +(1, 1, 72, 88163, 0), +(1, 1, 73, 78, 0), +(1, 1, 81, 59752, 0), +(1, 3, 0, 3044, 0), +(1, 3, 9, 59752, 0), +(1, 3, 10, 9, 48), +(1, 3, 11, 982, 0), +(1, 2, 0, 35395, 0), +(1, 2, 9, 59752, 0), +(1, 5, 0, 585, 0), +(1, 5, 9, 59752, 0), +(1, 4, 0, 1752, 0), +(1, 4, 9, 59752, 0), +(1, 9, 0, 686, 0), +(1, 9, 9, 59752, 0), +(1, 9, 10, 10, 48), +(1, 8, 0, 44614, 0), +(1, 8, 9, 59752, 0), +(1, 10, 0, 100780, 0), +(1, 10, 72, 100780, 0), +(1, 10, 81, 59752, 0), +(4, 4, 0, 1752, 0), +(4, 4, 4, 58984, 0), +(4, 4, 81, 58984, 0), +(4, 5, 0, 585, 0), +(4, 5, 9, 58984, 0), +(4, 5, 81, 58984, 0), +(4, 1, 0, 88163, 0), +(4, 1, 1, 78, 0), +(4, 1, 9, 58984, 0), +(4, 1, 72, 88163, 0), +(4, 1, 73, 78, 0), +(4, 1, 81, 58984, 0), +(4, 3, 0, 3044, 0), +(4, 3, 9, 58984, 0), +(4, 3, 10, 9, 48), +(4, 3, 11, 982, 0), +(4, 3, 81, 58984, 0), +(4, 8, 0, 44614, 0), +(4, 8, 9, 58984, 0), +(4, 10, 0, 100780, 0), +(4, 10, 72, 100780, 0), +(4, 10, 81, 58984, 0), +(4, 11, 0, 5176, 0), +(4, 11, 9, 58984, 0), +(4, 11, 72, 6603, 0), +(4, 11, 74, 58984, 0), +(4, 11, 84, 6603, 0), +(4, 11, 96, 6603, 0), +(4, 11, 108, 6603, 0), +(2, 3, 0, 3044, 0), +(2, 3, 9, 20572, 0), +(2, 3, 10, 9, 48), +(2, 3, 11, 982, 0), +(2, 1, 0, 88163, 0), +(2, 1, 1, 78, 0), +(2, 1, 9, 20572, 0), +(2, 1, 72, 88163, 0), +(2, 1, 73, 78, 0), +(2, 1, 81, 20572, 0), +(2, 7, 0, 403, 0), +(2, 7, 9, 33697, 0), +(2, 7, 72, 403, 0), +(2, 4, 0, 1752, 0), +(2, 4, 9, 20572, 0), +(2, 10, 0, 100780, 0), +(2, 10, 72, 100780, 0), +(2, 10, 81, 33697, 0), +(2, 8, 0, 44614, 0), +(2, 8, 9, 33702, 0), +(2, 9, 0, 686, 0), +(2, 9, 9, 33702, 0), +(2, 9, 10, 10, 48), +(24, 8, 0, 44614, 0), +(24, 8, 9, 107079, 0), +(24, 8, 11, 77264, 128), +(24, 10, 0, 100780, 0), +(24, 10, 72, 100780, 0), +(24, 10, 81, 107079, 0), +(24, 10, 83, 77272, 128), +(24, 1, 0, 88163, 0), +(24, 1, 1, 78, 0), +(24, 1, 9, 107079, 0), +(24, 1, 11, 77273, 128), +(24, 1, 72, 88163, 0), +(24, 1, 73, 78, 0), +(24, 1, 81, 107079, 0), +(24, 1, 83, 77273, 128), +(24, 3, 0, 3044, 0), +(24, 3, 7, 77272, 128), +(24, 3, 9, 107079, 0), +(24, 3, 10, 9, 48), +(24, 3, 11, 982, 0), +(24, 4, 0, 1752, 0), +(24, 4, 9, 107079, 0), +(24, 4, 11, 77272, 128), +(24, 5, 0, 585, 0), +(24, 5, 9, 107079, 0), +(24, 5, 11, 77264, 128), +(24, 7, 0, 403, 0), +(24, 7, 9, 107079, 0), +(24, 7, 11, 77272, 128), +(24, 7, 72, 403, 0), +(6, 7, 0, 403, 0), +(6, 7, 9, 20549, 0), +(6, 7, 75, 20549, 0), +(6, 5, 0, 585, 0), +(6, 5, 9, 20549, 0), +(6, 2, 0, 35395, 0), +(6, 2, 9, 20549, 0), +(6, 3, 0, 3044, 0), +(6, 3, 9, 20549, 0), +(6, 3, 10, 9, 48), +(6, 3, 11, 982, 0), +(6, 3, 75, 20549, 0), +(6, 1, 0, 88163, 0), +(6, 1, 1, 78, 0), +(6, 1, 9, 20549, 0), +(6, 1, 72, 88163, 0), +(6, 1, 73, 78, 0), +(6, 1, 81, 20549, 0), +(6, 10, 0, 100780, 0), +(6, 10, 72, 100780, 0), +(6, 10, 81, 20549, 0), +(6, 11, 0, 5176, 0), +(6, 11, 9, 20549, 0), +(6, 11, 72, 6603, 0), +(6, 11, 75, 20549, 0), +(6, 11, 84, 6603, 0), +(6, 11, 96, 6603, 0), +(6, 11, 108, 6603, 0), +(8, 8, 0, 44614, 0), +(8, 8, 9, 26297, 0), +(8, 9, 0, 686, 0), +(8, 9, 9, 26297, 0), +(8, 9, 10, 10, 48), +(8, 10, 0, 100780, 0), +(8, 10, 72, 100780, 0), +(8, 10, 81, 26297, 0), +(8, 11, 0, 5176, 0), +(8, 11, 9, 26297, 0), +(8, 11, 72, 6603, 0), +(8, 11, 84, 6603, 0), +(8, 11, 96, 6603, 0), +(8, 1, 0, 88163, 0), +(8, 1, 1, 78, 0), +(8, 1, 9, 26297, 0), +(8, 1, 72, 88163, 0), +(8, 1, 73, 78, 0), +(8, 1, 81, 26297, 0), +(8, 3, 0, 3044, 0), +(8, 3, 9, 26297, 0), +(8, 3, 10, 9, 48), +(8, 3, 11, 982, 0), +(8, 4, 0, 1752, 0), +(8, 4, 9, 26297, 0), +(8, 4, 76, 26297, 0), +(8, 5, 0, 585, 0), +(8, 5, 9, 26297, 0), +(8, 7, 0, 403, 0), +(8, 7, 9, 26297, 0), +(8, 7, 72, 403, 0), +(5, 5, 0, 585, 0), +(5, 5, 9, 20577, 0), +(5, 4, 0, 1752, 0), +(5, 4, 9, 20577, 0), +(5, 1, 0, 88163, 0), +(5, 1, 1, 78, 0), +(5, 1, 9, 20577, 0), +(5, 1, 72, 88163, 0), +(5, 1, 73, 78, 0), +(5, 1, 81, 20577, 0), +(5, 3, 0, 3044, 0), +(5, 3, 9, 20577, 0), +(5, 3, 10, 9, 48), +(5, 3, 11, 982, 0), +(5, 9, 0, 686, 0), +(5, 9, 9, 20577, 0), +(5, 9, 10, 10, 48), +(5, 8, 0, 44614, 0), +(5, 8, 9, 20577, 0), +(5, 10, 0, 100780, 0), +(5, 10, 72, 100780, 0), +(5, 10, 81, 20577, 0), +(22, 4, 0, 1752, 0), +(22, 5, 0, 585, 0), +(22, 3, 0, 3044, 0), +(22, 3, 10, 9, 48), +(22, 3, 11, 982, 0), +(22, 1, 0, 88163, 0), +(22, 1, 1, 78, 0), +(22, 1, 72, 88163, 0), +(22, 1, 73, 78, 0), +(22, 11, 0, 5176, 0), +(22, 11, 72, 6603, 0), +(22, 11, 84, 6603, 0), +(22, 11, 96, 6603, 0), +(22, 8, 0, 44614, 0), +(22, 9, 0, 686, 0), +(22, 9, 10, 10, 48); diff --git a/sql/updates/world/2014_12_04_00_world.sql b/sql/updates/world/2014_12_04_00_world.sql new file mode 100644 index 00000000000..5308b0f51d7 --- /dev/null +++ b/sql/updates/world/2014_12_04_00_world.sql @@ -0,0 +1,64 @@ +DROP TABLE IF EXISTS `playercreateinfo_spell`; +DROP TABLE IF EXISTS `playercreateinfo_skills`; +CREATE TABLE `playercreateinfo_skills` ( + `raceMask` int(10) unsigned NOT NULL, + `classMask` int(10) unsigned NOT NULL, + `skill` smallint(5) unsigned NOT NULL, + `rank` smallint(5) unsigned NOT NULL DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`raceMask`,`classMask`,`skill`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `playercreateinfo_skills` (`raceMask`, `classMask`, `skill`, `rank`, `comment`) VALUES +(0, 0, 95, 0, 'Defense'), +(0, 0, 162, 0, 'Unarmed'), +(0, 0, 183, 0, 'GENERIC (DND)'), +(0, 0, 415, 0, 'Cloth'), +(0, 0, 777, 0, 'Mounts'), +(0, 0, 778, 0, 'Companion Pets'), +(0, 0, 934, 0, 'All - Specializations'), +(0, 3, 160, 0, 'Two-Handed Maces'), +(0, 4, 45, 0, 'Bows'), +(0, 4, 46, 0, 'Guns'), +(0, 4, 226, 0, 'Crossbows'), +(0, 8, 176, 0, 'Thrown'), +(0, 32, 129, 4, 'Death Knight - First Aid'), +(0, 32, 229, 0, 'Polearms'), +(0, 32, 293, 0, 'Plate'), +(0, 32, 762, 0, 'Death Knight - Riding'), +(0, 35, 55, 0, 'Two-Handed Swords'), +(0, 35, 413, 0, 'Mail'), +(0, 37, 44, 0, 'Axes'), +(0, 37, 172, 0, 'Two-Handed Axes'), +(0, 39, 43, 0, 'Swords'), +(0, 40, 118, 0, 'Dual Wield'), +(0, 67, 433, 0, 'Shield'), +(0, 400, 228, 0, 'Wands'), +(0, 1107, 54, 0, 'Maces'), +(0, 1135, 414, 0, 'Leather'), +(0, 1293, 173, 0, 'Daggers'), +(0, 1488, 136, 0, 'Staves'), +(1, 0, 754, 0, 'Human - Racial'), +(2, 0, 125, 0, 'Orc - Racial'), +(4, 0, 101, 0, 'Dwarf - Racial'), +(4, 0, 111, 0, 'Language: Dwarven'), +(8, 0, 113, 0, 'Language: Darnassian'), +(8, 0, 126, 0, 'Night Elf - Racial'), +(16, 0, 220, 0, 'Undead - Racial'), +(16, 0, 673, 0, 'Language: Forsaken'), +(32, 0, 115, 0, 'Language: Taurahe'), +(32, 0, 124, 0, 'Tauren - Racial'), +(64, 0, 313, 0, 'Language: Gnomish'), +(64, 0, 753, 0, 'Gnome - Racial'), +(128, 0, 315, 0, 'Language: Troll'), +(128, 0, 733, 0, 'Troll - Racial'), +(256, 0, 790, 0, 'Racial - Goblin'), +(256, 0, 792, 0, 'Language: Goblin'), +(512, 0, 137, 0, 'Language: Thalassian'), +(512, 0, 756, 0, 'Blood Elf - Racial'), +(946, 0, 109, 0, 'Language: Orcish'), +(1024, 0, 759, 0, 'Language: Draenei'), +(1024, 0, 760, 0, 'Draenei - Racial'), +(2097152, 0, 789, 0, 'Racial - Worgen'), +(2097152, 0, 791, 0, 'Language: Worgen'), +(2098253, 0, 98, 0, 'Language: Common'); diff --git a/sql/updates/world/2014_12_04_01_world.sql b/sql/updates/world/2014_12_04_01_world.sql new file mode 100644 index 00000000000..274bfe59f87 --- /dev/null +++ b/sql/updates/world/2014_12_04_01_world.sql @@ -0,0 +1,24 @@ +SET @GAME_TELE_ID_START := 1555; + +DELETE FROM `game_tele` WHERE `id` BETWEEN @GAME_TELE_ID_START AND @GAME_TELE_ID_START + 19; +INSERT INTO `game_tele` (`id`, `position_x`, `position_y`, `position_z`, `orientation`, `map`, `name`) VALUES +(@GAME_TELE_ID_START + 00, 251.711, 1424.71, 444.638, 4.41881, 870, 'Pandaria'), +(@GAME_TELE_ID_START + 01, 907.901, 336.61, 506.095, 3.92009, 870, 'ShrineOfSevenStars'), +(@GAME_TELE_ID_START + 02, 1549.89, 920.995, 473.622, 3.42922, 870, 'ShrineOfTwoMoons'), +(@GAME_TELE_ID_START + 03, -536.012, 2386.36, 237.879, 0.637136, 870, 'SerpentsSpine'), +(@GAME_TELE_ID_START + 04, -1554.91, 1039.57, 15.4541, 3.04517, 870, 'TempleOfTheRedCrane'), +(@GAME_TELE_ID_START + 05, -1035.26, -56.1368, 21.0366, 1.3487, 870, 'DojaniRiver'), +(@GAME_TELE_ID_START + 06, 1679.63, 1366.97, 453.591, 3.12056, 870, 'TheGoldenStair'), +(@GAME_TELE_ID_START + 07, 1267, 572.682, 405.535, 5.44769, 870, 'MogushanPalace'), +(@GAME_TELE_ID_START + 08, 2365.02, -1759.82, 375.256, 3.78028, 870, 'TheJadeForest'), +(@GAME_TELE_ID_START + 09, 3644.58, 556.135, 626.341, 2.99016, 870, 'TempleOfTheWhiteTiger'), +(@GAME_TELE_ID_START + 10, 2822.38, 1768.44, 647.643, 1.91496, 870, 'TheBurlapTrail'), +(@GAME_TELE_ID_START + 11, 3610.88, 2545.96, 768.787, 6.09564, 870, 'ShadoPanMonastery'), +(@GAME_TELE_ID_START + 12, 3948.67, 5256.2, 224.267, 1.67229, 870, 'ShanzeDao'), +(@GAME_TELE_ID_START + 13, 2274.83, 4639.1, 155.072, 1.91183, 870, 'NiuzaoTemple'), +(@GAME_TELE_ID_START + 14, 2526.93, 3849.34, 279.058, 2.24641, 870, 'KriVess'), +(@GAME_TELE_ID_START + 15, 2257.71, 3398.02, 298.568, 1.07302, 870, 'TownlongSteppes'), +(@GAME_TELE_ID_START + 16, 789.24, 3451.31, 217.709, 3.75123, 870, 'DreadWastes'), +(@GAME_TELE_ID_START + 17, 203.245, 3926.39, 222.24, 1.7893, 870, 'HearthOfFear'), +(@GAME_TELE_ID_START + 18, -458.889, 1530.74, 258.509, 4.39761, 870, 'ValleyOfTheFourWinds'), +(@GAME_TELE_ID_START + 19, -460.761, 475.407, 165.089, 2.97515, 870, 'PlainOfThiefes'); diff --git a/sql/updates/world/2014_12_12_00_world.sql b/sql/updates/world/2014_12_12_00_world.sql new file mode 100644 index 00000000000..bf1854689b3 --- /dev/null +++ b/sql/updates/world/2014_12_12_00_world.sql @@ -0,0 +1,34 @@ +-- Spawn few missing Bloodcursed Voyagers +SET @CGUID := 75068; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+13; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 17714, 530, 1, 1, -981.0825, -12847.73, -78.35015, 2.45272, 120, 5, 1), +(@CGUID+1, 17714, 530, 1, 1, -981.314, -12813.58, -51.96035, 0.8106143, 120, 5, 1), +(@CGUID+2, 17714, 530, 1, 1, -1135.072, -12931.56, -98.48705, 2.435335, 120, 5, 1), +(@CGUID+3, 17714, 530, 1, 1, -1119.166, -12949.73, -99.68898, 2.535294, 120, 5, 1), +(@CGUID+4, 17714, 530, 1, 1, -1151.618, -12952.28, -101.0686, 2.985196, 120, 5, 1), +(@CGUID+5, 17714, 530, 1, 1, -1150.575, -12917.89, -101.5449, 3.950372, 120, 5, 1), +(@CGUID+6, 17714, 530, 1, 1, -1201.324, -12933.42, -102.7079, 1.193372, 120, 5, 1), +(@CGUID+7, 17714, 530, 1, 1, -1183.288, -12912.58, -102.4625, 3.731045, 120, 5, 1), +(@CGUID+8, 17714, 530, 1, 1, -1221.537, -12954.43, -104.158, 4.284279, 120, 5, 1), +(@CGUID+9, 17714, 530, 1, 1, -1252.931, -12952.77, -104.744, 3.633311, 120, 5, 1), +(@CGUID+10, 17714, 530, 1, 1, -1134.563, -12897.89, -102.6108, 2.934096, 120, 5, 1), +(@CGUID+11, 17714, 530, 1, 1, -1147.651, -12879.45, -102.4199, 4.143747, 120, 5, 1), +(@CGUID+12, 17714, 530, 1, 1, -1411.555, -12765.24, -16.17389, 1.595299, 120, 5, 1), +(@CGUID+13, 17714, 530, 1, 1, -1415.727, -12795.06, -15.76654, 1.830911, 120, 5, 1); + +DELETE FROM `gossip_menu_option` WHERE (`menu_id`=8298 AND `id`=0); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `OptionBroadcastTextID`, `npc_option_npcflag`, `box_coded`, `box_money`, `box_text`) VALUES +(8298, 0, 0, 'Can you cast the spell to help me breathe and move underwater?', 1, 19071, 1, 0, 0, ''); -- 17712 + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 8298; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES +(15, 8298, 0, 0, 0, 9, 0, 9674, 0, 0, 0, 0, 0, 'Captain Edward Hanes - Show Gossip if player has quest 9674 incomplete'), +(15, 8298, 0, 0, 1, 9, 0, 9682, 0, 0, 0, 0, 0, 'Captain Edward Hanes - Show Gossip if player has quest 9682 incomplete'); + +DELETE FROM `smart_scripts` WHERE `entryorguid` = 17712 AND `id` IN (1, 2, 3, 4); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17712,0,1,2,62,0,100,0,8298,0,0,0,11,31319,0,0,0,0,0,7,0,0,0,0,0,0,0,'Captain Edward Hanes - On Gossip Select - Cast "The Captain\'s Kiss"'), +(17712,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Captain Edward Hanes - On Gossip Select - Close Gossip'), +(17712,0,3,0,19,0,100,0,9674,0,0,0,11,31319,0,0,0,0,0,7,0,0,0,0,0,0,0,'Captain Edward Hanes - On Quest Accept - Cast "The Captain\'s Kiss"'), +(17712,0,4,0,19,0,100,0,9682,0,0,0,11,31319,0,0,0,0,0,7,0,0,0,0,0,0,0,'Captain Edward Hanes - On Quest Accept - Cast "The Captain\'s Kiss"'); diff --git a/sql/updates/world/2014_12_12_01_world.sql b/sql/updates/world/2014_12_12_01_world.sql new file mode 100644 index 00000000000..aa5b1641320 --- /dev/null +++ b/sql/updates/world/2014_12_12_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` |33554432, `flags_extra` = `flags_extra` &~256 WHERE entry IN (10184, 36538); diff --git a/sql/updates/world/2014_12_12_02_world.sql b/sql/updates/world/2014_12_12_02_world.sql new file mode 100644 index 00000000000..6dc657b39e9 --- /dev/null +++ b/sql/updates/world/2014_12_12_02_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `conditions` SET `conditionValue1` = 11 WHERE `SourceGroup` = 10389 AND `SourceEntry` = 15 AND `SourceTypeOrReferenceId` = 15; diff --git a/sql/updates/world/2014_12_12_03_world.sql b/sql/updates/world/2014_12_12_03_world.sql new file mode 100644 index 00000000000..0f939f81670 --- /dev/null +++ b/sql/updates/world/2014_12_12_03_world.sql @@ -0,0 +1,3 @@ +-- Ungroup some improperly grouped texts and set their text range +UPDATE `creature_text` SET `groupid` = 5, `TextRange` = 3 WHERE `entry` IN (16065, 16064, 30549, 16063) AND `groupid` = 1 AND `id` = 0; +UPDATE `creature_text` SET `groupid` = 6, `TextRange` = 3, `id` = 0 WHERE `entry` IN (16065, 16064, 30549, 16063) AND `groupid` = 1 AND `id` = 1;
diff --git a/sql/updates/world/2014_12_13_00_world.sql b/sql/updates/world/2014_12_13_00_world.sql new file mode 100644 index 00000000000..3be9f73a293 --- /dev/null +++ b/sql/updates/world/2014_12_13_00_world.sql @@ -0,0 +1,6 @@ +-- Ungroup some improperly grouped texts and set their text range +UPDATE `creature_text` SET `TextRange` = 3 WHERE `entry` = 15990 AND `groupid` = 5; +UPDATE `creature_text` SET `groupid` = 16, `TextRange` = 3, `id` = 0 WHERE `entry` = 15990 AND `groupid` = 6 AND `id` = 0; +UPDATE `creature_text` SET `groupid` = 17, `TextRange` = 3, `id` = 0 WHERE `entry` = 15990 AND `groupid` = 6 AND `id` = 1; +UPDATE `creature_text` SET `groupid` = 18, `TextRange` = 3, `id` = 0 WHERE `entry` = 15990 AND `groupid` = 6 AND `id` = 2; +UPDATE `creature_text` SET `groupid` = 19, `TextRange` = 3, `id` = 0 WHERE `entry` = 15990 AND `groupid` = 6 AND `id` = 3; diff --git a/sql/updates/world/2014_12_15_00_world.sql b/sql/updates/world/2014_12_15_00_world.sql new file mode 100644 index 00000000000..8ed026454c6 --- /dev/null +++ b/sql/updates/world/2014_12_15_00_world.sql @@ -0,0 +1,18 @@ +SET @CGUID := 6747; +DELETE FROM `creature` WHERE `guid`=@CGUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID, 22418, 534, 1, 1, 5502.288, -3525.471, 1607.909, 2.617994, 7200, 0, 0); + +DELETE FROM `creature_text` WHERE `entry`=17968 AND `groupid`=8; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17968, 8, 0, 'All of your efforts have been in vain, for the draining of the World Tree has already begun! Soon the heart of your world will beat no more!', 14, 0, 100, 0, 0, 10986, 20432, 3, 'Archimonde - Intro'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (39140,39141,39142); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,1,39140,0,0,31,0,3,22418,0,0,0, '', 'Drain World Tree Visual'), +(13,1,39141,0,0,31,0,3,17968,0,0,0, '', 'Drain World Tree Visual 2'), +(13,1,39142,0,0,31,0,3,22418,0,0,0, '', 'Drain World Tree Dummy'); + +DELETE FROM `spell_script_names` WHERE `spell_id`=39142; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(39142, 'spell_archimonde_drain_world_tree_dummy'); diff --git a/sql/updates/world/2014_12_17_00_world.sql b/sql/updates/world/2014_12_17_00_world.sql new file mode 100644 index 00000000000..fd1e88f9c1a --- /dev/null +++ b/sql/updates/world/2014_12_17_00_world.sql @@ -0,0 +1,23 @@ +-- +UPDATE `creature_text` SET `TextRange` = 3 WHERE `entry` = 15990 AND `groupid` IN (0, 2, 4); +DELETE FROM `creature_text` WHERE `entry` = 15990 AND `groupid` IN (13, 20); +DELETE FROM `creature_text` WHERE `entry` = 16980 AND `groupid` IN (1, 2, 3); +DELETE FROM `creature_text` WHERE `entry` = 15384 AND `groupid` = 0; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `TextRange`, `comment`) VALUES +(15990, 20, 0, 'Come, heroes... By the will of the Lich King, you shall be destroyed.', 14, 0, 100, 0, 0, 0, 12993, 3, 'Kel''Thuzad SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4'), +(15990, 13, 0, 'Kel''Thuzad strikes!', 41, 0, 100, 0, 0, 0, 32803, 0, 'Kel''Thuzad EMOTE_PHASE_TWO'), +(16980, 1, 0, 'Soon we will eradicate the Alliance and Horde. Then the rest of Azeroth will fall before the might of my army.', 14, 0, 100, 0, 0, 14768, 12988, 3, 'The Lich King SAY_DIALOGUE_SAPPHIRON_LICHKING'), +(16980, 2, 0, 'Invaders... here?! DESTROY them, Kel''Thuzad! Naxxramas must not fall!', 14, 0, 100, 0, 0, 14769, 12989, 3, 'The Lich King SAY_DIALOGUE_SAPPHIRON_LICHKING2'), +(16980, 3, 0, 'Very well. Warriors of the frozen wastes, rise up! I command you to fight, kill and die for your master! Let none survive!', 14, 0, 100, 0, 0, 14770, 12994, 3, 'The Lich King SAY_ANSWER_REQUEST'), +(15384, 0, 0, 'A Guardian of Icecrown enters the fight!', 41, 0, 100, 0, 0, 0, 32804, 0, 'OLDWorld Trigger (DO NOT DELETE)'); + +-- Spawn some missing triggers and the Lich King dummy. Triggers are used to emote when a Guardian of Icecrown is spawned, currently not implemented. +SET @CGUID = 75082; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+5; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 16980, 533, 3, 1, 3762.382, -5115.862, 143.9382, 0.1919862, 7200, 0, 0), -- 16980 (Area: -1) +(@CGUID+1, 15384, 533, 3, 1, 3759.62, -5172.786, 143.8345, 5.148721, 7200, 0, 0), -- 15384 (Area: -1) +(@CGUID+2, 15384, 533, 3, 1, 3716.097, -5106.208, 141.373, 4.939282, 7200, 0, 0), -- 15384 (Area: -1) +(@CGUID+3, 15384, 533, 3, 1, 3777.213, -5066.177, 143.6412, 1.53589, 7200, 0, 0), -- 15384 (Area: -1) +(@CGUID+4, 15384, 533, 3, 1, 3732.598, -5028.03, 144.0342, 5.951573, 7200, 0, 0), -- 15384 (Area: -1) +(@CGUID+5, 15384, 533, 3, 1, 3700.7, -5182.372, 143.9172, 3.525565, 7200, 0, 0); -- 15384 (Area: -1) diff --git a/sql/updates/world/2014_12_19_00_world.sql b/sql/updates/world/2014_12_19_00_world.sql new file mode 100644 index 00000000000..5ba41a95258 --- /dev/null +++ b/sql/updates/world/2014_12_19_00_world.sql @@ -0,0 +1,13145 @@ +DROP TABLE IF EXISTS `quest_objectives`; +CREATE TABLE `quest_objectives` ( + `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', + `QuestID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', + `Type` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + `StorageIndex` TINYINT(3) NOT NULL DEFAULT '0', + `ObjectID` INT(10) NOT NULL DEFAULT '0', + `Amount` INT(10) NOT NULL DEFAULT '0', + `Flags` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `UnkFloat` FLOAT NOT NULL DEFAULT '0', + `VisualEffect1` MEDIUMINT(8) NOT NULL DEFAULT '0', + `VisualEffect2` MEDIUMINT(8) NOT NULL DEFAULT '0', + `VisualEffect3` MEDIUMINT(8) NOT NULL DEFAULT '0', + `VisualEffect4` MEDIUMINT(8) NOT NULL DEFAULT '0', + `VisualEffect5` MEDIUMINT(8) NOT NULL DEFAULT '0', + `Description` TEXT, + `VerifiedBuild` SMALLINT(5) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(251604, 30057, 0, 0, 57408, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Mina Mudclaw home to her father', 19034), +(251605, 28250, 0, 0, 48105, 30, 0, 0, 0, 0, 0, 0, 0, 'Thieving plucker smashed', 19034), +(251606, 30190, 0, 0, 58673, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251607, 28282, 0, 0, 48257, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251608, 27943, 1, 0, 62793, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251609, 28280, 0, 0, 48197, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251613, 30073, 0, 0, 57477, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Chen brew his beer', 19034), +(251614, 30075, 0, 0, 57672, 10, 0, 0, 0, 0, 0, 0, 0, 'Ale-Addled Hozen or Mischievous Virmen slain', 19034), +(251615, 30076, 1, 0, 77471, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251616, 30077, 0, 0, 57662, 7, 0, 0, 0, 0, 0, 0, 0, 'Barreled Pandaren freed', 19034), +(251617, 16, 1, 0, 159, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251618, 29022, 2, 0, 4072, 1, 0, 0, 0, 0, 0, 0, 0, 'Shut off Main Control Valve', 19034), +(251619, 29022, 2, 1, 61936, 1, 0, 0, 0, 0, 0, 0, 0, 'Shut off Fuel Control Valve', 19034), +(251620, 29022, 2, 2, 61935, 1, 0, 0, 0, 0, 0, 0, 0, 'Shut off Regulator Valve', 19034), +(251624, 29024, 1, 0, 5054, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251625, 30051, 0, 0, 58793, 30, 0, 0, 932, 933, 0, 0, 0, 'Gladewater gathered', 19034), +(251626, 30078, 0, 0, 58014, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251627, 30078, 0, 1, 58015, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251628, 30078, 0, 2, 58017, 1, 1, 0, 1034, 0, 0, 0, 0, '', 19034), +(251629, 30599, 0, 0, 59902, 1, 1, 0, 816, 0, 0, 0, 0, 'Destroy Dak Dak''s Altar', 19034), +(251630, 30599, 0, 1, 59932, 1, 1, 0, 817, 0, 0, 0, 0, 'Destroy Ko Ko''s Altar', 19034), +(251631, 30599, 0, 2, 59934, 1, 1, 0, 818, 0, 0, 0, 0, 'Destroy Tak Tak''s Altar', 19034), +(251632, 30600, 1, 0, 80307, 8, 0, 0, 501, 502, 503, 504, 0, '', 19034), +(251634, 27955, 0, 0, 47252, 1, 0, 0, 0, 0, 0, 0, 0, 'Peered into the Eye', 19034), +(251635, 29023, 1, 0, 5089, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251636, 29150, 0, 0, 52623, 10, 0, 0, 0, 0, 0, 0, 0, 'Digsite Survivors Rescued', 19034), +(251638, 10222, 0, 0, 19707, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251639, 25412, 2, 0, 202765, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Firestone Examined', 19034), +(251640, 25412, 2, 1, 202764, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Firestone Examined', 19034), +(251641, 25412, 2, 2, 202763, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Firestone Examined', 19034), +(251642, 29920, 0, 0, 56206, 1, 1, 0, 908, 0, 0, 0, 0, 'Pandriarch Windfur defeated', 19034), +(251643, 29920, 0, 1, 56209, 1, 1, 0, 908, 0, 0, 0, 0, 'Pandriarch Bramblestaff defeated', 19034), +(251644, 29920, 0, 2, 56210, 1, 1, 0, 908, 0, 0, 0, 0, 'Pandriarch Goldendraft defeated', 19034), +(251645, 30052, 0, 0, 57358, 100, 0, 0, 913, 0, 0, 0, 0, 'Weeds pulled', 19034), +(251646, 30053, 0, 0, 62377, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Gardener Fran', 19034), +(251647, 30053, 0, 1, 57385, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Gai Lan', 19034), +(251648, 30053, 0, 2, 62385, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Den Mudclaw', 19034), +(251649, 30054, 1, 0, 77379, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251650, 30690, 0, 0, 61336, 1, 0, 0, 0, 0, 0, 0, 0, 'Lure Kobai into the Trap and Steal his Mask', 19034), +(251653, 10668, 0, 0, 21928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251654, 25447, 1, 0, 53642, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251655, 29287, 1, 0, 69836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251656, 29217, 0, 0, 52939, 1, 0, 0, 0, 0, 0, 0, 0, 'Hazlek rescued', 19034), +(251657, 29217, 0, 1, 52941, 1, 0, 0, 0, 0, 0, 0, 0, 'Bakkalzu rescued', 19034), +(251658, 29217, 0, 2, 52943, 1, 0, 0, 0, 0, 0, 0, 0, 'Norkani rescued', 19034), +(251659, 29217, 0, 3, 52945, 1, 0, 0, 0, 0, 0, 0, 0, 'Kasha rescued', 19034), +(251660, 9786, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251661, 30133, 0, 0, 59151, 1, 0, 0, 505, 0, 0, 0, 0, 'Zhu''s Watch Courier Found', 19034), +(251665, 24535, 0, 0, 37601, 1, 0, 0, 0, 0, 0, 0, 0, 'Thalorien''s Blessing obtained', 19034), +(251666, 30050, 0, 0, 57284, 60, 0, 0, 934, 0, 0, 0, 0, 'Vegetable watered', 19034), +(251667, 10625, 0, 0, 21788, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251668, 10625, 1, 1, 30719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251672, 10106, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(251673, 10106, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(251674, 10106, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(251675, 10624, 1, 0, 30716, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251678, 9716, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251679, 25446, 0, 0, 40218, 12, 0, 0, 0, 0, 0, 0, 0, 'Attuned Frogs deployed', 19034), +(251680, 29444, 1, 0, 71636, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251682, 29288, 1, 0, 69845, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251683, 24461, 1, 0, 49739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251686, 60, 1, 0, 772, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251687, 13513, 1, 0, 44942, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251688, 25449, 1, 0, 8973, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251689, 29037, 0, 0, 51700, 6, 0, 0, 0, 0, 0, 0, 0, 'Feed Winterspring Cub Smoked Meat', 19034), +(251690, 29151, 0, 0, 52882, 1, 0, 0, 0, 0, 0, 0, 0, 'Supplies Searched', 19034), +(251691, 14461, 0, 0, 36727, 1, 0, 0, 0, 0, 0, 0, 0, 'First Trough', 19034), +(251692, 14461, 0, 1, 37155, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Trough', 19034), +(251693, 14461, 0, 2, 37156, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Trough', 19034), +(251694, 28281, 0, 0, 48194, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251695, 28411, 1, 0, 64319, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251696, 28411, 1, 1, 64320, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251697, 30252, 0, 0, 58719, 8, 0, 0, 0, 0, 0, 0, 0, 'Unbudging Rock cleared', 19034), +(251702, 33, 1, 0, 50432, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251703, 28838, 1, 0, 65902, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251704, 29508, 0, 0, 54510, 1, 0, 0, 0, 0, 0, 0, 0, 'Put New Horseshoes on Baby', 19034), +(251705, 25306, 0, 0, 39683, 1, 0, 0, 0, 0, 0, 0, 0, 'Ejection System Tested', 19034), +(251706, 25466, 1, 0, 18958, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251707, 28354, 1, 0, 3502, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251708, 27371, 0, 0, 45444, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251709, 28837, 1, 0, 66052, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251710, 30390, 1, 0, 74644, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251711, 30391, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251712, 30387, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251713, 30388, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251714, 30389, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251715, 30188, 0, 0, 58594, 1, 0, 0, 0, 0, 0, 0, 0, 'Join the Order of the Cloud Serpent', 19034), +(251716, 30189, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251720, 10669, 0, 0, 21894, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251721, 10669, 1, 1, 30853, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251723, 29026, 1, 0, 11146, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251724, 15, 0, 0, 257, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251729, 28356, 0, 0, 2371, 15, 0, 0, 0, 0, 0, 0, 0, 'Daggerspine Naga slain', 19034), +(251731, 27945, 1, 0, 62796, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251732, 29677, 1, 0, 73184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251733, 29678, 0, 0, 57476, 1, 0, 0, 947, 948, 949, 0, 0, 'Cross to the Pool of Reflection', 19034), +(251734, 29678, 0, 1, 55205, 1, 0, 0, 0, 0, 0, 0, 0, 'Coax Shu, the Water Spirit', 19034), +(251735, 29679, 0, 0, 55212, 5, 0, 0, 0, 0, 0, 0, 0, 'Play with the Spirit of Water', 19034), +(251736, 27699, 1, 0, 55212, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251737, 30229, 0, 0, 58614, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251738, 29067, 1, 0, 76097, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251739, 29067, 1, 1, 76098, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251740, 29067, 1, 2, 93351, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251741, 10267, 1, 0, 28913, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251743, 25303, 0, 0, 39741, 1, 0, 0, 0, 0, 0, 0, 0, 'Crucible of Earth Activated', 19034), +(251744, 25303, 0, 1, 39739, 1, 0, 0, 0, 0, 0, 0, 0, 'Crucible of Air Activated', 19034), +(251745, 25303, 0, 2, 39727, 1, 0, 0, 0, 0, 0, 0, 0, 'Crucible of Fire Activated', 19034), +(251746, 25303, 0, 3, 39740, 1, 0, 0, 0, 0, 0, 0, 0, 'Crucible of Water Activated', 19034), +(251749, 28171, 0, 0, 47605, 1, 0, 0, 0, 0, 0, 0, 0, 'Red dragonflight assault joined', 19034), +(251750, 29034, 1, 0, 68644, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251751, 29034, 1, 1, 14047, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251752, 29034, 1, 2, 8170, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251753, 29034, 8, -1, 0, 800000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251754, 29392, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251755, 29290, 0, 0, 53308, 100, 0, 0, 0, 0, 0, 0, 0, 'Amassing Flamewakers slain', 19034), +(251756, 29290, 0, 1, 53479, 40, 0, 0, 0, 0, 0, 0, 0, 'Amassing Cinderwebs slain', 19034), +(251757, 29290, 0, 2, 53310, 3, 0, 0, 0, 0, 0, 0, 0, 'Molten Lords slain', 19034), +(251758, 47, 1, 0, 773, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251759, 25452, 1, 0, 8973, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251760, 29035, 0, 0, 51694, 6, 0, 0, 0, 0, 0, 0, 0, 'Feed Shardtooth Meat to Cub', 19034), +(251761, 23, 1, 0, 16303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251762, 9807, 1, 0, 24449, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251763, 25046, 0, 0, 39098, 1, 0, 0, 0, 0, 0, 0, 0, 'Lilian''s Mission Accomplished', 19034), +(251765, 28756, 0, 0, 59153, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251766, 27372, 1, 0, 60986, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251767, 10608, 0, 0, 21189, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251768, 25353, 1, 0, 52834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251769, 25353, 1, 1, 52853, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251770, 29210, 0, 0, 53886, 1, 0, 0, 0, 0, 0, 0, 0, 'Enter the Igneous Depths', 19034), +(251771, 29210, 0, 1, 52891, 1, 0, 0, 0, 0, 0, 0, 0, 'All Flame Runes Destroyed', 19034), +(251772, 29027, 1, 0, 11143, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251773, 28834, 0, 0, 40788, 1, 0, 0, 0, 0, 0, 0, 0, 'Erunak Stonespeaker Rescued', 19034), +(251774, 107, 1, 0, 1252, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251775, 25292, 1, 0, 52714, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251776, 25154, 0, 0, 39222, 3, 0, 0, 0, 0, 0, 0, 0, 'Timeless Nightstones Cut', 19034), +(251777, 25154, 1, 1, 52098, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251778, 274, 1, 0, 2609, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251780, 10677, 1, 0, 30867, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251781, 10220, 0, 0, 16904, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251782, 10220, 0, 1, 16906, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251783, 10220, 0, 2, 16905, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251785, 8, 1, 0, 7628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251786, 28833, 0, 0, 40788, 1, 0, 0, 0, 0, 0, 0, 0, 'Erunak Stonespeaker Rescued', 19034), +(251787, 11483, 1, 0, 34133, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251788, 11483, 1, 1, 34134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251789, 11483, 1, 2, 34135, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251790, 19, 1, 0, 1260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251792, 28173, 0, 0, 46141, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251793, 30460, 0, 0, 59143, 8, 0, 0, 516, 0, 0, 0, 0, 'Injured Binan Warriors healed', 19034), +(251794, 28176, 0, 0, 47855, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidian Whelps hatched', 19034), +(251795, 28176, 0, 1, 47874, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidian Lair infiltrated', 19034), +(251797, 28137, 1, 0, 63047, 22, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251798, 26443, 1, 0, 23780, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251799, 25273, 0, 0, 39446, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251800, 25273, 1, 1, 52682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251801, 30058, 0, 1, 57421, 1, 1, 0, 517, 0, 0, 0, 0, 'Bait and Kill Mothallus', 19034), +(251803, 30059, 0, 0, 57422, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251804, 30063, 1, 0, 77419, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251805, 30064, 1, 0, 77432, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251806, 30065, 1, 0, 77452, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251807, 30066, 0, 0, 57705, 6, 0, 0, 1412, 1413, 1414, 0, 0, 'Ancient Mantras delivered', 19034), +(251808, 30067, 0, 0, 57389, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251810, 27144, 0, 0, 45111, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Reckoning', 19034), +(251811, 30535, 1, 0, 80295, 1, 0, 0, 782, 0, 0, 0, 0, '', 19034), +(251812, 30834, 0, 0, 60982, 1, 0, 0, 0, 0, 0, 0, 0, 'Reunite Wu-Peng and Merchant Shi', 19034), +(251813, 10518, 1, 0, 30416, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251814, 10518, 1, 1, 30417, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251817, 98, 1, 0, 3629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251818, 29511, 0, 0, 54504, 5, 0, 0, 0, 0, 0, 0, 0, 'Damaged Tonk Repaired', 19034), +(251819, 10793, 1, 0, 31345, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251820, 30230, 1, 0, 79120, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251821, 28175, 0, 0, 47876, 1, 0, 0, 0, 0, 0, 0, 0, 'Alexstrasza''s Tear planted', 19034), +(251822, 27014, 1, 0, 60751, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251823, 28343, 0, 0, 48362, 3, 0, 0, 0, 0, 0, 0, 0, 'Elemental Gate closed', 19034), +(251824, 28343, 1, 1, 63469, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251825, 20, 1, 0, 3014, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251826, 26434, 1, 0, 58812, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251827, 26434, 1, 1, 58813, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251828, 28090, 1, 0, 62926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251829, 28090, 1, 1, 62927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251830, 30534, 0, 0, 59674, 1, 0, 0, 0, 0, 0, 0, 0, 'Hired a farm hand', 19034), +(251831, 27948, 1, 0, 62803, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251834, 28094, 0, 0, 47406, 30, 0, 0, 0, 0, 0, 0, 0, 'Wyrms'' Bend cultists killed', 19034), +(251835, 26406, 1, 0, 58281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251836, 11889, 0, 0, 25582, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251837, 26143, 0, 0, 41659, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251838, 64, 1, 0, 841, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251839, 30088, 1, 0, 78941, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251840, 30088, 1, 1, 78942, 1, 0, 0, 518, 0, 0, 0, 0, '', 19034), +(251841, 29425, 0, 0, 54022, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate Droffers and Son', 19034), +(251842, 28140, 0, 0, 47718, 1, 0, 0, 0, 0, 0, 0, 0, 'Controller disabled', 19034), +(251843, 26429, 0, 0, 2554, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251844, 26429, 0, 1, 2556, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251845, 26429, 0, 2, 2555, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251846, 28091, 0, 0, 47490, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251848, 10098, 1, 0, 27634, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251849, 10098, 1, 1, 27633, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251850, 10098, 1, 2, 27632, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251851, 30255, 0, 0, 59987, 2, 0, 0, 0, 0, 0, 0, 0, 'Parched EZ-Gro Green Cabbage watered', 19034), +(251852, 30118, 1, 0, 78352, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251853, 30118, 1, 1, 77947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251854, 30118, 1, 2, 77948, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251855, 30254, 0, 0, 59985, 2, 0, 0, 0, 0, 0, 0, 0, 'Soil Tilled', 19034), +(251856, 30254, 0, 1, 59990, 2, 0, 0, 0, 0, 0, 0, 0, 'EZ-Gro Green Cabbage Seeds Planted', 19034), +(251857, 28092, 0, 0, 47539, 1, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Gate opened', 19034), +(251858, 29428, 1, 0, 71057, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251859, 24451, 1, 0, 49698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251860, 22, 1, 0, 723, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251861, 255, 0, 0, 1178, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251862, 255, 0, 1, 1180, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251863, 255, 0, 2, 1179, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251864, 28189, 0, 0, 47872, 15, 0, 0, 0, 0, 0, 0, 0, 'Human Seedling "saved"', 19034), +(251865, 28093, 0, 0, 47566, 1, 0, 0, 0, 0, 0, 0, 0, 'Grim Batol entrance secured', 19034), +(251866, 30384, 0, 0, 58850, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251867, 10517, 0, 0, 20732, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251868, 29427, 0, 0, 54114, 1, 0, 0, 0, 0, 0, 0, 0, 'Meeting Disrupted', 19034), +(251869, 10567, 1, 0, 30706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251872, 12518, 1, 0, 44184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251873, 29426, 1, 1, 10940, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251874, 29426, 1, 0, 3371, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251875, 29426, 1, 2, 71035, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251876, 13185, 0, 0, 31093, 3, 0, 0, 0, 0, 0, 0, 0, 'Alliance Siege Devices destroyed', 19034), +(251877, 29514, 1, 0, 72046, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251878, 25272, 0, 0, 39446, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251879, 25272, 1, 1, 52682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251880, 26428, 1, 0, 5830, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251881, 26428, 1, 1, 5832, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251882, 26428, 1, 2, 5831, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251883, 28162, 1, 0, 63103, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251884, 25503, 1, 0, 54640, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251885, 10242, 1, 0, 30404, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251887, 20439, 1, 0, 49698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251888, 27949, 2, 0, 206570, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251889, 27966, 1, 0, 62808, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251890, 27359, 1, 0, 60975, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251891, 28165, 0, 0, 47785, 10, 0, 0, 0, 0, 0, 0, 0, 'Demons Slain', 19034), +(251892, 28488, 1, 0, 64404, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251893, 29415, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251895, 30240, 0, 0, 58967, 1, 0, 0, 0, 0, 0, 0, 0, 'Live through the Survival Ring for 60 seconds', 19034), +(251896, 26470, 0, 0, 3917, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251897, 26470, 0, 1, 12759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251900, 26426, 0, 0, 44281, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Felsen the Enduring', 19034), +(251901, 26426, 0, 1, 44282, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the entrance to the Crumbling Depths', 19034), +(251903, 28781, 0, 0, 44577, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251904, 28781, 0, 1, 45122, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251906, 29078, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251907, 26501, 0, 0, 43164, 1, 0, 0, 0, 0, 0, 0, 0, 'Armory sealed', 19034), +(251908, 26501, 0, 1, 43165, 1, 0, 0, 0, 0, 0, 0, 0, 'Inn sealed', 19034), +(251909, 26501, 0, 2, 43166, 1, 0, 0, 0, 0, 0, 0, 0, 'Barracks sealed', 19034), +(251910, 26501, 0, 3, 43167, 1, 0, 0, 0, 0, 0, 0, 0, 'Shrine sealed', 19034), +(251911, 30228, 0, 0, 58545, 8, 0, 0, 0, 0, 0, 0, 0, 'Stonebark sprites slain', 19034), +(251912, 27967, 0, 0, 46571, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251914, 114, 1, 0, 1257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251915, 26475, 1, 0, 5493, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251916, 26445, 1, 0, 45477, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251917, 26445, 1, 1, 45476, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251919, 29038, 0, 0, 51711, 5, 0, 0, 0, 0, 0, 0, 0, 'Hunting Practice', 19034), +(251920, 11568, 0, 0, 24874, 1, 0, 0, 0, 0, 0, 0, 0, 'Shield of the Aesirites Returned', 19034), +(251921, 11568, 0, 1, 24876, 1, 0, 0, 0, 0, 0, 0, 0, 'Staff of Storm''s Fury Returned', 19034), +(251922, 11568, 0, 2, 24877, 1, 0, 0, 0, 0, 0, 0, 0, 'Frozen Heart of Isuldof Returned', 19034), +(251923, 11568, 0, 3, 24875, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Armor of the Kvaldir Returned', 19034), +(251924, 126, 1, 0, 3614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251925, 74, 1, 0, 916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251928, 28278, 0, 0, 48195, 20, 0, 0, 0, 0, 0, 0, 0, 'Blackrock minions cudgeled', 19034), +(251929, 26452, 0, 0, 43120, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat your Gurubashi Arena Challenger', 19034), +(251930, 30472, 1, 0, 79870, 1, 0, 0, 1190, 0, 0, 0, 0, '', 19034), +(251931, 30087, 0, 0, 56110, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Xiao and his companions', 19034), +(251932, 30475, 1, 0, 80233, 1, 0, 0, 784, 0, 0, 0, 0, '', 19034), +(251933, 10970, 1, 0, 31956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251934, 26762, 0, 0, 43984, 5, 0, 0, 0, 0, 0, 0, 0, 'Deactivated War Constructs reactivated', 19034), +(251935, 10223, 0, 0, 19705, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251936, 13479, 1, 0, 44806, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251937, 26450, 1, 0, 58877, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251938, 24458, 1, 0, 49705, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251939, 30473, 1, 0, 79828, 1, 0, 0, 959, 0, 0, 0, 0, '', 19034), +(251940, 30474, 1, 0, 79871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251942, 30478, 1, 0, 80236, 1, 0, 0, 935, 0, 0, 0, 0, '', 19034), +(251943, 30479, 1, 0, 80231, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251944, 11631, 0, 0, 25456, 1, 0, 0, 0, 0, 0, 0, 0, 'Farseer Grimwalker''s fate divined', 19034), +(251945, 29416, 0, 0, 53978, 1, 0, 0, 0, 0, 0, 0, 0, 'Follow Thief''s Trail', 19034), +(251946, 26479, 1, 0, 46721, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251948, 11242, 1, 0, 33277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251952, 26473, 1, 0, 5437, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251954, 128, 0, 0, 435, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251955, 26476, 1, 0, 5463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251957, 30476, 1, 0, 80229, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251958, 25399, 0, 0, 39750, 10, 0, 0, 0, 0, 0, 0, 0, 'Hatecrest Naga killed', 19034), +(251959, 28163, 0, 0, 48144, 12, 0, 0, 0, 0, 0, 0, 0, 'Horde Infantry', 19034), +(251960, 30470, 1, 0, 80134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251961, 112, 1, 0, 1256, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251962, 30477, 1, 0, 80228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251963, 30471, 1, 0, 79827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251964, 70, 1, 0, 910, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251970, 83, 1, 0, 1019, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251973, 28758, 0, 0, 49873, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251974, 26477, 1, 0, 5464, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251975, 24480, 0, 0, 37158, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Quel''Delar to Halls of Reflection', 19034), +(251976, 24480, 1, 1, 50254, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251979, 9799, 1, 0, 24416, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251980, 26454, 1, 0, 24081, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251981, 26455, 1, 0, 23760, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251982, 26478, 1, 0, 5519, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(251983, 29246, 1, 0, 69678, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251988, 117, 1, 0, 1274, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251989, 29455, 0, 0, 54495, 3, 0, 0, 0, 0, 0, 0, 0, 'Rings Landed', 19034), +(251990, 26482, 1, 0, 46781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251991, 26456, 1, 0, 23778, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251992, 30116, 1, 0, 77952, 60, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251993, 30172, 0, 0, 58341, 1, 0, 0, 0, 0, 0, 0, 0, 'Lead Mudmug back to Halfhill', 19034), +(251994, 38, 1, 0, 732, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251995, 29094, 0, 0, 52360, 1, 0, 0, 0, 0, 0, 0, 0, 'Rocket Ride Taken', 19034), +(251996, 29475, 1, 0, 4394, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251997, 29475, 1, 1, 10507, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251998, 29475, 1, 2, 4384, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(251999, 30072, 1, 0, 77455, 1, 0, 0, 1046, 0, 0, 0, 0, '', 19034), +(252000, 30072, 0, 1, 57403, 5, 0, 0, 520, 0, 0, 0, 0, 'Hungry Silkworm Fed', 19034), +(252001, 30072, 1, 2, 77456, 1, 0, 0, 1047, 0, 0, 0, 0, '', 19034), +(252002, 28279, 0, 0, 48210, 5, 0, 0, 0, 0, 0, 0, 0, 'Blackrock Sergeant slain', 19034), +(252004, 29397, 1, 0, 33955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252005, 29161, 0, 0, 40284, 6, 0, 0, 0, 0, 0, 0, 0, 'Hyjal Bear Cubs chucked to safety', 19034), +(252006, 29398, 0, 0, 53978, 1, 0, 0, 0, 0, 0, 0, 0, 'Follow Thief''s Trail', 19034), +(252007, 29422, 0, 0, 54787, 1, 0, 0, 956, 0, 0, 0, 0, 'Reignite the Spirit of Fire', 19034), +(252008, 10957, 0, 0, 22841, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252009, 29423, 0, 0, 61128, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring the Spirit of Fire to the Temple of Five Dawns', 19034), +(252010, 29162, 0, 0, 52749, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252012, 29148, 0, 0, 52649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252013, 29163, 0, 0, 52816, 9, 0, 0, 0, 0, 0, 0, 0, 'Invader from the Firelands slain', 19034), +(252014, 29399, 0, 0, 54022, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate the Shady Lady', 19034), +(252015, 29424, 1, 0, 72071, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252016, 25519, 0, 0, 40561, 6, 0, 0, 0, 0, 0, 0, 0, 'Tortolla''s Eggs Saved', 19034), +(252017, 29149, 0, 0, 52816, 7, 0, 0, 0, 0, 0, 0, 0, 'Invader from the Firelands slain', 19034), +(252018, 29164, 0, 0, 52819, 10, 0, 0, 0, 0, 0, 0, 0, 'Howl atop an invader''s corpse', 19034), +(252019, 29165, 0, 0, 52766, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252020, 29477, 1, 0, 10559, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252021, 29477, 1, 1, 4407, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252022, 29477, 1, 2, 4392, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252023, 12054, 1, 0, 36740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252024, 26472, 0, 0, 3940, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252025, 26472, 0, 1, 3941, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252026, 26472, 0, 2, 3942, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252029, 30379, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252030, 30380, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252031, 30381, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252032, 79, 1, 0, 938, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252033, 62, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252034, 29079, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252035, 153, 1, 0, 829, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252038, 30616, 0, 0, 59538, 8, 0, 0, 0, 0, 0, 0, 0, 'Ruqin Yaungols slain', 19034), +(252039, 30617, 2, 0, 211539, 8, 0, 0, 569, 0, 0, 0, 0, 'Lucky Burlap Incense lit', 19034), +(252040, 27136, 0, 0, 45091, 8, 0, 0, 0, 0, 0, 0, 0, 'Totem energized', 19034), +(252041, 28497, 0, 0, 48859, 100, 0, 0, 0, 0, 0, 0, 0, 'Schnottz Infantrymen Slain', 19034), +(252042, 25155, 0, 0, 39223, 3, 0, 0, 0, 0, 0, 0, 0, 'Jagged Jasper Cut', 19034), +(252043, 25155, 1, 1, 52121, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252044, 30855, 0, 0, 61069, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252046, 2, 1, 0, 16305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252047, 24431, 1, 0, 49667, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252048, 30174, 0, 0, 58224, 1, 1, 0, 1445, 0, 0, 0, 0, '', 19034), +(252049, 30175, 0, 0, 58367, 10, 0, 0, 0, 0, 0, 0, 0, 'Ik''thik Mantid slain', 19034), +(252050, 30179, 1, 0, 79252, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252051, 30383, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252052, 29402, 1, 1, 10940, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252053, 29402, 1, 0, 3371, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252054, 29402, 1, 2, 71035, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252057, 30386, 1, 0, 74651, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252058, 29153, 1, 0, 69774, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252059, 30079, 0, 0, 57457, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Despondent Warden of Zhu', 19034), +(252060, 30079, 0, 1, 57830, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Sunni', 19034), +(252061, 30079, 0, 2, 57825, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Yun', 19034), +(252062, 30079, 0, 3, 57744, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Mei', 19034), +(252063, 30080, 0, 0, 57745, 1, 0, 0, 1221, 0, 0, 0, 0, 'Find Yi-Mo Longbrow', 19034), +(252064, 30081, 1, 0, 78880, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252065, 30081, 1, 1, 78877, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252066, 30081, 1, 2, 78881, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252067, 30823, 0, 0, 60493, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252068, 30082, 0, 0, 57310, 1, 0, 0, 1248, 1249, 0, 0, 0, 'Yi-Mo Brought to Zhu''s Watch', 19034), +(252069, 30083, 0, 0, 58215, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252071, 30084, 0, 0, 58161, 1, 0, 0, 0, 0, 0, 0, 0, 'Memorial Flame of Zhu', 19034), +(252072, 30084, 0, 1, 58170, 1, 0, 0, 0, 0, 0, 0, 0, 'Memorial Flame of Po', 19034), +(252073, 30084, 0, 2, 58173, 1, 0, 0, 0, 0, 0, 0, 0, 'Memorial Flame of Rin', 19034), +(252074, 30182, 0, 0, 58548, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252075, 27704, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252076, 28190, 0, 0, 7092, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252079, 30093, 0, 0, 57802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252080, 29154, 1, 0, 69774, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252081, 30469, 1, 0, 79880, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252082, 29293, 0, 0, 53243, 5, 0, 0, 0, 0, 0, 0, 0, 'Druids of the Talon rescued', 19034), +(252083, 26494, 1, 0, 58882, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252085, 29417, 0, 0, 54131, 8, 0, 0, 0, 0, 0, 0, 0, 'Fe-Feng attackers slain', 19034), +(252086, 29418, 1, 0, 72111, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252087, 29082, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(252088, 29313, 1, 0, 69898, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252089, 29166, 1, 0, 69236, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252090, 29419, 0, 0, 54855, 1, 0, 0, 569, 0, 0, 0, 0, 'Rescue the Cart Driver', 19034), +(252092, 29390, 0, 0, 53935, 1, 0, 0, 0, 0, 0, 0, 0, 'Lo''gosh assisted', 19034), +(252093, 29390, 0, 1, 53936, 1, 0, 0, 0, 0, 0, 0, 0, 'Tortolla assisted', 19034), +(252094, 29390, 0, 2, 53937, 1, 0, 0, 0, 0, 0, 0, 0, 'Aviana assisted', 19034), +(252095, 29390, 0, 3, 53924, 1, 0, 0, 0, 0, 0, 0, 0, 'Aessina assisted', 19034), +(252096, 30468, 0, 0, 59166, 15, 0, 0, 0, 0, 0, 0, 0, 'Enraged Jinyu slain', 19034), +(252097, 30181, 0, 0, 58424, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252098, 14126, 1, 0, 49866, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252099, 29391, 0, 0, 53935, 1, 0, 0, 0, 0, 0, 0, 0, 'Goldrinn assisted', 19034), +(252100, 29391, 0, 1, 53936, 1, 0, 0, 0, 0, 0, 0, 0, 'Tortolla assisted', 19034), +(252101, 29391, 0, 2, 53937, 1, 0, 0, 0, 0, 0, 0, 0, 'Aviana assisted', 19034), +(252102, 29391, 0, 3, 53924, 1, 0, 0, 0, 0, 0, 0, 0, 'Aessina assisted', 19034), +(252103, 10, 1, 0, 8593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252104, 29396, 1, 0, 33955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252107, 30829, 0, 0, 61305, 1, 1, 0, 1247, 0, 0, 0, 0, 'Tongue of Ba-Shon Bound', 19034), +(252108, 11, 1, 0, 782, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252109, 29403, 0, 0, 54114, 1, 0, 0, 0, 0, 0, 0, 0, 'Meeting Disrupted', 19034), +(252110, 30112, 0, 0, 23953, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252111, 30536, 0, 0, 56110, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Xiao and his companions', 19034), +(252112, 11255, 0, 0, 24124, 3, 0, 0, 0, 0, 0, 0, 0, 'Captured Valgarde Prisoner Rescued', 19034), +(252113, 27705, 0, 0, 46424, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252114, 29598, 0, 0, 20155, 1, 0, 0, 0, 0, 0, 0, 0, 'Internment Lodges Set Ablaze', 19034), +(252116, 30602, 0, 0, 59806, 1, 0, 0, 505, 0, 0, 0, 0, 'Rescue Brother Rabbitsfoot', 19034), +(252117, 29147, 0, 0, 52595, 12, 0, 0, 0, 0, 0, 0, 0, 'Alpine Songbird gathered', 19034), +(252118, 29147, 0, 1, 52596, 5, 0, 0, 0, 0, 0, 0, 0, 'Forest Owl gathered', 19034), +(252119, 29147, 0, 2, 52594, 2, 0, 0, 0, 0, 0, 0, 0, 'Goldwing Hawk gathered', 19034), +(252122, 28783, 0, 0, 44819, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252123, 27231, 0, 0, 45254, 10, 0, 0, 0, 0, 0, 0, 0, 'Hillsbrad Worgen slain', 19034), +(252124, 122, 1, 0, 1221, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252125, 29081, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252126, 29660, 0, 0, 17976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252127, 29660, 0, 1, 17975, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252128, 29660, 0, 2, 17978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252131, 71, 1, 0, 735, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252132, 29933, 1, 0, 76173, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252133, 29825, 0, 0, 29309, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252134, 30089, 0, 0, 58238, 8, 0, 0, 1222, 0, 0, 0, 0, 'Despondent Wardens of Zhu Cured', 19034), +(252135, 30090, 0, 0, 58409, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252136, 30090, 0, 1, 58410, 1, 0, 0, 1250, 0, 0, 0, 0, 'Yi-Mo Cured', 19034), +(252137, 30091, 0, 0, 57649, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252138, 30183, 0, 0, 58432, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252139, 29667, 0, 0, 19598, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252140, 29667, 0, 1, 19513, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252141, 29667, 0, 2, 19865, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252142, 29667, 1, 3, 72706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252143, 30184, 1, 0, 79058, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252144, 30185, 1, 0, 79059, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252145, 30186, 0, 0, 58439, 1, 1, 0, 903, 0, 0, 0, 0, 'Rescue Hemet Nesingwary Jr.', 19034), +(252146, 30665, 0, 0, 60164, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252147, 29669, 0, 0, 17977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252148, 29421, 0, 0, 54734, 1, 1, 0, 0, 0, 0, 0, 0, 'Defeat Master Li Fei', 19034), +(252149, 29377, 0, 0, 53737, 1, 0, 0, 0, 0, 0, 0, 0, 'Douse the Alliance''s Wickerman', 19034), +(252150, 24476, 1, 0, 49750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252152, 27230, 0, 0, 11121, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252154, 76, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252155, 30814, 0, 0, 60713, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252156, 11367, 0, 0, 24371, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252158, 29481, 1, 0, 76088, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252159, 29481, 1, 1, 76087, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252160, 29481, 1, 2, 76085, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252161, 29481, 1, 3, 76084, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252162, 25587, 0, 0, 46316, 1, 0, 0, 0, 0, 0, 0, 0, 'Smuggler''s Scar Scouted', 19034), +(252163, 25587, 0, 1, 46312, 1, 0, 0, 0, 0, 0, 0, 0, 'Adarrah Signaled', 19034), +(252164, 29100, 0, 0, 52930, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Bwemba Find the Darkspear Emissary', 19034), +(252167, 34, 1, 0, 3631, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252172, 13313, 0, 0, 32189, 6, 0, 0, 0, 0, 0, 0, 0, 'Skybreaker Recon Fighters shot down', 19034), +(252173, 26457, 0, 0, 17304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252174, 26457, 0, 1, 11682, 12, 0, 0, 0, 0, 0, 0, 0, 'Horde at the Warsong Lumber Camp slain', 19034), +(252175, 29464, 1, 0, 71716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252176, 29981, 0, 0, 57195, 14, 0, 0, 0, 0, 0, 0, 0, 'Ik''thik mantid slain', 19034), +(252177, 29982, 0, 0, 57120, 1, 0, 0, 505, 0, 0, 0, 0, 'Evacuate the Blacksoil family', 19034), +(252178, 29982, 0, 1, 57121, 1, 0, 0, 505, 911, 0, 0, 0, 'Evacuate the Spadepaw family', 19034), +(252179, 29982, 0, 2, 57123, 1, 0, 0, 505, 910, 0, 0, 0, 'Evacuate the Greentill family', 19034), +(252180, 29982, 0, 3, 57126, 1, 0, 0, 505, 909, 0, 0, 0, 'Evacuate the Marlfur family', 19034), +(252181, 54, 1, 0, 745, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252182, 25393, 0, 0, 39901, 1, 0, 0, 0, 0, 0, 0, 0, 'Regain the Surface of Gnomeregan', 19034), +(252184, 29527, 1, 0, 23881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252185, 29527, 1, 1, 23901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252186, 28148, 1, 0, 63088, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252187, 12, 0, 0, 504, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252188, 12, 0, 1, 95, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252189, 86, 1, 0, 60401, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252190, 28153, 0, 0, 9517, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252191, 29528, 1, 0, 23881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252192, 29528, 1, 1, 23901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252193, 30096, 0, 0, 54432, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252195, 30097, 0, 0, 57855, 2, 0, 0, 0, 0, 0, 0, 0, 'Echo archived', 19034), +(252196, 30097, 1, 1, 77955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252197, 30099, 0, 0, 58239, 1, 0, 0, 0, 0, 0, 0, 0, 'First portal disabled', 19034), +(252198, 30099, 0, 1, 58240, 1, 0, 0, 0, 0, 0, 0, 0, 'Second portal disabled', 19034), +(252199, 30099, 0, 2, 58241, 1, 0, 0, 0, 0, 0, 0, 0, 'Third portal disabled', 19034), +(252200, 30099, 0, 3, 55085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252201, 30100, 0, 0, 54853, 1, 0, 0, 0, 0, 0, 0, 0, 'Queen Azshara defeated', 19034), +(252202, 30101, 0, 0, 54969, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252203, 29607, 1, 0, 72480, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252204, 30030, 0, 0, 57213, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252205, 28146, 0, 0, 47752, 12, 0, 0, 0, 0, 0, 0, 0, 'Murlocs fed to Hungry Mine Spider', 19034), +(252207, 105, 1, 0, 17114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252208, 29456, 1, 0, 71951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252209, 29520, 0, 0, 54545, 1, 0, 0, 0, 0, 0, 0, 0, 'Plant Darkmoon Banner', 19034), +(252210, 30123, 1, 0, 78911, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252211, 30124, 0, 0, 58857, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252212, 30125, 1, 0, 78914, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252213, 30126, 0, 0, 58116, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252217, 10268, 1, 0, 28934, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252219, 30496, 1, 1, 81385, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252221, 29826, 0, 0, 30285, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252222, 29826, 0, 1, 30284, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 252222 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(252223, 29826, 0, 2, 29308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252224, 30256, 1, 0, 80314, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252225, 30648, 0, 0, 59692, 1, 0, 0, 709, 0, 0, 0, 0, 'Traveled to Valley of the Four Winds', 19034), +(252226, 29519, 2, 0, 209276, 4, 0, 0, 0, 0, 0, 0, 0, 'Scrape Staked Skins', 19034), +(252227, 29907, 0, 0, 56343, 1, 0, 0, 0, 0, 0, 0, 0, 'Follow Chen and Li Li to Pang''s Stead', 19034), +(252229, 28155, 0, 0, 9516, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252231, 29523, 1, 0, 72112, 1, 0, 0, 955, 0, 0, 0, 0, '', 19034), +(252232, 29985, 0, 0, 56740, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252233, 29075, 0, 0, 52072, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the Bonfire', 19034), +(252234, 30723, 0, 0, 61843, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252235, 29986, 0, 0, 66119, 1, 0, 0, 1022, 0, 0, 0, 0, 'Northern Fog Ward lit', 19034), +(252236, 29986, 0, 1, 66121, 1, 0, 0, 1023, 0, 0, 0, 0, 'Western Fog Ward lit', 19034), +(252237, 29986, 0, 2, 66120, 1, 0, 0, 1024, 0, 0, 0, 0, 'Southern Fog Ward lit', 19034), +(252238, 29987, 0, 0, 56738, 4, 0, 0, 914, 0, 0, 0, 0, 'Strike the Stack of Wooden Boards', 19034), +(252239, 30028, 1, 0, 77033, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252240, 30029, 0, 0, 57223, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252241, 27989, 1, 0, 62820, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252242, 29457, 1, 0, 71952, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252243, 28154, 1, 0, 63090, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252244, 30522, 0, 0, 59505, 8, 0, 0, 0, 0, 0, 0, 0, 'Suspicious Footprints found', 19034), +(252245, 192, 0, 0, 684, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252246, 29458, 1, 0, 71953, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252247, 29988, 1, 0, 76501, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252248, 29988, 1, 1, 76503, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252249, 29988, 1, 2, 76516, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252251, 11268, 0, 0, 24013, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252252, 11268, 0, 1, 24073, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252253, 11268, 0, 2, 23992, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252257, 29989, 0, 0, 56738, 5, 0, 0, 914, 0, 0, 0, 0, 'Strike the Stack of Stone Blocks', 19034), +(252258, 25411, 0, 0, 40099, 1, 0, 0, 0, 0, 0, 0, 0, 'Twilight Inferno Lord Subjugated', 19034), +(252259, 30524, 1, 0, 80136, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252260, 30525, 1, 0, 80140, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252261, 30525, 1, 1, 80141, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252262, 30525, 1, 2, 80142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252263, 30525, 1, 3, 80143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252264, 30526, 1, 0, 80144, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252265, 30527, 0, 1, 66736, 4, 0, 0, 1115, 0, 0, 0, 0, 'Plant Striped Melons', 19034), +(252266, 30528, 0, 0, 59567, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252267, 28393, 0, 0, 8911, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252268, 28393, 1, 1, 64302, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252269, 11130, 1, 0, 33010, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252270, 29599, 0, 0, 20156, 1, 0, 0, 0, 0, 0, 0, 0, 'Thrall''s Destiny Fulfilled', 19034), +(252271, 29908, 0, 0, 56184, 8, 0, 0, 0, 0, 0, 0, 0, 'Large virmen slain', 19034), +(252272, 29910, 0, 0, 60967, 6, 0, 0, 0, 0, 0, 0, 0, 'Plump Marmot moved', 19034), +(252273, 29910, 2, 1, 209835, 6, 0, 0, 0, 0, 0, 0, 0, 'Marmot Hole filled', 19034), +(252274, 28152, 1, 0, 63091, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252275, 68, 1, 0, 889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252276, 28487, 1, 0, 64390, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252277, 28487, 1, 1, 64391, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252278, 28487, 1, 2, 64393, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252279, 28144, 1, 0, 63082, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252280, 27969, 0, 0, 47127, 6, 0, 0, 0, 0, 0, 0, 0, 'Slackers Motivated', 19034), +(252281, 29371, 0, 0, 53737, 1, 0, 0, 0, 0, 0, 0, 0, 'Douse the Horde''s Wickerman', 19034), +(252282, 29482, 1, 0, 72104, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252283, 11262, 1, 0, 33330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252284, 29529, 1, 0, 23886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252285, 29851, 0, 0, 35557, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252288, 29984, 0, 0, 56738, 3, 0, 0, 914, 0, 0, 0, 0, 'Strike the Stack of Bamboo Reeds', 19034), +(252290, 29605, 0, 0, 18956, 1, 0, 0, 0, 0, 0, 0, 0, 'Free Lakka', 19034), +(252292, 30032, 2, 0, 210039, 1, 0, 0, 538, 543, 0, 0, 0, 'Use the Cliff Harness', 19034), +(252293, 30032, 1, 1, 77034, 1, 1, 0, 544, 0, 0, 0, 0, '', 19034), +(252298, 29518, 1, 0, 71968, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252299, 30031, 2, 0, 210021, 1, 0, 0, 538, 0, 0, 0, 0, '', 19034), +(252300, 30031, 2, 1, 210024, 1, 0, 0, 538, 0, 0, 0, 0, '', 19034), +(252301, 30031, 2, 2, 210023, 1, 0, 0, 538, 0, 0, 0, 0, '', 19034), +(252302, 30031, 2, 3, 210022, 1, 0, 0, 538, 0, 0, 0, 0, '', 19034), +(252303, 29412, 1, 0, 71034, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252305, 30127, 0, 0, 58117, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252306, 30127, 0, 1, 58068, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252307, 30128, 1, 0, 78934, 1, 0, 0, 545, 0, 0, 0, 0, '', 19034), +(252308, 30129, 1, 0, 78917, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252309, 30130, 1, 0, 78918, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252310, 29606, 1, 0, 27633, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252311, 29606, 1, 1, 27632, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252312, 30103, 0, 0, 54938, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort Thrall safely to Wyrmrest', 19034), +(252313, 30104, 0, 0, 57856, 1, 0, 0, 0, 0, 0, 0, 0, 'Legion Demon archived', 19034), +(252314, 30104, 0, 1, 57857, 1, 0, 0, 0, 0, 0, 0, 0, 'Royal Handmaiden archived', 19034), +(252315, 30104, 0, 2, 57858, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Varo''then archived', 19034), +(252316, 30107, 1, 0, 77951, 333, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252317, 30163, 0, 0, 58608, 8, 0, 0, 520, 0, 0, 0, 0, 'Captive Rescued', 19034), +(252318, 30164, 0, 0, 58955, 7, 0, 0, 520, 0, 0, 0, 0, 'Stoneplow Envoy saved', 19034), +(252319, 30168, 1, 0, 78958, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252320, 30169, 0, 0, 58285, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252323, 10629, 1, 0, 30794, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252324, 10629, 1, 1, 30803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252325, 416, 1, 0, 3110, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252326, 28000, 0, 0, 47365, 1, 0, 0, 0, 0, 0, 0, 0, 'Impsy captured', 19034), +(252327, 27977, 1, 0, 18959, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252328, 27977, 1, 1, 18960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252332, 193, 1, 0, 3876, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252334, 30565, 1, 0, 80176, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252335, 30565, 1, 1, 80177, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252336, 28485, 1, 0, 64386, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252337, 28484, 1, 0, 64380, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252339, 29406, 0, 0, 53714, 5, 0, 0, 0, 0, 0, 0, 0, 'Training Targets destroyed', 19034), +(252340, 28398, 0, 0, 8913, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252341, 28398, 1, 1, 64305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252342, 13526, 1, 0, 44850, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252344, 29408, 0, 0, 59591, 1, 0, 0, 1119, 0, 0, 0, 0, 'Snatch the Master''s Flame', 19034), +(252345, 29408, 0, 1, 59570, 1, 0, 0, 946, 0, 0, 0, 0, 'Burn the Edict of Temperance', 19034), +(252346, 10569, 1, 0, 31260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252347, 10569, 1, 1, 31261, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252348, 10569, 1, 2, 31262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252350, 10916, 1, 0, 31795, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252353, 213, 1, 0, 4106, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252357, 29401, 1, 0, 71034, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252359, 183, 0, 0, 708, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252360, 28376, 1, 0, 63700, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252361, 28394, 1, 0, 64303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252362, 28394, 1, 1, 64304, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252363, 30587, 0, 0, 59335, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252364, 29530, 1, 0, 23886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252365, 91, 1, 0, 1075, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252366, 26914, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(252367, 26914, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Corrupiton', 19034), +(252372, 25493, 1, 0, 54609, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252375, 29409, 0, 0, 54611, 1, 1, 0, 658, 0, 0, 0, 0, 'Defeat Jaomin Ro', 19034), +(252376, 29414, 0, 0, 54856, 1, 0, 0, 1192, 0, 0, 0, 0, 'Protect Aysa while she meditates', 19034), +(252377, 10630, 0, 0, 18976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252379, 102, 1, 0, 725, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252380, 26440, 0, 0, 43172, 1, 0, 0, 0, 0, 0, 0, 0, 'Pebble brought to crystal formation', 19034), +(252381, 10619, 0, 0, 21803, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252382, 10619, 0, 1, 21454, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252383, 10619, 0, 2, 21453, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252384, 26488, 1, 0, 58864, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252385, 26504, 0, 0, 423, 15, 0, 0, 0, 0, 0, 0, 0, 'Redridge Gnoll slain', 19034), +(252386, 52, 0, 0, 118, 8, 0, 0, 0, 0, 0, 0, 0, 'Prowler or Forest Wolf slain', 19034), +(252387, 52, 0, 1, 822, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252389, 10566, 0, 0, 21713, 1, 0, 0, 0, 0, 0, 0, 0, 'Test the first wand', 19034), +(252390, 10566, 0, 1, 21714, 1, 0, 0, 0, 0, 0, 0, 0, 'Test the second wand', 19034), +(252391, 10566, 0, 2, 21715, 1, 0, 0, 0, 0, 0, 0, 0, 'Test the third wand', 19034), +(252392, 10566, 0, 3, 21716, 1, 0, 0, 0, 0, 0, 0, 0, 'Test the fourth wand', 19034), +(252395, 28406, 2, 0, 207165, 6, 0, 0, 0, 0, 0, 0, 0, 'Poison Grain Rations', 19034), +(252396, 29884, 0, 0, 56223, 1, 0, 0, 0, 0, 0, 0, 0, 'See the scouts off', 19034), +(252397, 29885, 1, 1, 73368, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252401, 29992, 1, 0, 76499, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252405, 28405, 0, 0, 48524, 5, 0, 0, 0, 0, 0, 0, 0, 'Elemental-Imbued Weapon broken', 19034), +(252406, 25404, 0, 0, 40056, 1, 0, 0, 0, 0, 0, 0, 0, 'Blackhorn Persuaded', 19034), +(252407, 28399, 1, 0, 64308, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252409, 290, 1, 0, 2629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252410, 29463, 0, 0, 54505, 30, 0, 0, 0, 0, 0, 0, 0, 'Gnolls Whacked', 19034), +(252411, 188, 1, 0, 3879, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252413, 170, 0, 0, 707, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252414, 170, 0, 1, 724, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252415, 29641, 1, 0, 27480, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252416, 28379, 0, 0, 48474, 10, 0, 0, 0, 0, 0, 0, 0, 'Glopgut Ogre Slain', 19034), +(252417, 11250, 1, 0, 33311, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252418, 25283, 0, 0, 1268, 1, 0, 0, 0, 0, 0, 0, 0, 'Perform Speech to Ozzie Togglevolt', 19034), +(252419, 25283, 0, 1, 7955, 1, 0, 0, 0, 0, 0, 0, 0, 'Perform Speech to Milli Featherwhistle', 19034), +(252420, 25283, 0, 2, 6119, 1, 0, 0, 0, 0, 0, 0, 0, 'Perform Speech to Tog Rustsprocket', 19034), +(252422, 29883, 0, 0, 59058, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Pearlkeeper Fujin', 19034), +(252423, 29883, 0, 1, 56693, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Watersmith Ot-Temmdo', 19034), +(252424, 29883, 0, 2, 56690, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Instructor Sharpfin', 19034), +(252425, 29883, 0, 3, 54960, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Elder Lusshan', 19034), +(252426, 28138, 0, 0, 47697, 8, 0, 0, 0, 0, 0, 0, 0, 'Hillsbrad Human Captured', 19034), +(252427, 25494, 1, 0, 54610, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252428, 30393, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252429, 30394, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252430, 182, 0, 0, 706, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252431, 29240, 0, 0, 53047, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompanied Kalecgos to Coldarra', 19034), +(252432, 29054, 0, 0, 51833, 25, 0, 0, 0, 0, 0, 0, 0, 'Bombs Dropped', 19034), +(252433, 26503, 1, 0, 58887, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252434, 26503, 1, 1, 58888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252435, 26503, 1, 2, 58889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252437, 30131, 0, 0, 58585, 1, 0, 0, 548, 0, 0, 0, 0, 'Stand by Dezco''s side', 19034), +(252438, 30132, 1, 0, 79745, 1, 0, 0, 549, 0, 0, 0, 0, '', 19034), +(252442, 27440, 0, 0, 9237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252443, 27440, 0, 1, 9196, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252444, 27440, 0, 2, 9568, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252446, 224, 0, 0, 1161, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252447, 224, 0, 1, 1162, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252448, 30392, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252449, 29438, 0, 0, 54231, 25, 0, 0, 0, 0, 0, 0, 0, 'Targets Hit', 19034), +(252450, 26588, 1, 0, 58951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252451, 28275, 0, 0, 48286, 10, 0, 0, 0, 0, 0, 0, 0, 'Wellson Supply Boats Destroyed', 19034), +(252452, 28401, 0, 0, 48516, 6, 0, 0, 0, 0, 0, 0, 0, 'Fireguards freed', 19034), +(252453, 87, 1, 0, 981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252454, 30824, 0, 0, 60531, 15, 0, 0, 0, 0, 0, 0, 0, 'Kafa''goot "Deposit" Marked', 19034), +(252455, 29372, 0, 0, 45168, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the Sheriff', 19034), +(252460, 29373, 0, 0, 45168, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the Sheriff', 19034), +(252467, 211, 1, 0, 17114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252468, 10480, 0, 0, 21095, 5, 0, 0, 0, 0, 0, 0, 0, 'Watery Soul Captured', 19034), +(252469, 10480, 1, 1, 30094, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252470, 26505, 1, 0, 58890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252471, 132, 1, 0, 1327, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252474, 10110, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(252475, 10110, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(252476, 10110, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(252477, 29411, 1, 0, 71057, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252478, 30395, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252479, 286, 1, 0, 2625, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252480, 28397, 0, 0, 48482, 8, 0, 0, 0, 0, 0, 0, 0, 'Stormpike Dwarf slain', 19034), +(252481, 28397, 0, 1, 48484, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252482, 30396, 1, 0, 74649, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252484, 180, 1, 0, 3632, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252486, 30178, 0, 0, 59151, 1, 0, 0, 505, 0, 0, 0, 0, 'Zhu''s Watch Courier Found', 19034), +(252487, 30109, 1, 0, 77954, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252488, 30879, 0, 0, 60996, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Brewmaster Chani', 19034), +(252489, 29924, 0, 0, 56329, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252490, 127, 1, 0, 1467, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252491, 29937, 1, 0, 76225, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252492, 29535, 1, 0, 23894, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252493, 29535, 1, 1, 73200, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252494, 10239, 1, 0, 28564, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252495, 29296, 0, 0, 52660, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252497, 233, 1, 0, 2187, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252499, 10351, 0, 0, 19305, 1, 0, 0, 0, 0, 0, 0, 0, 'Fallen Sky Ridge Revitalized', 19034), +(252500, 10351, 1, 1, 29478, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252501, 197, 1, 0, 3877, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252502, 9819, 0, 0, 17156, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252503, 28378, 0, 0, 48489, 1, 0, 0, 0, 0, 0, 0, 0, 'Fanny Thundermar Rescued', 19034), +(252504, 10233, 0, 0, 19723, 4, 0, 0, 0, 0, 0, 0, 0, 'Sunfury Ballista Destroyed', 19034), +(252505, 10233, 0, 1, 19724, 4, 0, 0, 0, 0, 0, 0, 0, 'Sunfury Tent Destroyed', 19034), +(252506, 11366, 0, 0, 24381, 1, 0, 0, 0, 0, 0, 0, 0, 'Compare Runes with the Broken Tablet', 19034), +(252508, 25363, 1, 0, 9237, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252511, 9718, 1, 0, 25465, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252512, 24527, 5, -1, 73899, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Primal Strike', 19034), +(252514, 13280, 0, 0, 31766, 1, 0, 0, 0, 0, 0, 0, 0, 'Alliance Battle Standard planted', 19034), +(252515, 221, 0, 0, 205, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252516, 30398, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252517, 24645, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(252518, 24645, 0, 1, 37917, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252520, 28489, 1, 0, 64410, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252522, 10909, 0, 0, 22454, 10, 0, 0, 0, 0, 0, 0, 0, 'Jules Avenged', 19034), +(252523, 10909, 1, 1, 31772, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252524, 25278, 0, 0, 39642, 8, 0, 0, 0, 0, 0, 0, 0, 'Minion of Gar''gol Slain', 19034), +(252526, 161, 1, 0, 2563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252527, 78, 1, 0, 921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252529, 11049, 1, 0, 32506, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252531, 245, 0, 0, 539, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252532, 30397, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252533, 26142, 2, 0, 203699, 5, 0, 0, 0, 0, 0, 0, 0, 'Ancient Conduits destroyed', 19034), +(252534, 173, 0, 0, 533, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252535, 84, 1, 0, 962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252536, 28147, 1, 0, 63087, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252537, 150, 1, 0, 1468, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252538, 26752, 0, 0, 44051, 1, 0, 0, 0, 0, 0, 0, 0, 'Attend the Stonemother''s Audience', 19034), +(252539, 202, 0, 0, 939, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252540, 202, 0, 1, 978, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252541, 202, 1, 2, 3615, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252542, 201, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252543, 10912, 0, 0, 19747, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252544, 10912, 1, 1, 31763, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252545, 10912, 1, 2, 31809, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252546, 30403, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252547, 24548, 1, 0, 50274, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252551, 289, 0, 0, 1157, 13, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252552, 289, 0, 1, 1158, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252553, 289, 1, 2, 3619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252554, 30400, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252555, 30402, 1, 0, 74647, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252556, 26710, 0, 0, 49956, 1, 0, 0, 0, 0, 0, 0, 0, 'Pebble brought to safety', 19034), +(252557, 12170, 0, 0, 27121, 10, 0, 0, 0, 0, 0, 0, 0, 'Alliance in Blackriver slain', 19034), +(252558, 10911, 0, 0, 22504, 1, 0, 0, 0, 0, 0, 0, 0, 'South Warp-Gate Destroyed', 19034), +(252559, 10911, 0, 1, 22503, 1, 0, 0, 0, 0, 0, 0, 0, 'North Warp-Gate Destroyed', 19034), +(252560, 10911, 1, 2, 31807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252561, 28159, 1, 0, 63096, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252568, 28742, 0, 0, 10737, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252570, 179, 1, 0, 750, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252571, 30399, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252572, 291, 1, 0, 2628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252573, 106, 1, 0, 1208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252574, 28149, 1, 0, 63085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252575, 28149, 1, 1, 63089, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252576, 168, 1, 0, 1894, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252577, 208, 1, 0, 3880, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252578, 30401, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252579, 28099, 1, 0, 63028, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252580, 10097, 0, 0, 18472, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252581, 10097, 0, 1, 18956, 1, 0, 0, 0, 0, 0, 0, 0, 'Free Lakka', 19034), +(252582, 28151, 0, 0, 47765, 10, 0, 0, 0, 0, 0, 0, 0, 'Glopgut Ogres Slain', 19034), +(252584, 251, 1, 0, 1637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252585, 30407, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252586, 30410, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252587, 30411, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252588, 13542, 0, 0, 32986, 8, 0, 0, 0, 0, 0, 0, 0, 'Frenzied Cyclone bracers destroyed', 19034), +(252590, 26514, 1, 0, 58897, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252591, 30408, 1, 0, 74645, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252593, 30412, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252594, 186, 0, 0, 682, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252596, 25371, 0, 0, 39942, 1, 0, 0, 0, 0, 0, 0, 0, 'Tie off the Seahorse lure', 19034), +(252597, 25371, 0, 1, 39996, 1, 0, 0, 0, 0, 0, 0, 0, 'Subdue an Abyssal Seahorse', 19034), +(252598, 26520, 0, 0, 341, 1, 0, 0, 0, 0, 0, 0, 0, 'Foreman Oslow Saved', 19034), +(252599, 30404, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252601, 30413, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252602, 10678, 1, 0, 30851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252603, 30405, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252604, 30821, 0, 0, 60737, 100, 0, 0, 1227, 0, 0, 0, 0, 'Burlap Trail Hozen Slain', 19034), +(252605, 25294, 0, 0, 39673, 5, 0, 0, 0, 0, 0, 0, 0, 'Spawn of Smolderos Fed', 19034), +(252606, 24962, 1, 0, 52051, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252607, 28157, 1, 0, 63097, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252608, 28157, 1, 1, 63099, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252609, 28157, 1, 2, 63098, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252610, 28157, 1, 3, 63100, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252611, 30416, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252612, 25367, 1, 0, 18961, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252613, 29694, 0, 0, 55141, 1, 0, 0, 505, 0, 0, 0, 0, 'Shademaster Kiryn Rescued', 19034), +(252614, 29694, 0, 1, 55146, 1, 0, 0, 505, 0, 0, 0, 0, 'Rivett Clutchpop Rescued', 19034), +(252615, 29694, 0, 2, 55162, 1, 0, 0, 505, 0, 0, 0, 0, 'Sergeant Gorrok Rescued', 19034), +(252616, 29694, 0, 3, 55170, 1, 0, 0, 505, 0, 0, 0, 0, 'Shokia Rescued', 19034), +(252617, 30409, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252618, 26509, 1, 0, 3631, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252620, 189, 1, 0, 1519, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252621, 293, 1, 0, 2944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252623, 29109, 0, 0, 52445, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Rocco Whipshank', 19034), +(252624, 29109, 0, 1, 52303, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride Caravan to Dreadmist Peak', 19034), +(252625, 28141, 1, 0, 63081, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252626, 30414, 1, 0, 74642, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252627, 30406, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252628, 10589, 1, 0, 30695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252629, 11694, 0, 0, 25654, 1, 0, 0, 0, 0, 0, 0, 0, 'Plague Cauldron Neutralized', 19034), +(252630, 25364, 0, 0, 5258, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252634, 10721, 1, 0, 31349, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252635, 24556, 1, 0, 49648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252636, 28191, 0, 0, 47797, 10, 0, 0, 0, 0, 0, 0, 0, 'Obsidian Dragonkin slain', 19034), +(252637, 25341, 1, 0, 52832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252638, 24540, 0, 0, 36931, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252642, 30418, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252643, 30419, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252644, 203, 0, 0, 937, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252645, 11531, 1, 0, 34474, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252646, 28158, 0, 0, 47763, 1, 1, 0, 0, 0, 0, 0, 0, 'Bound Fury unbound', 19034), +(252647, 28158, 0, 1, 47766, 1, 1, 0, 0, 0, 0, 0, 0, 'Bound Vortex unbound', 19034), +(252648, 30417, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252649, 28145, 0, 0, 47748, 8, 0, 0, 0, 0, 0, 0, 0, 'Venomblood Scorpid drained', 19034), +(252650, 26552, 0, 0, 43253, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass through Zanzil''s Portal', 19034), +(252651, 10919, 1, 0, 31799, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252652, 11089, 1, 0, 23448, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252653, 11089, 1, 1, 23784, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252654, 11089, 1, 2, 23786, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252655, 11089, 1, 3, 32822, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252656, 29318, 0, 0, 53514, 5, 0, 0, 0, 0, 0, 0, 0, 'Feed Ribs to Sentinels', 19034), +(252657, 24467, 0, 0, 36638, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252658, 24467, 0, 1, 36649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252660, 25369, 1, 0, 18962, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252661, 29345, 1, 0, 69934, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252662, 185, 0, 0, 681, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252663, 930, 1, 0, 5189, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252664, 29314, 1, 0, 69900, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252665, 24547, 0, 0, 38121, 50, 0, 0, 0, 0, 0, 0, 0, 'Souls fed to Shadow''s Edge', 19034), +(252666, 24532, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(252667, 24532, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(252668, 24530, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(252669, 24530, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(252670, 29316, 2, 0, 208829, 6, 0, 0, 0, 0, 0, 0, 0, 'Practice Making Rice Flour', 19034), +(252671, 25160, 0, 0, 39222, 3, 0, 0, 0, 0, 0, 0, 0, 'Timeless Nightstones Cut', 19034), +(252672, 25160, 1, 1, 52098, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252674, 196, 0, 0, 687, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252675, 30426, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252676, 30427, 1, 0, 74655, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252677, 24545, 1, 0, 49869, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252678, 24545, 1, 1, 49908, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252679, 24545, 1, 2, 50226, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252680, 24545, 1, 3, 50231, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252681, 26361, 1, 0, 58224, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252682, 30422, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252683, 10189, 1, 0, 28376, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252687, 217, 0, 0, 1205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252688, 217, 0, 1, 1206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252689, 217, 0, 2, 1207, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252690, 24555, 0, 0, 36715, 1, 0, 0, 0, 0, 0, 0, 0, 'Ask Krasus about the hilt''s origins', 19034), +(252691, 30423, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252692, 30424, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252694, 234, 1, 0, 2188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252698, 176, 0, 0, 448, 1, 0, 0, 0, 0, 0, 0, 0, 'Dealt with "The Hogger Situation"', 19034), +(252699, 30421, 1, 0, 74654, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252700, 205, 1, 0, 2466, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252701, 9867, 1, 0, 24543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252702, 30425, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252703, 30428, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252704, 30429, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252705, 334, 1, 0, 2760, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252706, 26554, 0, 0, 43321, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass through Zanzil''s Portal', 19034), +(252707, 216, 0, 0, 3925, 15, 0, 0, 0, 0, 0, 0, 0, 'Thistlefur Village Furbolgs killed', 19034), +(252708, 24522, 1, 0, 49870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252709, 30420, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252710, 191, 0, 0, 736, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252712, 384, 1, 0, 60496, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252713, 384, 1, 1, 2894, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252718, 25442, 1, 0, 54614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252719, 30438, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252720, 30439, 1, 0, 74643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252725, 1582, 1, 0, 4239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252726, 1582, 1, 1, 2309, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252727, 1582, 1, 2, 2310, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252728, 27929, 0, 0, 46321, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252729, 24553, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252731, 25434, 0, 0, 39957, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252732, 30257, 1, 0, 79269, 1, 0, 0, 783, 0, 0, 0, 0, '', 19034), +(252733, 30259, 1, 0, 80116, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252734, 30880, 0, 0, 60994, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat The Streetfighter', 19034), +(252735, 30430, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252736, 30435, 1, 0, 79267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252737, 30436, 1, 0, 79266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252738, 10723, 0, 0, 22434, 3, 0, 0, 0, 0, 0, 0, 0, 'Plant Grisly Totem', 19034), +(252739, 10723, 1, 1, 31752, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252740, 30431, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252741, 11894, 1, 0, 35289, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252742, 10208, 2, 0, 184290, 1, 0, 0, 0, 0, 0, 0, 0, 'Disrupt Port Xilus', 19034), +(252743, 10208, 2, 1, 184289, 1, 0, 0, 0, 0, 0, 0, 0, 'Disrupt Port Kruul', 19034), +(252744, 10208, 1, 2, 28478, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252750, 26418, 1, 0, 58779, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252751, 25462, 0, 0, 40284, 6, 0, 0, 0, 0, 0, 0, 0, 'Hyjal Bear Cubs Rescued', 19034), +(252752, 30432, 1, 0, 79268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252753, 194, 0, 0, 685, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252754, 28183, 1, 0, 63354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252755, 30445, 0, 0, 58970, 1, 0, 0, 0, 0, 0, 0, 0, 'Observe Vaeldrin''s ritual', 19034), +(252756, 24511, 0, 0, 36497, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252757, 24511, 0, 1, 36502, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252758, 29879, 0, 0, 56183, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252760, 29887, 1, 0, 79807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252761, 29887, 1, 1, 79808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252762, 29887, 1, 2, 79809, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252763, 29887, 1, 3, 79810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252764, 30666, 0, 0, 60201, 8, 0, 0, 0, 0, 0, 0, 0, 'Mortbreath crocolisk slain', 19034), +(252765, 30667, 1, 0, 80677, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252766, 30667, 1, 1, 80678, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252767, 30667, 1, 2, 80679, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252768, 30437, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252770, 24554, 1, 0, 50380, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252771, 28184, 0, 0, 7025, 15, 0, 0, 0, 0, 0, 0, 0, 'Blackrock troop slain', 19034), +(252775, 30433, 1, 0, 74652, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252776, 30434, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252778, 10754, 1, 0, 31239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252779, 25298, 0, 0, 39719, 8, 0, 0, 0, 0, 0, 0, 0, 'Twilight Servitor Freed', 19034), +(252780, 25298, 1, 1, 52730, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252781, 10355, 1, 0, 29480, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252782, 10355, 1, 1, 29481, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252783, 319, 0, 0, 1196, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252784, 319, 0, 1, 1127, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252785, 319, 0, 2, 1201, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252786, 14429, 1, 0, 49359, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252787, 13233, 9, 0, 329, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252788, 28935, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(252789, 28935, 0, 1, 51613, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252790, 25432, 0, 0, 39952, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252791, 30484, 1, 0, 80013, 1, 0, 0, 561, 0, 0, 0, 0, '', 19034), +(252792, 30484, 1, 1, 80014, 1, 0, 0, 559, 0, 0, 0, 0, '', 19034), +(252793, 30484, 1, 2, 80015, 1, 0, 0, 558, 0, 0, 0, 0, '', 19034), +(252794, 30484, 1, 3, 80061, 1, 0, 0, 560, 0, 0, 0, 0, '', 19034), +(252795, 13538, 0, 0, 35074, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy one of the three southern towers', 19034), +(252796, 28934, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(252797, 28934, 0, 1, 51613, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252798, 299, 1, 0, 2658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252799, 299, 1, 1, 2659, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252800, 299, 1, 2, 2660, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252801, 299, 1, 3, 2661, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252802, 30668, 1, 0, 80685, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252803, 30668, 1, 1, 80804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252804, 30669, 2, 0, 211392, 1, 0, 0, 569, 0, 0, 0, 0, 'Pick up your raft', 19034), +(252805, 30671, 1, 0, 80810, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252806, 30672, 0, 0, 60299, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252807, 30674, 0, 0, 60367, 6, 0, 0, 569, 0, 0, 0, 0, 'Throw Flailing Carp back into the water', 19034), +(252808, 30675, 1, 0, 80817, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252810, 28757, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252811, 313, 0, 0, 40991, 1, 0, 0, 3137, 0, 0, 0, 0, 'Convey orders to Mountaineer Dunstan', 19034), +(252812, 313, 0, 1, 40994, 1, 0, 0, 3138, 0, 0, 0, 0, 'Convey orders to Mountaineer Lewin', 19034), +(252813, 313, 0, 2, 41056, 1, 0, 0, 3139, 0, 0, 0, 0, 'Convey orders to Mountaineer Valgrum', 19034), +(252818, 30457, 0, 1, 59148, 10, 0, 0, 0, 0, 0, 0, 0, 'Bataari Tribe Members slain', 19034), +(252819, 28179, 1, 0, 63124, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252820, 297, 1, 0, 2636, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252821, 10255, 0, 0, 16992, 1, 0, 0, 0, 0, 0, 0, 0, 'Administer Antidote', 19034), +(252822, 10255, 1, 1, 23337, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252823, 28172, 1, 0, 63114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252824, 28172, 1, 1, 63116, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252825, 28172, 1, 2, 63117, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252826, 28172, 1, 3, 63119, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252827, 28170, 0, 0, 47838, 1, 0, 0, 0, 0, 0, 0, 0, 'First Shrine Cleansed', 19034), +(252828, 28170, 0, 1, 47839, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Shrine Cleansed', 19034), +(252829, 28170, 0, 2, 47840, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Shrine Cleansed', 19034), +(252830, 8894, 0, 0, 15966, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252831, 8894, 0, 1, 15967, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252832, 30485, 0, 0, 59415, 1, 0, 0, 758, 1261, 0, 0, 0, 'Heirloom placed at Cho Family Shrine', 19034), +(252834, 28166, 1, 0, 63107, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252835, 28181, 1, 0, 63134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252836, 28181, 1, 1, 63132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252837, 28181, 1, 2, 63133, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252838, 304, 1, 0, 3639, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252839, 28182, 0, 0, 47805, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252846, 10664, 1, 0, 23784, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252847, 10664, 1, 1, 23793, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252848, 10664, 1, 2, 30823, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252849, 10269, 1, 0, 28962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252850, 10269, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252851, 169, 1, 0, 3633, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252852, 12284, 0, 0, 27453, 15, 0, 0, 0, 0, 0, 0, 0, 'Alliance units eliminated', 19034), +(252853, 30504, 0, 0, 64360, 1, 0, 0, 799, 0, 0, 0, 0, 'General Nazgrim Rescued', 19034), +(252857, 28178, 1, 0, 63136, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252858, 207, 1, 0, 2005, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252859, 207, 1, 1, 2006, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252860, 207, 1, 2, 2007, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252861, 207, 1, 3, 2008, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252863, 28174, 0, 0, 47782, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252864, 28174, 0, 1, 7049, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252865, 26556, 1, 0, 58945, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252866, 278, 1, 0, 2606, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252867, 278, 1, 1, 2607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252868, 278, 1, 2, 2939, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252869, 30466, 0, 0, 59296, 10, 0, 0, 0, 0, 0, 0, 0, 'Hozen Motivated', 19034), +(252870, 30466, 1, 1, 79884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 252870 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(252872, 11284, 0, 0, 24178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252873, 263, 0, 0, 1197, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252874, 263, 0, 1, 1164, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252875, 307, 1, 0, 2640, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252876, 29443, 1, 0, 71635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252877, 10720, 0, 0, 22356, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the keg of Green Spot Grog', 19034), +(252878, 10720, 0, 1, 22367, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the keg of Ripe Moonshine', 19034), +(252879, 10720, 0, 2, 22368, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the keg of Fermented Seed Beer', 19034), +(252880, 10720, 1, 3, 31141, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252881, 8482, 1, 0, 20765, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252882, 29848, 1, 0, 74830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252883, 30670, 1, 0, 81713, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252888, 30487, 3, 0, 60094, 1, 0, 0, 0, 0, 0, 0, 0, 'Jump in Ji-Lu''s Cart', 19034), +(252890, 28177, 1, 0, 63135, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252891, 26543, 1, 0, 58934, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252892, 10724, 0, 0, 22435, 1, 0, 0, 0, 0, 0, 0, 0, 'Rescue Leokk', 19034), +(252893, 27788, 0, 0, 46967, 1, 1, 0, 0, 0, 0, 0, 0, 'Survive Skullcrusher''s backhand', 19034), +(252894, 27788, 0, 1, 46732, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252895, 279, 0, 0, 1024, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252896, 279, 1, 1, 3618, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252897, 10342, 1, 0, 29464, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252898, 28480, 0, 0, 47742, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252899, 28480, 0, 1, 47730, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252900, 10895, 0, 0, 22401, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Tower Marked', 19034), +(252901, 10895, 0, 1, 21182, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Tower Marked', 19034), +(252902, 10895, 0, 2, 22402, 1, 0, 0, 0, 0, 0, 0, 0, 'Forge Tower Marked', 19034), +(252903, 10895, 0, 3, 22403, 1, 0, 0, 0, 0, 0, 0, 0, 'Foothill Tower Marked', 19034), +(252904, 25297, 1, 0, 52726, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252905, 25297, 1, 1, 52727, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252906, 25297, 1, 2, 52728, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252908, 30514, 0, 0, 59483, 1, 1, 0, 565, 0, 0, 0, 0, '', 19034), +(252909, 27787, 0, 0, 46967, 1, 1, 0, 0, 0, 0, 0, 0, 'Survive Skullcrusher''s backhand', 19034), +(252910, 27787, 0, 1, 46732, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252911, 30105, 0, 0, 57854, 1, 0, 0, 0, 0, 0, 0, 0, 'The Twilight Prophet unmasked', 19034), +(252912, 10586, 0, 0, 21287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252913, 10586, 1, 1, 30689, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252914, 303, 0, 0, 1051, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252915, 303, 0, 1, 1053, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252916, 303, 0, 2, 1052, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252917, 303, 0, 3, 1054, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252918, 10511, 1, 0, 29443, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252919, 256, 1, 0, 2561, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252920, 28185, 1, 0, 63143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252921, 30459, 1, 0, 79806, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252922, 306, 1, 0, 2639, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252923, 287, 0, 0, 1123, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252924, 287, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252925, 29890, 0, 0, 56269, 1, 0, 0, 0, 0, 0, 0, 0, 'Meditated at the pagoda', 19034), +(252926, 369, 1, 0, 2872, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252927, 11561, 0, 0, 25217, 15, 0, 0, 0, 0, 0, 0, 0, 'Winterfin murlocs slain', 19034), +(252928, 25499, 0, 0, 40440, 1, 0, 0, 0, 0, 0, 0, 0, 'Physical Training', 19034), +(252929, 25461, 0, 0, 40257, 5, 0, 0, 0, 0, 0, 0, 0, 'Troll Volunteers recruited', 19034), +(252930, 25461, 0, 1, 40260, 5, 0, 0, 0, 0, 0, 0, 0, 'Troll Volunteers delivered to Champion Uru''zin', 19034), +(252931, 28746, 0, 0, 39908, 1, 0, 0, 0, 0, 0, 0, 0, 'Titan Control Room Breached', 19034), +(252932, 29111, 0, 0, 52505, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Nagala Whipshank', 19034), +(252933, 29111, 0, 1, 52326, 1, 0, 0, 0, 0, 0, 0, 0, 'Mor''shan Caravan Ride Defended', 19034), +(252934, 30515, 0, 0, 59483, 1, 1, 0, 565, 0, 0, 0, 0, '', 19034), +(252935, 13683, 2, 0, 194464, 8, 0, 0, 0, 0, 0, 0, 0, 'Ritual Gems disturbed', 19034), +(252936, 29889, 0, 0, 56260, 1, 0, 0, 1232, 0, 0, 0, 0, 'Tasted the mouthwatering brew', 19034), +(252937, 11090, 1, 0, 32825, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252939, 9369, 1, 0, 22889, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252940, 30575, 0, 0, 59611, 3, 0, 0, 567, 0, 0, 0, 0, 'Yaks rounded up', 19034), +(252941, 27737, 1, 0, 62305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252942, 26220, 1, 0, 57758, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252946, 29893, 1, 0, 76115, 8, 0, 0, 1189, 0, 0, 0, 0, '', 19034), +(252947, 29894, 0, 0, 56398, 1, 0, 0, 568, 0, 0, 0, 0, 'Speak to Elder Lusshan', 19034), +(252948, 29894, 0, 1, 54894, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the waterspeaking ceremony', 19034), +(252950, 13598, 1, 0, 44976, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252951, 13945, 0, 0, 2010, 20, 0, 0, 0, 0, 0, 0, 0, 'Ban''ethil Gnarlpine slain', 19034), +(252952, 28759, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252953, 25019, 0, 0, 38998, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252955, 231, 1, 0, 2162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252956, 11355, 0, 0, 27802, 4, 0, 0, 0, 0, 0, 0, 0, 'Runed Stone Giant Corpse Analyzed', 19034), +(252957, 24460, 2, 0, 221552, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252958, 24460, 0, 1, 56531, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(252963, 30489, 1, 0, 79952, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252964, 30490, 0, 0, 59335, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252966, 296, 1, 0, 3638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252967, 273, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252968, 29433, 1, 0, 71096, 250, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252969, 29600, 0, 0, 56832, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252970, 301, 1, 0, 2637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252971, 27921, 0, 0, 46963, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252973, 29159, 0, 0, 52648, 8, 0, 0, 0, 0, 0, 0, 0, 'Cinderweb spider slain', 19034), +(252978, 29307, 0, 0, 54198, 250, 0, 0, 0, 0, 0, 0, 0, 'Smouldering Essences Collected', 19034), +(252979, 29307, 1, 1, 69848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252980, 29892, 1, 0, 76107, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252981, 30491, 0, 0, 59319, 6, 0, 0, 520, 712, 0, 0, 0, 'Escaped Yak Washed', 19034), +(252982, 30492, 0, 0, 59371, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Yak Herd to Lucky Eightcoins', 19034), +(252983, 14432, 1, 0, 49365, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252984, 25372, 1, 0, 56057, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(252990, 11282, 0, 0, 24166, 1, 0, 0, 0, 0, 0, 0, 0, 'Oric the Baleful''s Corpse Impaled', 19034), +(252991, 11282, 0, 1, 24165, 1, 0, 0, 0, 0, 0, 0, 0, 'Ulf the Bloodletter''s Corpse Impaled', 19034), +(252992, 11282, 0, 2, 24167, 1, 0, 0, 0, 0, 0, 0, 0, 'Gunnar Thorvardsson''s Corpse Impaled', 19034), +(252993, 28188, 0, 0, 48035, 10, 0, 0, 0, 0, 0, 0, 0, 'Prisoners Slain', 19034), +(252994, 30500, 0, 0, 59417, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253000, 29346, 1, 0, 69935, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253001, 11051, 0, 0, 23327, 15, 0, 0, 0, 0, 0, 0, 0, 'Demons banished', 19034), +(253002, 11051, 1, 1, 32696, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253003, 320, 1, 0, 2696, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253004, 29348, 1, 0, 69964, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253005, 29348, 1, 1, 69967, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253006, 310, 1, 0, 2548, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253007, 29349, 1, 0, 69977, 10, 0, 0, 1731, 0, 0, 0, 0, '', 19034), +(253008, 11795, 1, 0, 35126, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253012, 25402, 1, 0, 52832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253014, 10923, 0, 0, 22441, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253015, 10923, 1, 1, 31811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253018, 30518, 0, 0, 59491, 5, 0, 0, 790, 0, 0, 0, 0, 'Escaped Shagskin recovered', 19034), +(253021, 28186, 1, 0, 63149, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253022, 30516, 1, 0, 80122, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253023, 29850, 0, 0, 27969, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253024, 29850, 0, 1, 27977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253025, 10670, 1, 0, 30829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253026, 29891, 0, 0, 56304, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253027, 29891, 1, 1, 76129, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253028, 8655, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253029, 8655, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253030, 8655, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253031, 8655, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253032, 8655, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253035, 30502, 0, 0, 59454, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253036, 27530, 0, 0, 45886, 3, 0, 0, 0, 0, 0, 0, 0, 'Corpsebeast destroyed', 19034), +(253037, 371, 0, 0, 1664, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253038, 371, 0, 1, 1538, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253039, 28187, 0, 0, 47957, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompanied Schnottz to Safety', 19034), +(253040, 9873, 0, 0, 18204, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253041, 27676, 0, 0, 7291, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253046, 209, 1, 0, 1524, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253047, 28476, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(253048, 316, 1, 0, 2688, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253049, 25323, 0, 0, 40065, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253050, 24536, 0, 0, 37558, 6, 0, 0, 0, 0, 0, 0, 0, 'Perfumed Guards Analyzed', 19034), +(253051, 25401, 1, 0, 52832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253054, 314, 1, 0, 3627, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253055, 29112, 1, 0, 68837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253056, 365, 1, 0, 2846, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253057, 11050, 1, 0, 32506, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253058, 11942, 1, 0, 35355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253059, 11942, 1, 1, 35353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253060, 11942, 1, 2, 35354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253061, 357, 1, 0, 2833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253062, 25564, 1, 0, 54957, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253063, 12659, 0, 0, 28622, 10, 0, 0, 0, 0, 0, 0, 0, 'Heb''Drakkar trolls scalped', 19034), +(253065, 26535, 1, 0, 58901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253068, 10742, 0, 0, 20555, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253069, 10742, 1, 1, 31146, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253070, 26569, 1, 0, 58952, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253071, 11147, 0, 0, 23727, 1, 0, 0, 0, 0, 0, 0, 0, 'Raptors Released', 19034), +(253073, 351, 1, 0, 8623, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253075, 25355, 1, 0, 52834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253076, 25355, 1, 1, 52854, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253077, 30495, 0, 0, 59395, 1, 0, 0, 505, 0, 0, 0, 0, 'Delivery to Historian Dinh', 19034), +(253078, 30495, 0, 1, 59401, 1, 0, 0, 505, 0, 0, 0, 0, 'Delivery to Surveyor Sawa', 19034), +(253079, 30495, 0, 2, 59392, 1, 0, 0, 505, 0, 0, 0, 0, 'Delivery to Kitemaster Shoku', 19034), +(253080, 30495, 0, 3, 59397, 1, 0, 0, 505, 0, 0, 0, 0, 'Delivery to Taskmaster Emi', 19034), +(253081, 9303, 0, 0, 16534, 6, 0, 0, 0, 0, 0, 0, 0, 'Nestlewood Owlkin inoculated', 19034), +(253082, 9303, 1, 1, 22962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253083, 25470, 0, 0, 40301, 1, 0, 0, 0, 0, 0, 0, 0, 'Challenge the Tiger Matriarch', 19034), +(253087, 28314, 0, 0, 7040, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253088, 325, 1, 0, 7297, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253089, 356, 0, 0, 1529, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253090, 356, 0, 1, 1532, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253091, 29310, 0, 0, 53302, 1, 0, 0, 0, 0, 0, 0, 0, 'Look deeper into Leyara''s memories', 19034), +(253092, 10641, 0, 0, 21925, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253095, 13520, 1, 0, 44864, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253097, 25475, 1, 0, 8705, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253098, 421, 0, 0, 1769, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253106, 10962, 1, 0, 31951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253118, 28315, 0, 0, 48287, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253119, 28315, 0, 1, 48288, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253120, 28315, 0, 2, 48289, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253121, 28315, 0, 3, 48291, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253122, 28312, 1, 0, 63423, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253124, 28313, 1, 0, 63424, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253125, 25361, 1, 0, 9369, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253126, 317, 1, 0, 769, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253127, 317, 1, 1, 6952, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253128, 28311, 1, 0, 63421, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253130, 432, 0, 0, 1115, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253131, 432, 0, 1, 1117, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253132, 9865, 0, 0, 18207, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253133, 9865, 0, 1, 18203, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253134, 11350, 1, 0, 33781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253140, 12870, 1, 0, 42780, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253141, 27478, 1, 0, 61312, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253142, 11352, 0, 0, 24345, 1, 0, 0, 0, 0, 0, 0, 0, 'Test Rune of Command', 19034), +(253143, 11352, 0, 1, 24334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253150, 25428, 1, 0, 53454, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253151, 25428, 1, 1, 53464, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253153, 10257, 1, 0, 28769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253154, 30660, 0, 0, 60127, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253155, 30661, 0, 0, 60127, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253156, 30662, 0, 0, 60127, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253157, 30663, 0, 0, 60127, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253158, 30691, 0, 0, 60203, 1, 1, 0, 0, 0, 0, 0, 0, 'Put Nahassa out of his misery', 19034), +(253159, 12040, 0, 0, 26605, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253161, 29141, 0, 0, 52552, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253162, 10280, 1, 0, 29106, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253163, 29142, 0, 0, 54343, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253165, 602, 1, 0, 3960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253166, 333, 1, 0, 2724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253167, 30501, 1, 0, 79250, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253168, 29143, 0, 0, 52531, 1, 0, 0, 0, 0, 0, 0, 0, 'Close a Fire Portal', 19034), +(253169, 11910, 1, 0, 35483, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253170, 11910, 1, 1, 35484, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253173, 11054, 1, 0, 21887, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253174, 11054, 1, 1, 32666, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253179, 26571, 1, 0, 58953, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253180, 26571, 1, 1, 58954, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253181, 8773, 0, 0, 11728, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253182, 8773, 1, 1, 21248, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253183, 10588, 0, 0, 21181, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253184, 10588, 1, 1, 30657, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253185, 25473, 1, 0, 54453, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253186, 420, 1, 0, 2619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253187, 311, 1, 0, 2666, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253188, 25360, 0, 0, 39418, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253189, 27480, 1, 0, 61311, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253190, 543, 1, 0, 3684, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253192, 29247, 1, 0, 69677, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253193, 29248, 1, 0, 69679, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253194, 29134, 0, 0, 52605, 1, 0, 0, 0, 0, 0, 0, 0, 'Future of Azeroth Witnessed', 19034), +(253197, 10173, 1, 0, 28292, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253198, 10173, 1, 1, 29207, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253199, 28096, 0, 0, 47444, 1, 0, 0, 0, 0, 0, 0, 0, 'First Quest Dispensed', 19034), +(253200, 28096, 0, 1, 47443, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Quest Dispensed', 19034), +(253201, 28096, 0, 2, 47442, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Quest Dispensed', 19034), +(253202, 29263, 0, 0, 53112, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253205, 11379, 1, 0, 33848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253206, 353, 1, 0, 2806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253207, 440, 1, 0, 3234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253208, 29308, 0, 0, 54198, 250, 0, 0, 0, 0, 0, 0, 0, 'Smouldering Essences Collected', 19034), +(253209, 29308, 1, 1, 69848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253210, 361, 1, 0, 2837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253211, 27672, 0, 0, 7228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253212, 29382, 1, 0, 70923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253213, 29382, 1, 1, 70928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253214, 30027, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Staff', 19034), +(253216, 10597, 1, 0, 30628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253217, 10597, 1, 1, 30631, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253221, 10665, 1, 0, 30824, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253222, 27958, 1, 0, 62809, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253223, 29434, 0, 0, 33081, 30, 0, 0, 0, 0, 0, 0, 0, 'Targets Destroyed', 19034), +(253227, 13507, 0, 0, 32859, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253228, 13507, 0, 1, 34248, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253230, 470, 1, 0, 3349, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253231, 295, 0, 0, 1022, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253232, 295, 0, 1, 1023, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253233, 11351, 1, 0, 33794, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253234, 10666, 1, 0, 30827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253235, 10701, 0, 0, 20772, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253236, 11602, 2, 0, 187655, 10, 0, 0, 0, 0, 0, 0, 0, 'Nerub''ar Egg Sac Destroyed', 19034), +(253240, 462, 0, 0, 2090, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253245, 10074, 1, 0, 26042, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253246, 30571, 0, 0, 59577, 12, 0, 0, 791, 0, 0, 0, 0, 'Farmstead Slaves freed', 19034), +(253248, 11484, 1, 0, 34136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253249, 11484, 1, 1, 34137, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253250, 10426, 0, 0, 20983, 10, 0, 0, 0, 0, 0, 0, 0, 'Test Energy Modulator', 19034), +(253251, 10426, 1, 1, 29818, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253253, 443, 1, 0, 3236, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253254, 563, 1, 0, 3721, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253255, 485, 1, 0, 8704, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253259, 13596, 1, 0, 44968, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253262, 30608, 0, 0, 60012, 5, 0, 0, 520, 571, 0, 0, 0, 'Rescue Imprisoned Grummle', 19034), +(253264, 30582, 1, 0, 80241, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253265, 10647, 1, 0, 30807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253266, 30593, 0, 0, 59758, 14, 0, 0, 0, 0, 0, 0, 0, 'Terracotta Warriors or Guardians destroyed', 19034), +(253268, 30611, 0, 0, 60169, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253270, 459, 1, 0, 46700, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253271, 459, 1, 1, 46694, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253272, 459, 1, 2, 46699, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253274, 30603, 1, 0, 81137, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253276, 10648, 1, 0, 30807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253277, 30606, 0, 0, 59410, 8, 0, 0, 0, 0, 0, 0, 0, 'Silverback Hozen slain', 19034), +(253278, 30607, 1, 0, 80535, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253279, 30607, 0, 1, 59421, 1, 0, 0, 572, 0, 0, 0, 0, 'Release Old Poot Poot', 19034), +(253280, 10574, 1, 0, 30692, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253281, 10574, 1, 1, 30691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253282, 10574, 1, 2, 30693, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253283, 10574, 1, 3, 30694, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253284, 30604, 0, 0, 59414, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253285, 30604, 0, 1, 59416, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253286, 10598, 0, 0, 21512, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy Legion Hold Infernals', 19034), +(253287, 10598, 1, 1, 30614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253289, 14274, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(253290, 14274, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Corruption', 19034), +(253291, 30594, 0, 0, 59758, 14, 0, 0, 0, 0, 0, 0, 0, 'Terracotta Warriors or Guardians destroyed', 19034), +(253292, 30610, 0, 0, 60120, 5, 0, 0, 573, 0, 0, 0, 0, 'Packers Packed', 19034), +(253293, 11377, 1, 0, 33839, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253294, 27956, 1, 0, 62805, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253296, 30605, 0, 0, 60008, 1, 0, 0, 538, 0, 0, 0, 0, 'Rescue the Brother Yakshoe', 19034), +(253297, 12203, 0, 0, 27212, 1, 0, 0, 0, 0, 0, 0, 0, 'Message from Loken received', 19034), +(253305, 26526, 1, 0, 58241, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253306, 29436, 0, 0, 54224, 5, 0, 0, 2969, 0, 0, 0, 0, 'Cannon Target Points Accrued', 19034), +(253307, 30033, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Spellblade', 19034), +(253309, 11030, 1, 0, 32598, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253310, 29193, 0, 0, 52832, 1, 0, 0, 0, 0, 0, 0, 0, 'Brought Timeless Eye to Coldarra', 19034), +(253311, 29882, 1, 0, 75221, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253312, 29898, 0, 0, 56457, 1, 0, 0, 574, 0, 0, 0, 0, 'Waters of Restorative Body', 19034), +(253313, 29898, 0, 1, 56458, 1, 0, 0, 577, 0, 0, 0, 0, 'Waters of Restorative Mind', 19034), +(253314, 29898, 0, 2, 56459, 1, 0, 0, 576, 0, 0, 0, 0, 'Waters of Restorative Spirit', 19034), +(253315, 29898, 0, 3, 56460, 1, 0, 0, 575, 0, 0, 0, 0, 'Waters of Restorative Heart', 19034), +(253316, 29899, 0, 0, 56444, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253317, 29900, 0, 1, 56441, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253318, 25479, 0, 0, 39897, 1, 0, 0, 0, 0, 0, 0, 0, 'Hippogryph to New Thalanaar', 19034), +(253320, 400, 1, 0, 2999, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253321, 30612, 0, 0, 59419, 1, 1, 0, 0, 0, 0, 0, 0, 'Enrage Chomp Chomp', 19034), +(253322, 30612, 0, 1, 60188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253324, 26529, 1, 0, 58281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253325, 13506, 1, 0, 44979, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253326, 30566, 0, 0, 56110, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Xiao and his companions', 19034), +(253327, 10238, 2, 0, 183936, 1, 0, 0, 0, 0, 0, 0, 0, 'Manni Saved', 19034), +(253328, 10238, 2, 1, 183940, 1, 0, 0, 0, 0, 0, 0, 0, 'Moh Saved', 19034), +(253329, 10238, 2, 2, 183941, 1, 0, 0, 0, 0, 0, 0, 0, 'Jakk Saved', 19034), +(253330, 29881, 1, 0, 75219, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253331, 10973, 1, 0, 29460, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253332, 504, 0, 0, 2287, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253333, 30614, 1, 0, 80311, 1, 0, 0, 819, 820, 0, 0, 0, '', 19034), +(253334, 10600, 0, 0, 20878, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253335, 10600, 0, 1, 20872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253336, 10603, 0, 0, 21287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253337, 10603, 1, 1, 30689, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253338, 26524, 1, 0, 19071, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253339, 26581, 0, 0, 43370, 1, 0, 0, 0, 0, 0, 0, 0, 'Gather a sample of the red mist', 19034), +(253341, 12013, 0, 0, 26370, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253342, 12204, 0, 0, 26484, 1, 0, 0, 0, 0, 0, 0, 0, 'Hugh Glass Questioned', 19034), +(253343, 12204, 0, 1, 26420, 1, 0, 0, 0, 0, 0, 0, 0, 'Gavrock Questioned', 19034), +(253344, 30623, 0, 0, 59875, 5, 0, 0, 915, 0, 0, 0, 0, 'Use Ken-Ken''s Mask on Ik''thik Wing Commander', 19034), +(253347, 10604, 1, 0, 30695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253348, 30622, 0, 0, 56721, 15, 0, 0, 0, 0, 0, 0, 0, 'Ik''thallik Infestor or Warrior slain', 19034), +(253349, 469, 1, 0, 3347, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253351, 29383, 1, 0, 70923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253352, 29383, 1, 1, 70932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253353, 28733, 0, 0, 49189, 1, 0, 0, 0, 0, 0, 0, 0, 'Massive Wave Survived', 19034), +(253356, 10077, 1, 0, 26043, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253357, 11086, 0, 0, 23393, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253358, 10576, 1, 0, 30640, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253359, 10667, 1, 0, 30828, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253360, 10076, 1, 0, 26043, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253361, 455, 0, 0, 2103, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253362, 455, 0, 1, 2102, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253363, 455, 10, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253364, 294, 0, 0, 1020, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253365, 294, 0, 1, 1021, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253373, 377, 1, 0, 3628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253384, 10112, 1, 0, 27861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253386, 11959, 0, 0, 26227, 1, 0, 0, 0, 0, 0, 0, 0, 'Loguhn''s Blood Smeared', 19034), +(253390, 30590, 1, 0, 74955, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253391, 27894, 0, 0, 46859, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253392, 27894, 0, 1, 46915, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253393, 30627, 0, 0, 56703, 1, 0, 0, 917, 0, 0, 0, 0, '', 19034), +(253394, 30591, 0, 0, 55946, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253396, 28277, 0, 0, 48211, 30, 0, 0, 0, 0, 0, 0, 0, 'Bloodsnarl Scavenger slain', 19034), +(253397, 30629, 0, 0, 56110, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Xiao and his companions', 19034), +(253398, 30881, 0, 0, 60980, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Clever Ashyo', 19034), +(253399, 30881, 0, 1, 60979, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Ken-Ken', 19034), +(253401, 490, 1, 0, 5220, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253402, 27060, 0, 0, 44909, 1, 0, 0, 0, 0, 0, 0, 0, 'Crime Scene Discovered', 19034), +(253403, 27060, 0, 1, 44910, 1, 0, 0, 0, 0, 0, 0, 0, 'Prince Anduin Protected', 19034), +(253408, 10755, 1, 0, 31241, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253409, 10075, 1, 0, 26042, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253410, 30624, 0, 0, 59878, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Zhu''s Wardens', 19034), +(253411, 30624, 0, 1, 59879, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Crane Wing Priests', 19034), +(253412, 30624, 0, 2, 59880, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Shado-Pan', 19034), +(253413, 30624, 0, 3, 59881, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to night elf settlers', 19034), +(253414, 426, 1, 0, 3162, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253415, 426, 1, 1, 3163, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253416, 30625, 0, 0, 59887, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253417, 30625, 0, 1, 59890, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253418, 30625, 0, 2, 59888, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253419, 30625, 0, 3, 59889, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253422, 3845, 1, 0, 11104, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253423, 3845, 1, 1, 11105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253424, 3845, 1, 2, 11106, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253425, 30620, 0, 0, 59797, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253437, 413, 1, 0, 3085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253438, 680, 1, 0, 4551, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253440, 30034, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Crossbow', 19034), +(253444, 445, 1, 0, 3238, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253446, 11254, 1, 0, 33411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253447, 30619, 0, 0, 59797, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253448, 335, 1, 0, 2779, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253449, 335, 1, 1, 2784, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253450, 30567, 0, 0, 59575, 1, 0, 0, 0, 0, 0, 0, 0, 'Scenario Complete', 19034), +(253451, 26907, 0, 0, 75001, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253452, 26907, 0, 1, 74462, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253453, 26907, 0, 2, 74948, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253455, 27972, 1, 0, 62810, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253456, 10971, 1, 0, 31957, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253457, 387, 0, 0, 1706, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253458, 387, 0, 1, 1711, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253459, 387, 0, 2, 1715, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253462, 29445, 1, 0, 71637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253463, 10236, 1, 0, 28554, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253464, 429, 1, 0, 3164, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253466, 27483, 0, 0, 2358, 12, 0, 0, 0, 0, 0, 0, 0, 'Dalaran Human slain', 19034), +(253470, 30653, 0, 0, 59878, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Zhu''s Wardens', 19034), +(253471, 30653, 0, 1, 59879, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Crane Wing Priests', 19034), +(253472, 30653, 0, 2, 59880, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to Shado-Pan', 19034), +(253473, 30653, 0, 3, 59882, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver beer to tauren settlers', 19034), +(253476, 10947, 1, 0, 32459, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253477, 3764, 1, 0, 11018, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253479, 26679, 1, 0, 59523, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253481, 471, 1, 0, 3348, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253482, 11434, 1, 0, 34069, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253483, 11434, 1, 1, 34070, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253484, 26922, 0, 0, 44360, 1, 0, 0, 0, 0, 0, 0, 0, 'Scourge Bone Animus destroyed', 19034), +(253485, 26922, 0, 1, 44329, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253493, 705, 1, 0, 4611, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253494, 26921, 0, 0, 44574, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253495, 26905, 1, 0, 5793, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253503, 30035, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Mace', 19034), +(253504, 30035, 0, 1, 57849, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Book of Prayers', 19034), +(253506, 30601, 0, 0, 59818, 3, 0, 0, 520, 0, 0, 0, 0, 'Hiding Guide Inspired', 19034), +(253507, 27959, 0, 0, 47279, 7, 0, 0, 0, 0, 0, 0, 0, 'Spiders ridden', 19034), +(253508, 28229, 0, 0, 48077, 1, 0, 0, 0, 0, 0, 0, 0, 'Irontree Hill watered', 19034), +(253511, 10601, 1, 0, 30659, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253520, 26945, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(253521, 26945, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(253522, 500, 1, 0, 2843, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253524, 14427, 1, 0, 49354, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253525, 29901, 0, 0, 56485, 1, 0, 0, 583, 0, 0, 0, 0, 'Speak to Anduin', 19034), +(253528, 28220, 0, 0, 48164, 7, 0, 0, 0, 0, 0, 0, 0, 'Rich Soil', 19034), +(253529, 484, 1, 0, 3397, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253530, 13515, 0, 0, 32862, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253531, 711, 1, 0, 4627, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253533, 14425, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 'Filthy Kobolds Removed', 19034), +(253534, 658, 1, 0, 4482, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253535, 26591, 0, 0, 43229, 10, 0, 0, 0, 0, 0, 0, 0, 'Injured Earthen patched up', 19034), +(253537, 29160, 1, 0, 69214, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253538, 518, 0, 0, 2254, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253539, 28288, 0, 0, 48227, 20, 0, 0, 0, 0, 0, 0, 0, 'Imps terrified', 19034), +(253544, 30683, 0, 1, 60765, 1, 0, 0, 584, 0, 0, 0, 0, 'Search the Abandoned Wreckage for supplies', 19034), +(253545, 30684, 2, 0, 211597, 1, 1, 0, 538, 0, 0, 0, 0, '', 19034), +(253546, 30684, 2, 1, 211601, 1, 1, 0, 896, 0, 0, 0, 0, '', 19034), +(253547, 30684, 2, 2, 211602, 1, 1, 0, 897, 0, 0, 0, 0, '', 19034), +(253548, 11464, 1, 0, 34115, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253549, 25486, 0, 0, 39949, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253554, 412, 1, 0, 3084, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253558, 13587, 1, 0, 46695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253559, 10938, 1, 0, 31890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253560, 453, 1, 0, 2161, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253563, 14450, 1, 0, 49460, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253564, 14451, 1, 0, 49459, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253565, 30882, 0, 0, 60978, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Kang Bramblestaff', 19034), +(253566, 27625, 0, 0, 43541, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253567, 27960, 0, 0, 5839, 10, 0, 0, 0, 0, 0, 0, 0, 'Dark Iron Geologist or Watchman slain', 19034), +(253568, 30595, 1, 0, 80294, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253569, 28219, 0, 0, 48038, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253570, 26540, 1, 0, 58932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253571, 30618, 1, 0, 80315, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253572, 10602, 0, 0, 21735, 1, 0, 0, 0, 0, 0, 0, 0, 'End Infernal Summoning Ritual', 19034), +(253573, 10602, 1, 1, 30672, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253574, 27677, 0, 0, 2748, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253575, 10481, 0, 0, 21096, 10, 0, 0, 0, 0, 0, 0, 0, 'Airy Soul Captured', 19034), +(253576, 10481, 1, 1, 30094, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253578, 30036, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Dagger', 19034), +(253579, 30036, 0, 1, 57849, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Second Trainee''s Dagger', 19034), +(253580, 10512, 0, 0, 21241, 5, 0, 0, 0, 0, 0, 0, 0, 'Bladespire Ogres drunk', 19034), +(253581, 10512, 1, 1, 30353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253583, 11010, 0, 0, 23118, 15, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannonball Stacks destroyed', 19034), +(253584, 11010, 1, 1, 32456, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253585, 30621, 1, 0, 80316, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253586, 30621, 1, 1, 80317, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253587, 30621, 1, 2, 80318, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253588, 30621, 1, 3, 80319, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253591, 27626, 1, 0, 61972, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253592, 27626, 1, 1, 61973, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253593, 27626, 1, 2, 61974, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253594, 10649, 1, 0, 30808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253597, 30652, 0, 0, 59969, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253598, 30652, 0, 1, 60032, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253599, 30652, 0, 2, 60030, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253600, 30652, 0, 3, 60031, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253604, 28272, 1, 0, 63685, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253606, 11548, 8, -1, 0, 100000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253610, 10671, 1, 0, 30840, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253612, 28267, 0, 0, 48189, 1, 0, 0, 0, 0, 0, 0, 0, 'Went ''Out Back'' With Schnottz', 19034), +(253616, 681, 0, 0, 2586, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253617, 681, 0, 1, 2589, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253618, 627, 1, 0, 4278, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253619, 481, 1, 0, 3353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253620, 465, 1, 0, 3339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253623, 28221, 0, 0, 7139, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253629, 28224, 0, 0, 7149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253632, 28228, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253635, 29446, 1, 0, 71638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253636, 30650, 0, 0, 60038, 8, 0, 0, 516, 0, 0, 0, 0, 'Pandaren Prisoners rescued', 19034), +(253637, 30651, 0, 0, 60096, 1, 0, 0, 538, 0, 0, 0, 0, 'Eastern Oil Rig destroyed', 19034), +(253638, 30651, 0, 1, 60098, 1, 0, 0, 538, 0, 0, 0, 0, 'Southern Oil Rig destroyed', 19034), +(253639, 30651, 0, 2, 60099, 1, 0, 0, 538, 0, 0, 0, 0, 'Western Oil Rig destroyed', 19034), +(253640, 450, 1, 0, 3255, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253641, 29939, 1, 0, 76260, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253642, 29942, 1, 0, 76420, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253643, 555, 1, 0, 3712, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253645, 29101, 0, 0, 52177, 5, 0, 0, 0, 0, 0, 0, 0, 'Child of Tortolla punted into water', 19034), +(253646, 28483, 1, 0, 64352, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253649, 11024, 1, 0, 32564, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253650, 28098, 0, 0, 47503, 1, 0, 0, 0, 0, 0, 0, 0, 'Get a flight from Heartrazor', 19034); -- 253650 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(253651, 28098, 0, 1, 47510, 1, 1, 0, 0, 0, 0, 0, 0, 'Twilight Skymaster Richtofen dealt with', 19034), +(253652, 29912, 0, 0, 56230, 1, 0, 0, 916, 996, 0, 0, 0, 'Launch a pink turnip', 19034), +(253653, 29912, 0, 1, 56229, 1, 0, 0, 916, 998, 0, 0, 0, 'Launch a watermelon', 19034), +(253654, 29912, 0, 2, 55375, 1, 0, 0, 916, 999, 0, 0, 0, 'Launch the Extra-Spicy Tofu', 19034), +(253655, 30568, 0, 0, 59572, 1, 0, 0, 587, 0, 0, 0, 0, 'Challenge a Pearlfin Recruit', 19034), +(253656, 30568, 0, 1, 59562, 1, 0, 0, 586, 0, 0, 0, 0, 'Defeat the Captive Hozen', 19034), +(253657, 30568, 0, 2, 59609, 3, 0, 0, 585, 0, 0, 0, 0, 'Assist the Wounded Pearlfin', 19034), +(253661, 190, 0, 0, 683, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253662, 28498, 1, 0, 64642, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253663, 423, 1, 0, 3156, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253664, 423, 1, 1, 3157, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253665, 29903, 0, 0, 56601, 9, 0, 0, 588, 589, 590, 591, 0, 'Pearlfin Aqualytes equipped', 19034), +(253666, 29904, 0, 0, 56655, 24, 0, 0, 0, 0, 0, 0, 0, 'Bamboo Wilds wildlife', 19034), +(253667, 28495, 0, 0, 48684, 10, 0, 0, 0, 0, 0, 0, 0, 'Hill Fawn "saved"', 19034), +(253668, 26544, 1, 0, 58936, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253670, 28274, 0, 0, 48431, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompanied Sullah', 19034), +(253671, 26636, 1, 0, 59152, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253672, 26636, 1, 1, 59153, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253673, 28044, 1, 0, 62919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253674, 10972, 1, 0, 31957, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253675, 28271, 0, 0, 48204, 15, 0, 0, 0, 0, 0, 0, 0, 'Schnottz Employees Killed at Obelisk of the Moon', 19034), +(253678, 26930, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253683, 25514, 0, 0, 40544, 1, 0, 0, 0, 0, 0, 0, 0, 'First Rod of Subjugation Disabled', 19034), +(253684, 25514, 0, 1, 40545, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Rod of Subjugation Disabled', 19034), +(253685, 28222, 0, 0, 48200, 5, 0, 0, 0, 0, 0, 0, 0, 'Sunbeams basked in', 19034), +(253686, 30583, 1, 0, 80245, 160, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253688, 26637, 1, 0, 59156, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253689, 26938, 0, 0, 45090, 5, 0, 0, 0, 0, 0, 0, 0, 'Forsaken Trooper mobilized', 19034), +(253690, 26938, 0, 1, 45098, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253691, 28499, 0, 0, 48757, 10, 0, 0, 0, 0, 0, 0, 0, 'Neferset intruder slain', 19034), +(253692, 26640, 1, 0, 59157, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253693, 13878, 0, 0, 34285, 3, 0, 0, 0, 0, 0, 0, 0, 'Wolves Freed', 19034), +(253694, 30581, 1, 0, 80227, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253695, 30581, 1, 1, 80230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253697, 26656, 0, 0, 46139, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Terrath the Steady', 19034), +(253698, 26656, 0, 1, 43597, 5, 0, 0, 0, 0, 0, 0, 0, 'Opalescent Guardians Escorted to safety', 19034), +(253699, 579, 1, 0, 3898, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253700, 29536, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253701, 28215, 1, 0, 63285, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253702, 456, 0, 0, 2031, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253703, 456, 0, 1, 1984, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253704, 765, 1, 0, 4819, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253709, 10939, 1, 0, 31891, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253711, 27041, 2, 0, 205145, 6, 0, 0, 0, 0, 0, 0, 0, 'Plans decrypted', 19034), +(253714, 29911, 1, 0, 76110, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253717, 29537, 0, 0, 17377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253718, 833, 0, 0, 3232, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253720, 684, 1, 0, 4515, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253724, 29905, 0, 0, 55461, 15, 0, 0, 0, 0, 0, 0, 0, 'Grookin Reinforcement or Slingtail Recruit', 19034), +(253726, 29906, 0, 0, 54868, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253727, 29913, 1, 0, 75275, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253728, 29913, 1, 1, 75276, 80, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253730, 11466, 1, 0, 34116, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253731, 28216, 1, 0, 63286, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253732, 385, 1, 0, 2924, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253733, 385, 1, 1, 2925, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253734, 30596, 0, 0, 59797, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253735, 10637, 0, 0, 21892, 1, 0, 0, 0, 0, 0, 0, 0, 'Azaloth Freed', 19034), +(253736, 488, 1, 0, 3409, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253737, 488, 1, 1, 3411, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253738, 488, 1, 2, 3412, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253740, 26506, 1, 0, 58891, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253741, 26506, 1, 1, 58892, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253742, 26506, 1, 2, 58893, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253743, 29538, 1, 0, 23894, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253744, 29538, 1, 1, 73200, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253745, 418, 1, 0, 3173, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253746, 10380, 0, 0, 20285, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253747, 10380, 0, 1, 18860, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253748, 10380, 0, 2, 20326, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253749, 14371, 1, 0, 49208, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253750, 11421, 0, 0, 24533, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253751, 11421, 0, 1, 24538, 1, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Longhouse Destroyed', 19034), +(253752, 11421, 0, 2, 24646, 1, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Dockhouse Destroyed', 19034), +(253753, 11421, 0, 3, 24647, 1, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Storage Facility Destroyed', 19034), +(253754, 24471, 0, 0, 37079, 4, 0, 0, 0, 0, 0, 0, 0, 'Wounded Coldridge Mountaineers Aided', 19034), +(253756, 29211, 0, 0, 52950, 1, 0, 0, 0, 0, 0, 0, 0, 'Solar Core detonated', 19034), +(253757, 10587, 1, 0, 30679, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253766, 30682, 0, 0, 60187, 1, 0, 0, 592, 0, 0, 0, 0, 'Jin Warmkeg rescued', 19034), +(253767, 30682, 0, 1, 60189, 1, 0, 0, 505, 0, 0, 0, 0, 'Ya Firebough rescued', 19034), +(253768, 30682, 0, 2, 60190, 1, 0, 0, 505, 0, 0, 0, 0, 'Old Lady Fung rescued', 19034), +(253769, 30682, 0, 3, 60178, 1, 0, 0, 505, 0, 0, 0, 0, 'Sya Zhong rescued', 19034), +(253770, 30692, 0, 0, 59749, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort grummles to Kota Basecamp', 19034), +(253772, 29103, 0, 0, 52224, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253773, 29103, 0, 1, 52307, 10, 0, 0, 0, 0, 0, 0, 0, 'Adventurers healed', 19034), +(253774, 11394, 0, 0, 23645, 15, 0, 0, 0, 0, 0, 0, 0, 'Chillmere Coast Scourge Killed', 19034), +(253775, 10522, 1, 0, 30428, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253777, 565, 1, 0, 2997, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253778, 565, 1, 1, 2321, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253779, 565, 1, 2, 3719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253780, 565, 1, 3, 3720, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253782, 30037, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Axe', 19034), +(253783, 30037, 0, 1, 57849, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Shield', 19034), +(253786, 26674, 0, 0, 315, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253787, 28225, 0, 0, 7038, 10, 0, 0, 0, 0, 0, 0, 0, 'Thaurissan dwarf slain', 19034), +(253788, 10946, 1, 0, 31946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253790, 2752, 1, 0, 7958, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253791, 2752, 1, 1, 7956, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253796, 14452, 0, 0, 2952, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253797, 11378, 1, 0, 33847, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253798, 10594, 1, 0, 30701, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253799, 199, 1, 0, 2563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253801, 566, 1, 0, 3626, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253802, 573, 0, 0, 1907, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253803, 573, 1, 1, 737, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253805, 8784, 1, 0, 21230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253806, 25592, 0, 0, 40911, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253807, 28234, 1, 0, 63374, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253808, 10489, 1, 0, 30177, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253809, 30631, 0, 2, 59908, 1, 0, 0, 1203, 0, 0, 0, 0, 'Speak to Jaluu the Generous', 19034), +(253810, 30631, 0, 0, 59961, 1, 0, 0, 1204, 0, 0, 0, 0, 'Speak to Kuru the Light-Hearted', 19034), +(253811, 30631, 0, 3, 64149, 1, 0, 0, 1206, 0, 0, 0, 0, 'Speak to Matron Vi Vinh', 19034), +(253812, 30633, 0, 0, 59914, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253813, 29104, 0, 0, 52678, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the bonfire in Fort Livingston', 19034), +(253815, 28227, 0, 0, 48037, 4, 0, 0, 0, 0, 0, 0, 0, 'Chiseled Golems trained', 19034), +(253817, 28212, 1, 0, 63283, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253818, 26598, 1, 0, 2799, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253819, 10523, 1, 0, 30429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253820, 30640, 1, 0, 80808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253825, 28261, 0, 0, 48154, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253827, 30634, 0, 0, 60002, 1, 0, 0, 1037, 0, 0, 0, 0, 'Speak to Lao Softfoot', 19034), +(253828, 30634, 0, 1, 60011, 1, 0, 0, 0, 0, 0, 0, 0, 'Explosives planted', 19034), +(253829, 30635, 0, 0, 59971, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253831, 11122, 0, 0, 24337, 3, 0, 0, 0, 0, 0, 0, 0, 'Kegs Delivered', 19034), +(253836, 28264, 0, 0, 47842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253837, 28486, 0, 0, 49250, 1, 0, 0, 0, 0, 0, 0, 0, 'Higher ground secured', 19034), +(253838, 24475, 1, 0, 49747, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253839, 24475, 1, 1, 49748, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253840, 10853, 1, 0, 31656, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253841, 29997, 1, 0, 76725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253842, 29999, 0, 0, 56856, 1, 0, 0, 596, 0, 0, 0, 0, 'Playful Azure Serpent found', 19034), +(253843, 29999, 0, 1, 56858, 1, 0, 0, 595, 0, 0, 0, 0, 'Playful Crimson Serpent found', 19034), +(253844, 29999, 0, 2, 56859, 1, 0, 0, 593, 0, 0, 0, 0, 'Playful Emerald Serpent found', 19034), +(253845, 29999, 0, 3, 56860, 1, 0, 0, 594, 0, 0, 0, 0, 'Playful Gold Serpent found', 19034), +(253846, 30000, 0, 0, 57243, 1, 0, 0, 0, 0, 0, 0, 0, 'Listened to the Jade Serpent', 19034), +(253847, 30001, 0, 0, 57232, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253848, 30636, 1, 0, 80511, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253849, 30002, 0, 0, 57237, 12, 0, 0, 0, 0, 0, 0, 0, 'Bookworms squashed', 19034), +(253851, 673, 1, 0, 4510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253857, 28763, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253858, 30615, 0, 0, 59797, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253859, 24477, 1, 0, 49749, 5, 0, 0, 2906, 0, 0, 0, 0, '', 19034), +(253860, 28211, 1, 0, 63282, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253861, 28252, 0, 0, 48112, 7, 0, 0, 0, 0, 0, 0, 0, 'Blackrock War Kodos summoned back to camp', 19034), +(253862, 11020, 0, 0, 23209, 12, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Peon Camp Poisoned', 19034), +(253863, 11020, 1, 1, 32503, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253866, 13850, 0, 0, 34157, 20, 0, 0, 0, 0, 0, 0, 0, 'Splashed with Venomhide blood', 19034), +(253868, 11425, 0, 0, 6, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253869, 9756, 0, 0, 17974, 1, 0, 0, 0, 0, 0, 0, 0, 'Sunhawk Information Recovered', 19034), +(253870, 29116, 0, 0, 52911, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Mauti''s Lair', 19034), +(253871, 27321, 1, 0, 60976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253872, 483, 1, 0, 3405, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253873, 483, 1, 1, 3406, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253874, 483, 1, 2, 3407, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253875, 483, 1, 3, 3408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253877, 27320, 1, 0, 60976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253880, 10290, 1, 0, 29163, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253881, 27299, 0, 0, 45394, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253883, 28226, 1, 0, 63333, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253884, 28226, 1, 1, 63336, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253885, 28226, 1, 2, 63335, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253886, 28226, 1, 3, 63334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253887, 29135, 1, 0, 71141, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253888, 29135, 1, 1, 65893, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253890, 487, 0, 0, 2152, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253892, 10550, 1, 0, 30501, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253893, 27319, 0, 0, 45410, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253894, 28213, 0, 0, 47679, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253896, 529, 0, 0, 2404, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253897, 529, 0, 1, 2265, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253898, 529, 1, 2, 3564, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253899, 8593, 1, 0, 20927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253900, 8593, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253901, 8593, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253902, 8593, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253903, 8593, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253905, 28762, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253907, 28210, 0, 0, 45353, 8, 0, 0, 0, 0, 0, 0, 0, 'Help Salhet defeat Bloodsnarl Hyenas', 19034), +(253909, 30592, 0, 0, 59527, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort grummles to the Burlap Waystation', 19034), +(253910, 28086, 0, 0, 47481, 12, 0, 0, 0, 0, 0, 0, 0, 'Pridelings freed', 19034), +(253911, 955, 1, 0, 5336, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253912, 12661, 0, 0, 28738, 1, 0, 0, 0, 0, 0, 0, 0, 'Overlord Drakuru''s task complete', 19034), +(253913, 28214, 0, 0, 47675, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253914, 11940, 0, 0, 26175, 1, 0, 0, 0, 0, 0, 0, 0, 'Captured Nexus Drake', 19034), +(253915, 11941, 1, 0, 35648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253916, 28764, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253917, 11684, 0, 0, 25664, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of South Sinkhole', 19034), +(253918, 11684, 0, 1, 25665, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of Northeast Sinkhole', 19034), +(253919, 11684, 0, 2, 25666, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of Northwest Sinkhole', 19034), +(253920, 11684, 1, 3, 34920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253921, 14256, 0, 0, 35779, 1, 0, 0, 0, 0, 0, 0, 0, 'Naga Forces Scouted', 19034), +(253926, 28201, 0, 0, 46333, 8, 0, 0, 0, 0, 0, 0, 0, 'Ramkahen Laborer recruited', 19034), +(253928, 782, 1, 0, 4640, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253929, 10651, 0, 0, 21178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253930, 10651, 0, 1, 21164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253931, 10651, 0, 2, 21168, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253932, 10651, 0, 3, 21171, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253933, 24484, 0, 0, 36813, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253934, 28316, 1, 0, 63431, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253935, 14236, 0, 0, 35897, 100, 0, 0, 0, 0, 0, 0, 0, 'Deadly Jungle Plants mowed down', 19034), +(253936, 12201, 1, 0, 37035, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253937, 10835, 1, 0, 31550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253938, 11431, 1, 0, 32906, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253939, 11431, 1, 1, 32907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253941, 25532, 0, 0, 40726, 1, 0, 0, 0, 0, 0, 0, 0, 'Get a boat from Mazzer', 19034), +(253942, 25532, 2, 1, 203009, 15, 0, 0, 0, 0, 0, 0, 0, 'Fires extinguished', 19034), +(253943, 28200, 1, 0, 63256, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253951, 835, 0, 0, 41007, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253954, 28217, 0, 0, 47923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253955, 584, 1, 0, 3904, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253956, 584, 1, 1, 3905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253957, 25580, 0, 0, 40877, 8, 0, 0, 0, 0, 0, 0, 0, 'Azsh''ir Monitor destroyed', 19034), +(253958, 28207, 1, 0, 63078, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253959, 30694, 0, 0, 59138, 10, 0, 0, 0, 0, 0, 0, 0, 'Traps Poked', 19034), +(253960, 703, 1, 0, 3404, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253961, 28242, 0, 0, 46322, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253962, 10974, 1, 0, 32061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253963, 10974, 1, 1, 31994, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253966, 12501, 0, 0, 28042, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Brandon''s Task', 19034), +(253967, 12501, 0, 1, 28044, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Rupert''s Task', 19034), +(253968, 12501, 0, 2, 28043, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Grondel''s Task', 19034), +(253969, 12501, 0, 3, 28205, 1, 0, 0, 0, 0, 0, 0, 0, 'Alchemist Finklestein''s''s Task', 19034), +(253970, 30649, 0, 2, 59908, 1, 0, 0, 1203, 0, 0, 0, 0, 'Speak to Jaluu the Generous', 19034), +(253971, 30649, 0, 0, 59959, 1, 0, 0, 1207, 0, 0, 0, 0, 'Speak to Mokimo the Strong', 19034), +(253972, 30649, 0, 3, 62996, 1, 0, 0, 1208, 0, 0, 0, 0, 'Speak to Madam Vee Luo', 19034), +(253974, 28245, 2, 0, 206977, 7, 0, 0, 0, 0, 0, 0, 0, 'Pairs of Blackrock Boots polished', 19034), +(253976, 12519, 1, 0, 38333, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253977, 29914, 1, 0, 75271, 1, 0, 0, 918, 0, 0, 0, 0, '', 19034), +(253978, 29914, 1, 1, 75272, 1, 0, 0, 919, 0, 0, 0, 0, '', 19034), +(253979, 29914, 1, 2, 75273, 1, 0, 0, 920, 0, 0, 0, 0, '', 19034), +(253980, 29967, 0, 0, 56620, 10, 0, 0, 1257, 0, 0, 0, 0, 'Jinyu Attackers Slain', 19034), +(253981, 633, 2, 0, 2704, 1, 0, 0, 0, 0, 0, 0, 0, 'Cache of Explosives Destroyed', 19034), +(253982, 28246, 0, 0, 9176, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253983, 28246, 0, 1, 48099, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253984, 28246, 0, 2, 48100, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(253986, 28208, 1, 0, 63279, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253989, 29133, 0, 0, 52762, 1, 0, 0, 0, 0, 0, 0, 0, 'Arrived at the Digsite', 19034), +(253990, 11395, 1, 0, 33961, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253991, 11041, 0, 0, 23264, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253992, 11041, 0, 1, 23269, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253993, 11041, 1, 2, 32621, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253994, 29192, 0, 0, 52815, 1, 0, 0, 0, 0, 0, 0, 0, 'Druid of the Flame captured', 19034), +(253996, 25579, 0, 0, 39638, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(253997, 28205, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(254001, 30655, 0, 0, 60038, 8, 0, 0, 516, 0, 0, 0, 0, 'Pandaren Prisoners rescued', 19034), +(254002, 11456, 1, 0, 36776, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254004, 26729, 1, 0, 3923, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254005, 866, 1, 0, 5056, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254006, 26681, 1, 0, 1637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254007, 28244, 0, 0, 47252, 1, 0, 0, 0, 0, 0, 0, 0, 'Peered into the Eye', 19034), +(254008, 30695, 0, 0, 59313, 1, 0, 0, 0, 0, 0, 0, 0, 'West Pagoda Cleansed', 19034), +(254009, 30695, 0, 1, 59314, 1, 0, 0, 0, 0, 0, 0, 0, 'East Pagoda Cleansed', 19034), +(254012, 28204, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(254013, 893, 1, 0, 5093, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254014, 893, 1, 1, 5092, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254015, 893, 1, 2, 5094, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254016, 28202, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(254017, 9741, 0, 0, 17887, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254020, 25368, 0, 0, 40136, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254023, 581, 1, 0, 3901, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254024, 29376, 0, 0, 52072, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the Bonfire', 19034), +(254025, 29376, 0, 1, 53827, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the Wickerman Ashes', 19034), +(254027, 25582, 0, 0, 40963, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Quel''Dormir Gardens scouted', 19034), +(254028, 25582, 0, 1, 40964, 1, 0, 0, 0, 0, 0, 0, 0, 'Tunnel west of Quel''Dormir Gardens scouted', 19034), +(254029, 25582, 0, 2, 40965, 1, 0, 0, 0, 0, 0, 0, 0, 'Structures south of Quel''Dormir Gardens scouted', 19034), +(254035, 10275, 1, 0, 29018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254036, 10275, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254046, 11055, 0, 0, 23311, 20, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Peon Disciplined', 19034), +(254047, 11055, 1, 1, 32680, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254048, 913, 1, 0, 5164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254049, 788, 0, 0, 3098, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254050, 28253, 1, 0, 63358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254051, 30656, 0, 0, 60096, 1, 0, 0, 538, 0, 0, 0, 0, 'Eastern Oil Rig destroyed', 19034), +(254052, 30656, 0, 1, 60098, 1, 0, 0, 538, 0, 0, 0, 0, 'Southern Oil Rig destroyed', 19034), +(254053, 30656, 0, 2, 60099, 1, 0, 0, 538, 0, 0, 0, 0, 'Western Oil Rig destroyed', 19034), +(254054, 30657, 0, 0, 59969, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254055, 30657, 0, 1, 60032, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254056, 30657, 0, 2, 60030, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254057, 30657, 0, 3, 60031, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254058, 10099, 0, 0, 18974, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254059, 790, 1, 0, 4905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254060, 10792, 0, 0, 20813, 1, 0, 0, 0, 0, 0, 0, 0, 'Barracks Burned', 19034), +(254061, 10792, 0, 1, 20815, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Hovel Burned', 19034), +(254062, 10792, 0, 2, 20816, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Hovel Burned', 19034), +(254063, 10792, 0, 3, 20814, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Burned', 19034), +(254064, 28243, 1, 0, 62804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254065, 28203, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(254067, 29121, 1, 0, 68937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254069, 486, 0, 0, 2039, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254072, 26731, 1, 0, 23681, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254073, 25507, 1, 0, 54745, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254074, 606, 1, 0, 3919, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254075, 25523, 0, 0, 47459, 1, 0, 0, 0, 0, 0, 0, 0, 'Guardian Flag Visited', 19034), +(254076, 574, 0, 0, 938, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254077, 574, 0, 1, 941, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254079, 29120, 0, 0, 52384, 1, 0, 0, 0, 0, 0, 0, 0, 'Bwemba has inspected the Cat', 19034), +(254083, 13088, 1, 0, 43013, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254085, 11526, 1, 0, 34420, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254086, 26875, 0, 0, 44680, 12, 0, 0, 0, 0, 0, 0, 0, 'Twilight Invaders slain', 19034), +(254087, 26875, 0, 1, 44683, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254088, 28765, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254090, 30742, 0, 0, 60493, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254091, 30743, 0, 0, 60531, 15, 0, 0, 0, 0, 0, 0, 0, 'Kafa''goot "Deposit" Marked', 19034), +(254092, 26146, 0, 0, 1161, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254099, 25600, 0, 0, 40845, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254100, 26953, 0, 0, 44777, 20, 0, 0, 0, 0, 0, 0, 0, 'Wildlife killed with Zen''Kiki', 19034), +(254101, 24998, 1, 0, 3635, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254103, 944, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254108, 30883, 0, 0, 60997, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat The Wrestler', 19034), +(254110, 951, 1, 0, 5273, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254111, 11157, 0, 0, 23777, 15, 0, 0, 0, 0, 0, 0, 0, 'Proto-Drake Egg destroyed', 19034), +(254112, 11157, 0, 1, 23688, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254113, 27944, 0, 0, 46508, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254114, 28232, 1, 0, 63315, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254115, 28237, 1, 0, 63330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254116, 28403, 0, 0, 48547, 1, 0, 0, 0, 0, 0, 0, 0, 'Titan Data Uploaded', 19034), +(254118, 784, 0, 0, 3128, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254119, 784, 0, 1, 3129, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254120, 784, 0, 2, 3192, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254121, 882, 1, 0, 5101, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254122, 28404, 0, 0, 48437, 1, 0, 0, 0, 0, 0, 0, 0, 'Titanic Guardian Defeated', 19034), +(254123, 918, 1, 0, 5168, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254125, 840, 1, 0, 4992, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254126, 8592, 1, 0, 20926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254127, 8592, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254128, 8592, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254129, 8592, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254130, 8592, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254131, 28402, 0, 0, 48668, 10, 0, 0, 0, 0, 0, 0, 0, 'Schnottz Elite Troopers Slain', 19034), +(254132, 28583, 1, 0, 65613, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254134, 888, 1, 0, 5076, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254135, 888, 1, 1, 5077, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254136, 28223, 1, 0, 63309, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254138, 28087, 1, 0, 62924, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254139, 28584, 0, 0, 49451, 10, 0, 0, 0, 0, 0, 0, 0, 'Faulty Valves sealed', 19034), +(254140, 25515, 1, 0, 54809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254141, 28766, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254142, 769, 1, 0, 2318, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254143, 769, 1, 1, 2320, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254144, 632, 1, 0, 4429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254145, 1656, 1, 0, 7626, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254146, 26280, 0, 0, 42621, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254148, 29088, 0, 0, 4127, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254149, 28231, 0, 0, 47792, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254150, 743, 1, 0, 4751, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254151, 123, 1, 0, 2223, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254152, 29089, 0, 0, 52165, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254153, 28266, 0, 0, 48156, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254155, 29661, 0, 0, 55077, 1, 0, 0, 957, 0, 0, 0, 0, 'Ring the Training Bell', 19034), +(254156, 10109, 1, 0, 27807, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254158, 13849, 0, 0, 34123, 15, 0, 0, 0, 0, 0, 0, 0, 'Astranaar fire extinguished', 19034), +(254159, 899, 1, 0, 5085, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254160, 28760, 0, 0, 43875, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254161, 12044, 1, 0, 36727, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254162, 29090, 0, 0, 3379, 8, 0, 0, 0, 0, 0, 0, 0, 'Burning Blade Slain', 19034), +(254163, 10438, 0, 0, 20899, 1, 0, 0, 0, 0, 0, 0, 0, 'Void Conduit Destroyed', 19034), +(254164, 28235, 0, 0, 47790, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254165, 28230, 0, 0, 47793, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254166, 26070, 0, 0, 41646, 8, 0, 0, 0, 0, 0, 0, 0, 'Defiled Scalding Chasm wildlife', 19034), +(254167, 13543, 0, 0, 32988, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254168, 13543, 0, 1, 32989, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254169, 13543, 0, 2, 32990, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254170, 895, 1, 0, 5084, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254171, 27439, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254172, 27439, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254173, 27439, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254174, 29086, 1, 0, 68820, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254179, 7905, 1, 0, 19338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254180, 29087, 0, 0, 52166, 5, 0, 0, 0, 0, 0, 0, 0, 'Muddy Tracks Examined', 19034), +(254181, 11153, 0, 0, 23755, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254182, 11153, 0, 1, 23771, 10, 0, 0, 0, 0, 0, 0, 0, 'Blockade Cannons destroyed', 19034), +(254183, 26885, 1, 0, 5359, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254184, 13522, 0, 0, 32928, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254185, 10510, 1, 0, 30315, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254186, 27751, 1, 0, 62325, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254187, 768, 1, 0, 2318, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254188, 746, 1, 0, 4703, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254194, 13600, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254195, 12043, 0, 0, 26493, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254196, 12043, 0, 1, 26492, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254197, 834, 1, 0, 4918, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254199, 14146, 0, 0, 35177, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254200, 26706, 0, 0, 43729, 1, 0, 0, 0, 0, 0, 0, 0, 'Gunship destroyed', 19034), +(254204, 792, 0, 0, 3101, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254205, 11675, 0, 0, 25615, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254207, 845, 1, 0, 5086, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254208, 10679, 1, 0, 30876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254209, 11129, 0, 0, 23616, 1, 0, 0, 0, 0, 0, 0, 0, 'Kyle fed', 19034), +(254210, 719, 1, 0, 4616, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254212, 29473, 0, 0, 54518, 4, 0, 0, 0, 0, 0, 0, 0, 'Use bandage on Injured Carnie', 19034), +(254213, 29922, 0, 0, 56737, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Kitemaster Ut-Nam', 19034), +(254214, 30744, 1, 0, 81054, 100, 0, 0, 597, 598, 0, 0, 0, '', 19034), +(254217, 27151, 0, 0, 45153, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254218, 27680, 0, 0, 2748, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254219, 30038, 0, 0, 54139, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Sword', 19034), +(254220, 28209, 1, 0, 63281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254221, 10308, 1, 0, 29209, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254223, 28318, 1, 0, 63430, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254224, 643, 1, 0, 4458, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254230, 28319, 1, 0, 63134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254231, 28317, 1, 0, 63429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254233, 28320, 0, 0, 48432, 200, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254234, 29451, 1, 0, 71715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254235, 27750, 1, 0, 62324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254236, 29662, 1, 0, 73178, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254237, 927, 1, 0, 5179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254238, 29122, 0, 0, 52383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254239, 27679, 0, 0, 7228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254240, 28586, 0, 0, 49548, 10, 0, 0, 0, 0, 0, 0, 0, 'Krazzworks Laborers rescued', 19034), +(254241, 24557, 1, 0, 49872, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254242, 10570, 1, 0, 30617, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254243, 26779, 0, 0, 43024, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254244, 25524, 0, 0, 40594, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the crowbar on the outhouse', 19034), +(254248, 28197, 0, 0, 47791, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254249, 28197, 0, 1, 47789, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254250, 13265, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254254, 26647, 0, 0, 43560, 5, 0, 0, 0, 0, 0, 0, 0, 'Hit Smilin'' Timmy Sticks with a cannonball', 19034), +(254256, 718, 1, 0, 4629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254257, 25516, 1, 0, 54809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254262, 933, 1, 0, 5645, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254263, 27752, 1, 0, 62330, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254265, 27356, 1, 0, 60876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254266, 27356, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254267, 27356, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254268, 931, 1, 0, 5190, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254269, 896, 1, 0, 5097, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254270, 28196, 1, 0, 63249, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254271, 28088, 0, 0, 47486, 1, 0, 0, 0, 0, 0, 0, 0, 'Heartrazor released', 19034), +(254272, 29591, 0, 0, 18524, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254273, 29591, 0, 1, 18521, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254274, 29591, 0, 2, 18702, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254275, 27753, 1, 0, 62324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254276, 27361, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254277, 27361, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254278, 27361, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254279, 28199, 1, 0, 63254, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254281, 24499, 0, 0, 36497, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254282, 24499, 0, 1, 36502, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254283, 26811, 0, 0, 43253, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass through Zanzil''s Portal', 19034), +(254284, 26251, 0, 0, 42885, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254285, 24442, 1, 0, 49676, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254286, 24442, 1, 1, 49678, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254287, 27995, 0, 0, 47555, 1, 0, 0, 0, 0, 0, 0, 0, 'Ruumbo''s Secret discovered', 19034), +(254288, 27994, 0, 0, 47329, 15, 0, 0, 0, 0, 0, 0, 0, 'Deadwood Furbolg slain', 19034), +(254289, 1068, 0, 0, 4073, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254290, 1068, 0, 1, 4074, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254293, 25553, 0, 0, 40974, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254294, 10437, 1, 0, 29822, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254296, 744, 1, 0, 4752, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254297, 744, 1, 1, 4753, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254298, 848, 1, 0, 5012, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254299, 14443, 1, 0, 50379, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254300, 28195, 0, 0, 47981, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Margun Killed', 19034), +(254301, 28195, 0, 1, 47980, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Cork Killed', 19034), +(254302, 28195, 0, 2, 47978, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Kronkh Killed', 19034), +(254305, 28194, 1, 0, 63248, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254308, 952, 1, 0, 5390, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254310, 25588, 0, 0, 40092, 15, 0, 0, 0, 0, 0, 0, 0, 'Southsea pirates slain', 19034), +(254311, 27990, 0, 0, 47778, 7, 0, 0, 0, 0, 0, 0, 0, 'Decrepit Watchers Obliterated', 19034), +(254312, 27990, 0, 1, 47898, 1, 0, 0, 0, 0, 0, 0, 0, 'Returned to Schnottz', 19034), +(254313, 14491, 0, 0, 36872, 6, 0, 0, 0, 0, 0, 0, 0, 'Spirits Calmed', 19034), +(254323, 10111, 2, 0, 183147, 1, 0, 0, 0, 0, 0, 0, 0, 'Attempt to Steal Egg', 19034), +(254324, 10111, 1, 1, 27841, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254325, 29915, 1, 0, 76100, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254327, 29916, 0, 0, 56034, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254328, 29916, 0, 1, 56106, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254330, 11322, 0, 0, 27959, 1, 0, 0, 0, 0, 0, 0, 0, 'Cleansed of Your Inner Turmoil', 19034), +(254335, 29917, 0, 0, 56357, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254336, 27842, 0, 0, 47162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254337, 29918, 0, 0, 56171, 1, 0, 0, 921, 0, 0, 0, 0, '', 19034), +(254338, 29918, 1, 1, 75208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254339, 29919, 0, 0, 56571, 1, 0, 0, 922, 0, 0, 0, 0, 'Escort Chen and Li Li', 19034), +(254340, 26646, 0, 0, 43574, 1, 0, 0, 0, 0, 0, 0, 0, 'Prisoners of War Freed', 19034), +(254341, 25526, 0, 0, 40594, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the crowbar on the outhouse', 19034), +(254343, 870, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254344, 29474, 1, 0, 71979, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254345, 25599, 0, 0, 40844, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254346, 25599, 1, 1, 55136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254347, 28134, 0, 0, 47932, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Nomarch Teneth', 19034), +(254348, 28134, 0, 1, 47933, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Sun Priest Asaris', 19034), +(254349, 28134, 0, 2, 47936, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Asaq', 19034), +(254354, 28193, 0, 0, 47970, 1, 0, 0, 0, 0, 0, 0, 0, 'Schnottz''s Guests Visited', 19034), +(254355, 29763, 1, 0, 33330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254356, 24500, 0, 0, 36955, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Jaina Proudmoore', 19034), +(254357, 24500, 0, 1, 38211, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape the Lich King', 19034), +(254361, 950, 1, 0, 5272, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254364, 26103, 1, 0, 56818, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254365, 26103, 1, 1, 56819, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254366, 26103, 1, 2, 56820, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254372, 29485, 4, -1, 393, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254376, 29123, 0, 0, 52816, 6, 0, 0, 0, 0, 0, 0, 0, 'Invader from the Firelands slain', 19034), +(254377, 27928, 1, 0, 62776, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254380, 25440, 0, 0, 40510, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254382, 29663, 0, 0, 55019, 6, 0, 0, 0, 0, 0, 0, 0, 'Defeat Tushui Monks', 19034), +(254383, 25542, 0, 0, 40707, 15, 0, 0, 0, 0, 0, 0, 0, 'Rowboats sunk', 19034), +(254384, 26651, 0, 0, 43589, 1, 0, 0, 0, 0, 0, 0, 0, 'Seaforium Planted at Munitions Hut', 19034), +(254385, 26651, 0, 1, 43590, 1, 0, 0, 0, 0, 0, 0, 0, 'Seaforium Planted at Blackrock Tower', 19034), +(254386, 865, 1, 0, 46850, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254387, 25576, 0, 0, 40838, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254389, 871, 0, 0, 3267, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 254389 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(254390, 871, 0, 1, 3265, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254392, 14046, 0, 0, 34769, 1, 0, 0, 0, 0, 0, 0, 0, 'Deal Struck with Baron Longshore', 19034), +(254393, 14049, 1, 0, 46832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254394, 27713, 0, 0, 46467, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254395, 27713, 0, 1, 46471, 1, 1, 0, 0, 0, 0, 0, 0, 'Punch Deathwing in the Face', 19034), +(254397, 887, 0, 0, 34779, 8, 0, 0, 0, 0, 0, 0, 0, 'Fray Island Pirates Killed', 19034), +(254398, 25287, 1, 0, 52731, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254400, 14042, 2, 0, 195203, 5, 0, 0, 0, 0, 0, 0, 0, 'Ammo Dumps Destroyed', 19034), +(254401, 28102, 0, 0, 7106, 8, 0, 0, 0, 0, 0, 0, 0, 'Jadefire Rogue or Shadowstalker slain', 19034), +(254402, 28116, 1, 0, 63032, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254403, 27708, 0, 0, 41530, 1, 0, 0, 0, 0, 0, 0, 0, 'Zin''jatar Warden Slain', 19034), +(254404, 880, 1, 0, 5098, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254405, 28885, 0, 0, 46472, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Goldmine to get in the cart', 19034), +(254406, 28885, 0, 1, 46459, 1, 0, 0, 0, 0, 0, 0, 0, 'End of the line', 19034), +(254407, 29272, 0, 0, 53234, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort Anren to the front of the cave', 19034), +(254409, 26622, 0, 0, 43189, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254410, 29168, 0, 0, 52405, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254411, 29168, 0, 1, 52422, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254412, 29168, 0, 2, 52438, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254413, 27536, 1, 0, 61349, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254414, 29273, 0, 0, 53190, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwestern Lava Pool sampled', 19034), +(254415, 29273, 0, 1, 53191, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeastern Lava Pool sampled', 19034), +(254416, 29273, 0, 2, 53192, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Lava Pool sampled', 19034), +(254417, 26359, 0, 0, 42840, 1, 0, 0, 0, 0, 0, 0, 0, 'Mind Vision complete', 19034), +(254418, 28767, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254419, 26360, 1, 0, 58225, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254420, 27709, 0, 0, 46398, 1, 0, 0, 0, 0, 0, 0, 0, 'Sentinel''s Game Completed', 19034), +(254422, 27903, 1, 0, 62705, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254423, 25555, 0, 0, 40814, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254424, 12509, 0, 0, 28090, 5, 0, 0, 0, 0, 0, 0, 0, 'Recruit''s Courage Restored', 19034), +(254428, 29274, 1, 0, 69816, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254430, 28769, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254431, 10439, 0, 0, 19554, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254432, 10439, 0, 1, 20985, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Captain Saeed', 19034), +(254433, 11420, 1, 0, 34031, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254434, 858, 1, 0, 5050, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254435, 25778, 1, 0, 56006, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254437, 1008, 1, 0, 5490, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254438, 28113, 0, 0, 9454, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254441, 11094, 1, 0, 32842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254442, 26735, 1, 0, 60214, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254443, 26735, 1, 1, 60215, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254444, 844, 1, 0, 5087, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254445, 10303, 0, 0, 16521, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254446, 11334, 1, 0, 33442, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254447, 761, 1, 0, 4769, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254449, 27932, 0, 0, 44229, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254455, 24470, 0, 0, 37073, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254456, 3630, 1, 0, 10789, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254458, 13645, 1, 0, 5463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254459, 7604, 1, 0, 18628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254460, 7604, 1, 1, 17203, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254464, 879, 1, 0, 5074, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254465, 879, 1, 1, 5073, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254466, 879, 1, 2, 5072, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254469, 10302, 0, 0, 16516, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254471, 868, 1, 0, 5058, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254472, 868, 1, 1, 5059, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254473, 13172, 0, 0, 31555, 80, 0, 0, 0, 0, 0, 0, 0, 'Weeping Quarry Undead slaughtered', 19034), +(254474, 745, 0, 0, 2949, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254475, 745, 0, 1, 2950, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254476, 745, 0, 2, 2951, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254477, 26633, 0, 0, 43511, 1, 0, 0, 0, 0, 0, 0, 0, 'Swab the decks', 19034), +(254478, 28052, 0, 0, 47467, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure entrance into the Slag Pit', 19034), +(254479, 11952, 0, 0, 26214, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254480, 969, 1, 0, 12334, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254483, 28745, 0, 0, 7456, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254484, 13987, 0, 0, 34609, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254485, 876, 1, 0, 5067, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254487, 27997, 0, 0, 7105, 12, 0, 0, 0, 0, 0, 0, 0, 'Jadefire Glen satyr slain', 19034), +(254490, 11095, 1, 0, 32842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254491, 877, 2, 0, 3737, 1, 0, 0, 0, 0, 0, 0, 0, 'Test the Dried Seeds', 19034), +(254493, 26904, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(254494, 26904, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice casting Corruption', 19034), +(254495, 24828, 1, 0, 50377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254496, 872, 0, 0, 3268, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254497, 872, 0, 1, 3266, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254498, 872, 1, 2, 5063, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254499, 905, 0, 0, 34964, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Red Raptor Nest', 19034), +(254500, 905, 0, 1, 34962, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Yellow Raptor Nest', 19034), +(254501, 905, 0, 2, 34963, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Blue Raptor Nest', 19034), +(254508, 748, 1, 0, 4758, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254509, 748, 1, 1, 4759, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254510, 27973, 1, 0, 62811, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254511, 147, 1, 0, 2239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254513, 11965, 2, 0, 188163, 1, 0, 0, 0, 0, 0, 0, 0, 'Farshire Bell Rung', 19034), +(254515, 922, 1, 0, 5168, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254516, 25577, 0, 0, 40862, 8, 0, 0, 0, 0, 0, 0, 0, 'Smoldering Core Destroyed', 19034), +(254517, 10717, 1, 0, 31119, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254518, 852, 1, 0, 5025, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254519, 11364, 0, 0, 17465, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254520, 875, 0, 0, 3278, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254521, 10293, 1, 0, 29164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254522, 25538, 0, 0, 40646, 8, 0, 0, 0, 0, 0, 0, 0, 'Clam Divers Odorfied', 19034), +(254525, 26525, 0, 0, 42879, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254529, 27362, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254530, 27362, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254531, 27362, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254532, 27878, 1, 0, 62509, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254533, 919, 1, 0, 5169, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254535, 24512, 0, 0, 37176, 5, 0, 0, 0, 0, 0, 0, 0, 'Stonetalon Prisoner Armed', 19034), +(254539, 28491, 1, 0, 64409, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254541, 13880, 2, 0, 195002, 8, 0, 0, 0, 0, 0, 0, 0, 'Lava fissures filled', 19034), +(254542, 13880, 1, 1, 46352, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254543, 25539, 1, 0, 54861, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254544, 935, 1, 0, 5188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254546, 28770, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254547, 27434, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254548, 27434, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254549, 27434, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254555, 11362, 1, 0, 33814, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254557, 751, 1, 0, 4834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254560, 29611, 0, 0, 54870, 1, 0, 0, 0, 0, 0, 0, 0, 'Report to Grommash Hold', 19034), +(254561, 30716, 0, 0, 60487, 3, 0, 0, 0, 0, 0, 0, 0, 'Spirit of the Crane found', 19034), +(254562, 29127, 0, 0, 52816, 8, 0, 0, 0, 0, 0, 0, 0, 'Invader from the Firelands slain', 19034), +(254563, 29125, 0, 0, 52176, 3, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Malorne captured', 19034), +(254564, 29126, 0, 0, 52399, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254565, 13314, 1, 0, 44220, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254567, 27877, 1, 0, 62650, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254568, 11363, 1, 0, 33815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254569, 10313, 0, 0, 20333, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Pipeline Measured', 19034), +(254570, 10313, 0, 1, 20336, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Pipeline Measured', 19034), +(254571, 10313, 0, 2, 20337, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Pipeline Measured', 19034), +(254572, 10313, 0, 3, 20338, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Pipeline Measured', 19034), +(254573, 11396, 0, 0, 24464, 3, 0, 0, 0, 0, 0, 0, 0, 'Scourging Crystals Destroyed', 19034), +(254574, 1110, 1, 0, 5798, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254575, 27435, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254576, 27435, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254577, 27435, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254579, 25022, 0, 0, 38872, 1, 0, 0, 0, 0, 0, 0, 0, 'Ambassador Gaines Rescued', 19034), +(254580, 26278, 0, 0, 42620, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254582, 851, 1, 0, 5023, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254583, 27484, 1, 0, 61312, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254584, 24619, 1, 0, 49945, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254585, 24619, 1, 1, 49948, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254586, 11397, 0, 0, 23645, 15, 0, 0, 0, 0, 0, 0, 0, 'Chillmere Coast Scourge Killed', 19034), +(254589, 10096, 0, 0, 18137, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254590, 10096, 0, 1, 18136, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254600, 25008, 0, 0, 37086, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254605, 26742, 1, 0, 23679, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254606, 11569, 1, 0, 34600, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254607, 29128, 0, 0, 52300, 6, 0, 0, 0, 0, 0, 0, 0, 'Invader slain at Sethria''s Roost', 19034), +(254608, 941, 1, 0, 5217, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254609, 1195, 1, 0, 5868, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254611, 28130, 0, 0, 47664, 14, 0, 0, 0, 0, 0, 0, 0, 'Rustberg Village Residents', 19034), +(254612, 28771, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254617, 974, 0, 0, 10541, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the hottest area of Fire Plume Ridge', 19034), +(254618, 974, 1, 1, 12472, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254619, 10606, 1, 0, 30713, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254620, 10318, 0, 0, 20803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254621, 929, 1, 0, 5639, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254631, 11402, 0, 0, 5868, 255, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254633, 29644, 0, 0, 18708, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254634, 855, 1, 0, 5030, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254635, 30885, 0, 0, 61013, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Master Boom Boom', 19034), +(254637, 10450, 1, 0, 30327, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254638, 1036, 6, -1, 87, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254639, 1036, 7, -1, 21, -6001, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254640, 13170, 0, 0, 30951, 20, 0, 0, 0, 0, 0, 0, 0, 'Restless Lookouts assassinated', 19034), +(254641, 11726, 1, 0, 34983, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254646, 962, 1, 0, 5339, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254648, 11321, 1, 0, 33955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254649, 1099, 1, 0, 5769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254650, 11381, 1, 0, 33850, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254651, 1104, 1, 0, 5794, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254652, 26760, 0, 0, 43969, 1, 0, 0, 0, 0, 0, 0, 0, 'Worgen cured', 19034), +(254654, 1168, 0, 0, 4329, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254655, 1168, 0, 1, 4331, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254656, 1168, 0, 2, 4328, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254657, 959, 1, 0, 5334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254658, 11714, 0, 0, 25467, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254659, 11714, 0, 1, 25470, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254660, 11714, 0, 2, 25468, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254661, 11380, 1, 0, 33849, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254662, 24754, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(254663, 24754, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254665, 11968, 0, 0, 26266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254666, 25159, 0, 0, 39237, 10, 0, 0, 0, 0, 0, 0, 0, 'Stardust No. 2 Tested', 19034), +(254667, 982, 1, 0, 12191, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254668, 982, 1, 1, 12192, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254669, 978, 1, 0, 12383, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254670, 11564, 1, 0, 34618, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254675, 80, 1, 0, 939, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254676, 26858, 0, 0, 11322, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254677, 26858, 0, 1, 11323, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254678, 26858, 0, 2, 11324, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254679, 26858, 1, 3, 14540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254681, 10449, 1, 0, 30326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254682, 891, 0, 0, 34753, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254683, 891, 0, 1, 34752, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254684, 891, 1, 2, 5078, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254688, 1111, 1, 0, 5799, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254689, 10607, 0, 0, 22798, 1, 0, 0, 0, 0, 0, 0, 0, 'Receive the First Prophecy', 19034), +(254690, 10607, 0, 1, 22799, 1, 0, 0, 0, 0, 0, 0, 0, 'Receive the Second Prophecy', 19034), +(254691, 10607, 0, 2, 22800, 1, 0, 0, 0, 0, 0, 0, 0, 'Receive the Third Prophecy', 19034), +(254692, 10607, 0, 3, 22801, 1, 0, 0, 0, 0, 0, 0, 0, 'Receive the Fourth Prophecy', 19034), +(254693, 12175, 1, 0, 37010, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254694, 26744, 1, 0, 60295, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254695, 10262, 1, 0, 29209, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254696, 1024, 1, 0, 5463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254697, 1010, 1, 0, 5437, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254698, 1014, 1, 0, 5442, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254699, 25252, 0, 0, 11440, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254700, 25252, 0, 1, 11443, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254704, 973, 1, 0, 5533, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254706, 923, 1, 0, 5170, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254707, 26016, 1, 0, 56474, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254714, 26862, 1, 0, 60499, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254715, 1183, 1, 0, 5852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254716, 10719, 1, 0, 31120, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254717, 46, 1, 0, 780, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254719, 1141, 1, 0, 12238, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254720, 10839, 1, 0, 31610, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254721, 11439, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(254722, 11608, 0, 0, 25402, 1, 0, 0, 0, 0, 0, 0, 0, 'South Nerub''ar Sinkhole Destroyed', 19034), +(254723, 11608, 0, 1, 25403, 1, 0, 0, 0, 0, 0, 0, 0, 'East Nerub''ar Sinkhole Destroyed', 19034), +(254724, 11608, 0, 2, 25404, 1, 0, 0, 0, 0, 0, 0, 0, 'West Nerub''ar Sinkhole Destroyed', 19034), +(254725, 11608, 0, 3, 25405, 1, 0, 0, 0, 0, 0, 0, 0, 'North Nerub''ar Sinkhole Destroyed', 19034), +(254729, 1011, 1, 0, 5440, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254730, 1096, 1, 0, 5736, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254734, 750, 1, 0, 4742, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254735, 967, 1, 0, 5354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254737, 26147, 0, 0, 1197, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254738, 26147, 0, 1, 1164, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254740, 26747, 1, 0, 58179, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254741, 25177, 0, 0, 39272, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254742, 59, 1, 0, 748, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254743, 1116, 1, 0, 5803, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254744, 12168, 1, 0, 36958, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254747, 3301, 1, 0, 10414, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254748, 1175, 0, 0, 4147, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254749, 1175, 0, 1, 4151, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254750, 1175, 0, 2, 4150, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254751, 29144, 0, 0, 52553, 10, 0, 0, 0, 0, 0, 0, 0, 'Stink Bombs Removed', 19034), +(254754, 1107, 1, 0, 5796, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254756, 10959, 0, 0, 22917, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254757, 10959, 1, 1, 32649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254759, 92, 1, 0, 2296, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254760, 92, 1, 1, 1080, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254761, 92, 1, 2, 1081, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254764, 1016, 0, 0, 3917, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254765, 1016, 0, 1, 12759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254767, 14324, 1, 0, 49174, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254768, 14324, 1, 1, 49176, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254769, 27363, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254770, 27363, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254771, 27363, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254773, 8596, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254774, 8596, 1, 1, 20876, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254775, 8596, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254776, 8596, 1, 3, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254777, 8596, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254782, 27360, 0, 0, 45403, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254784, 10516, 1, 0, 30413, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254785, 10516, 1, 1, 30415, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254786, 14339, 1, 0, 49195, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254787, 1108, 1, 0, 5797, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254790, 29275, 1, 0, 69810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254791, 29275, 1, 1, 69811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254792, 29275, 1, 2, 69812, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254793, 29275, 1, 3, 69813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254795, 29276, 1, 0, 69808, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254796, 29276, 1, 1, 69809, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254797, 1026, 1, 0, 5464, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254800, 29137, 0, 0, 52633, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254804, 12505, 1, 0, 38319, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254807, 261, 0, 0, 11561, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254808, 10571, 1, 0, 30649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254809, 18, 1, 0, 752, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254810, 10927, 0, 0, 22044, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254811, 11560, 0, 0, 25201, 20, 0, 0, 0, 0, 0, 0, 0, 'Winterfin Tadpole rescued', 19034), +(254812, 399, 1, 0, 2998, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254815, 11935, 1, 0, 35568, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254817, 966, 1, 0, 5348, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254818, 1035, 1, 0, 5508, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254819, 1051, 1, 0, 5538, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254825, 1007, 1, 0, 5424, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254826, 1179, 1, 0, 5849, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254828, 28357, 0, 0, 48452, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254829, 1126, 1, 0, 17346, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254830, 14328, 0, 0, 36181, 1, 0, 0, 0, 0, 0, 0, 0, 'Rhoho Defeated', 19034), +(254831, 14328, 0, 1, 36182, 1, 0, 0, 0, 0, 0, 0, 0, 'Sherik Defeated', 19034), +(254832, 14328, 0, 2, 36183, 1, 0, 0, 0, 0, 0, 0, 0, 'Jorreth Defeated', 19034), +(254834, 13977, 1, 0, 46769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254835, 1027, 1, 0, 5519, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254836, 958, 1, 0, 5360, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254837, 1201, 0, 0, 4834, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254840, 30717, 1, 0, 80938, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254841, 30718, 0, 0, 60601, 10, 0, 0, 0, 0, 0, 0, 0, 'Student of Chi-Ji dueled', 19034), +(254842, 30745, 0, 0, 60564, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254843, 414, 1, 0, 3086, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254844, 36, 1, 0, 2832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254852, 928, 1, 0, 5186, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254853, 11729, 1, 0, 34984, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254854, 29177, 0, 0, 40660, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254856, 11017, 1, 0, 32468, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254857, 985, 0, 0, 2167, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254858, 985, 0, 1, 2324, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254860, 850, 1, 0, 5022, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254861, 11465, 1, 0, 34112, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254862, 11465, 1, 1, 34111, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254868, 997, 1, 0, 5391, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254869, 29139, 0, 0, 53107, 5, 0, 0, 0, 0, 0, 0, 0, 'Smothervine planted', 19034), +(254870, 30725, 0, 0, 60530, 1, 1, 0, 937, 0, 0, 0, 0, 'Ellia Ravenmane defeated', 19034), +(254871, 10928, 0, 0, 22044, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254873, 691, 1, 0, 4503, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254874, 691, 1, 1, 4522, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254875, 691, 1, 2, 5040, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254876, 846, 1, 0, 5017, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254877, 846, 1, 1, 5018, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254878, 846, 1, 2, 5019, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254879, 28359, 1, 0, 63687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254880, 971, 1, 0, 5359, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254881, 26098, 1, 0, 56816, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254883, 29138, 0, 0, 52834, 8, 0, 0, 0, 0, 0, 0, 0, 'Wounded Hyjal Defender saved', 19034), +(254885, 14393, 0, 0, 36414, 15, 0, 0, 0, 0, 0, 0, 0, 'Burning Blade Warlocks Slain', 19034), +(254886, 14393, 0, 1, 36412, 3, 0, 0, 0, 0, 0, 0, 0, 'Doomguard Invaders Slain', 19034), +(254887, 14393, 0, 2, 36413, 1, 0, 0, 0, 0, 0, 0, 0, 'Priestess Than''darissa Slain', 19034), +(254889, 28360, 0, 0, 48455, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254890, 11933, 1, 0, 35569, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254892, 28358, 0, 0, 7136, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254895, 963, 1, 0, 5382, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254896, 29524, 0, 0, 54586, 6, 0, 0, 1052, 0, 0, 0, 0, 'Sparring Trainees defeated', 19034), +(254897, 29531, 0, 0, 54621, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254907, 25392, 0, 0, 40031, 3, 0, 0, 0, 0, 0, 0, 0, 'Injured Fawn Escorted Home', 19034), +(254908, 187, 0, 0, 1085, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254909, 984, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254912, 861, 1, 0, 5203, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254913, 28361, 0, 0, 48457, 6, 0, 0, 0, 0, 0, 0, 0, 'Tainted Squirrel scrubbed', 19034), +(254917, 11033, 1, 0, 29283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254918, 11033, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254920, 8595, 1, 0, 21229, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254921, 604, 0, 0, 1563, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254922, 604, 1, 1, 3920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254923, 604, 1, 2, 3921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254924, 11426, 1, 0, 34032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254925, 1052, 1, 0, 5539, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254926, 27923, 2, 0, 206684, 5, 0, 0, 0, 0, 0, 0, 0, 'Bale of Hay burnt', 19034), +(254928, 8594, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254929, 8594, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254930, 8594, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254931, 8594, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254932, 8594, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254933, 1174, 1, 0, 5768, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254934, 983, 1, 0, 5385, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254935, 27926, 0, 0, 47176, 1, 0, 0, 0, 0, 0, 0, 0, 'Mingled with Ambassador Laurent', 19034), +(254936, 27926, 0, 1, 47185, 1, 0, 0, 0, 0, 0, 0, 0, 'Mingled with a Refined Gentleman', 19034), +(254937, 27926, 0, 2, 47187, 1, 0, 0, 0, 0, 0, 0, 0, 'Mingled with a Budding Artist', 19034), +(254938, 27926, 0, 3, 47189, 1, 0, 0, 0, 0, 0, 0, 0, 'Mingled with an Aspiring Starlet', 19034), +(254939, 617, 1, 0, 4029, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254940, 13268, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254941, 88, 1, 0, 1006, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254942, 362, 1, 0, 2831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254943, 474, 1, 0, 3625, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254944, 14329, 0, 0, 4656, 10, 0, 0, 0, 0, 0, 0, 0, 'Maraudine Maulers Slain', 19034), +(254946, 27924, 1, 0, 62821, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254949, 24943, 0, 0, 38658, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254951, 13190, 0, 0, 31105, 1, 0, 0, 0, 0, 0, 0, 0, 'Ahn''kahar Watcher Corpse Burned', 19034), +(254952, 867, 1, 0, 5064, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254956, 28364, 1, 0, 63695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254958, 13872, 1, 0, 46310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254964, 10582, 0, 0, 20878, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254965, 10582, 0, 1, 20872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254967, 11410, 0, 0, 24500, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254968, 10261, 1, 0, 28787, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254969, 1045, 1, 0, 5388, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254970, 1045, 1, 1, 46739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254974, 28589, 0, 0, 49831, 1, 0, 0, 0, 0, 0, 0, 0, 'Hop into a Krazz Cannon', 19034), +(254975, 28589, 0, 1, 49683, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254976, 28366, 1, 0, 63689, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254978, 10782, 1, 0, 31365, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254979, 10256, 0, 0, 19938, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover the Keymaster''s identity', 19034), +(254980, 204, 1, 0, 2633, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254981, 204, 1, 1, 2634, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254982, 28588, 0, 0, 49628, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254983, 171, 1, 0, 69057, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254985, 11032, 1, 0, 29279, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254986, 11032, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254988, 11002, 1, 0, 32385, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254989, 903, 1, 0, 5096, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254991, 27933, 1, 0, 60487, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254993, 28321, 0, 0, 48316, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254994, 28321, 0, 1, 48314, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254995, 28321, 0, 2, 48312, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(254997, 1136, 1, 0, 5811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(254998, 28592, 0, 0, 49381, 1, 0, 0, 0, 0, 0, 0, 0, 'Highbank boat bomb placed', 19034), +(254999, 28592, 0, 1, 49380, 1, 0, 0, 0, 0, 0, 0, 0, 'Highbank keep bomb placed', 19034), +(255000, 28592, 0, 2, 49144, 1, 0, 0, 0, 0, 0, 0, 0, 'Highbank tower bomb placed', 19034), +(255001, 332, 1, 0, 2722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255004, 10205, 0, 0, 19641, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255005, 10715, 1, 0, 31132, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255007, 10937, 0, 0, 19312, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255008, 464, 1, 0, 3337, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255010, 11003, 1, 0, 32386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255011, 27951, 0, 0, 46322, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255012, 28593, 1, 0, 64584, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255014, 14272, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(255015, 14272, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(255016, 28594, 0, 0, 49023, 10, 0, 0, 0, 0, 0, 0, 0, 'Highbank Defenders slain', 19034), +(255018, 13270, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255019, 24474, 1, 0, 49744, 1, 0, 0, 2911, 0, 0, 0, 0, '', 19034), +(255020, 24474, 1, 1, 49745, 1, 0, 0, 2912, 0, 0, 0, 0, '', 19034), +(255021, 24474, 1, 2, 49746, 1, 0, 0, 2913, 0, 0, 0, 0, '', 19034), +(255027, 600, 1, 0, 3917, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255028, 766, 1, 0, 4804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255029, 766, 1, 1, 4805, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255030, 766, 1, 2, 4806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255031, 766, 1, 3, 4807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255037, 10963, 1, 0, 31951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255039, 25044, 0, 0, 37513, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255040, 25044, 1, 1, 49782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255042, 25980, 0, 0, 41782, 1, 0, 0, 0, 0, 0, 0, 0, 'Banner planted in Fathom-Caller Azrajar''s corpse', 19034), +(255044, 10168, 0, 0, 19480, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255045, 10168, 1, 1, 28283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255046, 276, 0, 0, 1007, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255047, 276, 0, 1, 1008, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255048, 10609, 1, 0, 30743, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255049, 10609, 1, 1, 30782, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255050, 10609, 1, 2, 30783, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255051, 10609, 1, 3, 30742, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255053, 764, 0, 0, 2978, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255054, 764, 0, 1, 2979, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255055, 11579, 0, 0, 6, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255056, 11579, 9, 1, 330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255057, 30902, 0, 0, 61012, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Master Windfur', 19034), +(255058, 1057, 0, 0, 4022, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255059, 1057, 0, 1, 4025, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255060, 1057, 0, 2, 4024, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255061, 1057, 0, 3, 4023, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255062, 28368, 0, 0, 48352, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255063, 540, 1, 0, 3658, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255064, 540, 1, 1, 3659, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255065, 27950, 0, 0, 47249, 1, 0, 0, 0, 0, 0, 0, 0, 'Gobbles'' Transformation Ritual Witnessed', 19034), +(255066, 10583, 1, 0, 30658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255068, 28591, 0, 0, 49124, 80, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255069, 28591, 0, 1, 49025, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255070, 28591, 0, 2, 49060, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255072, 493, 1, 0, 3468, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255075, 757, 1, 0, 4770, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255079, 25711, 0, 0, 42359, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255080, 753, 1, 0, 4755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255083, 24546, 0, 0, 37667, 1, 0, 0, 0, 0, 0, 0, 0, 'Point Captured', 19034), +(255084, 24546, 0, 1, 37668, 1, 0, 0, 0, 0, 0, 0, 0, 'Point Defended', 19034), +(255086, 27942, 1, 0, 62792, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255087, 14456, 1, 0, 49535, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255089, 1069, 1, 0, 5570, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255090, 315, 1, 0, 2676, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255092, 29249, 0, 0, 53084, 1, 0, 0, 0, 0, 0, 0, 0, 'Acorn Planted', 19034), +(255093, 9545, 0, 0, 17413, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision Granted', 19034), +(255094, 9545, 1, 1, 23645, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255097, 1244, 1, 0, 5947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255098, 27954, 1, 0, 62804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255099, 25645, 1, 0, 55180, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255100, 11025, 1, 0, 32569, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255101, 29506, 1, 0, 72044, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255103, 10167, 0, 0, 18373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255104, 869, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255106, 587, 1, 0, 3910, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255108, 27510, 0, 0, 45750, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255109, 1252, 1, 0, 5950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255110, 27934, 0, 0, 44290, 1, 0, 0, 0, 0, 0, 0, 0, 'One With the Ground ritual complete', 19034), +(255111, 505, 0, 0, 2240, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255112, 505, 0, 1, 2241, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255113, 873, 1, 0, 5104, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255114, 11031, 1, 0, 29287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255115, 11031, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255116, 218, 0, 0, 808, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255117, 218, 0, 1, 37507, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255118, 218, 0, 2, 37112, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255119, 292, 1, 0, 2944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255120, 280, 1, 0, 2610, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255121, 11578, 0, 0, 6, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255122, 11578, 9, 1, 331, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255125, 10780, 1, 0, 31324, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255126, 10929, 1, 0, 31814, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255127, 10929, 1, 1, 31810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255128, 932, 1, 0, 5221, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255129, 11016, 1, 0, 32470, 35, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255133, 29941, 0, 0, 56340, 1, 0, 0, 505, 738, 0, 0, 0, 'Shokia Dispatched', 19034), +(255134, 29941, 0, 1, 56477, 1, 0, 0, 739, 0, 0, 0, 0, 'Sergeant Gorrok Dispatched', 19034), +(255135, 29941, 0, 2, 56478, 1, 0, 0, 740, 0, 0, 0, 0, 'Shademaster Kiryn Dispatched', 19034), +(255136, 29941, 0, 3, 56336, 1, 0, 0, 741, 0, 0, 0, 0, 'Parlayed with Kah Kah', 19034), +(255137, 375, 1, 0, 2876, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255138, 375, 1, 1, 2320, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255139, 8837, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255140, 25056, 1, 0, 52270, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255142, 28608, 1, 0, 64582, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255143, 28608, 1, 1, 64581, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255144, 28598, 0, 0, 49180, 1, 0, 0, 0, 0, 0, 0, 0, 'Wait to be launched from Flintlocke''s Cannon', 19034), +(255145, 28598, 0, 1, 49212, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy the Skyshredder', 19034), +(255146, 28596, 0, 0, 49008, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde Attackers slain', 19034), +(255147, 10348, 1, 0, 29474, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255148, 24517, 0, 0, 37216, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255149, 24517, 0, 1, 37161, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255150, 10120, 1, 0, 28024, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255151, 10930, 1, 0, 31826, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255152, 10930, 1, 1, 31825, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255156, 2751, 1, 0, 2868, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255157, 2751, 1, 1, 7957, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255158, 2751, 1, 2, 5635, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 255158 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(255159, 28597, 1, 0, 64585, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255160, 747, 1, 0, 4739, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255161, 747, 1, 1, 4740, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255162, 10162, 0, 0, 19398, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255163, 10162, 0, 1, 19397, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255164, 10162, 0, 2, 19399, 5, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannon Destroyed', 19034), +(255165, 10162, 1, 3, 28132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255166, 11120, 0, 0, 23531, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255167, 11120, 0, 1, 23529, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255168, 11120, 0, 2, 23530, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255169, 11120, 1, 3, 32960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255170, 13537, 1, 0, 12238, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255172, 1054, 1, 0, 5544, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255173, 11013, 1, 0, 32469, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255174, 28595, 1, 0, 64584, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255176, 298, 1, 0, 2637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255177, 210, 1, 0, 4085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255179, 28416, 0, 0, 47782, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255180, 28416, 0, 1, 7049, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255181, 13502, 1, 0, 44791, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255182, 13502, 1, 1, 44802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255183, 27608, 1, 0, 61924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255184, 27608, 1, 1, 61927, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255185, 27608, 1, 2, 61926, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255186, 27608, 1, 3, 61925, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255188, 26024, 1, 0, 4515, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255189, 25796, 0, 0, 40062, 15, 0, 0, 0, 0, 0, 0, 0, 'Splithoof Heights centaurs slain', 19034), +(255190, 8836, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255191, 433, 0, 0, 41671, 7, 0, 0, 0, 0, 0, 0, 0, 'Trapped Miners rescued', 19034), +(255192, 28862, 1, 0, 62324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255195, 9383, 1, 0, 23442, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255196, 29507, 4, -1, 393, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255198, 28863, 0, 0, 46493, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255199, 11034, 1, 0, 29290, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255200, 11034, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255203, 13979, 1, 0, 46768, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255204, 28864, 0, 0, 48762, 1, 0, 0, 0, 0, 0, 0, 0, 'Supply Caravan Escorted', 19034), +(255206, 25753, 0, 0, 41281, 6, 0, 0, 0, 0, 0, 0, 0, 'Injured Assault Volunteers rescued', 19034), +(255208, 10166, 1, 0, 28209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255209, 29934, 0, 0, 56314, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Mostrasz', 19034), +(255210, 30726, 0, 0, 60532, 1, 1, 0, 937, 0, 0, 0, 0, 'Minh Do-Tan defeated', 19034), +(255211, 30005, 0, 0, 57212, 8, 0, 0, 0, 0, 0, 0, 0, 'Fireworks launched', 19034), +(255212, 25658, 0, 0, 41155, 6, 0, 0, 0, 0, 0, 0, 0, 'Nar''shola Wards activated', 19034), +(255214, 27609, 1, 0, 61924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255215, 27609, 1, 1, 61927, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255216, 27609, 1, 2, 61926, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255217, 27609, 1, 3, 61925, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255218, 12292, 1, 0, 37572, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255220, 30727, 0, 0, 60533, 1, 1, 0, 937, 0, 0, 0, 0, 'Ellia Ravenmane defeated', 19034), +(255222, 25801, 0, 0, 42109, 12, 0, 0, 0, 0, 0, 0, 0, 'Bluegill Murloc slain', 19034), +(255223, 25801, 1, 1, 3618, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255224, 11235, 0, 0, 23991, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255225, 11235, 0, 1, 23990, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255226, 11235, 0, 2, 23989, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255227, 28415, 1, 0, 64409, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255228, 1143, 1, 0, 5383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255231, 237, 0, 0, 1163, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255232, 237, 0, 1, 1166, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255234, 878, 0, 0, 3260, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255235, 878, 0, 1, 3261, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255236, 878, 0, 2, 3263, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255237, 26064, 1, 0, 56041, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255240, 1023, 1, 0, 5463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255241, 28417, 1, 0, 63114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255242, 28417, 1, 1, 63116, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255243, 28417, 1, 2, 63117, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255244, 28417, 1, 3, 63119, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255246, 11015, 1, 0, 32427, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255249, 571, 1, 0, 3862, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255250, 11914, 1, 0, 35493, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255251, 28418, 0, 0, 47782, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255252, 28418, 0, 1, 7049, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255253, 25285, 0, 0, 39683, 1, 0, 0, 0, 0, 0, 0, 0, 'Ejection System Tested', 19034), +(255255, 29534, 1, 0, 72108, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255256, 267, 1, 0, 2536, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255257, 10585, 0, 0, 21735, 1, 0, 0, 0, 0, 0, 0, 0, 'End Infernal Summoning Ritual', 19034), +(255258, 10585, 1, 1, 30672, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255264, 28772, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255266, 195, 0, 0, 686, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255267, 25595, 1, 0, 55140, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255270, 25730, 1, 0, 55239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255274, 12264, 0, 0, 27358, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255275, 12264, 0, 1, 27362, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255276, 12264, 0, 2, 27363, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255283, 354, 1, 0, 2829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255284, 354, 1, 1, 2828, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255285, 354, 1, 2, 2830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255286, 1065, 1, 0, 5628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255287, 11072, 1, 0, 32715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255288, 11072, 1, 1, 32717, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255289, 11072, 1, 2, 32716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255290, 11072, 1, 3, 32718, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255292, 27920, 0, 0, 3887, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255293, 27920, 0, 1, 4278, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255294, 1105, 1, 0, 5795, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255295, 1112, 1, 0, 5800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255296, 25805, 1, 0, 2625, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255298, 282, 1, 0, 2619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255300, 26856, 0, 0, 11518, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255301, 26856, 0, 1, 11519, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255302, 26856, 0, 2, 11517, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255303, 11076, 1, 0, 32723, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255304, 24752, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(255305, 24752, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(255306, 8840, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255308, 1202, 1, 0, 5882, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255311, 29509, 1, 0, 72058, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255314, 24558, 1, 0, 49698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255315, 29261, 1, 0, 63128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255316, 567, 0, 0, 2448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255317, 567, 0, 1, 2449, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255318, 567, 0, 2, 2450, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255319, 567, 0, 3, 2451, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255320, 29510, 1, 0, 71979, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255323, 11919, 0, 0, 26175, 1, 0, 0, 0, 0, 0, 0, 0, 'Captured Nexus Drake', 19034), +(255327, 24539, 0, 0, 37548, 5, 0, 0, 0, 0, 0, 0, 0, 'Taurajo Refugees Rescued from Overgrowth', 19034), +(255329, 24534, 0, 0, 37513, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255330, 24534, 1, 1, 49782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255331, 11188, 0, 0, 23689, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255332, 13924, 1, 0, 46715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255333, 937, 1, 0, 5204, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255334, 25817, 0, 0, 41428, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255335, 25817, 0, 1, 41427, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255337, 11908, 1, 0, 35481, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255339, 26933, 0, 0, 44433, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255340, 11236, 0, 0, 24018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255343, 29315, 1, 0, 69899, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255344, 25729, 0, 0, 4202, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255345, 8774, 0, 0, 11730, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255346, 8774, 1, 1, 21252, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255348, 26446, 2, 0, 181690, 8, 0, 0, 0, 0, 0, 0, 0, 'Tree Seedling Planted', 19034), +(255349, 25593, 0, 0, 39729, 8, 0, 0, 0, 0, 0, 0, 0, 'Shell Survivors rescued', 19034), +(255357, 970, 1, 0, 5366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255359, 26296, 1, 0, 58118, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255360, 25622, 0, 0, 40957, 8, 0, 0, 0, 0, 0, 0, 0, 'Warsong Stockpile Incinerated', 19034), +(255368, 1134, 1, 0, 5808, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255370, 1242, 1, 0, 5946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255372, 1442, 1, 0, 6995, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255374, 1205, 1, 0, 5945, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255375, 26620, 1, 0, 60989, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255376, 1131, 1, 0, 5837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255377, 275, 0, 0, 1040, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255379, 11155, 1, 0, 33120, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255380, 1258, 1, 0, 5938, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255381, 1025, 0, 0, 3746, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255382, 1025, 0, 1, 3749, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255383, 1025, 0, 2, 3750, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255384, 1025, 0, 3, 3743, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255387, 2754, 1, 0, 3851, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255388, 2754, 1, 1, 3482, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255389, 2754, 1, 2, 3483, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255394, 947, 1, 0, 5271, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255395, 947, 1, 1, 5270, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255396, 564, 0, 0, 2406, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255397, 564, 0, 1, 2407, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255398, 27223, 0, 0, 10516, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255399, 27223, 0, 1, 10808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255400, 28350, 1, 0, 63541, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255402, 1253, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255403, 1140, 2, 0, 19901, 1, 0, 0, 0, 0, 0, 0, 0, 'Free the Highborne soul in Night Run', 19034), +(255404, 1140, 2, 1, 20352, 1, 0, 0, 0, 0, 0, 0, 0, 'Free the Highborne soul in Satyrnaar', 19034), +(255405, 26740, 1, 0, 4085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255406, 489, 1, 0, 3418, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255407, 1160, 1, 0, 5861, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255408, 27512, 1, 0, 61312, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255409, 27935, 0, 0, 44372, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255417, 10704, 1, 0, 31085, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255418, 10704, 1, 1, 31086, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255419, 27715, 0, 0, 47123, 1, 0, 0, 0, 0, 0, 0, 0, 'Choose an admirer to save', 19034), +(255420, 27715, 0, 1, 47178, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride to the end of the canyon', 19034), +(255421, 27715, 0, 2, 47179, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Deathwing', 19034), +(255422, 27715, 0, 3, 46471, 1, 1, 0, 0, 0, 0, 0, 0, 'Beat Deathwing in a knife fight', 19034), +(255423, 11154, 1, 0, 33084, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255427, 29374, 0, 0, 51833, 25, 0, 0, 0, 0, 0, 0, 0, 'Bombs Dropped', 19034), +(255428, 1243, 1, 0, 5960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255429, 11593, 0, 0, 25342, 10, 0, 0, 0, 0, 0, 0, 0, 'Fallen Caravan Guards & Workers Torched', 19034), +(255430, 1106, 1, 0, 5827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255431, 29375, 0, 0, 52553, 10, 0, 0, 0, 0, 0, 0, 0, 'Stink Bombs Removed', 19034), +(255434, 11018, 1, 0, 32464, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255435, 11231, 0, 0, 24035, 10, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Prisoner Freed', 19034), +(255437, 27714, 0, 0, 47080, 1, 0, 0, 0, 0, 0, 0, 0, 'Grow large enough to reach the clouds', 19034), +(255438, 27714, 0, 1, 47097, 5, 0, 0, 0, 0, 0, 0, 0, 'Clouds searched', 19034), +(255439, 27714, 0, 2, 47103, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Deathwing', 19034), +(255440, 27818, 1, 0, 62551, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255441, 28747, 0, 0, 49561, 2, 0, 0, 0, 0, 0, 0, 0, 'Massive Wave Survived', 19034), +(255442, 10165, 1, 0, 28490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255448, 29925, 1, 0, 76483, 1, 0, 0, 1218, 0, 0, 0, 0, '', 19034), +(255449, 29926, 0, 0, 56401, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255450, 29926, 0, 1, 56404, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255451, 29927, 0, 0, 56347, 1, 0, 0, 0, 0, 0, 0, 0, 'Locate Hao Mann', 19034), +(255452, 29928, 1, 0, 76209, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255454, 29929, 0, 0, 56464, 8, 0, 0, 520, 0, 0, 0, 0, 'Greenstone Miners Freed', 19034), +(255455, 26274, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(255456, 26274, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Corruption', 19034), +(255457, 1009, 1, 0, 5445, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255458, 25585, 0, 0, 40869, 8, 0, 0, 0, 0, 0, 0, 0, 'Holdfast Cannons destroyed', 19034), +(255459, 25586, 0, 0, 40869, 8, 0, 0, 0, 0, 0, 0, 0, 'Holdfast Cannons destroyed', 19034), +(255463, 25445, 0, 0, 40428, 1, 0, 0, 0, 0, 0, 0, 0, 'Zalazane Killed', 19034), +(255464, 2753, 1, 0, 3836, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255465, 2753, 1, 1, 3835, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255466, 2753, 1, 2, 3842, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255467, 27879, 1, 0, 62544, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255468, 27879, 1, 1, 62547, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255469, 11632, 1, 0, 34777, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255473, 27938, 1, 0, 60575, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255474, 10164, 0, 0, 18373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255478, 1088, 1, 0, 5686, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255479, 25, 0, 0, 3917, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255480, 25, 0, 1, 12759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255481, 1114, 1, 0, 5802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255482, 914, 1, 0, 9738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255483, 914, 1, 1, 9739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255484, 914, 1, 2, 9740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255485, 914, 1, 3, 9741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255486, 28748, 0, 0, 49627, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden Stillwater Defeated', 19034), +(255487, 24528, 5, -1, 105361, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Seal of Command', 19034), +(255488, 24528, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Seal of Command and Hit a Training Dummy', 19034), +(255490, 28352, 0, 0, 51199, 3, 0, 0, 0, 0, 0, 0, 0, 'Wild Camels captured', 19034), +(255491, 25672, 1, 0, 55226, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255492, 28351, 0, 0, 51188, 5, 0, 0, 0, 0, 0, 0, 0, 'Sand Pygmies captured', 19034), +(255494, 27905, 0, 0, 47054, 1, 0, 0, 0, 0, 0, 0, 0, 'Escaped the Obelisk of the Sun', 19034), +(255495, 1491, 1, 0, 6464, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255496, 25647, 1, 0, 55181, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255497, 288, 1, 0, 2594, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255502, 8600, 1, 0, 8170, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255503, 1187, 1, 0, 5862, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255507, 11983, 0, 0, 26179, 5, 0, 0, 0, 0, 0, 0, 0, 'Taunka Admitted Into the Horde', 19034), +(255508, 11983, 1, 1, 35784, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255510, 1275, 1, 0, 5952, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255511, 10662, 1, 0, 30822, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255513, 28773, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255520, 25604, 1, 0, 54883, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255522, 28603, 0, 0, 48922, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255523, 28603, 0, 1, 48923, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255524, 28603, 0, 2, 48924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255525, 8602, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255526, 8602, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255527, 8602, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255528, 8602, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255529, 8602, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255530, 1176, 1, 0, 5848, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255536, 24441, 1, 0, 4801, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255537, 24441, 1, 1, 4802, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255541, 26287, 0, 0, 42652, 12, 0, 0, 0, 0, 0, 0, 0, 'Attacking Riverpaw Gnoll slain', 19034), +(255542, 1204, 1, 0, 5883, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255543, 1093, 1, 0, 5734, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255544, 8321, 1, 0, 20466, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255547, 11576, 0, 0, 25310, 1, 0, 0, 0, 0, 0, 0, 0, 'Cleftcliff Anomaly Reading Taken', 19034), +(255548, 24978, 0, 0, 1934, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255549, 1338, 1, 0, 5998, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255551, 25774, 1, 0, 56002, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255552, 29173, 0, 0, 52405, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255553, 29173, 0, 1, 52422, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255554, 29173, 0, 2, 52438, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255555, 29317, 1, 0, 69901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255556, 29172, 0, 0, 52418, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255557, 29172, 0, 1, 52442, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255558, 29172, 0, 2, 52414, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255559, 10672, 0, 0, 21924, 8, 0, 0, 0, 0, 0, 0, 0, 'Greater Felfire Diemetradon Tagged', 19034), +(255564, 10572, 1, 0, 30628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255565, 10572, 1, 1, 30631, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255567, 29513, 1, 0, 73269, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255568, 27365, 1, 0, 60885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255569, 27365, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255570, 27365, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255580, 30728, 0, 0, 60534, 1, 1, 0, 937, 0, 0, 0, 0, 'Fat Long-Fat defeated', 19034), +(255581, 30729, 0, 0, 60535, 1, 1, 0, 937, 0, 0, 0, 0, 'Julia Bates defeated', 19034), +(255582, 10663, 1, 0, 30822, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255586, 26194, 0, 0, 42819, 15, 0, 0, 0, 0, 0, 0, 0, 'Kill 15 naga in the Abyssal Breach', 19034), +(255588, 1701, 1, 0, 6838, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255589, 1701, 1, 1, 6839, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255590, 1701, 1, 2, 6840, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255591, 1701, 1, 3, 6841, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255597, 25873, 1, 0, 56139, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255598, 1241, 1, 0, 5948, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255601, 29512, 0, 0, 54518, 4, 0, 0, 0, 0, 0, 0, 0, 'Use bandage on Injured Carnie', 19034), +(255602, 29659, 1, 0, 72663, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255603, 14369, 0, 0, 36634, 8, 0, 0, 0, 0, 0, 0, 0, 'Forsaken Combatant slain', 19034), +(255606, 25726, 1, 0, 55234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255607, 11307, 0, 0, 24281, 10, 0, 0, 0, 0, 0, 0, 0, 'Plagued Vrykul Sprayed', 19034), +(255608, 26781, 1, 0, 3616, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255609, 10221, 0, 0, 20284, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255610, 10221, 1, 1, 29429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255611, 8530, 1, 0, 20737, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255612, 29015, 1, 0, 5097, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255614, 25721, 0, 0, 41132, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255615, 28774, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255617, 8603, 1, 0, 20933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255618, 8603, 1, 1, 20876, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255619, 8603, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255620, 8603, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255621, 8603, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255626, 25855, 1, 0, 56085, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255627, 28502, 0, 0, 47755, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255629, 1182, 1, 0, 5852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255630, 13134, 2, 0, 192933, 5, 0, 0, 0, 0, 0, 0, 0, 'Blood Orbs shattered', 19034), +(255631, 13134, 2, 1, 192932, 5, 0, 0, 0, 0, 0, 0, 0, 'Vats of Embalming Fluid destroyed', 19034), +(255632, 29175, 0, 0, 52440, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255633, 29175, 0, 1, 52392, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255634, 1375, 1, 0, 6073, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255635, 1375, 6, -1, 93, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255637, 10309, 1, 0, 29260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255638, 10309, 1, 1, 29447, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255639, 8621, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255640, 8621, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255641, 8621, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255642, 8621, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255643, 8621, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255644, 943, 1, 0, 5233, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255645, 943, 1, 1, 5234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255646, 20440, 1, 0, 4758, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255647, 20440, 1, 1, 4759, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255648, 1101, 1, 0, 5792, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255650, 28751, 0, 0, 49626, 2, 0, 0, 0, 0, 0, 0, 0, 'Massive Wave Defeated', 19034), +(255652, 24559, 1, 0, 49739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255657, 28732, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255659, 11984, 0, 0, 26444, 1, 0, 0, 0, 0, 0, 0, 0, 'Captured Live Ice Troll', 19034), +(255660, 14279, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(255661, 14279, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(255662, 1487, 0, 0, 3636, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255663, 1487, 0, 1, 5755, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255664, 1487, 0, 2, 5761, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255665, 1487, 0, 3, 5056, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255670, 14263, 1, 0, 49082, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255672, 1382, 6, -1, 92, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255673, 1150, 1, 0, 5843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255674, 1618, 1, 0, 2857, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255675, 1618, 1, 1, 6214, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255677, 25420, 0, 0, 38914, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255678, 10578, 1, 0, 30645, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255680, 11317, 0, 0, 27959, 1, 0, 0, 0, 0, 0, 0, 0, 'Cleansed of Your Inner Turmoil', 19034), +(255686, 20438, 1, 0, 49648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255688, 10688, 0, 0, 21892, 1, 0, 0, 0, 0, 0, 0, 0, 'Azaloth Freed', 19034), +(255691, 29032, 1, 0, 68638, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255692, 28753, 0, 0, 39587, 1, 0, 0, 0, 0, 0, 0, 0, 'Isiset Slain', 19034), +(255693, 28753, 0, 1, 39731, 1, 0, 0, 0, 0, 0, 0, 0, 'Ammunae Slain', 19034), +(255694, 28753, 0, 2, 39378, 1, 0, 0, 0, 0, 0, 0, 0, 'Rajh Slain', 19034), +(255695, 28753, 0, 3, 39732, 1, 0, 0, 0, 0, 0, 0, 0, 'Setesh Slain', 19034), +(255696, 1245, 1, 0, 5947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255699, 12814, 0, 0, 29406, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Gryphon delivered to Uzo Deathcaller', 19034), +(255703, 28602, 1, 0, 61321, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255708, 28604, 0, 0, 49037, 30, 0, 0, 0, 0, 0, 0, 0, 'Stormpike Trainee poisoned', 19034), +(255709, 24, 1, 0, 16304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255710, 8604, 1, 0, 3530, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255716, 14151, 0, 0, 28701, 5, 0, 0, 0, 0, 0, 0, 0, 'Epic Gem Transmutes', 19034), +(255717, 8460, 0, 0, 7153, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255718, 8460, 0, 1, 7155, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255719, 8460, 0, 2, 7154, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255720, 12174, 1, 0, 37003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255722, 11433, 0, 0, 24669, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255723, 5501, 1, 0, 13703, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255724, 14072, 1, 0, 46857, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255726, 25776, 0, 0, 41255, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255727, 25776, 1, 1, 56003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255728, 29319, 1, 0, 69905, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255736, 25045, 0, 0, 39029, 1, 0, 0, 0, 0, 0, 0, 0, 'Hill Captured', 19034), +(255737, 25045, 0, 1, 39030, 1, 0, 0, 0, 0, 0, 0, 0, 'Hill Defended', 19034), +(255738, 10757, 1, 0, 23445, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255739, 10757, 1, 1, 22445, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255740, 10757, 1, 2, 22574, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255741, 30730, 0, 0, 60536, 1, 1, 0, 937, 0, 0, 0, 0, 'Dextrous Izissha defeated', 19034), +(255742, 30731, 0, 0, 60537, 1, 1, 0, 937, 0, 0, 0, 0, 'Kuo-Na Quillpaw defeated', 19034), +(255743, 30732, 0, 0, 60538, 1, 1, 0, 937, 0, 0, 0, 0, 'Ellia Ravenmane defeated', 19034), +(255744, 30733, 0, 0, 60539, 1, 1, 0, 937, 0, 0, 0, 0, 'Tukka-Tuk defeated', 19034), +(255748, 25637, 0, 0, 41108, 16, 0, 0, 0, 0, 0, 0, 0, 'Kvaldir invaders on the terrace slain', 19034), +(255749, 29515, 1, 0, 71974, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255751, 29664, 0, 0, 56048, 1, 0, 0, 0, 0, 0, 0, 0, 'Challenger Torch lit', 19034), +(255752, 29664, 0, 1, 56037, 1, 0, 0, 0, 0, 0, 0, 0, 'Red Brazier lit', 19034), +(255753, 29664, 0, 2, 56038, 1, 0, 0, 0, 0, 0, 0, 0, 'Blue Brazier lit', 19034), +(255754, 29664, 0, 3, 56040, 1, 0, 0, 0, 0, 0, 0, 0, 'Violet Brazier lit', 19034), +(255756, 25664, 1, 0, 55210, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255757, 25664, 1, 1, 55211, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255758, 184, 1, 0, 1971, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255764, 29516, 1, 0, 72050, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255768, 24468, 0, 0, 37078, 5, 0, 0, 0, 0, 0, 0, 0, 'Crash Survivor rescued', 19034), +(255775, 25771, 1, 0, 10593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255776, 264, 1, 0, 6145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255777, 8528, 1, 0, 6887, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255778, 25663, 0, 0, 41079, 1, 0, 0, 0, 0, 0, 0, 0, 'Nectar Offered', 19034), +(255779, 25663, 1, 1, 55208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255781, 26910, 1, 0, 60677, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255782, 1359, 1, 0, 10283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255783, 101, 1, 0, 1129, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255784, 101, 1, 1, 1130, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255785, 101, 1, 2, 2378, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255790, 10661, 1, 0, 30819, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255791, 11432, 0, 0, 24669, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255792, 10660, 1, 0, 30819, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255797, 25689, 1, 0, 56019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255798, 8622, 1, 0, 20929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255799, 8622, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255800, 8622, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255801, 8622, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255802, 8622, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255809, 1360, 1, 0, 8027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255814, 25701, 0, 0, 41280, 1, 1, 0, 0, 0, 0, 0, 0, 'Razelikh''s body destroyed', 19034), +(255815, 25701, 0, 1, 41292, 1, 0, 0, 0, 0, 0, 0, 0, 'Razelikh''s soul imprisoned', 19034), +(255816, 29320, 1, 0, 69909, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255818, 8367, 4, -1, 392, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255819, 11407, 0, 0, 24202, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark outside the Auction House', 19034), +(255820, 11407, 0, 1, 24203, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Honor', 19034), +(255821, 11407, 0, 2, 24204, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Wisdom', 19034), +(255822, 11407, 0, 3, 24205, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Spirits', 19034), +(255823, 10714, 0, 0, 22383, 1, 0, 0, 0, 0, 0, 0, 0, 'Eavesdrop on the Bloodmaul ogres'' plans', 19034), +(255824, 10714, 1, 1, 31128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255828, 8464, 0, 0, 7439, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255829, 8464, 0, 1, 7440, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255830, 8464, 0, 2, 7438, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255833, 29517, 1, 0, 71976, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255834, 24608, 0, 0, 37940, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255836, 27097, 0, 0, 44953, 15, 0, 0, 0, 0, 0, 0, 0, 'Forsaken raised', 19034), +(255846, 26211, 0, 0, 2505, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255848, 9280, 1, 0, 22889, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255854, 8320, 0, 0, 11881, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255855, 10675, 1, 0, 30890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255856, 10674, 0, 0, 21929, 15, 0, 0, 0, 0, 0, 0, 0, 'Razaani Light Orbs trapped', 19034), +(255857, 10674, 1, 1, 30852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255861, 5529, 0, 0, 10678, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255866, 8545, 1, 0, 3860, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255867, 25922, 0, 0, 41531, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen as Duarn speaks to Nespirah', 19034), +(255868, 25922, 0, 1, 41776, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape on Erunak''s Seahorse', 19034), +(255869, 27681, 0, 0, 7291, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255870, 26025, 1, 0, 4510, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255878, 26732, 1, 0, 2633, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255879, 12143, 0, 0, 27005, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255880, 1802, 1, 0, 6931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255881, 1802, 1, 1, 6997, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255885, 8371, 4, -1, 392, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255886, 29322, 1, 0, 69911, 10, 0, 0, 1733, 0, 0, 0, 0, '', 19034), +(255887, 25715, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255888, 2541, 1, 0, 8363, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255889, 25720, 0, 0, 42334, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255892, 25825, 1, 0, 56037, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255898, 25522, 1, 0, 54855, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255899, 11479, 0, 0, 24713, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255900, 25743, 0, 0, 41192, 1, 0, 0, 0, 0, 0, 0, 0, 'The Pewter Prophet Destroyed', 19034), +(255903, 28605, 0, 0, 49116, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255904, 25950, 0, 0, 41586, 10, 0, 0, 0, 0, 0, 0, 0, 'Sira''kess naga slain', 19034), +(255911, 28617, 0, 0, 49542, 1, 0, 0, 0, 0, 0, 0, 0, 'Massive Wave Survived', 19034), +(255912, 25710, 0, 0, 42228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255913, 1581, 1, 0, 2454, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255914, 1581, 1, 1, 5997, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255917, 10673, 1, 0, 30851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255918, 25639, 0, 0, 36966, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255919, 3110, 1, 0, 9556, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255923, 26925, 1, 0, 17114, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(255931, 12265, 2, 0, 188695, 8, 0, 0, 0, 0, 0, 0, 0, 'Necromantic Rune destroyed', 19034), +(255935, 25826, 1, 0, 56037, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255936, 1578, 1, 0, 2845, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255937, 1578, 1, 1, 2851, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255939, 27027, 5, -1, 73899, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Primal Strike', 19034), +(255940, 27027, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Primal Strike', 19034), +(255941, 26826, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255946, 5341, 1, 0, 13471, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255947, 5341, 1, 1, 13448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255948, 5341, 1, 2, 13450, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255949, 5341, 1, 3, 13451, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255950, 24968, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(255951, 24968, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Corruption', 19034), +(255953, 1712, 1, 0, 3357, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255954, 1712, 1, 1, 3901, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255955, 1712, 1, 2, 6851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255957, 11056, 1, 0, 32687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255958, 25936, 0, 0, 41672, 6, 0, 0, 0, 0, 0, 0, 0, 'Drowning Warriors Rescued', 19034), +(255960, 8318, 1, 0, 20404, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255962, 11365, 0, 0, 27802, 4, 0, 0, 0, 0, 0, 0, 0, 'Runed Stone Giant Corpses Analyzed', 19034), +(255963, 25920, 1, 0, 56194, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255965, 10427, 0, 0, 20982, 12, 0, 0, 0, 0, 0, 0, 0, 'Talbuk Tagged', 19034), +(255966, 10427, 1, 1, 29817, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255969, 8319, 1, 0, 20404, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255972, 9180, 1, 0, 22627, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255973, 27961, 1, 0, 62934, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255975, 8842, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255976, 2161, 1, 0, 7629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255977, 25925, 0, 0, 35163, 3, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar Demolisher destroyed', 19034), +(255978, 25925, 0, 1, 35158, 20, 0, 0, 0, 0, 0, 0, 0, 'Horde Soldier slain', 19034), +(255979, 24969, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(255980, 24969, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(255983, 2206, 1, 0, 7675, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255984, 5344, 1, 0, 13470, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255985, 10975, 1, 0, 29460, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255987, 14058, 1, 0, 44839, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255989, 26027, 0, 0, 2570, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255990, 26027, 0, 1, 2571, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255994, 10657, 0, 0, 21910, 25, 0, 0, 0, 0, 0, 0, 0, 'Lightning Strikes Absorbed', 19034), +(255995, 10657, 1, 1, 30849, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255996, 10657, 1, 2, 30818, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255997, 27840, 1, 0, 6071, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(255999, 9177, 1, 0, 22627, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256000, 1486, 1, 0, 6443, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256008, 11170, 0, 0, 24121, 16, 0, 0, 0, 0, 0, 0, 0, 'North Fleet Reservist Infected', 19034), +(256009, 25756, 1, 0, 55808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256010, 25746, 0, 0, 41029, 12, 0, 0, 0, 0, 0, 0, 0, 'Sethria''s Minion Slain', 19034), +(256011, 8249, 1, 0, 16885, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256012, 2160, 1, 0, 7646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256013, 13831, 1, 0, 45898, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256018, 28611, 0, 0, 49148, 1, 1, 0, 0, 0, 0, 0, 0, 'Neferset Ritual stopped', 19034), +(256020, 25919, 2, 0, 203309, 7, 0, 0, 0, 0, 0, 0, 0, 'Nespirah Abscess attacked', 19034), +(256031, 9385, 0, 0, 16934, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256032, 24783, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 256032 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(256033, 11021, 1, 0, 32523, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256034, 26237, 0, 0, 114, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256041, 25731, 0, 0, 41169, 1, 0, 0, 0, 0, 0, 0, 0, 'Marion Wormwing Captured', 19034), +(256042, 25731, 0, 1, 41170, 1, 0, 0, 0, 0, 0, 0, 0, 'Marion Wormwing Interrogated', 19034), +(256043, 10446, 0, 0, 21039, 1, 0, 0, 0, 0, 0, 0, 0, 'Mana Bomb Activated', 19034), +(256045, 24646, 1, 0, 50086, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256054, 11399, 0, 0, 24464, 3, 0, 0, 0, 0, 0, 0, 0, 'Scourging Crystals Destroyed', 19034), +(256055, 28657, 0, 0, 47593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256056, 1918, 1, 0, 16408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256060, 2279, 1, 0, 6064, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256064, 24967, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(256065, 24967, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(256067, 14379, 1, 0, 49222, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256071, 25015, 0, 0, 37521, 8, 0, 0, 0, 0, 0, 0, 0, 'Bristleback Quilboar Slain', 19034), +(256072, 25015, 1, 1, 52046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256073, 13527, 1, 0, 44911, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256074, 10976, 1, 0, 31941, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256075, 8309, 1, 0, 20456, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256076, 8309, 1, 1, 20453, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256080, 27939, 1, 0, 62777, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256088, 11073, 0, 0, 21838, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256089, 29332, 1, 0, 69917, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256096, 26055, 0, 0, 2595, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256097, 26055, 0, 1, 2596, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256101, 25871, 0, 0, 41463, 1, 1, 0, 0, 0, 0, 0, 0, 'Captured Feralas Sentinel freed', 19034), +(256113, 24965, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(256114, 24965, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(256120, 14155, 0, 0, 35198, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256124, 29930, 0, 0, 56508, 1, 0, 0, 1219, 0, 0, 0, 0, 'Jade Delivered', 19034), +(256125, 28775, 1, 0, 65896, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256126, 28775, 1, 1, 52190, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256127, 28775, 1, 2, 52186, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256128, 24958, 0, 0, 38868, 1, 0, 0, 0, 0, 0, 0, 0, 'Volcanoth slain', 19034), +(256131, 25809, 0, 0, 41283, 8, 0, 0, 0, 0, 0, 0, 0, 'Frightened Miner Rescued', 19034), +(256132, 25869, 0, 0, 41431, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256134, 25822, 1, 0, 56010, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256137, 2770, 1, 0, 8707, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256139, 26356, 1, 0, 1362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256140, 5526, 1, 0, 18540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256141, 24960, 0, 0, 38895, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Lilian Voss', 19034), +(256142, 24960, 0, 1, 49230, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Marshal Redpath', 19034), +(256143, 24960, 0, 2, 49231, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Valdred Moray', 19034), +(256144, 8323, 1, 0, 20404, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256145, 28658, 1, 0, 63103, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256147, 27707, 0, 0, 46461, 1, 0, 0, 0, 0, 0, 0, 0, 'Tahet''s Whereabouts ', 19034), +(256148, 13275, 1, 0, 44001, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256149, 11398, 1, 0, 33962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256150, 27706, 1, 0, 62267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256151, 2198, 1, 0, 7666, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256152, 29932, 0, 0, 57290, 1, 0, 0, 600, 601, 0, 0, 0, 'Elder Sage Wind-Yi spoken to', 19034), +(256153, 25811, 0, 0, 41314, 1, 0, 0, 0, 0, 0, 0, 0, 'Plant Explosives at First Beam', 19034), +(256154, 25811, 0, 1, 41315, 1, 0, 0, 0, 0, 0, 0, 0, 'Plant Explosives at Second Beam', 19034), +(256155, 25811, 0, 2, 41316, 1, 0, 0, 0, 0, 0, 0, 0, 'Plant Explosives at Third Beam', 19034), +(256156, 25811, 0, 3, 41317, 1, 0, 0, 0, 0, 0, 0, 0, 'Plant Explosives at Fourth Beam', 19034), +(256157, 25187, 0, 0, 39357, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Raggaran', 19034), +(256158, 25187, 0, 1, 39358, 1, 0, 0, 0, 0, 0, 0, 0, 'Find flooded hut', 19034), +(256159, 25187, 0, 2, 39359, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Misha', 19034), +(256160, 25187, 0, 3, 39360, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Zen''Taji', 19034), +(256161, 2768, 1, 0, 8548, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256163, 29645, 0, 0, 18794, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256164, 29645, 0, 1, 18731, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256166, 11300, 1, 0, 33545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256167, 29262, 1, 0, 63128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256168, 4811, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256170, 3107, 1, 0, 9563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256171, 27098, 0, 0, 45051, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Sylvanas Windrunner accompanied to the Sepulcher.', 19034), +(256172, 5146, 1, 0, 7077, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256173, 5146, 1, 1, 7079, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256174, 5146, 1, 2, 7075, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256175, 5146, 1, 3, 7081, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256176, 2199, 1, 0, 2842, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256179, 25907, 0, 0, 41555, 8, 0, 0, 0, 0, 0, 0, 0, 'Pearl Miners rescued', 19034), +(256180, 29278, 1, 0, 69807, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256181, 8274, 0, 0, 126, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256182, 12198, 0, 0, 27017, 10, 0, 0, 0, 0, 0, 0, 0, 'Charge Level', 19034), +(256186, 13980, 0, 0, 34603, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256187, 14032, 0, 0, 6, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256188, 14032, 0, 1, 46, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256190, 2280, 1, 0, 6064, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256193, 25910, 0, 0, 41563, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256194, 25910, 0, 1, 41565, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256197, 28355, 0, 0, 2372, 10, 0, 0, 0, 0, 0, 0, 0, 'Mudsnout Gnoll or Shaman slain', 19034), +(256202, 11244, 2, 0, 186565, 8, 0, 0, 0, 0, 0, 0, 0, 'Valgarde Scout Rescued', 19034), +(256203, 8308, 1, 0, 20461, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256207, 11448, 1, 0, 34088, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256208, 1456, 1, 0, 6245, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256211, 25914, 0, 0, 34923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256212, 25914, 0, 1, 34961, 10, 0, 0, 0, 0, 0, 0, 0, 'Invading Tentacle slain', 19034), +(256216, 25861, 0, 0, 41457, 1, 0, 0, 0, 0, 0, 0, 0, 'Kvaldir High-Shaman brought to the executioner', 19034), +(256221, 8325, 0, 0, 15274, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256222, 25879, 0, 0, 40906, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256223, 25422, 1, 0, 53135, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256224, 11423, 1, 0, 34040, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256225, 11423, 1, 1, 34042, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256226, 11423, 1, 2, 34041, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256227, 6142, 1, 0, 15924, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256228, 8607, 1, 0, 8544, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256231, 27716, 1, 0, 62281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256232, 8306, 0, 0, 15215, 1, 0, 0, 0, 0, 0, 0, 0, 'The Fate of Mistress Natalia Mar''alith', 19034), +(256235, 26030, 1, 0, 4440, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256238, 13557, 0, 0, 33024, 8, 0, 0, 0, 0, 0, 0, 0, 'Uncorrupted animals freed', 19034), +(256239, 13557, 1, 1, 44925, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256243, 29257, 1, 0, 69725, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256246, 27941, 1, 0, 62789, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256247, 9945, 0, 0, 18065, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256248, 9945, 0, 1, 18037, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256249, 25681, 0, 0, 41173, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256250, 10276, 1, 0, 29026, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256253, 3105, 1, 0, 9576, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256254, 2118, 0, 0, 11836, 1, 0, 0, 0, 0, 0, 0, 0, 'Rabid Thistle Bear Captured', 19034), +(256256, 6741, 1, 0, 17422, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256260, 9367, 2, 0, 181332, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256261, 9367, 2, 1, 181333, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256262, 9367, 2, 2, 181334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256265, 2439, 1, 0, 8070, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256266, 11243, 0, 0, 24051, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256269, 9787, 1, 0, 24422, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256270, 29181, 4, -1, 416, 150, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256271, 5515, 1, 0, 13725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256272, 2138, 0, 0, 2164, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256274, 10924, 1, 0, 31813, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256275, 10924, 1, 1, 31815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256276, 10188, 1, 0, 28368, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256278, 24623, 0, 0, 39157, 12, 0, 0, 0, 0, 0, 0, 0, 'Bloodtalon Hatchlings rescued', 19034), +(256279, 14364, 0, 0, 35647, 1, 0, 0, 0, 0, 0, 0, 0, 'Nazargen slain', 19034), +(256280, 10542, 1, 0, 30468, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256281, 10542, 1, 1, 29443, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256282, 10977, 1, 0, 32069, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256285, 2499, 1, 0, 8136, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256287, 25126, 0, 0, 3098, 6, 0, 0, 0, 0, 0, 0, 0, 'Mottled Boar slaughtered', 19034), +(256289, 2240, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256292, 27702, 0, 0, 46416, 5, 0, 0, 0, 0, 0, 0, 0, 'Coup de Grace delivered', 19034), +(256294, 29252, 1, 0, 69774, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256297, 27703, 0, 0, 46416, 5, 0, 0, 0, 0, 0, 0, 0, 'Coup de Grace delivered', 19034), +(256307, 24819, 1, 0, 50377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256308, 24819, 8, -1, 0, 2000000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256309, 11401, 1, 0, 33985, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256311, 30740, 0, 0, 60546, 1, 1, 0, 937, 0, 0, 0, 0, 'Champion of Chi-Ji defeated', 19034), +(256314, 27940, 0, 0, 47202, 8, 0, 0, 0, 0, 0, 0, 0, 'Diseased Vultures Slain', 19034), +(256315, 3089, 1, 0, 9568, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256319, 29179, 0, 0, 52504, 8, 0, 0, 0, 0, 0, 0, 0, 'Charred Combatant slain', 19034), +(256320, 29251, 1, 0, 69774, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256321, 2139, 0, 0, 6788, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256322, 25192, 0, 0, 3113, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256323, 25192, 0, 1, 3114, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256324, 2383, 1, 0, 12635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256329, 30736, 0, 0, 60542, 1, 1, 0, 937, 0, 0, 0, 0, 'Yan Quillpaw defeated', 19034), +(256333, 2418, 1, 0, 8009, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256334, 2418, 1, 1, 8052, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256335, 25878, 0, 0, 41475, 4, 0, 0, 0, 0, 0, 0, 0, 'Oil Pump Destroyed', 19034), +(256336, 25874, 1, 0, 56139, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256339, 30746, 1, 0, 80944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256340, 30747, 0, 0, 60737, 100, 0, 0, 1227, 0, 0, 0, 0, 'Burlap Trail Hozen Slain', 19034), +(256344, 9514, 1, 0, 23759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256349, 25931, 2, 0, 203384, 5, 0, 0, 0, 0, 0, 0, 0, 'Seldarria''s Egg destroyed', 19034), +(256350, 29943, 0, 0, 56303, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256352, 27692, 0, 0, 12201, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256353, 8330, 1, 0, 20470, 1, 0, 0, 2099, 0, 0, 0, 0, '', 19034), +(256354, 8330, 1, 1, 20471, 1, 0, 0, 2099, 0, 0, 0, 0, '', 19034), +(256355, 8330, 1, 2, 20472, 1, 0, 0, 2099, 0, 0, 0, 0, '', 19034), +(256356, 9688, 0, 0, 17588, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256357, 9688, 0, 1, 17589, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256358, 2518, 1, 0, 8344, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256361, 2623, 1, 0, 8463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256362, 14460, 1, 0, 50473, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256363, 27963, 1, 0, 62807, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256364, 12116, 1, 0, 36825, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256368, 12547, 1, 0, 38708, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256369, 27962, 1, 0, 10005, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256370, 10524, 1, 0, 30431, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256371, 10524, 1, 1, 30433, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256372, 10524, 1, 2, 30432, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256373, 10524, 1, 3, 30434, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256376, 29219, 0, 0, 52930, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Bwemba Find the Darkspear Emissary', 19034), +(256377, 29040, 0, 0, 51763, 1, 0, 0, 0, 0, 0, 0, 0, 'Try out Winterspring Cat Toy', 19034), +(256378, 29186, 1, 0, 69264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256381, 25373, 0, 0, 39952, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256382, 13232, 0, 0, 31312, 5, 0, 0, 0, 0, 0, 0, 0, 'Dying Soldiers Slain', 19034), +(256384, 9946, 1, 0, 25590, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256385, 25884, 0, 0, 41481, 12, 0, 0, 0, 0, 0, 0, 0, 'Zin''jatar Naga Slain', 19034), +(256386, 28777, 1, 0, 65894, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256387, 28777, 1, 1, 52192, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256388, 28777, 1, 2, 52186, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256389, 24429, 1, 0, 49643, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256391, 25883, 2, 0, 203300, 6, 0, 0, 0, 0, 0, 0, 0, 'Naga Weapons Destroyed', 19034), +(256392, 3088, 1, 0, 9560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256396, 24432, 1, 0, 54828, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256397, 24432, 1, 1, 52504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256400, 3120, 1, 0, 9580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256403, 3093, 1, 0, 9552, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256405, 27964, 1, 0, 62806, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256407, 25444, 0, 0, 40188, 5, 0, 0, 0, 0, 0, 0, 0, 'Sen''jin Frogs attuned', 19034), +(256409, 2846, 1, 0, 9234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256410, 25546, 1, 0, 54845, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256411, 3087, 1, 0, 9553, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256421, 27909, 1, 0, 62609, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256427, 14459, 0, 0, 36696, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256430, 25433, 0, 0, 39958, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256431, 3091, 1, 0, 9547, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256432, 25904, 1, 0, 56177, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256433, 2945, 1, 0, 9326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256434, 2945, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256435, 26257, 0, 0, 42601, 1, 0, 0, 0, 0, 0, 0, 0, 'Overloaded Harvest Golem enabled', 19034), +(256436, 26257, 0, 1, 42342, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256438, 14198, 0, 0, 35506, 40, 0, 0, 0, 0, 0, 0, 0, 'Nijel''s Point Defenders Slain', 19034), +(256439, 14198, 0, 1, 35510, 15, 0, 0, 0, 0, 0, 0, 0, 'Nijel''s Point Merchants Slain', 19034), +(256440, 25558, 0, 0, 40714, 1, 0, 0, 0, 0, 0, 0, 0, 'Defense of The Briny Cutter Complete', 19034), +(256441, 3106, 1, 0, 9543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256445, 8326, 1, 0, 20797, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256447, 29236, 0, 0, 52762, 1, 0, 0, 0, 0, 0, 0, 0, 'Arrived at Hardwrench Hideaway', 19034), +(256449, 27974, 0, 0, 46962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256452, 25888, 0, 0, 41533, 10, 0, 0, 0, 0, 0, 0, 0, 'Imprisoned Soldiers Released', 19034), +(256453, 13058, 2, 0, 194123, 1, 0, 0, 0, 0, 0, 0, 0, 'True timeline restored', 19034), +(256454, 13058, 1, 1, 42918, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256455, 29940, 1, 0, 76297, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256456, 29940, 1, 1, 76298, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256460, 27376, 0, 0, 48281, 1, 0, 0, 0, 0, 0, 0, 0, 'Join the assault on Iso''rath', 19034), +(256465, 28776, 1, 0, 65897, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256466, 28776, 1, 1, 52327, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256467, 28776, 1, 2, 52186, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256468, 28776, 1, 3, 54849, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256470, 3090, 1, 0, 9579, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256471, 26886, 0, 0, 40593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256473, 1319, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256478, 10538, 1, 0, 30430, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256479, 25394, 0, 0, 39384, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256481, 3103, 1, 0, 9548, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256482, 11252, 1, 0, 33330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256483, 11641, 0, 0, 25393, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256484, 11641, 0, 1, 25378, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256485, 28114, 1, 0, 63029, 60, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256486, 8517, 1, 0, 1251, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256488, 5283, 1, 0, 7937, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256489, 5283, 1, 1, 7936, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256490, 5283, 1, 2, 7935, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256492, 28610, 1, 0, 64586, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256493, 12285, 1, 0, 37565, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256496, 28782, 0, 0, 50044, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256499, 26038, 1, 0, 4530, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256500, 26038, 1, 1, 4531, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256501, 26038, 1, 2, 4532, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256502, 2863, 0, 0, 5258, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256503, 3097, 1, 0, 9569, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256504, 28614, 0, 0, 49178, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256505, 3100, 1, 0, 9542, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256506, 25188, 0, 0, 39331, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Grandmatron Tekla', 19034), +(256507, 25188, 0, 1, 39332, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Raggaran', 19034), +(256508, 25188, 0, 2, 39333, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Misha Tor''kren', 19034), +(256509, 25188, 0, 3, 39334, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Zen''Taji', 19034), +(256511, 13308, 1, 0, 44153, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256512, 8623, 1, 0, 20930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256513, 8623, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256514, 8623, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256515, 8623, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256516, 8623, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256517, 8532, 1, 0, 2840, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256518, 9687, 1, 0, 24185, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256519, 3109, 1, 0, 9550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256520, 27910, 1, 0, 62714, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256521, 25923, 0, 0, 41614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256522, 25955, 0, 0, 40963, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Quel''Dormir Gardens scouted', 19034), +(256523, 25955, 0, 1, 40964, 1, 0, 0, 0, 0, 0, 0, 0, 'Tunnel west of Quel''Dormir Gardens scouted', 19034), +(256524, 25955, 0, 2, 40965, 1, 0, 0, 0, 0, 0, 0, 0, 'Structures south of Quel''Dormir Gardens scouted', 19034), +(256528, 26039, 1, 0, 4435, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256529, 27476, 1, 0, 61306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256531, 29539, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256533, 8369, 4, -1, 392, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256534, 26969, 5, -1, 73899, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Primal Strike', 19034), +(256536, 25374, 0, 0, 39958, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256537, 11237, 1, 0, 33289, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256540, 24495, 1, 0, 49760, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256541, 3101, 1, 0, 9570, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256542, 3108, 1, 0, 9566, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256549, 3125, 1, 0, 9596, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256550, 3125, 1, 1, 9620, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256553, 25545, 1, 0, 54843, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256554, 25545, 1, 1, 54842, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256555, 25545, 1, 2, 54958, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256556, 25545, 1, 3, 54844, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256561, 10447, 0, 0, 21039, 1, 0, 0, 0, 0, 0, 0, 0, 'Mana Bomb Activated', 19034), +(256564, 12178, 1, 0, 39665, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256567, 3094, 1, 0, 9581, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256568, 3104, 1, 0, 9571, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256569, 3096, 1, 0, 9559, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256570, 28629, 1, 0, 12366, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256573, 14395, 0, 0, 36450, 4, 0, 0, 0, 0, 0, 0, 0, 'Drowning Watchman rescued', 19034), +(256576, 25602, 1, 0, 55143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256577, 2038, 1, 0, 7343, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256578, 2038, 1, 1, 7345, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256579, 2038, 1, 2, 7346, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256580, 2038, 1, 3, 7376, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256586, 12038, 0, 0, 26612, 30, 0, 0, 0, 0, 0, 0, 0, 'Scourge Trolls Burned', 19034), +(256588, 25598, 0, 0, 39669, 1, 0, 0, 0, 0, 0, 0, 0, 'Mack and Samir Rescued', 19034), +(256589, 26034, 0, 0, 39863, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256590, 28778, 1, 0, 65895, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256591, 28778, 1, 1, 52193, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256592, 28778, 1, 2, 54849, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256593, 28778, 1, 3, 52327, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256594, 25935, 1, 0, 56223, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256596, 27907, 1, 0, 62550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256599, 25967, 0, 0, 41779, 1, 0, 0, 0, 0, 0, 0, 0, 'Return to the Forward Post', 19034), +(256601, 27474, 1, 0, 61306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256603, 9809, 1, 0, 24245, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256607, 29594, 1, 0, 72160, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256608, 26330, 1, 0, 58179, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256609, 26782, 1, 0, 58205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256611, 29237, 0, 0, 52623, 10, 0, 0, 0, 0, 0, 0, 0, 'Hideaway Survivors Rescued', 19034), +(256614, 8311, 1, 0, 20492, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256615, 8311, 1, 1, 20494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256616, 8311, 1, 2, 20490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256617, 8311, 1, 3, 20496, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256618, 2342, 1, 0, 8026, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256619, 27968, 0, 0, 46964, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256620, 11525, 0, 0, 24991, 5, 0, 0, 0, 0, 0, 0, 0, 'Converted Sentry Deployed', 19034), +(256621, 11525, 1, 1, 34368, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256622, 26037, 1, 0, 4527, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256623, 12004, 1, 0, 35800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256624, 12004, 1, 1, 35801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256625, 11582, 0, 0, 25308, 1, 0, 0, 0, 0, 0, 0, 0, 'Sundered Chasm Reading Taken', 19034), +(256628, 2947, 1, 0, 9362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256629, 25190, 0, 0, 3111, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256630, 25190, 0, 1, 3112, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256631, 8515, 1, 0, 4304, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256633, 26036, 1, 0, 4525, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256635, 3099, 1, 0, 9578, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256636, 8370, 4, -1, 392, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256637, 29593, 1, 0, 72160, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256638, 29966, 0, 0, 56509, 1, 0, 0, 0, 0, 0, 0, 0, 'Alliance Camp Destroyed', 19034), +(256639, 25886, 0, 0, 41502, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256640, 28612, 0, 0, 49204, 1, 0, 0, 0, 0, 0, 0, 0, 'Coffer of Promise Discovered', 19034), +(256641, 3092, 1, 0, 9565, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256643, 27908, 1, 0, 62593, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256645, 28370, 0, 0, 48454, 5, 0, 0, 0, 0, 0, 0, 0, 'Talonbranch Wisp captured', 19034), +(256646, 11224, 0, 0, 23977, 10, 0, 0, 0, 0, 0, 0, 0, 'Abandoned Pack Mule Sent Packing', 19034), +(256647, 2159, 1, 0, 7627, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256648, 3128, 1, 0, 9590, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256649, 3128, 1, 1, 9589, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256650, 3128, 1, 2, 9591, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256651, 3128, 1, 3, 9592, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256658, 14486, 1, 0, 49639, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256660, 27754, 1, 0, 62332, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256662, 10565, 1, 0, 30567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256663, 11230, 0, 0, 23983, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256665, 12910, 0, 0, 29677, 1, 0, 0, 0, 0, 0, 0, 0, 'Track scent to its source', 19034), +(256666, 12910, 0, 1, 29695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256669, 28861, 1, 0, 62330, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256670, 11196, 0, 0, 23863, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256671, 8491, 1, 0, 20772, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256672, 26288, 0, 0, 453, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256673, 26288, 0, 1, 98, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256674, 26288, 0, 2, 42653, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256676, 25794, 0, 0, 41294, 1, 0, 0, 0, 0, 0, 0, 0, 'Erunak''s Scrying Orb Used', 19034), +(256681, 9746, 0, 0, 17608, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256682, 9746, 0, 1, 17607, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256687, 12618, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256688, 8372, 4, -1, 392, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256692, 10702, 0, 0, 21978, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256693, 9808, 1, 0, 24245, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256695, 2949, 1, 0, 9362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256696, 25964, 0, 0, 41281, 6, 0, 0, 0, 0, 0, 0, 0, 'Injured Assault Volunteers rescued', 19034), +(256702, 10595, 0, 0, 21419, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256704, 9784, 1, 0, 24401, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256705, 27494, 2, 0, 205590, 1, 0, 0, 0, 0, 0, 0, 0, 'Hidden explosives detonated', 19034), +(256706, 27477, 0, 0, 11896, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256710, 26041, 1, 0, 4483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256711, 26041, 1, 1, 4484, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256712, 26041, 1, 2, 4485, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256713, 9802, 1, 0, 24401, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256718, 13560, 0, 0, 32852, 50, 0, 0, 0, 0, 0, 0, 0, 'Scavenging Greymist Murlocs', 19034), +(256722, 28615, 0, 0, 49177, 4, 0, 0, 0, 0, 0, 0, 0, 'Winterfall Earth Totem overloaded', 19034), +(256723, 25977, 0, 0, 41782, 1, 0, 0, 0, 0, 0, 0, 0, 'Banner planted in Fathom-Caller Azrajar''s corpse', 19034), +(256724, 25971, 1, 0, 56183, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256729, 29194, 0, 0, 52867, 1, 0, 0, 0, 0, 0, 0, 0, 'Obscured Event Witnessed', 19034), +(256731, 9801, 1, 0, 24426, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256732, 9801, 1, 1, 24427, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256736, 2459, 0, 0, 7235, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256737, 2459, 1, 1, 8050, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256742, 25423, 1, 0, 53136, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256743, 9748, 1, 0, 24317, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256744, 14484, 0, 0, 36822, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256746, 2438, 1, 0, 8048, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256747, 28872, 0, 0, 46551, 10, 0, 0, 0, 0, 0, 0, 0, 'Wildhammer Kegs Smashed', 19034), +(256748, 28873, 1, 0, 62324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256749, 29333, 1, 0, 69918, 8, 0, 0, 1728, 0, 0, 0, 0, '', 19034), +(256751, 13559, 1, 0, 42780, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256752, 3095, 1, 0, 9546, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256754, 9951, 0, 0, 18438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256755, 14195, 0, 0, 35382, 1, 0, 0, 0, 0, 0, 0, 0, 'Ruins of Elune''s Palace Located', 19034), +(256760, 11913, 0, 0, 26161, 8, 0, 0, 0, 0, 0, 0, 0, 'Farshire Grain burnt', 19034), +(256769, 2948, 1, 0, 9362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256770, 2948, 1, 1, 2842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256771, 2948, 1, 2, 1206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256772, 2948, 8, -1, 0, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256773, 25960, 0, 0, 41780, 8, 0, 0, 0, 0, 0, 0, 0, 'Horde Lookout restocked', 19034), +(256775, 29255, 1, 0, 69722, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256777, 10703, 0, 0, 21978, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256778, 3115, 1, 0, 9577, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256779, 8492, 1, 0, 2840, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256780, 25179, 0, 0, 39270, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Razor Hill Grunt Rescued', 19034), +(256781, 2953, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256782, 2953, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256783, 25172, 0, 0, 39317, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256784, 27475, 1, 0, 61307, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256785, 8324, 1, 0, 20404, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256789, 25704, 0, 0, 41130, 1, 0, 0, 0, 0, 0, 0, 0, 'Mad Magus Tirth''s soul extracted', 19034), +(256790, 28871, 1, 0, 62325, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256797, 2951, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256798, 2951, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256800, 10385, 1, 0, 29459, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256808, 29540, 0, 0, 17377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256811, 9370, 0, 0, 16994, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256812, 9370, 1, 1, 23358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256813, 9689, 0, 0, 17592, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256814, 10265, 1, 0, 28829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256815, 6391, 1, 0, 16310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256816, 8656, 1, 0, 20929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256817, 8656, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256818, 8656, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256819, 8656, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256820, 8656, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256823, 28860, 1, 0, 62332, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256829, 6642, 1, 0, 11370, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256830, 8312, 1, 0, 20493, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256831, 8312, 1, 1, 20495, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256832, 8312, 1, 2, 20491, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256833, 8312, 1, 3, 20497, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256834, 8310, 1, 0, 20459, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256843, 24561, 0, 0, 37158, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Quel''Delar to Halls of Reflection', 19034), +(256844, 24561, 1, 1, 50254, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256845, 29221, 0, 0, 52224, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256846, 29221, 0, 1, 52307, 10, 0, 0, 0, 0, 0, 0, 0, 'Headhunters healed', 19034), +(256847, 29297, 0, 0, 53251, 3, 0, 0, 0, 0, 0, 0, 0, 'Druids of the Flame in Fire Crow form slain', 19034), +(256848, 8336, 1, 0, 20482, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256849, 10935, 0, 0, 22432, 1, 0, 0, 0, 0, 0, 0, 0, 'Colonel Jules Saved', 19034), +(256850, 10935, 1, 1, 31828, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256853, 8334, 0, 0, 15271, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256854, 8334, 0, 1, 15294, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256856, 12544, 0, 0, 28256, 1, 0, 0, 0, 0, 0, 0, 0, 'Location of Farunn revealed', 19034), +(256857, 2930, 1, 0, 9316, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256858, 29189, 0, 0, 52751, 8, 0, 0, 0, 0, 0, 0, 0, 'Victims freed', 19034), +(256859, 2950, 1, 0, 9362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256860, 2950, 1, 1, 2842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256861, 2950, 1, 2, 1206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256862, 2950, 8, -1, 0, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256863, 29295, 1, 0, 69860, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256864, 6563, 1, 0, 16784, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256865, 4450, 1, 0, 11727, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256866, 4450, 1, 1, 11725, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256867, 4450, 1, 2, 11724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256868, 4450, 1, 3, 11723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256870, 28779, 1, 0, 65660, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256874, 3116, 1, 0, 9545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256880, 3119, 1, 0, 9557, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256881, 29334, 1, 0, 69919, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256883, 6134, 1, 0, 15849, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256884, 4441, 1, 0, 5646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256887, 8313, 1, 0, 20467, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256888, 27497, 0, 0, 45865, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern building targeted', 19034), +(256889, 27497, 0, 1, 45864, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeastern building targeted', 19034), +(256890, 27497, 0, 2, 45863, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwestern building targeted', 19034), +(256891, 27497, 0, 3, 45862, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern building targeted', 19034), +(256892, 25779, 1, 0, 56006, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256893, 4970, 1, 0, 12622, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256894, 4970, 1, 1, 12623, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256896, 2926, 1, 0, 9284, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256899, 27498, 0, 0, 46000, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack signaled', 19034), +(256902, 13662, 1, 0, 18945, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256903, 11903, 0, 0, 25650, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256906, 29222, 0, 0, 52678, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the bonfire near Bambala', 19034), +(256907, 26972, 0, 0, 3983, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256908, 26972, 0, 1, 4543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256909, 3118, 1, 0, 9551, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256911, 4971, 0, 0, 10717, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256912, 4971, 1, 1, 12627, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256913, 10445, 1, 0, 29906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256914, 10445, 1, 1, 29905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256915, 13935, 0, 0, 32856, 50, 0, 0, 0, 0, 0, 0, 0, 'Warsong enemies destroyed', 19034), +(256921, 27495, 2, 0, 205590, 1, 0, 0, 0, 0, 0, 0, 0, 'Hidden explosives detonated', 19034), +(256925, 29437, 0, 0, 54314, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256926, 27496, 0, 0, 45865, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern building targeted', 19034), +(256927, 27496, 0, 1, 45864, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeastern building targeted', 19034), +(256928, 27496, 0, 2, 45863, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwestern building targeted', 19034), +(256929, 27496, 0, 3, 45862, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern building targeted', 19034), +(256930, 8335, 0, 0, 15273, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256931, 8335, 0, 1, 15298, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256932, 8335, 1, 2, 20799, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256933, 29936, 0, 0, 56403, 1, 0, 0, 602, 0, 0, 0, 0, 'Signaled Survivors', 19034), +(256938, 25204, 2, 0, 202609, 1, 0, 0, 0, 0, 0, 0, 0, 'Valve #1 released', 19034), +(256939, 25204, 2, 1, 202610, 1, 0, 0, 0, 0, 0, 0, 0, 'Valve #2 released', 19034), +(256940, 25204, 2, 2, 202611, 1, 0, 0, 0, 0, 0, 0, 0, 'Valve #3 released', 19034), +(256941, 25204, 2, 3, 202612, 1, 0, 0, 0, 0, 0, 0, 0, 'Valve #4 released', 19034), +(256943, 10339, 0, 0, 20452, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256944, 10339, 0, 1, 20453, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256945, 10339, 0, 2, 20456, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256946, 10339, 0, 3, 20727, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256953, 14470, 0, 0, 8408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256954, 14470, 1, 1, 49700, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256956, 10384, 1, 0, 29582, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256957, 3517, 1, 0, 10538, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256958, 3517, 1, 1, 10539, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 256958 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(256959, 3517, 1, 2, 10540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256960, 3517, 1, 3, 10541, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256962, 2865, 1, 0, 9238, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256963, 28625, 1, 0, 64587, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256964, 3523, 1, 0, 10682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256965, 4502, 1, 0, 11829, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256966, 3376, 1, 0, 10459, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256967, 26045, 1, 0, 56575, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256973, 24571, 1, 0, 49876, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256976, 27378, 0, 0, 48161, 1, 0, 0, 0, 0, 0, 0, 0, 'Aid Thrall in battling Deathwing', 19034), +(256977, 10176, 0, 0, 19494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256978, 10690, 0, 0, 21956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256980, 4501, 0, 0, 9167, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256981, 26481, 1, 0, 5388, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(256982, 26481, 1, 1, 46739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256987, 4984, 0, 0, 1817, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256988, 3373, 1, 0, 10454, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(256998, 27499, 0, 0, 46000, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack signaled', 19034), +(256999, 5151, 1, 0, 12942, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257000, 5151, 1, 1, 12946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257005, 8338, 1, 0, 20483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257007, 5981, 0, 0, 7428, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257008, 5981, 0, 1, 7429, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257010, 27606, 0, 0, 46009, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257014, 6607, 1, 0, 16967, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257015, 6607, 1, 1, 16970, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257016, 6607, 1, 2, 16968, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257017, 6607, 1, 3, 16969, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257024, 29326, 0, 0, 54306, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Ceremony', 19034), +(257026, 3042, 1, 0, 9523, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257029, 3102, 1, 0, 9555, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257031, 11008, 0, 0, 22991, 20, 0, 0, 0, 0, 0, 0, 0, 'Monstrous Kaliri Egg Destroyed', 19034), +(257032, 11008, 1, 1, 32406, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257037, 12280, 1, 0, 37412, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257038, 12280, 1, 1, 37413, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257039, 12280, 1, 2, 37416, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257040, 12543, 1, 0, 38505, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257042, 29327, 0, 0, 53518, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Thrall from the elements', 19034), +(257048, 3361, 1, 0, 10438, 1, 0, 0, 3142, 0, 0, 0, 0, '', 19034), +(257049, 3361, 1, 1, 16313, 1, 0, 0, 3141, 0, 0, 0, 0, '', 19034), +(257050, 3361, 1, 2, 16314, 1, 0, 0, 3140, 0, 0, 0, 0, '', 19034), +(257051, 3117, 1, 0, 9567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257064, 25943, 1, 0, 54845, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257065, 29321, 1, 0, 69910, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257074, 13649, 0, 0, 24108, 5, 0, 0, 0, 0, 0, 0, 0, 'S.T.O.U.T. Hit', 19034), +(257079, 24564, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257081, 12420, 1, 0, 37736, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257084, 13333, 1, 0, 44220, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257092, 24562, 1, 0, 49870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257093, 27377, 0, 0, 48108, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive Iso''rath''s defenses', 19034), +(257100, 4812, 1, 0, 14339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257101, 28626, 1, 0, 64661, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257103, 29238, 0, 0, 52882, 1, 0, 0, 0, 0, 0, 0, 0, 'Supplies Searched', 19034), +(257107, 8282, 1, 0, 20379, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257110, 11006, 1, 0, 32388, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257111, 27482, 0, 0, 45738, 1, 0, 0, 0, 0, 0, 0, 0, 'Warlord Thresh''jin''s Body burned', 19034), +(257112, 25974, 0, 0, 41586, 10, 0, 0, 0, 0, 0, 0, 0, 'Sira''kess naga slain', 19034), +(257115, 29325, 1, 0, 69915, 6, 0, 0, 1732, 0, 0, 0, 0, '', 19034), +(257116, 29299, 0, 0, 53263, 6, 0, 0, 0, 0, 0, 0, 0, 'Help the Crimson Lasher Drink from Ember Pools', 19034), +(257120, 28618, 1, 0, 64638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257121, 3521, 1, 0, 10639, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257122, 3521, 1, 1, 10641, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257123, 3521, 1, 2, 10640, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257124, 10206, 1, 0, 28457, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257125, 29328, 0, 0, 53655, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Thrall from the elements', 19034), +(257126, 29328, 0, 1, 53670, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Aggra from the elements', 19034), +(257134, 3364, 1, 0, 10439, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257139, 26049, 1, 0, 4473, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257140, 3098, 1, 0, 9574, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257141, 29323, 1, 0, 69912, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257142, 3541, 1, 0, 10539, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257143, 27479, 1, 0, 61313, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257149, 13430, 0, 0, 17257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257154, 12006, 0, 0, 26280, 15, 0, 0, 0, 0, 0, 0, 0, 'Blue Dragonflight forces at Moonrest Gardens slain', 19034), +(257164, 11023, 0, 0, 23118, 15, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannonball Stacks destroyed', 19034), +(257165, 11023, 1, 1, 32456, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257166, 3528, 1, 0, 10662, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257167, 3365, 1, 0, 10440, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257169, 25909, 1, 0, 56182, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257172, 10331, 1, 0, 29365, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257174, 13137, 0, 0, 30924, 1, 0, 0, 0, 0, 0, 0, 0, 'Iskalder defeated in battle', 19034), +(257175, 28115, 0, 0, 47204, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257177, 12278, 1, 0, 37571, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257187, 11190, 1, 0, 33123, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257189, 28628, 1, 0, 64665, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257191, 6365, 1, 0, 16306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257193, 29324, 1, 0, 69913, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257196, 27850, 0, 0, 47739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257198, 24563, 0, 0, 37601, 1, 0, 0, 0, 0, 0, 0, 0, 'Thalorien''s Blessing obtained', 19034), +(257204, 10692, 0, 0, 21178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257205, 10692, 0, 1, 21164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257206, 10692, 0, 2, 21168, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257207, 10692, 0, 3, 21171, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257208, 10596, 0, 0, 21502, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover Legion''s Plans', 19034), +(257209, 10596, 1, 1, 30638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257210, 3518, 1, 0, 10538, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257211, 27847, 0, 0, 43778, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257214, 27821, 0, 0, 46166, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257218, 11443, 1, 0, 34081, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257219, 28105, 1, 0, 62817, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257220, 11005, 0, 0, 23066, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257221, 11005, 0, 1, 23067, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257222, 11005, 0, 2, 23068, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257223, 11452, 0, 0, 24023, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257224, 8304, 0, 0, 15221, 1, 0, 0, 0, 0, 0, 0, 0, 'Frankal Questioned', 19034), +(257225, 8304, 0, 1, 15222, 1, 0, 0, 0, 0, 0, 0, 0, 'Rutgar Questioned', 19034), +(257231, 28631, 1, 0, 64664, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257233, 9139, 0, 0, 16325, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257234, 9139, 0, 1, 16326, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257241, 27971, 0, 0, 46605, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257242, 8278, 1, 0, 20375, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257243, 8278, 1, 1, 20374, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257244, 8278, 1, 2, 20377, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257250, 8281, 0, 0, 11741, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257251, 27502, 0, 0, 46076, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to the Squad commander', 19034), +(257252, 27502, 0, 1, 46121, 1, 0, 0, 0, 0, 0, 0, 0, 'SI:7 escorted', 19034), +(257254, 5166, 1, 0, 12871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257255, 5166, 1, 1, 12607, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257256, 5166, 1, 2, 12938, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257257, 5166, 1, 3, 12735, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257259, 28119, 1, 0, 12907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257260, 27503, 0, 0, 46117, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to the Squad commander', 19034), +(257261, 27503, 0, 1, 46121, 1, 0, 0, 0, 0, 0, 0, 0, 'Kor''kron escorted', 19034), +(257262, 29269, 0, 0, 53182, 1, 0, 0, 0, 0, 0, 0, 0, 'Bonded with Tarecgosa''s Essence', 19034), +(257263, 29564, 0, 0, 17941, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257265, 25215, 0, 0, 39911, 3, 0, 0, 0, 0, 0, 0, 0, 'Dead Zin''jatar Raiders disposed of', 19034), +(257270, 5213, 1, 0, 13176, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257271, 29270, 1, 0, 69815, 1000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257287, 5167, 1, 0, 12871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257288, 5167, 1, 1, 12607, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257289, 5167, 1, 2, 12938, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257290, 5167, 1, 3, 12753, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257291, 28634, 0, 0, 49245, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257293, 5101, 0, 0, 1933, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257294, 26234, 1, 0, 57878, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257300, 10123, 0, 0, 19434, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257301, 10123, 0, 1, 19136, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257302, 10123, 0, 2, 19261, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257303, 25609, 1, 0, 55138, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257305, 3639, 1, 0, 4394, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257306, 3639, 1, 1, 10507, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257307, 3639, 1, 2, 4384, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257309, 27099, 0, 0, 44951, 1, 0, 0, 0, 0, 0, 0, 0, 'Human Leaders found', 19034), +(257310, 8549, 1, 0, 2447, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257312, 27970, 0, 0, 47287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257313, 27481, 1, 0, 61315, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257317, 26051, 1, 0, 4492, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257318, 26051, 1, 1, 4491, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257320, 25478, 0, 0, 39897, 1, 0, 0, 0, 0, 0, 0, 0, 'Wind Rider to Westreach Summit', 19034), +(257321, 11457, 1, 0, 34101, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257323, 5214, 1, 0, 13172, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257328, 8277, 1, 0, 20373, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257329, 8277, 1, 1, 20376, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257330, 27975, 0, 0, 46648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257331, 10896, 0, 0, 22419, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257332, 3542, 1, 0, 10540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257334, 9524, 0, 0, 17290, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Alina Rescued', 19034), +(257342, 8279, 1, 0, 20394, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257343, 8279, 1, 1, 20395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257344, 8279, 1, 2, 20396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257345, 10436, 0, 0, 20634, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257346, 28639, 0, 0, 10806, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257349, 8892, 0, 0, 15645, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257350, 8892, 0, 1, 16162, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257357, 29764, 1, 0, 43513, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257358, 14388, 0, 0, 36438, 1, 0, 0, 0, 0, 0, 0, 0, 'Gormungan Scared', 19034), +(257359, 7962, 1, 0, 19482, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257360, 3520, 0, 0, 8612, 3, 0, 0, 0, 0, 0, 0, 0, 'Screecher Spirits Collected', 19034), +(257361, 3520, 1, 1, 10699, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257367, 30006, 0, 0, 57327, 15, 0, 0, 0, 0, 0, 0, 0, 'Sha invaders slain', 19034), +(257368, 27501, 1, 0, 61924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257369, 27501, 1, 1, 61927, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257370, 27501, 1, 2, 61926, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257371, 27501, 1, 3, 61925, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257375, 28875, 0, 0, 46885, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257377, 27500, 1, 0, 61924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257378, 27500, 1, 1, 61927, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257379, 27500, 1, 2, 61926, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257380, 27500, 1, 3, 61925, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257383, 3281, 1, 0, 5061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257384, 10543, 0, 0, 20095, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257385, 10543, 0, 1, 20723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257386, 29563, 0, 0, 17893, 1, 0, 0, 0, 0, 0, 0, 0, 'Naturalist Bite Discovered', 19034), +(257387, 29563, 0, 1, 17890, 1, 0, 0, 0, 0, 0, 0, 0, 'Weeder Greenthumb Discovered', 19034), +(257389, 30237, 0, 0, 58671, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257390, 10300, 1, 0, 29216, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257391, 8557, 1, 0, 20885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257392, 8557, 1, 1, 20867, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257393, 8557, 1, 2, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257394, 8557, 1, 3, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257395, 8557, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257402, 10683, 1, 0, 30596, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257403, 10547, 1, 0, 30500, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257405, 28632, 1, 0, 64662, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257406, 28638, 0, 0, 7455, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257411, 8559, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257412, 8559, 1, 1, 20882, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257413, 8559, 1, 2, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257414, 8559, 1, 3, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257415, 8559, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257417, 5235, 1, 0, 13196, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257418, 5235, 1, 1, 13189, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257421, 10468, 1, 0, 29303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257422, 10468, 6, -1, 990, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257424, 8026, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257426, 8023, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257427, 11603, 1, 0, 34714, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257428, 9775, 1, 0, 24382, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257429, 29214, 4, -1, 416, 150, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257430, 26974, 0, 0, 3975, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257435, 11026, 0, 0, 23327, 15, 0, 0, 0, 0, 0, 0, 0, 'Demons banished', 19034), +(257436, 11026, 1, 1, 32696, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257437, 25153, 0, 0, 39219, 10, 0, 0, 0, 0, 0, 0, 0, 'Bael''dun Survivor Rescued', 19034), +(257439, 27486, 0, 0, 45708, 1, 0, 0, 0, 0, 0, 0, 0, 'Meet with Lirastrasza', 19034), +(257440, 25543, 0, 0, 40707, 15, 0, 0, 0, 0, 0, 0, 0, 'Rowboats sunk', 19034), +(257441, 14333, 0, 0, 36204, 1, 0, 0, 0, 0, 0, 0, 0, 'Defiled Relics Destroyed', 19034), +(257443, 27778, 0, 0, 47028, 1, 0, 0, 0, 0, 0, 0, 0, 'Wibson Mainframe hacked', 19034), +(257444, 29234, 1, 0, 69646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257445, 10035, 1, 0, 25852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257447, 6621, 1, 0, 16976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257448, 6621, 1, 1, 16972, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257449, 28637, 0, 0, 7444, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257452, 10655, 1, 0, 30809, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257453, 8317, 1, 0, 20452, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257454, 10472, 1, 0, 29304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257455, 10472, 6, -1, 990, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257456, 3506, 1, 0, 10597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257457, 29264, 0, 0, 53093, 8, 0, 0, 0, 0, 0, 0, 0, 'Flamewaker slain', 19034), +(257464, 27777, 1, 0, 62399, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257465, 29565, 1, 0, 72118, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257466, 29565, 1, 1, 72119, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257467, 27364, 1, 0, 60977, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257471, 27493, 0, 0, 45787, 10, 0, 0, 0, 0, 0, 0, 0, 'Bloodeye Clan ogres & ettins slain', 19034), +(257473, 11171, 0, 0, 24239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257474, 6441, 1, 0, 5481, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257476, 30238, 0, 0, 58915, 6, 0, 0, 0, 0, 0, 0, 0, 'Pandaren Gravestones Honored', 19034), +(257477, 13554, 1, 0, 44966, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257478, 27604, 1, 0, 6212, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257481, 8354, 0, 0, 6741, 1, 0, 0, 0, 0, 0, 0, 0, 'Cluck like a chicken for Innkeeper Norman', 19034), +(257483, 29968, 1, 0, 76333, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257484, 28874, 0, 0, 46321, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257487, 10475, 1, 0, 29296, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257488, 10475, 6, -1, 990, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257489, 7961, 1, 0, 46395, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257491, 11558, 1, 0, 22145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257494, 11077, 0, 0, 23169, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257495, 11077, 0, 1, 23326, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257496, 25892, 0, 0, 41562, 1, 0, 0, 0, 0, 0, 0, 0, 'Return to the Forward Post', 19034), +(257497, 26233, 1, 0, 57877, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257498, 6982, 1, 0, 17542, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257499, 10639, 0, 0, 21877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257500, 11458, 0, 0, 24676, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257501, 12036, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257502, 29265, 1, 0, 69765, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257503, 10466, 1, 0, 29298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257504, 10466, 6, -1, 990, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257505, 27488, 1, 0, 61318, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257506, 3524, 1, 0, 12242, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257507, 8350, 1, 0, 20804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257508, 27513, 0, 0, 45756, 20, 0, 0, 0, 0, 0, 0, 0, 'Ambermill Mage slain', 19034), +(257509, 27978, 0, 0, 47303, 14, 0, 0, 0, 0, 0, 0, 0, 'Largo''s Overlook Ghosts Slain', 19034), +(257510, 10274, 0, 0, 18544, 1, 0, 0, 0, 0, 0, 0, 0, 'Slay Veraku', 19034), +(257511, 10274, 1, 1, 29101, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257512, 30275, 1, 0, 79237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257517, 11610, 0, 0, 25397, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Kesuk''s ceremony completed', 19034), +(257518, 11610, 0, 1, 25398, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Sagani''s ceremony completed', 19034), +(257519, 11610, 0, 2, 25399, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Takret''s ceremony completed', 19034), +(257523, 28513, 0, 0, 7523, 8, 0, 0, 0, 0, 0, 0, 0, 'Highborne spirits released', 19034), +(257525, 29342, 1, 0, 69931, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257526, 10272, 1, 0, 28971, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257527, 29330, 0, 0, 53926, 1, 0, 0, 0, 0, 0, 0, 0, 'Activate Aggra''s totems to save Thrall', 19034), +(257528, 28622, 0, 0, 49221, 1, 0, 0, 0, 0, 0, 0, 0, 'North Signal Flare Placed', 19034), +(257529, 28622, 0, 1, 49222, 1, 0, 0, 0, 0, 0, 0, 0, 'West Signal Flare Placed', 19034), +(257530, 28622, 0, 2, 49223, 1, 0, 0, 0, 0, 0, 0, 0, 'South Signal Flare Placed', 19034), +(257531, 6662, 1, 0, 17118, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257536, 8314, 1, 0, 20463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257537, 7302, 0, 0, 14026, 1, 0, 0, 0, 0, 0, 0, 0, 'Guse''s Location Discovered', 19034), +(257538, 7302, 0, 1, 14028, 1, 0, 0, 0, 0, 0, 0, 0, 'Jeztor''s Location Discovered', 19034), +(257539, 7302, 0, 2, 14027, 1, 0, 0, 0, 0, 0, 0, 0, 'Mulverick''s Location Discovered', 19034), +(257540, 5085, 1, 0, 12813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257541, 25057, 0, 0, 39050, 5, 0, 0, 0, 0, 0, 0, 0, 'Taurajo Looters Arrested', 19034), +(257542, 25057, 1, 1, 52271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257543, 5157, 1, 0, 12907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257544, 29279, 4, -1, 416, 125, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257545, 10476, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257548, 5625, 0, 0, 12427, 1, 0, 0, 0, 0, 0, 0, 0, 'Heal and fortify Mountaineer Dolf', 19034), +(257552, 29329, 0, 0, 53744, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Thrall break out of his stone prison', 19034), +(257553, 29596, 0, 0, 18373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257554, 9276, 0, 0, 16469, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257555, 9276, 0, 1, 16344, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257559, 8021, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257561, 10464, 1, 0, 29302, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257562, 10464, 6, -1, 990, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257568, 27369, 1, 0, 60984, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257572, 27492, 0, 0, 45787, 10, 0, 0, 0, 0, 0, 0, 0, 'Bloodeye Clan ogres & ettins slain', 19034), +(257573, 8520, 1, 0, 6450, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257576, 13556, 1, 0, 44921, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257582, 10391, 0, 0, 22461, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257584, 6392, 1, 0, 16311, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257587, 4503, 1, 0, 11830, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257588, 4503, 1, 1, 11831, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257591, 10467, 1, 0, 29294, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257592, 10467, 6, -1, 990, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257593, 10470, 1, 0, 29299, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257594, 10470, 6, -1, 990, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257595, 27779, 0, 0, 46394, 1000, 0, 0, 0, 0, 0, 0, 0, 'Crazed Gnome obliterated', 19034), +(257596, 10758, 1, 0, 31252, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257599, 8562, 1, 0, 20929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257600, 8562, 1, 1, 20882, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257601, 8562, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257602, 8562, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257603, 8562, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257604, 3561, 1, 0, 10541, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257605, 12009, 1, 0, 35802, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257606, 10642, 1, 0, 30716, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257607, 5881, 1, 0, 16189, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257614, 29343, 0, 0, 53542, 1, 0, 0, 0, 0, 0, 0, 0, 'Put Young Ironjaw on Display', 19034), +(257615, 8280, 0, 0, 11740, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257619, 4513, 1, 0, 11954, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257620, 7301, 0, 0, 14029, 1, 0, 0, 0, 0, 0, 0, 0, 'Ichman''s Location Discovered', 19034), +(257621, 7301, 0, 1, 14031, 1, 0, 0, 0, 0, 0, 0, 0, 'Vipore''s Location Discovered', 19034), +(257622, 7301, 0, 2, 14030, 1, 0, 0, 0, 0, 0, 0, 0, 'Slidore''s Location Discovered', 19034), +(257629, 10634, 1, 0, 30797, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257630, 10920, 0, 0, 18467, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257636, 11600, 1, 0, 34695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257637, 27368, 1, 0, 60983, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257638, 4492, 1, 0, 15722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257639, 4161, 1, 0, 5465, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257640, 6962, 1, 0, 17197, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257641, 6962, 1, 1, 1179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257646, 8058, 1, 0, 19717, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257647, 8058, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257648, 10392, 0, 0, 19298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257649, 10392, 2, 1, 182935, 1, 0, 0, 0, 0, 0, 0, 0, 'Close Burning Legion Gate', 19034), +(257650, 10392, 1, 2, 29795, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257651, 11611, 0, 0, 25270, 5, 0, 0, 0, 0, 0, 0, 0, 'Warsong Peon Freed', 19034), +(257652, 29947, 0, 0, 56544, 12, 0, 0, 0, 0, 0, 0, 0, 'Virmen tricked with Orange-Painted Turnip', 19034), +(257654, 27485, 0, 0, 45708, 1, 0, 0, 0, 0, 0, 0, 0, 'Meet with Lirastrasza', 19034), +(257657, 10271, 0, 0, 53236, 8, 0, 0, 0, 0, 0, 0, 0, 'Netherwing Essence Gathered', 19034), +(257658, 10544, 0, 0, 21446, 5, 0, 0, 0, 0, 0, 0, 0, 'Bladespire Hold building cursed', 19034), +(257659, 10544, 0, 1, 21452, 2, 0, 0, 0, 0, 0, 0, 0, 'Bloodmaul Outpost building cursed', 19034), +(257660, 10544, 1, 2, 30479, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257661, 13539, 0, 0, 35074, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy a southern tower in Wintergrasp', 19034), +(257663, 8345, 2, 0, 180516, 1, 0, 0, 0, 0, 0, 0, 0, 'Shrine of Dath''Remar Read', 19034), +(257664, 29944, 0, 0, 56520, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257665, 29944, 0, 1, 56513, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257666, 29944, 0, 2, 56514, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257667, 10270, 1, 0, 28969, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257670, 10390, 0, 0, 16947, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257671, 10390, 1, 1, 29586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257675, 10471, 1, 0, 29295, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257676, 10471, 6, -1, 990, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257678, 27491, 0, 0, 45902, 1, 0, 0, 0, 0, 0, 0, 0, 'Get wind rider squad', 19034), +(257679, 27491, 0, 1, 45877, 1, 0, 0, 0, 0, 0, 0, 0, 'Kor''kron dropped off', 19034), +(257680, 9274, 0, 0, 16327, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257681, 9274, 0, 1, 16328, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257687, 8353, 0, 0, 5111, 1, 0, 0, 0, 0, 0, 0, 0, 'Cluck like a chicken for Innkeeper Firebrew', 19034), +(257688, 8560, 1, 0, 20927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257689, 8560, 1, 1, 20876, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257690, 8560, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257691, 8560, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257692, 8560, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257693, 13842, 0, 0, 44416, 1, 0, 0, 0, 0, 0, 0, 0, 'Durak Persuaded', 19034), +(257696, 11007, 1, 0, 32405, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257698, 10645, 0, 0, 21877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257699, 5082, 0, 0, 7442, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257700, 5082, 0, 1, 7440, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257701, 5082, 0, 2, 7441, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257704, 10295, 1, 0, 29162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257705, 10295, 1, 1, 29226, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257708, 28421, 1, 0, 63124, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257714, 27183, 1, 0, 33202, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257718, 7282, 0, 0, 13154, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257719, 10456, 1, 0, 30184, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257720, 8059, 1, 0, 19718, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257721, 8059, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257722, 27487, 0, 0, 45744, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257723, 27487, 0, 1, 45743, 10, 0, 0, 0, 0, 0, 0, 0, 'Ix''lar''s minion slain', 19034), +(257725, 10455, 0, 0, 21022, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257726, 29945, 1, 0, 76334, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257727, 29945, 1, 1, 76335, 40, 0, 0, 978, 0, 0, 0, 0, '', 19034), +(257728, 29946, 0, 0, 56537, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257732, 28420, 1, 0, 63136, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257733, 10791, 0, 0, 18384, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Malukaz Summon the Wolf Spirit', 19034), +(257734, 10791, 1, 1, 31344, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257735, 12016, 1, 0, 35831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257737, 8063, 1, 0, 19717, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257738, 8063, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257739, 10465, 1, 0, 29307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257740, 10465, 6, -1, 990, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257742, 28633, 1, 0, 64667, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257743, 28423, 1, 0, 63134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257744, 28423, 1, 1, 63132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257745, 28423, 1, 2, 63133, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257746, 8811, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257748, 28426, 0, 0, 7025, 15, 0, 0, 0, 0, 0, 0, 0, 'Blackrock troop slain', 19034), +(257749, 9702, 1, 0, 24233, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257750, 5204, 0, 0, 9518, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257751, 9717, 1, 0, 24247, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257752, 8073, 1, 0, 19724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257753, 8073, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257754, 29283, 4, -1, 416, 125, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257755, 28419, 1, 0, 63135, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257756, 10579, 1, 0, 30646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257757, 10528, 1, 0, 30442, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257758, 13503, 1, 0, 44791, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257759, 13503, 1, 1, 44802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257762, 8022, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257764, 10469, 1, 0, 29306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257765, 10469, 6, -1, 990, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257766, 10389, 0, 0, 16951, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257769, 29344, 0, 0, 53543, 3, 0, 0, 0, 0, 0, 0, 0, 'Feed Squirky', 19034), +(257775, 29597, 0, 0, 18373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257776, 10482, 0, 0, 21161, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257777, 4126, 1, 0, 11312, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257778, 8062, 1, 0, 19716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257779, 8062, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257780, 6781, 1, 0, 17422, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257783, 10273, 0, 0, 20071, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257786, 7367, 0, 0, 13597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257787, 29281, 4, -1, 416, 125, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257788, 27490, 0, 0, 45902, 1, 0, 0, 0, 0, 0, 0, 0, 'Get Wildhammer squad', 19034), +(257789, 27490, 0, 1, 45877, 1, 0, 0, 0, 0, 0, 0, 0, 'SI:7 dropped off', 19034), +(257790, 10564, 0, 0, 21512, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy Legion Hold Infernals', 19034), +(257791, 10564, 1, 1, 30614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257793, 13595, 0, 0, 33183, 1, 0, 0, 0, 0, 0, 0, 0, 'Bathran''s corpse burned', 19034), +(257795, 8055, 1, 0, 19722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257796, 8055, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257798, 13578, 1, 0, 44960, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257804, 5222, 1, 0, 13197, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257805, 5222, 1, 1, 13188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257808, 8494, 1, 0, 3575, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257809, 10525, 1, 0, 30481, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257810, 11202, 0, 0, 23921, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwest Plague Tank Destroyed', 19034), +(257811, 11202, 0, 1, 23922, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Plague Tank Destroyed', 19034), +(257812, 11202, 0, 2, 23923, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Plague Tank Destroyed', 19034), +(257813, 11202, 0, 3, 23924, 1, 0, 0, 0, 0, 0, 0, 0, 'Southeast Plague Tank Destroyed', 19034), +(257815, 26448, 0, 0, 11697, 15, 0, 0, 0, 0, 0, 0, 0, 'Demons Slain', 19034), +(257816, 4496, 1, 0, 11837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257817, 4496, 1, 1, 11018, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257818, 11168, 1, 0, 33337, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257822, 27605, 0, 0, 5709, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257824, 11167, 1, 0, 33099, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257826, 8284, 1, 0, 20378, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257828, 5892, 1, 0, 17522, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257829, 5201, 0, 0, 7439, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257830, 5201, 0, 1, 7438, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257831, 26090, 1, 0, 56570, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257834, 4021, 1, 0, 11227, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257835, 5841, 1, 0, 14647, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257842, 8066, 1, 0, 19721, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257843, 8066, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257845, 5581, 0, 0, 11937, 6, 0, 0, 0, 0, 0, 0, 0, 'Portals Banished', 19034), +(257847, 3861, 1, 0, 11109, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257848, 27380, 0, 0, 47960, 1, 1, 0, 0, 0, 0, 0, 0, 'Kill Iso''rath', 19034), +(257853, 8054, 1, 0, 19721, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257854, 8054, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257858, 10483, 1, 0, 30157, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257859, 10294, 1, 0, 29161, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257860, 10913, 0, 0, 21859, 8, 0, 0, 0, 0, 0, 0, 0, 'Slain Sha''tar Vindicator corpse burned', 19034), +(257861, 10913, 0, 1, 21846, 8, 0, 0, 0, 0, 0, 0, 0, 'Slain Auchenai Warrior corpse burned', 19034), +(257862, 10913, 1, 2, 31769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257866, 27379, 0, 0, 48731, 1, 0, 0, 0, 0, 0, 0, 0, 'Save Hargoth Dimblaze', 19034), +(257867, 27379, 0, 1, 48732, 1, 0, 0, 0, 0, 0, 0, 0, 'Save Stormcaller Jalara', 19034), +(257868, 27379, 0, 2, 48733, 1, 0, 0, 0, 0, 0, 0, 0, 'Save Earthmender Duarn', 19034), +(257869, 27379, 0, 3, 48734, 1, 0, 0, 0, 0, 0, 0, 0, 'Save Stormcaller Mylra', 19034), +(257870, 6801, 1, 0, 17306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257871, 29951, 1, 0, 76356, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257873, 11029, 1, 0, 32742, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257874, 11029, 1, 1, 32741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257875, 27184, 1, 0, 5884, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257881, 10473, 1, 0, 29308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257882, 10473, 6, -1, 990, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257883, 8025, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257886, 8609, 1, 0, 14529, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257889, 29351, 0, 0, 53564, 6, 0, 0, 0, 0, 0, 0, 0, 'Ironforge Guards Fed', 19034), +(257890, 6442, 1, 0, 5490, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257891, 5054, 0, 0, 10806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257897, 29948, 1, 0, 76337, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257898, 11502, 0, 0, 24867, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257899, 9275, 2, 0, 181250, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the Raw Meat Rack', 19034), +(257900, 9275, 2, 1, 181251, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the Smoked Meat Rack', 19034), +(257901, 9275, 2, 2, 181252, 1, 0, 0, 0, 0, 0, 0, 0, 'Poison the Fresh Fish Rack', 19034), +(257902, 10568, 1, 0, 30596, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257903, 29350, 1, 0, 69978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257904, 8024, 1, 0, 19642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257911, 5741, 1, 0, 15750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257912, 8072, 1, 0, 19719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257913, 8072, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257914, 5041, 1, 0, 12708, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257915, 8077, 1, 0, 19723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257916, 8077, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257917, 10353, 0, 0, 20554, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257918, 8053, 1, 0, 19716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257919, 8053, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257923, 8061, 1, 0, 19718, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257924, 8061, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257925, 28424, 0, 0, 47805, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(257926, 3909, 1, 0, 11243, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257927, 10332, 0, 0, 20410, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 257927 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(257930, 11296, 0, 0, 24211, 7, 0, 0, 0, 0, 0, 0, 0, 'Winterhoof Longrunner Freed', 19034), +(257931, 28425, 1, 0, 63354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257932, 10893, 0, 0, 22396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257938, 27518, 0, 0, 45769, 1, 0, 0, 0, 0, 0, 0, 0, 'Transdimensional Shield destroyed', 19034), +(257940, 26221, 0, 0, 42486, 1, 0, 0, 0, 0, 0, 0, 0, 'Board the Verne once it arrives', 19034), +(257941, 26221, 0, 1, 42487, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure Tenebrous Cavern', 19034), +(257942, 5903, 1, 0, 15042, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257943, 5903, 1, 1, 15043, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257950, 27366, 0, 0, 45175, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257951, 10474, 1, 0, 29300, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257952, 10474, 6, -1, 990, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257954, 4512, 1, 0, 11947, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257955, 4512, 1, 1, 11949, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257956, 8071, 1, 0, 19724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257957, 8071, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257958, 8285, 1, 0, 20401, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257963, 10997, 1, 0, 32382, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257964, 10252, 1, 0, 28665, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257965, 10252, 1, 1, 28667, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257966, 10252, 1, 2, 28668, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257967, 29352, 1, 0, 69982, 6, 0, 0, 1730, 0, 0, 0, 0, '', 19034), +(257973, 29838, 1, 0, 43158, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257974, 10305, 0, 0, 19547, 1, 0, 0, 0, 0, 0, 0, 0, 'Put Belmara''s Spirit to Rest', 19034), +(257975, 3921, 1, 0, 11146, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257982, 4603, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257983, 4603, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(257984, 27489, 0, 0, 45400, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride Fiona''s Caravan to Northpass Tower', 19034), +(257995, 27976, 0, 0, 5854, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258000, 5901, 1, 0, 15042, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258001, 5901, 1, 1, 15043, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258002, 10125, 0, 0, 19276, 1, 0, 0, 0, 0, 0, 0, 0, 'Legion Antenna: Spite Destroyed', 19034), +(258003, 10125, 0, 1, 19277, 1, 0, 0, 0, 0, 0, 0, 0, 'Legion Antenna: Rage Destroyed', 19034), +(258004, 10125, 0, 2, 19278, 1, 0, 0, 0, 0, 0, 0, 0, 'Legion Antenna: Hate Destroyed', 19034), +(258005, 10125, 0, 3, 19279, 1, 0, 0, 0, 0, 0, 0, 0, 'Legion Antenna: Fear Destroyed', 19034), +(258006, 6610, 1, 0, 12207, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258007, 6610, 1, 1, 7974, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258008, 6610, 1, 2, 3927, 20, 0, 0, 1231, 0, 0, 0, 0, '', 19034), +(258009, 10485, 1, 0, 30158, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258010, 7281, 0, 0, 13320, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258011, 10289, 1, 0, 28024, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258012, 30678, 1, 0, 80600, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258013, 25105, 0, 0, 39221, 3, 0, 0, 0, 0, 0, 0, 0, 'Solid Zephyrites Cut', 19034), +(258014, 25105, 1, 1, 52086, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258020, 10301, 1, 0, 28475, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258024, 10484, 1, 0, 30157, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258025, 5561, 0, 0, 11627, 3, 0, 0, 0, 0, 0, 0, 0, 'Kodos Tamed', 19034), +(258026, 5561, 1, 1, 13892, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258027, 14227, 0, 0, 35647, 1, 0, 0, 0, 0, 0, 0, 0, 'Nazargen slain', 19034), +(258028, 8076, 1, 0, 19720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258029, 8076, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258036, 8078, 1, 0, 19719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258037, 8078, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258038, 10998, 1, 0, 32358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258039, 11182, 0, 0, 23871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258040, 11182, 0, 1, 23940, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258047, 27717, 1, 0, 62282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258055, 10785, 1, 0, 31351, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258056, 29285, 0, 0, 53227, 1, 0, 0, 0, 0, 0, 0, 0, 'Witnessed Kalecgos''s Ascension', 19034), +(258057, 29285, 1, 1, 71084, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258058, 8065, 1, 0, 19722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258059, 8065, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258061, 29347, 0, 0, 53612, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch Cold Water Crayfish', 19034), +(258062, 29347, 0, 1, 53551, 1, 0, 0, 0, 0, 0, 0, 0, 'Take Crayfish to Cook Ghilm', 19034), +(258063, 6983, 1, 0, 17662, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258064, 6983, 0, 1, 15664, 1, 0, 0, 1457, 0, 0, 0, 0, 'Free Metzen the Reindeer', 19034), +(258067, 4604, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258068, 4604, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258069, 8067, 1, 0, 19724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258070, 8067, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258071, 29303, 0, 0, 53301, 1, 0, 0, 0, 0, 0, 0, 0, 'Look deeper into Leyara''s memories', 19034), +(258073, 8075, 1, 0, 19722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258074, 8075, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258076, 11061, 1, 0, 32601, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258077, 8069, 1, 0, 19723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258078, 8069, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258079, 28367, 2, 0, 207127, 7, 0, 0, 0, 0, 0, 0, 0, 'Powder Kegs Sabotaged', 19034), +(258081, 10584, 0, 0, 21731, 5, 0, 0, 0, 0, 0, 0, 0, 'Electromentals collected', 19034), +(258082, 10584, 1, 1, 30656, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258089, 10643, 0, 0, 21795, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258090, 10643, 1, 1, 30719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258091, 29950, 0, 0, 56546, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Li Li to the Silken Fields', 19034), +(258092, 29950, 0, 1, 56547, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Li Li to New Cifera', 19034), +(258093, 29950, 0, 2, 56548, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Li Li to Huangtze Falls', 19034), +(258094, 5321, 1, 0, 13536, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258095, 29302, 0, 0, 53296, 1, 0, 0, 0, 0, 0, 0, 0, 'Look into Leyara''s memories', 19034), +(258096, 13632, 0, 0, 33389, 10, 0, 0, 0, 0, 0, 0, 0, 'Furbolg at the Ruins of Ordil''Aran slain', 19034), +(258100, 7382, 1, 0, 18148, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258101, 8064, 1, 0, 19720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258102, 8064, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258103, 4289, 1, 0, 11478, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258104, 4289, 1, 1, 11479, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258105, 4289, 1, 2, 11480, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258109, 10995, 1, 0, 32379, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258110, 4784, 1, 0, 12293, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258111, 4784, 1, 1, 6991, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258112, 4784, 1, 2, 6265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258115, 29612, 0, 0, 54870, 1, 0, 0, 0, 0, 0, 0, 0, 'Report to Grommash Hold', 19034), +(258117, 3882, 1, 0, 11114, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258119, 4735, 1, 0, 12241, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258120, 4735, 1, 1, 12287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258122, 24973, 0, 0, 1504, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258123, 24973, 0, 1, 1505, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258131, 10784, 0, 0, 19993, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258132, 10784, 0, 1, 19994, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258133, 10914, 0, 0, 21284, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258134, 10914, 0, 1, 21285, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258135, 8617, 1, 0, 20737, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258136, 11035, 1, 0, 32509, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258137, 10307, 0, 0, 19550, 1, 0, 0, 0, 0, 0, 0, 0, 'Put Cohlien''s Spirit to Rest', 19034), +(258140, 4504, 1, 0, 11834, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258143, 13107, 1, 0, 43144, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258144, 8079, 1, 0, 19723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258145, 8079, 6, -1, 270, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258150, 5246, 1, 0, 13313, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258152, 4621, 0, 0, 2496, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258153, 4621, 0, 1, 2487, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258154, 4621, 6, -1, 87, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258155, 4621, 7, -1, 21, -6001, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258156, 5893, 1, 0, 17542, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258157, 4601, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258158, 4601, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258161, 4581, 1, 0, 12060, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258163, 4602, 1, 0, 9308, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258164, 4602, 8, -1, 0, 300, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258165, 10749, 1, 0, 31135, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258169, 6985, 1, 0, 17522, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258170, 10768, 1, 0, 31278, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258175, 7368, 0, 0, 13598, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258177, 10772, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258179, 24975, 1, 0, 2846, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258180, 27193, 1, 0, 60867, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258185, 10457, 2, 0, 184631, 5, 0, 0, 0, 0, 0, 0, 0, 'Living Grove Defenders summoned', 19034), +(258186, 10457, 1, 1, 29952, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258188, 11354, 1, 0, 33833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258190, 9067, 1, 0, 22775, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258191, 9067, 1, 1, 22776, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258192, 9067, 1, 2, 22777, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258193, 28433, 2, 0, 206977, 7, 0, 0, 0, 0, 0, 0, 0, 'Pairs of Blackrock Boots polished', 19034), +(258194, 29952, 0, 0, 56680, 1, 0, 0, 931, 0, 0, 0, 0, 'Listen to Chen''s story', 19034), +(258196, 29304, 0, 0, 54339, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258197, 25017, 0, 0, 38914, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258198, 13422, 0, 0, 29886, 6, 0, 0, 0, 0, 0, 0, 0, 'Exhausted Vrykul Disciplined', 19034), +(258204, 8613, 1, 0, 6887, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258207, 8105, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(258208, 8105, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(258209, 8105, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(258210, 8105, 0, 3, 15003, 1, 0, 0, 0, 0, 0, 0, 0, 'Farm Assaulted', 19034), +(258211, 5541, 1, 0, 13850, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258213, 12183, 1, 0, 37035, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258219, 28635, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258222, 10458, 0, 0, 21092, 8, 0, 0, 0, 0, 0, 0, 0, 'Earthen Soul Captured', 19034), +(258223, 10458, 0, 1, 21094, 8, 0, 0, 0, 0, 0, 0, 0, 'Fiery Soul Captured', 19034), +(258224, 10458, 1, 2, 30094, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258225, 11036, 1, 0, 32619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258227, 4921, 0, 0, 10668, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Mankrik''s Wife', 19034), +(258229, 10707, 1, 0, 31307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258230, 8057, 1, 0, 19718, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258231, 8057, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258233, 10478, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258234, 8283, 1, 0, 20385, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258235, 10299, 0, 0, 20209, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge B''naar Shut Down', 19034), +(258236, 10299, 1, 1, 29366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258238, 10996, 1, 0, 32380, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258242, 28755, 1, 0, 65615, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258243, 10769, 0, 0, 22051, 5, 0, 0, 0, 0, 0, 0, 0, 'Crazed Colossus slain while in disguise', 19034), +(258244, 10769, 1, 1, 31108, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258245, 29839, 1, 0, 43158, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258247, 10327, 1, 0, 29425, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258250, 29692, 1, 0, 24246, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258256, 10326, 1, 0, 29425, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258257, 4146, 1, 0, 11319, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258258, 4146, 1, 1, 11318, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258259, 3924, 1, 0, 11149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258260, 10487, 1, 0, 30174, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258261, 10306, 0, 0, 19548, 1, 0, 0, 0, 0, 0, 0, 0, 'Put Luminrath''s Spirit to Rest', 19034), +(258262, 10504, 0, 0, 19995, 30, 0, 0, 0, 0, 0, 0, 0, 'Bladespire Ogres killed', 19034), +(258264, 28434, 0, 0, 9176, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258265, 28434, 0, 1, 48099, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258266, 28434, 0, 2, 48100, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258267, 28435, 0, 0, 48112, 7, 0, 0, 0, 0, 0, 0, 0, 'Blackrock War Kodos summoned back to camp', 19034), +(258269, 6324, 1, 0, 16210, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258270, 10712, 1, 0, 31123, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258271, 26662, 0, 0, 43666, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Long John Copper', 19034), +(258272, 26662, 0, 1, 43667, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Enormous Shawn Stooker', 19034), +(258273, 26662, 0, 2, 43668, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Wailing Mary Smitts', 19034), +(258274, 4295, 1, 0, 11325, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258280, 6661, 0, 0, 13017, 5, 0, 0, 0, 0, 0, 0, 0, 'Rats Captured', 19034), +(258281, 6661, 1, 1, 17117, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258286, 11227, 0, 0, 24000, 5, 0, 0, 0, 0, 0, 0, 0, 'Plaguehound Fed', 19034), +(258287, 6825, 1, 0, 17326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258294, 8070, 1, 0, 19720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258295, 8070, 6, -1, 270, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258296, 9065, 0, 0, 25499, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258297, 8522, 1, 0, 14529, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258306, 14283, 5, -1, 8921, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Moonfire', 19034), +(258307, 14283, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Moonfire', 19034), +(258309, 9066, 0, 0, 15945, 1, 0, 0, 0, 0, 0, 0, 0, 'Apprentice Meledor Disciplined', 19034), +(258310, 9066, 0, 1, 15941, 1, 0, 0, 0, 0, 0, 0, 0, 'Apprentice Ralen Disciplined', 19034), +(258311, 9066, 1, 2, 22473, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258312, 10765, 0, 0, 22012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258313, 10765, 0, 1, 22011, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258314, 10765, 1, 2, 31271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258316, 12052, 0, 0, 26578, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258317, 12052, 0, 1, 26577, 15, 0, 0, 0, 0, 0, 0, 0, 'Coldwind Harpies', 19034), +(258325, 5242, 0, 0, 9861, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258326, 5242, 0, 1, 9860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258327, 5242, 1, 2, 13207, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258328, 10773, 0, 0, 22016, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258329, 10773, 0, 1, 22018, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258330, 10773, 0, 2, 19824, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258331, 29840, 1, 0, 43140, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258336, 8287, 1, 0, 20405, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258337, 10486, 0, 0, 21033, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258339, 28428, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(258340, 8286, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258341, 26634, 1, 0, 59150, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258342, 8060, 1, 0, 19716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258343, 8060, 6, -1, 270, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258344, 3883, 1, 0, 11131, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258346, 10503, 0, 0, 19995, 30, 0, 0, 0, 0, 0, 0, 0, 'Bladespire Ogres killed', 19034), +(258347, 10503, 0, 1, 20728, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258353, 10822, 1, 0, 30810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258356, 8687, 0, 0, 11726, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258357, 8687, 1, 1, 21251, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258358, 11283, 0, 0, 24231, 16, 0, 0, 0, 0, 0, 0, 0, 'Baleheim Bodycount', 19034), +(258363, 6827, 1, 0, 17328, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258365, 10325, 1, 0, 29425, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258366, 4201, 1, 0, 8846, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258367, 4201, 1, 1, 11405, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258368, 4201, 1, 2, 11413, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258369, 11059, 1, 0, 32697, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258370, 3881, 1, 0, 11113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258371, 3881, 1, 1, 11112, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258372, 28430, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(258375, 10477, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258376, 6561, 1, 0, 5881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258377, 29305, 0, 0, 54230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258378, 9295, 1, 0, 22932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258379, 28429, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(258381, 29665, 0, 0, 56360, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258382, 29666, 0, 0, 60411, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258389, 11683, 0, 0, 25660, 20, 0, 0, 0, 0, 0, 0, 0, 'Talramas Scourge Destroyed', 19034), +(258390, 29691, 1, 0, 24246, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258392, 8120, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(258393, 8120, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(258394, 8120, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(258395, 8120, 0, 3, 15001, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Assaulted', 19034), +(258404, 8615, 1, 0, 13935, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258407, 26060, 1, 0, 56796, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258409, 10824, 1, 0, 30810, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258410, 10507, 0, 0, 20132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258411, 10507, 1, 1, 30259, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258412, 10507, 1, 2, 29796, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258413, 13712, 0, 0, 34007, 1, 0, 0, 0, 0, 0, 0, 0, 'Splintertree Post Siege Broken', 19034), +(258415, 6323, 1, 0, 16209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258416, 6543, 1, 0, 16764, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258417, 6543, 1, 1, 16763, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258418, 6543, 1, 2, 16765, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258428, 4141, 1, 0, 11316, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258429, 9076, 1, 0, 22487, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258430, 9473, 1, 0, 23692, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258431, 29266, 1, 0, 63128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258432, 8611, 1, 0, 12209, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258433, 5441, 0, 0, 10556, 5, 0, 0, 0, 0, 0, 0, 0, 'Peons Awoken', 19034), +(258434, 5441, 1, 1, 16114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258435, 28431, 0, 0, 47910, 1, 0, 0, 0, 0, 0, 0, 0, 'Perfect Costume created', 19034), +(258436, 10479, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258437, 12922, 1, 0, 41556, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258438, 12922, 1, 1, 41558, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258448, 6143, 0, 0, 4714, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258449, 6143, 0, 1, 4711, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258450, 6143, 0, 2, 4712, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258451, 29338, 0, 0, 53738, 1, 0, 0, 0, 0, 0, 0, 0, 'Teleport into the Firelands', 19034), +(258452, 5844, 1, 0, 14650, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258458, 6846, 1, 0, 17353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258459, 7181, 0, 0, 12159, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258461, 11532, 0, 0, 25031, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258462, 11532, 0, 1, 25033, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258463, 11532, 0, 2, 25030, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258467, 8812, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258470, 10502, 0, 0, 19991, 30, 0, 0, 0, 0, 0, 0, 0, 'Bloodmaul Ogres killed', 19034), +(258471, 27181, 0, 0, 45195, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258479, 29585, 0, 0, 54789, 12, 0, 0, 0, 0, 0, 0, 0, 'Orchard Fires Put Out', 19034), +(258480, 10278, 1, 0, 29051, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258481, 10278, 1, 1, 29027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258488, 5761, 1, 0, 14540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258489, 11329, 1, 0, 33628, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258494, 10915, 0, 0, 22452, 1, 0, 0, 0, 0, 0, 0, 0, 'Contents of the Auchenai Coffin destroyed', 19034), +(258497, 11000, 1, 0, 32383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258498, 11000, 1, 1, 32467, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258499, 27180, 1, 0, 60862, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258500, 26864, 1, 0, 60500, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258506, 6361, 1, 0, 16282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258507, 6363, 1, 0, 16283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258513, 7488, 1, 0, 18426, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258515, 5421, 1, 0, 13545, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258516, 6521, 1, 0, 17009, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258526, 10505, 0, 0, 19991, 30, 0, 0, 0, 0, 0, 0, 0, 'Bloodmaul Ogres killed', 19034), +(258527, 6385, 1, 0, 16307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258529, 6481, 0, 0, 11920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258530, 6481, 1, 1, 16603, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258539, 10750, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258540, 6826, 1, 0, 17327, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258546, 6922, 1, 0, 16782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258548, 4292, 1, 0, 11510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258554, 10748, 0, 0, 21389, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258557, 8509, 1, 0, 8836, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258561, 29586, 0, 0, 54999, 1, 0, 0, 0, 0, 0, 0, 0, 'Mogu Camp Discovered', 19034), +(258562, 8513, 1, 0, 2319, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258563, 29743, 0, 0, 55379, 1, 0, 0, 606, 0, 0, 0, 0, 'Statue Torso Sketched', 19034), +(258564, 29743, 0, 1, 55383, 1, 0, 0, 605, 0, 0, 0, 0, 'Statue Arm Sketched', 19034), +(258565, 29743, 0, 2, 55388, 1, 0, 0, 604, 0, 0, 0, 0, 'Statue Shoulder Sketched', 19034), +(258566, 29743, 0, 3, 55392, 1, 0, 0, 1151, 0, 0, 0, 0, 'Statue Head Sketched', 19034), +(258568, 11451, 1, 0, 34089, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258569, 5847, 1, 0, 14651, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258570, 10132, 0, 0, 19188, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258579, 29353, 1, 0, 69984, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258580, 29353, 1, 1, 69985, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258581, 29353, 1, 2, 2678, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258585, 5843, 1, 0, 14649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258587, 10786, 0, 0, 21046, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258588, 10786, 0, 1, 21047, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258595, 6322, 1, 0, 16210, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258596, 4521, 0, 0, 7451, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258597, 4521, 0, 1, 7450, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258603, 10747, 1, 0, 31130, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258604, 10747, 1, 1, 31129, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258605, 8221, 1, 0, 19805, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258607, 24980, 0, 0, 1535, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258613, 5728, 0, 0, 11519, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258614, 5728, 0, 1, 11518, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258621, 24979, 0, 0, 38999, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the Scarlet Prisoner', 19034), +(258622, 24979, 1, 1, 52079, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258623, 8524, 1, 0, 5095, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258625, 14161, 0, 0, 35245, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258626, 27373, 0, 0, 45400, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride Fiona''s Caravan', 19034), +(258628, 9315, 0, 0, 16357, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258633, 6881, 1, 0, 17423, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258636, 4284, 1, 0, 11186, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258637, 4284, 1, 1, 11188, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258638, 4284, 1, 2, 11185, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258639, 4284, 1, 3, 11184, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258645, 10341, 0, 0, 20139, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258646, 10341, 0, 1, 20207, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258647, 10341, 0, 2, 20140, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258648, 13186, 0, 0, 31093, 3, 0, 0, 0, 0, 0, 0, 0, 'Horde Siege Devices destroyed', 19034), +(258650, 12184, 0, 0, 26885, 8, 0, 0, 0, 0, 0, 0, 0, 'Iron Dwarf Images Captured', 19034), +(258651, 12184, 1, 1, 37045, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258652, 9856, 1, 0, 24513, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258659, 25032, 0, 0, 39159, 1, 0, 0, 0, 0, 0, 0, 0, 'Fate of Jang''thraze', 19034), +(258660, 24708, 1, 0, 50407, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258662, 7002, 1, 0, 17642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258670, 9811, 1, 0, 22653, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258671, 10182, 0, 0, 19549, 1, 0, 0, 0, 0, 0, 0, 0, 'Put Dathric''s Spirit to Rest', 19034), +(258673, 12231, 0, 0, 27322, 1, 0, 0, 0, 0, 0, 0, 0, 'Orsonn''s Story', 19034), +(258674, 12231, 0, 1, 27321, 1, 0, 0, 0, 0, 0, 0, 0, 'Kodian''s Story', 19034), +(258677, 5545, 1, 0, 13872, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258690, 10537, 1, 0, 30451, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258691, 9085, 0, 0, 16143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258694, 5842, 1, 0, 14648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258702, 25047, 1, 0, 52197, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258703, 25047, 1, 1, 52194, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258704, 25047, 1, 2, 52186, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258705, 25047, 1, 3, 54849, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258706, 12048, 1, 0, 36736, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258707, 28374, 0, 0, 47747, 7, 0, 0, 0, 0, 0, 0, 0, 'Whisperwind Lashers checked', 19034), +(258708, 14232, 1, 0, 49008, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258717, 10741, 1, 0, 29277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258718, 10741, 6, -1, 967, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258722, 12129, 1, 0, 36848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258723, 12055, 1, 0, 36742, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258725, 10506, 0, 0, 21176, 5, 0, 0, 0, 0, 0, 0, 0, 'Bloodmaul Dire Wolf weakened', 19034), +(258726, 10506, 1, 1, 30251, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258732, 11040, 1, 0, 32623, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258733, 28332, 0, 0, 48272, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258735, 28386, 1, 0, 63516, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258736, 11065, 0, 0, 23343, 5, 0, 0, 0, 0, 0, 0, 0, 'Aether Rays wrangled', 19034), +(258737, 11065, 1, 1, 32698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258738, 7081, 0, 0, 13756, 1, 0, 0, 0, 0, 0, 0, 0, 'Graveyard Assaulted', 19034), +(258739, 7803, 1, 0, 4306, 60, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258740, 28387, 0, 0, 48317, 7, 0, 0, 0, 0, 0, 0, 0, 'Oil Gusher ignited', 19034), +(258741, 7063, 1, 0, 17735, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258742, 7102, 0, 0, 13778, 1, 0, 0, 0, 0, 0, 0, 0, 'Banner Destroyed', 19034), +(258744, 6943, 1, 0, 17504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258748, 4262, 0, 0, 9026, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258752, 8477, 1, 0, 20759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258754, 8791, 1, 0, 21220, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258756, 6384, 1, 0, 16306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258757, 5721, 0, 0, 10936, 1, 0, 0, 0, 0, 0, 0, 0, 'Accept Redpath''s Forgiveness', 19034), +(258758, 9861, 1, 0, 24504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258759, 6027, 1, 0, 15803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258760, 6027, 1, 1, 15766, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258767, 9922, 0, 0, 17136, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258768, 9922, 0, 1, 17137, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258769, 9361, 1, 0, 23248, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258770, 9361, 1, 1, 23268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258775, 28388, 0, 0, 48331, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258777, 6032, 1, 0, 14342, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258778, 10078, 0, 0, 18818, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Thrower Burned', 19034), +(258779, 10078, 0, 1, 21237, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Eastern Thrower Burned', 19034), +(258780, 10078, 0, 2, 19009, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Western Thrower Burned', 19034), +(258781, 10078, 0, 3, 21236, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Thrower Burned', 19034), +(258785, 11066, 0, 0, 23343, 5, 0, 0, 0, 0, 0, 0, 0, 'Aether Rays wrangled', 19034), +(258786, 11066, 1, 1, 32698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258787, 8867, 0, 0, 15893, 8, 0, 0, 0, 0, 0, 0, 0, 'Lunar Fireworks Fired', 19034), +(258788, 8867, 0, 1, 15894, 2, 0, 0, 0, 0, 0, 0, 0, 'Lunar Fireworks Cluster Fired', 19034), +(258790, 11258, 0, 0, 24098, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Longhouse Set Ablaze', 19034), +(258791, 11258, 0, 1, 24100, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Longhouse Set Ablaze', 19034), +(258792, 11258, 0, 2, 24102, 1, 0, 0, 0, 0, 0, 0, 0, 'Barracks Set Ablaze', 19034), +(258793, 11004, 1, 0, 32388, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258794, 6321, 1, 0, 16209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258795, 29613, 0, 0, 17798, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258796, 6362, 1, 0, 16282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258797, 5762, 1, 0, 14542, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258798, 29614, 0, 0, 21694, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258799, 29614, 0, 1, 21338, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258800, 29614, 1, 2, 72574, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258801, 4740, 0, 0, 10323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258802, 6284, 1, 0, 16192, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258810, 26783, 1, 0, 58205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258811, 28448, 1, 0, 63431, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258812, 7068, 1, 0, 17756, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258813, 10751, 0, 0, 22016, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258814, 10751, 0, 1, 22018, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258815, 10751, 0, 2, 22017, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258818, 6381, 2, 0, 177929, 10, 0, 0, 0, 0, 0, 0, 0, 'Gaea seed planted', 19034), +(258819, 6381, 1, 1, 16208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258820, 25897, 1, 0, 56183, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258821, 8790, 1, 0, 21237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258822, 8790, 1, 1, 18562, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258828, 5723, 0, 0, 11318, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258829, 5723, 0, 1, 11319, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258831, 6386, 1, 0, 16307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258832, 8657, 1, 0, 20930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258833, 8657, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258834, 8657, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258835, 8657, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258836, 8657, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258837, 9862, 0, 0, 18202, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258838, 28436, 1, 0, 63358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258839, 5805, 1, 0, 14646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258840, 8789, 1, 0, 21232, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258841, 8789, 1, 1, 18562, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258844, 7124, 0, 0, 13796, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Captured', 19034), +(258845, 6942, 1, 0, 17502, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258846, 5863, 0, 0, 5474, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258847, 5863, 0, 1, 5472, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258848, 5863, 0, 2, 12046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258855, 29360, 1, 0, 69989, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258857, 8799, 1, 0, 8150, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258858, 8799, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258859, 7861, 0, 0, 7995, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258860, 7861, 0, 1, 2648, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258861, 9720, 0, 0, 17998, 1, 0, 0, 0, 0, 0, 0, 0, 'Umbrafen Lake Controls Disabled', 19034), +(258862, 9720, 0, 1, 18002, 1, 0, 0, 0, 0, 0, 0, 0, 'Marshlight Lake Controls Disabled', 19034), +(258863, 9720, 0, 2, 18000, 1, 0, 0, 0, 0, 0, 0, 0, 'Serpent Lake Controls Disabled', 19034), +(258864, 9720, 0, 3, 17999, 1, 0, 0, 0, 0, 0, 0, 0, 'Lagoon Controls Disabled', 19034), +(258865, 10740, 1, 0, 29281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258866, 10740, 6, -1, 967, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258867, 7781, 1, 0, 19003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258868, 6503, 0, 0, 12856, 9, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Outrunners Killed', 19034), +(258871, 10774, 0, 0, 22012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258872, 10774, 0, 1, 22011, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258873, 10774, 1, 2, 31271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258874, 7490, 1, 0, 18422, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258878, 8356, 0, 0, 6740, 1, 0, 0, 0, 0, 0, 0, 0, 'Flex for Innkeeper Allison', 19034), +(258880, 28443, 1, 0, 63421, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258881, 11414, 0, 0, 24516, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258882, 11414, 0, 1, 24517, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258887, 8544, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258888, 8544, 1, 1, 20875, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258889, 8544, 1, 2, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258890, 8544, 1, 3, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258891, 8544, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258893, 8505, 1, 0, 8831, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258895, 28447, 0, 0, 48287, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258896, 28447, 0, 1, 48288, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258897, 28447, 0, 2, 48289, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258898, 28447, 0, 3, 48291, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(258902, 11453, 0, 0, 24023, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258903, 6282, 0, 0, 4022, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258904, 6282, 0, 1, 4025, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258905, 6282, 0, 2, 4024, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258906, 6282, 0, 3, 4023, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258907, 6862, 1, 0, 12359, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258908, 6862, 1, 1, 3860, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258909, 6862, 1, 2, 3575, 75, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258910, 6862, 1, 3, 17411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258913, 11629, 1, 0, 34778, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258915, 9406, 1, 0, 23569, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258916, 27143, 1, 0, 13471, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258917, 27143, 1, 1, 13448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258918, 27143, 1, 2, 13450, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258919, 27143, 1, 3, 13451, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258920, 10136, 0, 0, 19191, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258924, 6387, 1, 0, 16310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258925, 29567, 1, 0, 24248, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258926, 7043, 1, 0, 17662, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258927, 7043, 0, 1, 15664, 1, 0, 0, 1457, 0, 0, 0, 0, 'Free Metzen the Reindeer', 19034), +(258928, 24779, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 258928 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(258933, 11208, 1, 0, 33163, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258936, 11260, 0, 0, 23671, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258937, 11260, 1, 1, 33346, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258942, 7082, 0, 0, 13756, 1, 0, 0, 0, 0, 0, 0, 0, 'Graveyard Assaulted', 19034), +(258943, 9277, 0, 0, 16345, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258944, 9277, 0, 1, 16346, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258945, 6861, 1, 0, 12359, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258946, 6861, 1, 1, 3860, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258947, 6861, 1, 2, 3575, 75, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258948, 6861, 1, 3, 17411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258952, 7386, 1, 0, 17423, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258953, 8359, 0, 0, 6929, 1, 0, 0, 0, 0, 0, 0, 0, 'Flex for Innkeeper Gryshka', 19034), +(258958, 7495, 1, 0, 18423, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258959, 11259, 0, 0, 24087, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Tower Targeted', 19034), +(258960, 11259, 0, 1, 24092, 1, 0, 0, 0, 0, 0, 0, 0, 'East Tower Targeted', 19034), +(258961, 11259, 0, 2, 24093, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwest Tower Targeted', 19034), +(258962, 11259, 0, 3, 24094, 1, 0, 0, 0, 0, 0, 0, 0, 'Southeast Tower Targeted', 19034), +(258964, 10067, 0, 0, 17358, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258965, 7848, 1, 0, 18412, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258968, 8511, 1, 0, 2318, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258973, 11257, 0, 0, 24095, 20, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Vrykul Dismembered', 19034), +(258974, 28454, 0, 0, 48432, 200, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258975, 28439, 0, 0, 48195, 20, 0, 0, 0, 0, 0, 0, 0, 'Blackrock minions cudgeled', 19034), +(258978, 7703, 1, 0, 18336, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258979, 26916, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(258980, 26916, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice casting Frost Nova', 19034), +(258981, 10999, 1, 0, 2536, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258989, 7783, 1, 0, 19002, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258990, 11265, 0, 0, 24035, 10, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Prisoner Freed', 19034), +(258991, 13836, 1, 0, 45323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258992, 7061, 1, 0, 17735, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258993, 12535, 1, 0, 38504, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258994, 27987, 1, 0, 62818, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258995, 25403, 0, 0, 39845, 1, 0, 0, 0, 0, 0, 0, 0, 'Gordok Ogre-Mage Captured', 19034), +(258996, 10324, 1, 0, 23677, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258997, 6364, 1, 0, 16283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(258999, 11375, 1, 0, 33840, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259006, 10020, 1, 0, 25815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259007, 28383, 0, 0, 48454, 5, 0, 0, 0, 0, 0, 0, 0, 'Talonbranch Wisp captured', 19034), +(259009, 28331, 0, 0, 48269, 8, 0, 0, 0, 0, 0, 0, 0, 'Dark Ranger empowered', 19034), +(259016, 28103, 0, 0, 47490, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259017, 7862, 0, 0, 2643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259018, 7862, 0, 1, 2645, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259019, 7862, 0, 2, 2646, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259020, 7862, 0, 3, 2647, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259024, 28440, 0, 0, 48210, 5, 0, 0, 0, 0, 0, 0, 0, 'Blackrock Sergeant slain', 19034), +(259025, 28324, 0, 0, 48290, 250, 0, 0, 0, 0, 0, 0, 0, 'Blight Sample taken', 19034), +(259027, 9424, 1, 0, 23589, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259029, 28451, 1, 0, 63430, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259031, 8476, 0, 0, 15643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259032, 8476, 0, 1, 15641, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259034, 9368, 2, 0, 181336, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259035, 9368, 2, 1, 181337, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259036, 9368, 2, 2, 181335, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259039, 11261, 1, 0, 33340, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259040, 28444, 1, 0, 63423, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259041, 8897, 1, 0, 21921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259042, 10209, 1, 0, 28479, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259043, 9816, 0, 0, 18152, 1, 0, 0, 0, 0, 0, 0, 0, 'Release Murlocs at Daggerfen Village', 19034), +(259046, 6031, 1, 0, 14047, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259050, 7026, 1, 0, 17643, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259059, 30267, 1, 0, 79197, 18, 0, 0, 1265, 0, 0, 0, 0, '', 19034), +(259060, 30267, 1, 1, 79198, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259061, 7385, 1, 0, 17306, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259062, 29241, 0, 0, 52148, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259065, 28455, 0, 0, 48316, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259066, 28455, 0, 1, 48314, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259067, 28455, 0, 2, 48312, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259069, 11218, 1, 0, 33188, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259070, 11218, 1, 1, 33187, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259071, 11892, 0, 0, 25804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259073, 29844, 1, 0, 43140, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259074, 11264, 0, 0, 24018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259076, 14358, 0, 0, 35581, 1, 0, 0, 0, 0, 0, 0, 0, 'Sacrificial Offering Accepted', 19034), +(259077, 25180, 1, 0, 52275, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259078, 13179, 0, 0, 39019, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde members slain', 19034), +(259079, 24956, 0, 0, 38659, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259080, 24956, 1, 1, 52036, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259081, 9311, 0, 0, 16522, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259082, 9426, 0, 0, 16951, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259083, 9426, 0, 1, 16901, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259085, 12226, 1, 0, 37246, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259086, 9706, 1, 0, 24237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259087, 7025, 1, 0, 17197, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259088, 7025, 1, 1, 1179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259089, 28325, 1, 0, 63432, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259093, 10330, 0, 0, 20417, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Coruu Shut Down', 19034), +(259094, 10330, 1, 1, 29396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259096, 13478, 1, 0, 20560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259097, 13478, 1, 1, 47395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259098, 13478, 4, -1, 392, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259103, 27300, 0, 0, 45334, 12, 0, 0, 0, 0, 0, 0, 0, 'Drakgor cultists slain', 19034), +(259106, 27381, 0, 0, 45501, 1, 0, 0, 0, 0, 0, 0, 0, 'Find a traveling companion', 19034), +(259107, 10541, 1, 0, 30454, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259111, 28450, 1, 0, 63429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259112, 27100, 1, 0, 60814, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259113, 29568, 0, 0, 17770, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259115, 11286, 1, 0, 33109, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259116, 7787, 1, 0, 19018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259117, 9488, 1, 0, 2589, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259118, 9488, 1, 1, 23707, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259125, 11116, 0, 0, 17257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259126, 25594, 1, 0, 55139, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259127, 28329, 0, 0, 48319, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259128, 28791, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259129, 10161, 1, 0, 28116, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259133, 9399, 0, 0, 17058, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259135, 13095, 1, 0, 43095, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259136, 6343, 1, 0, 16263, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259137, 9302, 1, 0, 22944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259138, 28438, 0, 0, 48156, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259139, 9871, 1, 0, 24559, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259140, 9871, 6, -1, 978, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259143, 12877, 1, 0, 41393, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259146, 28452, 1, 0, 63134, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259150, 28330, 0, 0, 48322, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259151, 7223, 1, 0, 17422, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259153, 9493, 0, 0, 16700, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259154, 9493, 0, 1, 17465, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259155, 9493, 0, 2, 17671, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259156, 9761, 0, 0, 17610, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259157, 9761, 0, 1, 17609, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259158, 28382, 0, 0, 48453, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259162, 28445, 1, 0, 63424, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259163, 10334, 1, 0, 29428, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259167, 8830, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259168, 9174, 0, 0, 16292, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259169, 9174, 1, 1, 22675, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259170, 7202, 0, 0, 12159, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259173, 28104, 1, 0, 62926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259174, 28104, 1, 1, 62927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259175, 12059, 1, 0, 36746, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259176, 9422, 0, 0, 18199, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver Silithyst', 19034), +(259177, 7161, 1, 0, 17850, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259179, 29298, 1, 0, 69854, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259184, 13093, 1, 0, 43089, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259185, 8561, 1, 0, 20926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259186, 8561, 1, 1, 20874, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259187, 8561, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259188, 8561, 1, 3, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259189, 8561, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259190, 7838, 1, 0, 18706, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259195, 8288, 1, 0, 20383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259196, 29354, 1, 0, 69983, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259197, 9134, 1, 0, 22550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259199, 7937, 1, 0, 19423, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259203, 7101, 0, 0, 13778, 1, 0, 0, 0, 0, 0, 0, 0, 'Tower Captured', 19034), +(259208, 28446, 0, 0, 7040, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259210, 8446, 1, 0, 20644, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259214, 8526, 1, 0, 12210, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259216, 13640, 1, 0, 45069, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259222, 7881, 1, 0, 2309, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259223, 7790, 0, 0, 693, 15000, 0, 0, 0, 0, 0, 0, 0, 'Words Written', 19034), +(259224, 10065, 0, 0, 17527, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259232, 11263, 0, 0, 23991, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259233, 11263, 0, 1, 23990, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259234, 11263, 0, 2, 23989, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259244, 10713, 0, 0, 21810, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259245, 27505, 0, 0, 45746, 5, 0, 0, 0, 0, 0, 0, 0, 'Vermillion Menders Defended', 19034), +(259249, 27382, 0, 0, 8600, 13, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259251, 7165, 1, 0, 17906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259252, 10021, 2, 0, 182563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259253, 10021, 2, 1, 182565, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259254, 10021, 2, 2, 182566, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259256, 10635, 1, 0, 30799, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259260, 10488, 0, 0, 21142, 5, 0, 0, 0, 0, 0, 0, 0, 'Thunderlord Dire Wolf strengthened', 19034), +(259261, 10488, 1, 1, 30175, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259263, 9496, 0, 0, 16700, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259264, 9496, 0, 1, 17465, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259265, 9496, 0, 2, 17671, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259266, 8481, 1, 0, 21144, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259267, 8481, 1, 1, 21145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259268, 8481, 6, -1, 576, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259273, 9921, 0, 0, 17134, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259274, 9921, 0, 1, 17135, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259279, 6462, 1, 0, 16602, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259283, 7163, 1, 0, 17690, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259288, 9299, 1, 0, 22945, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259289, 7785, 1, 0, 19016, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259291, 13143, 0, 0, 31049, 1, 0, 0, 0, 0, 0, 0, 0, 'Subdued Lithe Stalker Returned', 19034), +(259292, 7786, 1, 0, 17771, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259293, 7786, 1, 1, 19017, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259294, 7786, 1, 2, 18563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259295, 7786, 1, 3, 18564, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259297, 26062, 1, 0, 56795, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259299, 27384, 1, 0, 12885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259304, 28792, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259305, 9398, 0, 0, 16929, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259306, 9398, 0, 1, 16927, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259307, 10540, 1, 0, 30453, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259308, 7945, 1, 0, 19452, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259315, 12227, 1, 0, 37250, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259316, 10526, 1, 0, 30435, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259317, 8357, 0, 0, 6735, 1, 0, 0, 0, 0, 0, 0, 0, 'Dance for Innkeeper Saelienne', 19034), +(259318, 11633, 0, 0, 25471, 1, 0, 0, 0, 0, 0, 0, 0, 'Spire of Decay Scouted', 19034), +(259319, 11633, 0, 1, 25472, 1, 0, 0, 0, 0, 0, 0, 0, 'Spire of Blood Scouted', 19034), +(259320, 11633, 0, 2, 25473, 1, 0, 0, 0, 0, 0, 0, 0, 'Spire of Pain Scouted', 19034), +(259324, 9430, 1, 0, 23642, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259325, 7164, 1, 0, 17905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259326, 11289, 1, 0, 33485, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259327, 28338, 0, 0, 7156, 15, 0, 0, 0, 0, 0, 0, 0, 'Deadwood Furbolg slain', 19034), +(259328, 26141, 1, 0, 57096, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259331, 8889, 2, 0, 180916, 1, 0, 0, 0, 0, 0, 0, 0, 'First Power Source Deactivated', 19034), +(259332, 8889, 2, 1, 180919, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Power Source Deactivated', 19034), +(259333, 8889, 2, 2, 180920, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Power Source Deactivated', 19034), +(259334, 8889, 1, 3, 24337, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259335, 8558, 1, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259336, 8558, 1, 1, 20873, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259337, 8558, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259338, 8558, 1, 3, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259339, 8558, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259342, 9064, 1, 0, 22414, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259344, 9477, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259345, 9266, 1, 0, 14047, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259346, 9266, 1, 1, 3857, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259347, 26061, 1, 0, 56797, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259348, 29578, 0, 0, 54702, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259349, 29578, 0, 1, 54703, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259351, 7224, 1, 0, 17422, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259354, 7815, 0, 0, 2505, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259362, 8625, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259363, 8625, 1, 1, 20876, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259364, 8625, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259365, 8625, 1, 3, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259366, 8625, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259367, 7816, 1, 0, 19023, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259370, 9166, 1, 0, 22594, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259371, 8567, 1, 0, 19213, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259374, 10312, 1, 0, 29331, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259378, 8260, 6, -1, 509, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259379, 12737, 0, 0, 29055, 8, 0, 0, 0, 0, 0, 0, 0, 'Song of Fecundity played', 19034), +(259382, 7162, 1, 0, 17849, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259383, 9413, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259384, 8819, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259389, 10243, 1, 0, 28571, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259390, 9457, 1, 0, 23681, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259391, 9457, 1, 1, 23680, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259395, 9396, 1, 0, 23483, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259396, 6085, 1, 0, 15908, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259398, 11290, 1, 0, 33488, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259400, 29577, 0, 0, 56113, 1, 0, 0, 505, 0, 0, 0, 0, 'Ashyo''s Vision', 19034), +(259401, 26063, 0, 0, 41185, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259402, 26063, 0, 1, 4006, 10, 0, 0, 0, 0, 0, 0, 0, 'Webwinder Hollow Spider slain', 19034), +(259404, 8360, 0, 0, 6746, 1, 0, 0, 0, 0, 0, 0, 0, 'Dance for Innkeeper Pala', 19034), +(259413, 8813, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259415, 13071, 0, 0, 30576, 8, 0, 0, 0, 0, 0, 0, 0, 'Vrykul buildings set ablaze', 19034), +(259418, 8884, 1, 0, 21757, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259419, 7737, 1, 0, 18945, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259420, 28108, 0, 0, 47539, 1, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Gate opened', 19034), +(259421, 8355, 0, 0, 6826, 1, 0, 0, 0, 0, 0, 0, 0, 'Do the "train" for Talvash', 19034), +(259423, 27988, 0, 0, 3887, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259424, 27988, 0, 1, 4278, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259428, 29570, 0, 0, 17885, 1, 0, 0, 0, 0, 0, 0, 0, 'Earthbinder Rayge Discovered', 19034), +(259429, 29570, 0, 1, 17894, 1, 0, 0, 0, 0, 0, 0, 0, 'Windcaller Claw Discovered', 19034), +(259430, 11285, 0, 0, 24182, 1, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Dwelling Burned', 19034), +(259431, 11285, 0, 1, 24183, 1, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Watchtower Burned', 19034), +(259432, 11285, 0, 2, 24185, 1, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Bridge Burned', 19034), +(259433, 11285, 0, 3, 24184, 1, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Barracks Burned', 19034), +(259446, 8624, 1, 0, 20931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259447, 8624, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259448, 8624, 1, 2, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259449, 8624, 1, 3, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259450, 8624, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259451, 8358, 0, 0, 11814, 1, 0, 0, 0, 0, 0, 0, 0, 'Do the "train" for Kali Remik', 19034), +(259452, 8556, 1, 0, 20884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259453, 8556, 1, 1, 20868, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259454, 8556, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259455, 8556, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259456, 8556, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259458, 9053, 1, 0, 22444, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259459, 10079, 0, 0, 18827, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259461, 10129, 0, 0, 19291, 1, 0, 0, 0, 0, 0, 0, 0, 'Gateway Murketh Destroyed', 19034), +(259462, 10129, 0, 1, 19292, 1, 0, 0, 0, 0, 0, 0, 0, 'Gateway Shaadraz Destroyed', 19034), +(259463, 10129, 1, 2, 28038, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259464, 10760, 1, 0, 31260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259465, 10760, 1, 1, 31261, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259466, 10760, 1, 2, 31262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259473, 9405, 1, 0, 23550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259477, 14435, 0, 0, 36625, 1, 0, 0, 0, 0, 0, 0, 0, 'Negotiations Sabotaged', 19034), +(259478, 14435, 0, 1, 36013, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259479, 14435, 0, 2, 36012, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259480, 14435, 1, 3, 49368, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259482, 9297, 1, 0, 22949, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259485, 9674, 0, 0, 17713, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259486, 8393, 4, -1, 392, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259496, 7734, 1, 0, 18947, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259498, 30767, 0, 0, 60727, 1, 1, 0, 0, 0, 0, 0, 0, 'Shen-zin Su''s Thorn Removed', 19034), +(259499, 9261, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259500, 9261, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259503, 8753, 1, 0, 21201, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259504, 10241, 0, 0, 18855, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259505, 10241, 0, 1, 18853, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259508, 9149, 1, 0, 22579, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259509, 8568, 1, 0, 19322, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259510, 8755, 1, 0, 21203, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259511, 8565, 1, 0, 19725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259512, 7122, 0, 0, 13796, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Captured', 19034), +(259514, 8201, 1, 0, 19880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259515, 8542, 1, 0, 3576, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259516, 7944, 1, 0, 19443, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259517, 9153, 1, 0, 22484, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259520, 9585, 1, 0, 23880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259521, 9585, 1, 1, 23877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259523, 28342, 1, 0, 63123, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259526, 9298, 1, 0, 22949, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259530, 8472, 1, 0, 21808, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259535, 28334, 0, 0, 48311, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259537, 9680, 1, 0, 24152, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259541, 9466, 1, 0, 23687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259545, 27385, 1, 0, 60987, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259546, 28336, 0, 0, 48331, 7, 0, 0, 0, 0, 0, 0, 0, 'Panicking Worker slapped', 19034), +(259547, 8637, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259548, 8637, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259549, 8637, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259550, 8637, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259551, 8637, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259554, 9163, 1, 0, 22590, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259555, 9163, 1, 1, 22591, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259556, 9163, 1, 2, 22592, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259558, 9537, 1, 0, 23899, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259560, 9740, 2, 0, 182026, 1, 0, 0, 0, 0, 0, 0, 0, 'The Sun Gate Destroyed', 19034), +(259571, 30322, 1, 0, 80213, 1, 0, 0, 786, 0, 0, 0, 0, '', 19034), +(259572, 30322, 1, 1, 80214, 1, 0, 0, 787, 0, 0, 0, 0, '', 19034), +(259573, 30322, 1, 2, 80215, 1, 0, 0, 788, 0, 0, 0, 0, '', 19034), +(259574, 30322, 1, 3, 80216, 1, 0, 0, 789, 0, 0, 0, 0, '', 19034), +(259575, 9409, 1, 0, 23568, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259577, 9420, 1, 0, 23588, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259578, 9154, 1, 0, 22595, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259589, 26235, 1, 0, 57879, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259590, 9159, 0, 0, 16354, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259591, 9159, 0, 1, 16351, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259595, 11074, 1, 0, 32715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259596, 11074, 1, 1, 32717, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259597, 11074, 1, 2, 32716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259598, 11074, 1, 3, 32718, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259599, 8900, 1, 0, 21926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259604, 9587, 1, 0, 23891, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259608, 7926, 1, 0, 19338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259610, 8626, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259611, 8626, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259612, 8626, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259613, 8626, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259614, 8626, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259615, 8817, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259618, 28478, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(259622, 7802, 1, 0, 2592, 60, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259623, 8801, 1, 0, 21221, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259624, 8468, 1, 0, 21781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259628, 28636, 0, 0, 49269, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259631, 9262, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259632, 9262, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259633, 9170, 0, 0, 16250, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259634, 9170, 0, 1, 16247, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259635, 9170, 0, 2, 16248, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259636, 9170, 0, 3, 16249, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259640, 28339, 1, 0, 63519, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259642, 8754, 1, 0, 21202, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259646, 9155, 0, 0, 16301, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259647, 9155, 0, 1, 16309, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259650, 9479, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259651, 9437, 0, 0, 17119, 1, 0, 0, 0, 0, 0, 0, 0, 'Rescue Ithania from North Point Tower', 19034), +(259652, 9437, 1, 1, 23657, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259658, 8901, 1, 0, 22264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259660, 28518, 1, 0, 64441, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259663, 8263, 6, -1, 510, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259664, 8823, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259667, 28337, 0, 0, 48259, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259674, 27506, 0, 0, 45503, 6, 0, 0, 0, 0, 0, 0, 0, 'Dragonkin corpse reclaimed', 19034), +(259675, 28795, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259676, 12492, 1, 0, 38281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259678, 10328, 1, 0, 29545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259679, 10328, 1, 1, 29546, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259681, 10734, 1, 0, 29288, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259682, 10734, 6, -1, 967, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259684, 8503, 1, 0, 3820, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259685, 8473, 0, 0, 15637, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259688, 10770, 0, 0, 21021, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259689, 30317, 0, 0, 59574, 35, 0, 0, 912, 0, 0, 0, 0, 'Dusty Spots watered', 19034), +(259690, 30318, 1, 0, 80223, 1, 0, 0, 785, 0, 0, 0, 0, '', 19034), +(259691, 30319, 0, 0, 59530, 25, 0, 0, 975, 0, 0, 0, 0, 'Black-Nose Marmot stomped', 19034), +(259692, 30321, 0, 0, 59524, 100, 0, 0, 913, 0, 0, 0, 0, 'Weeds pulled', 19034), +(259693, 13305, 0, 0, 31812, 150, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259694, 13305, 0, 1, 31813, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259695, 13305, 0, 2, 31815, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259699, 12060, 0, 0, 27853, 1, 0, 0, 0, 0, 0, 0, 0, 'Object on the Surge Needle observed', 19034), +(259701, 8474, 1, 0, 23228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259702, 27507, 0, 0, 45616, 12, 0, 0, 0, 0, 0, 0, 0, 'Twilight invaders slain', 19034), +(259704, 9458, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259709, 28414, 0, 0, 37203, 1, 0, 0, 0, 0, 0, 0, 0, 'Footbomb Kicked Through Smokestacks', 19034), +(259712, 8487, 1, 0, 20771, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259714, 9157, 1, 0, 22674, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259715, 8507, 1, 0, 20810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259722, 9164, 0, 0, 16208, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Enith Rescued', 19034), +(259723, 9164, 0, 1, 16206, 1, 0, 0, 0, 0, 0, 0, 0, 'Apprentice Varnis Rescued', 19034), +(259724, 9164, 0, 2, 16209, 1, 0, 0, 0, 0, 0, 0, 0, 'Ranger Vedoran Rescued', 19034), +(259727, 10735, 1, 0, 29280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259728, 10735, 6, -1, 967, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259729, 26860, 1, 0, 60497, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259730, 9513, 0, 0, 17194, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259731, 9513, 0, 1, 17193, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259732, 9513, 0, 2, 17195, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259733, 8816, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259734, 8662, 1, 0, 20926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259735, 8662, 1, 1, 20876, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259736, 8662, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259737, 8662, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259738, 8662, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259739, 28340, 1, 0, 63516, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259744, 9454, 1, 0, 23676, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259745, 9397, 1, 0, 23486, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259746, 9481, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259747, 8627, 1, 0, 20929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259748, 8627, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259749, 8627, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259750, 8627, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259751, 8627, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259752, 8461, 0, 0, 7156, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259753, 8461, 0, 1, 7157, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259754, 8461, 0, 2, 7158, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259761, 8802, 1, 0, 21221, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259764, 9176, 1, 0, 22599, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259765, 9176, 1, 1, 22598, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259766, 8667, 1, 0, 20930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259767, 8667, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259768, 8667, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259769, 8667, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259770, 8667, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259771, 8815, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259778, 8580, 1, 0, 4625, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259779, 8835, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259781, 28477, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(259785, 26066, 0, 0, 42024, 6, 0, 0, 0, 0, 0, 0, 0, 'Boulderslide Kobold subdued', 19034), +(259786, 9156, 1, 0, 22894, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259787, 9156, 1, 1, 22893, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259788, 12949, 1, 0, 41843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259789, 9260, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259790, 9260, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259793, 8993, 1, 0, 22262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259794, 10921, 0, 0, 20682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259795, 9167, 1, 0, 22653, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259796, 12776, 1, 0, 39698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259797, 28371, 1, 0, 3502, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259799, 9453, 1, 0, 23672, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259801, 26067, 0, 0, 41360, 12, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar Marauder empowered', 19034), +(259802, 9452, 1, 0, 23614, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259803, 9452, 1, 1, 23654, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259805, 8865, 1, 0, 21100, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259807, 8818, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259809, 8899, 1, 0, 21925, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259810, 9436, 1, 0, 23679, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259811, 27979, 1, 0, 62828, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259812, 9506, 1, 0, 23738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259813, 9506, 1, 1, 23739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259815, 28641, 0, 0, 7434, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259816, 9463, 1, 0, 23685, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259817, 9442, 1, 0, 23753, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259821, 9418, 1, 0, 23580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259822, 8588, 1, 0, 4234, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259823, 30323, 1, 0, 80138, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259824, 30323, 1, 1, 80137, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259825, 30323, 1, 2, 80139, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259826, 30324, 0, 0, 59119, 8, 0, 0, 0, 0, 0, 0, 0, 'Kunzen tribe member slain', 19034), +(259827, 30325, 2, 0, 210955, 8, 0, 0, 569, 0, 0, 0, 0, 'Kunzen Ritual Candle thrown', 19034), +(259828, 30325, 2, 1, 210890, 4, 0, 0, 569, 0, 0, 0, 0, 'Blazing Ember kicked', 19034), +(259829, 30325, 0, 2, 59123, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259830, 30326, 1, 0, 79866, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(259831, 28107, 0, 0, 47406, 30, 0, 0, 0, 0, 0, 0, 0, 'Wyrms'' Bend cultists killed', 19034), +(259833, 11530, 1, 0, 34238, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259834, 28794, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259835, 12017, 0, 0, 26510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259836, 28640, 0, 0, 7431, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259841, 9265, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259842, 9265, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259843, 8826, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259844, 6388, 1, 0, 16311, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259846, 28333, 0, 0, 48330, 7, 0, 0, 0, 0, 0, 0, 0, 'Shredder oiled', 19034), +(259847, 10229, 1, 0, 28552, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259848, 9478, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259850, 28341, 1, 0, 63522, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259852, 9169, 2, 0, 181359, 1, 0, 0, 0, 0, 0, 0, 0, 'Night Elf Moon Crystal Deactivated', 19034), +(259853, 12113, 1, 0, 36819, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259854, 12113, 1, 1, 36875, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259857, 8821, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259858, 8863, 1, 0, 21100, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259859, 12937, 0, 0, 30035, 8, 0, 0, 0, 0, 0, 0, 0, 'Fallen Earthen Defenders healed', 19034), +(259860, 9483, 1, 0, 29112, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259861, 28793, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259862, 11658, 1, 0, 34842, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259863, 11658, 1, 1, 34690, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259864, 9494, 1, 0, 23726, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259865, 6342, 1, 0, 16263, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259866, 9172, 1, 0, 22706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259867, 8501, 0, 0, 11698, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259868, 8501, 1, 1, 20941, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259874, 27508, 1, 0, 61317, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259875, 11368, 1, 0, 33821, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259876, 9562, 1, 0, 23849, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259880, 8750, 1, 0, 21198, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259881, 8822, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259890, 9459, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 259890 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(259891, 29547, 0, 0, 55567, 1, 0, 0, 0, 0, 0, 0, 0, 'Stormwind Keep visited', 19034), +(259898, 8749, 1, 0, 21197, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259902, 8638, 1, 0, 20929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259903, 8638, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259904, 8638, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259905, 8638, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259906, 8638, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259907, 8470, 1, 0, 20741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259908, 8470, 6, -1, 576, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259910, 8689, 1, 0, 20885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259911, 8689, 1, 1, 20870, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259912, 8689, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259913, 8689, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259914, 8689, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259915, 27980, 0, 0, 5857, 9, 0, 0, 0, 0, 0, 0, 0, 'Lava Spider slain', 19034), +(259919, 11078, 1, 0, 32732, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259920, 8582, 1, 0, 8831, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259925, 12942, 0, 0, 29570, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259926, 8704, 1, 0, 20888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259927, 8704, 1, 1, 20869, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259928, 8704, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259929, 8704, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259930, 8704, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259937, 8895, 1, 0, 21807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259938, 25081, 0, 0, 37922, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259939, 25081, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259940, 8751, 1, 0, 21199, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259945, 9512, 1, 0, 23757, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259947, 27387, 1, 0, 12956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259948, 27387, 1, 1, 12957, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259952, 11079, 1, 0, 32733, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259958, 9175, 1, 0, 22597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259959, 8502, 0, 0, 11721, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259960, 8502, 1, 1, 20942, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259966, 9455, 1, 0, 23678, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259967, 9701, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259968, 8758, 1, 0, 21206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259969, 8695, 1, 0, 20889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259970, 8695, 1, 1, 20871, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259971, 8695, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259972, 8695, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259973, 8695, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259974, 8692, 1, 0, 20889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259975, 8692, 1, 1, 20872, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259976, 8692, 1, 2, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259977, 8692, 1, 3, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259978, 8692, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259986, 9171, 1, 0, 22644, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259990, 10636, 1, 0, 30800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259991, 8690, 1, 0, 20889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259992, 8690, 1, 1, 20871, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259993, 8690, 1, 2, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259994, 8690, 1, 3, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259995, 8690, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259996, 8570, 1, 0, 20256, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(259997, 26970, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(259998, 26970, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(260006, 9173, 0, 0, 16315, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260007, 9173, 0, 1, 16314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260008, 8590, 1, 0, 4304, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260010, 10763, 1, 0, 23445, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260011, 10763, 1, 1, 22445, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260012, 10763, 1, 2, 22574, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260018, 8694, 1, 0, 20889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260019, 8694, 1, 1, 20869, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260020, 8694, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260021, 8694, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260022, 8694, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260023, 8903, 1, 0, 22143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260024, 11369, 1, 0, 33826, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260027, 8666, 1, 0, 20933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260028, 8666, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260029, 8666, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260030, 8666, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260031, 8666, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260032, 10775, 1, 0, 31278, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260040, 7889, 1, 0, 3240, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260043, 9699, 1, 0, 24230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260044, 27386, 1, 0, 60987, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260045, 9300, 1, 0, 22946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260046, 9472, 0, 0, 17226, 1, 0, 0, 0, 0, 0, 0, 0, 'Carinda''s Scroll of Retribution used', 19034), +(260052, 12232, 0, 0, 27331, 5, 0, 0, 0, 0, 0, 0, 0, 'New Hearthglen Ballista bombarded', 19034), +(260053, 9482, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260054, 12591, 0, 0, 28352, 5, 0, 0, 0, 0, 0, 0, 0, 'Nerubian Tunnels Collapsed', 19034), +(260055, 8579, 1, 0, 21229, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260056, 8569, 1, 0, 20256, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260058, 10654, 1, 0, 30809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260059, 8490, 0, 0, 16364, 1, 0, 0, 0, 0, 0, 0, 0, 'Runestone Energized', 19034), +(260060, 8490, 1, 1, 22693, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260061, 8167, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260062, 8167, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260063, 8167, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260064, 8167, 0, 3, 15003, 1, 0, 0, 0, 0, 0, 0, 0, 'Farm Assaulted', 19034), +(260069, 9162, 1, 0, 22706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260070, 11372, 1, 0, 33834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260073, 11278, 1, 0, 33387, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260074, 8770, 0, 0, 11722, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260075, 8770, 1, 1, 21749, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260082, 8486, 0, 0, 15648, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260083, 8486, 0, 1, 15647, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260085, 8633, 1, 0, 20933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260086, 8633, 1, 1, 20874, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260087, 8633, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260088, 8633, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260089, 8633, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260094, 10776, 0, 0, 22051, 5, 0, 0, 0, 0, 0, 0, 0, 'Crazed Colossus slain while in disguise', 19034), +(260095, 10776, 1, 1, 31310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260098, 8566, 1, 0, 19725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260100, 10234, 1, 0, 28551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260107, 27982, 1, 0, 62822, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260109, 8832, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260110, 8824, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260112, 9374, 1, 0, 23339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260114, 28390, 0, 0, 43372, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260117, 8831, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260119, 8641, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260120, 8641, 1, 1, 20874, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260121, 8641, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260122, 8641, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260123, 8641, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260124, 10623, 1, 0, 30579, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260136, 8479, 1, 0, 20760, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260137, 9604, 1, 0, 23902, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260138, 8630, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260139, 8630, 1, 1, 20879, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260140, 8630, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260141, 8630, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260142, 8630, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260146, 11490, 0, 0, 25042, 1, 0, 0, 0, 0, 0, 0, 0, 'Scrying Orb Activated', 19034), +(260147, 28474, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(260148, 8224, 1, 0, 19806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260149, 8756, 1, 0, 21204, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260150, 9301, 1, 0, 22930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260151, 28473, 0, 0, 48524, 5, 0, 0, 0, 0, 0, 0, 0, 'Elemental-Imbued Weapon broken', 19034), +(260153, 8227, 1, 0, 19973, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260159, 8825, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260166, 9698, 1, 0, 24323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260167, 7927, 1, 0, 19277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260168, 8763, 1, 0, 8150, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260169, 8763, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260174, 8834, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260176, 10621, 1, 0, 30756, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260177, 9487, 1, 0, 23706, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260180, 10626, 1, 0, 30786, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260181, 10626, 1, 1, 30785, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260184, 8760, 1, 0, 21208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260185, 13231, 0, 0, 31312, 1, 0, 0, 0, 0, 0, 0, 0, 'Dying Soldier Questioned', 19034), +(260187, 8814, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260188, 10632, 1, 0, 30798, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260189, 8664, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260190, 8664, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260191, 8664, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260192, 8664, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260193, 8664, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260194, 8663, 1, 0, 20931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260195, 8663, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260196, 8663, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260197, 8663, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260198, 8663, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260200, 11359, 0, 0, 24371, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260201, 28475, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(260204, 12239, 1, 0, 37299, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260205, 28109, 0, 0, 47566, 1, 0, 0, 0, 0, 0, 0, 0, 'Grim Batol entrance secured', 19034), +(260206, 8166, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260207, 8166, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260208, 8166, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260209, 8166, 0, 3, 15003, 1, 0, 0, 0, 0, 0, 0, 0, 'Farm Assaulted', 19034), +(260211, 9696, 1, 0, 24399, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260212, 10764, 1, 0, 31252, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260213, 8701, 1, 0, 20888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260214, 8701, 1, 1, 20867, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260215, 8701, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260216, 8701, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260217, 8701, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260220, 8864, 1, 0, 21100, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260221, 8669, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260222, 8669, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260223, 8669, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260224, 8669, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260225, 8669, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260229, 26978, 0, 0, 44622, 1, 0, 0, 0, 0, 0, 0, 0, 'Leave Drum near Windmill', 19034), +(260230, 26978, 0, 1, 44623, 1, 0, 0, 0, 0, 0, 0, 0, 'Leave Drum near Grain Silos', 19034), +(260231, 26978, 0, 2, 44624, 1, 0, 0, 0, 0, 0, 0, 0, 'Leave Drum inside Ranch House', 19034), +(260232, 26978, 0, 3, 44625, 1, 0, 0, 0, 0, 0, 0, 0, 'Leave Drum inside Barn', 19034), +(260233, 9410, 1, 0, 23669, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260234, 7946, 1, 0, 11325, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260235, 8463, 1, 0, 20743, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260237, 7929, 1, 0, 19267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260240, 8661, 1, 0, 20933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260241, 8661, 1, 1, 20875, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260242, 8661, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260243, 8661, 1, 3, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260244, 8661, 6, -1, 910, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260251, 12200, 1, 0, 37124, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260252, 9490, 1, 0, 23687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260254, 8634, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260255, 8634, 1, 1, 20874, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260256, 8634, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260257, 8634, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260258, 8634, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260259, 13666, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260260, 27981, 1, 0, 62827, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260261, 8480, 1, 0, 22413, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260271, 8898, 1, 0, 21920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260272, 8697, 1, 0, 20888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260273, 8697, 1, 1, 20871, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260274, 8697, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260275, 8697, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260276, 8697, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260277, 8748, 1, 0, 21196, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260279, 8820, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260280, 30825, 1, 0, 81054, 100, 0, 0, 597, 598, 0, 0, 0, '', 19034), +(260284, 8639, 1, 0, 20930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260285, 8639, 1, 1, 20882, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260286, 8639, 1, 2, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260287, 8639, 1, 3, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260288, 8639, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260289, 7894, 1, 0, 4363, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260290, 9143, 1, 0, 22639, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260291, 8660, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260292, 8660, 1, 1, 20875, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260293, 8660, 1, 2, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260294, 8660, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260295, 8660, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260296, 28519, 0, 0, 48664, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260302, 9158, 0, 0, 16348, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260303, 9427, 0, 0, 17000, 1, 0, 0, 0, 0, 0, 0, 0, 'Aggonar''s Presence Cleansed', 19034), +(260304, 9427, 1, 1, 23361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260306, 24932, 0, 0, 39170, 15, 0, 0, 0, 0, 0, 0, 0, 'Hazzali Silithid slain', 19034), +(260308, 26676, 1, 0, 1451, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260310, 9403, 1, 0, 23552, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260311, 8168, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260312, 8168, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260313, 8168, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260314, 8168, 0, 3, 15003, 1, 0, 0, 0, 0, 0, 0, 0, 'Farm Assaulted', 19034), +(260315, 27303, 1, 0, 60981, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260323, 9694, 0, 0, 17604, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260328, 8885, 1, 0, 21770, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260329, 9130, 1, 0, 22549, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260334, 12538, 0, 0, 28109, 12, 0, 0, 0, 0, 0, 0, 0, 'Mistwhisper Gorloc', 19034), +(260335, 8171, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260336, 8171, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260337, 8171, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260338, 8171, 0, 3, 15001, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Assaulted', 19034), +(260339, 28391, 0, 0, 43640, 1, 0, 0, 0, 0, 0, 0, 0, 'Pale Resonating Crystal struck', 19034), +(260340, 28391, 0, 1, 43641, 1, 0, 0, 0, 0, 0, 0, 0, 'Aeosera defeated', 19034), +(260362, 9138, 0, 0, 16313, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260364, 8887, 1, 0, 21776, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260368, 9328, 1, 0, 22653, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260369, 8844, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260374, 9700, 0, 0, 17550, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260375, 9700, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260376, 30327, 0, 0, 59229, 6, 0, 0, 0, 0, 0, 0, 0, 'Rope Burned', 19034), +(260377, 30328, 1, 0, 80133, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260378, 9381, 1, 0, 23387, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260382, 11101, 1, 0, 32853, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260392, 9296, 1, 0, 22949, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260393, 9351, 1, 0, 23218, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260402, 8170, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260403, 8170, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260404, 8170, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260405, 8170, 0, 3, 15001, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Assaulted', 19034), +(260407, 8194, 1, 0, 19807, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260412, 8886, 1, 0, 21771, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260413, 9417, 0, 0, 16966, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260414, 9417, 0, 1, 16967, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260415, 9294, 0, 0, 88791, 1, 0, 0, 0, 0, 0, 0, 0, 'Disperse the Neutralizing Agent', 19034), +(260422, 9456, 0, 0, 17202, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260423, 8499, 1, 0, 12359, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260429, 9414, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260437, 8183, 1, 0, 19802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260440, 10733, 1, 0, 29284, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260441, 10733, 6, -1, 967, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260443, 10771, 2, 0, 185124, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Volcanic Soil', 19034), +(260444, 10771, 2, 1, 185147, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Volcanic Soil', 19034), +(260445, 10771, 2, 2, 185148, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Volcanic Soil', 19034), +(260446, 10771, 1, 3, 31300, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260447, 9062, 1, 0, 22414, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260448, 10515, 2, 0, 184684, 10, 0, 0, 0, 0, 0, 0, 0, 'Ravenous Flayer Egg Destroyed', 19034), +(260450, 9419, 0, 0, 17090, 1, 0, 0, 0, 0, 0, 0, 0, 'Return Silithyst', 19034), +(260451, 8225, 1, 0, 19803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260453, 9193, 2, 0, 181148, 10, 0, 0, 0, 0, 0, 0, 0, 'Mummified Troll Remains Burned', 19034), +(260454, 9193, 1, 1, 22755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260455, 9193, 10, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260459, 8483, 1, 0, 20764, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260460, 12241, 1, 0, 37303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260468, 8169, 0, 0, 15005, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Assaulted', 19034), +(260469, 8169, 0, 1, 15004, 1, 0, 0, 0, 0, 0, 0, 0, 'Lumber Mill Assaulted', 19034), +(260470, 8169, 0, 2, 15002, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Assaulted', 19034), +(260471, 8169, 0, 3, 15001, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Assaulted', 19034), +(260473, 12064, 1, 0, 36752, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260474, 12064, 1, 1, 36753, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260475, 12064, 1, 2, 36754, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260482, 7899, 1, 0, 5134, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260483, 7928, 1, 0, 19257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260488, 9411, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260489, 8475, 0, 0, 15654, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260491, 26093, 0, 0, 2589, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260493, 10314, 1, 0, 29338, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260494, 26095, 1, 0, 4506, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260497, 28466, 0, 0, 48524, 5, 0, 0, 0, 0, 0, 0, 0, 'Elemental-Imbued Weapon broken', 19034), +(260498, 8776, 0, 0, 11733, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260499, 8776, 1, 1, 21255, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260502, 9207, 1, 0, 22634, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260504, 12078, 1, 0, 36772, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260505, 9330, 1, 0, 23182, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260507, 9719, 1, 0, 24248, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260508, 10086, 1, 0, 67419, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260509, 10086, 1, 1, 67420, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260510, 11880, 0, 0, 25882, 6, 0, 0, 0, 0, 0, 0, 0, 'Multiphase Readings Taken', 19034), +(260511, 11880, 1, 1, 35233, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260512, 9319, 2, 0, 181346, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260513, 9319, 2, 1, 181347, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260514, 9319, 2, 2, 181348, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260515, 9319, 2, 3, 181349, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260518, 9705, 1, 0, 20804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260519, 11371, 0, 0, 17800, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260520, 8771, 0, 0, 11723, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260521, 8771, 1, 1, 21750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260526, 10134, 1, 0, 29476, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260527, 10066, 0, 0, 17346, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260530, 10057, 0, 0, 16977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260531, 10057, 0, 1, 16978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260532, 8775, 0, 0, 11732, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260533, 8775, 1, 1, 21253, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260534, 29615, 0, 0, 17797, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260537, 8856, 1, 0, 7079, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260538, 8856, 1, 1, 19440, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260539, 8856, 1, 2, 20452, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260540, 8856, 1, 3, 20807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260548, 28395, 1, 0, 21377, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260549, 8777, 0, 0, 11731, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260550, 8777, 1, 1, 21256, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260552, 25029, 1, 0, 2828, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260553, 25029, 1, 1, 2829, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260554, 25029, 1, 2, 2830, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260555, 25029, 1, 3, 2831, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260556, 9549, 1, 0, 23834, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260557, 9549, 1, 1, 23833, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260558, 12114, 0, 0, 26797, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260559, 12114, 0, 1, 26795, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260572, 9218, 1, 0, 22642, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260573, 9340, 0, 0, 16927, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260574, 9340, 0, 1, 16929, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260575, 9636, 1, 0, 23981, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260578, 9594, 0, 0, 17337, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260579, 9594, 0, 1, 17339, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260580, 9594, 1, 2, 23900, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260586, 10315, 0, 0, 20248, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260593, 28868, 0, 0, 50606, 5, 0, 0, 0, 0, 0, 0, 0, 'Frostmane Builders shrunk', 19034), +(260594, 9563, 1, 0, 23848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260595, 9563, 6, -1, 946, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260596, 12079, 0, 0, 26358, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260605, 9322, 2, 0, 181342, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260606, 9322, 2, 1, 181339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260607, 9322, 2, 2, 181343, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260608, 9322, 2, 3, 181340, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260617, 11100, 1, 0, 32842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260622, 11376, 0, 0, 18848, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260626, 7907, 1, 0, 19228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260638, 8841, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260641, 9216, 1, 0, 22641, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260646, 9349, 1, 0, 23217, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260647, 9326, 1, 0, 23181, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260649, 9387, 1, 0, 29113, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260650, 28472, 1, 0, 12842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260660, 8838, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260668, 9567, 1, 0, 23859, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260669, 11931, 1, 0, 35629, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260670, 11931, 1, 1, 35628, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260672, 11097, 1, 0, 32843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260674, 9584, 1, 0, 23879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260675, 9584, 1, 1, 23876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260683, 9220, 0, 0, 16320, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260684, 9220, 0, 1, 16319, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260685, 9220, 0, 2, 16321, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260686, 10901, 1, 0, 31750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260687, 10901, 1, 1, 31751, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260695, 10225, 1, 0, 28526, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260698, 13797, 1, 0, 45576, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260700, 28396, 1, 0, 21377, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260701, 28457, 0, 0, 8911, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260702, 28457, 1, 1, 64302, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260703, 9331, 1, 0, 23183, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260704, 9305, 1, 0, 22978, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260705, 9703, 1, 0, 24236, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260710, 8691, 1, 0, 20885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260711, 8691, 1, 1, 20873, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260712, 8691, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260713, 8691, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260714, 8691, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260718, 28805, 0, 0, 50054, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of the Farseer Witnessed', 19034), +(260722, 9581, 1, 0, 23878, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260723, 9581, 1, 1, 23875, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260730, 9402, 1, 0, 23551, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260731, 10144, 2, 0, 184414, 1, 0, 0, 0, 0, 0, 0, 0, 'Disrupt Portal Grimh', 19034), +(260732, 10144, 2, 1, 184415, 1, 0, 0, 0, 0, 0, 0, 0, 'Disrupt Portal Kaalez', 19034), +(260733, 10144, 1, 2, 28106, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260734, 11895, 0, 0, 26045, 1, 0, 0, 0, 0, 0, 0, 0, 'Storm mastered', 19034), +(260741, 28463, 2, 0, 207165, 6, 0, 0, 0, 0, 0, 0, 0, 'Poison Grain Rations', 19034), +(260745, 28469, 1, 0, 12829, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260746, 10738, 1, 0, 29285, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260747, 10738, 6, -1, 967, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260748, 8780, 1, 0, 15564, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260749, 8780, 1, 1, 4265, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260750, 8780, 1, 2, 21263, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260751, 30826, 0, 0, 60564, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260752, 28465, 0, 0, 48516, 6, 0, 0, 0, 0, 0, 0, 0, 'Fireguards freed', 19034), +(260757, 28471, 1, 0, 12842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260760, 10904, 1, 0, 31757, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260764, 9404, 1, 0, 23553, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260770, 11688, 0, 0, 25600, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260771, 9400, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260777, 9569, 0, 0, 17494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260778, 9569, 0, 1, 17342, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260779, 9569, 0, 2, 17340, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260780, 9569, 1, 3, 23863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260781, 10140, 1, 0, 28105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260782, 28458, 0, 0, 8913, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260783, 28458, 1, 1, 64305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260784, 10117, 1, 0, 27943, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260795, 28400, 1, 0, 64307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260804, 29228, 0, 0, 52911, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Mauti''s Lair', 19034), +(260805, 10365, 0, 0, 20440, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Ara Shut Down', 19034), +(260806, 10365, 1, 1, 29411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260807, 28796, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260808, 10146, 0, 0, 19291, 1, 0, 0, 0, 0, 0, 0, 0, 'Gateway Murketh Destroyed', 19034), +(260809, 10146, 0, 1, 19292, 1, 0, 0, 0, 0, 0, 0, 0, 'Gateway Shaadraz Destroyed', 19034), +(260810, 10146, 1, 2, 28038, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260812, 9531, 0, 0, 17243, 1, 0, 0, 0, 0, 0, 0, 0, 'The Traitor Uncovered', 19034), +(260813, 9531, 1, 1, 23792, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260814, 9747, 0, 0, 18080, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260815, 9747, 0, 1, 18077, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260816, 9747, 0, 2, 18079, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260817, 9747, 0, 3, 20115, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260818, 9730, 0, 0, 18046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260819, 11630, 1, 0, 34774, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260821, 29229, 0, 0, 52911, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Mauti''s Lair', 19034), +(260822, 9293, 1, 0, 22934, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260830, 9192, 0, 0, 16334, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260831, 9192, 0, 1, 16335, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260832, 9192, 0, 2, 16337, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260833, 9247, 1, 0, 22723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260834, 29230, 0, 0, 52384, 1, 0, 0, 0, 0, 0, 0, 0, 'Bwemba has inspected the Cat', 19034), +(260839, 9304, 1, 0, 22948, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260840, 11877, 1, 0, 35231, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260842, 8974, 1, 0, 22121, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260843, 8974, 1, 1, 22145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260844, 8974, 1, 2, 22174, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260849, 11890, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260850, 9391, 2, 0, 181581, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260851, 9391, 2, 1, 181580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260852, 9391, 2, 2, 181579, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260853, 9391, 1, 3, 23480, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260854, 10736, 1, 0, 29276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260855, 10736, 6, -1, 967, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260856, 10514, 1, 0, 30356, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260857, 10514, 1, 1, 30462, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260858, 9292, 1, 0, 22949, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260859, 9742, 1, 0, 24290, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260860, 11098, 1, 0, 32848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260861, 28461, 1, 0, 64303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260862, 28461, 1, 1, 64304, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260869, 9372, 1, 0, 23336, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260875, 9645, 1, 0, 23934, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260876, 28797, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260877, 28814, 0, 0, 42333, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260878, 28814, 0, 1, 42428, 101, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260883, 25270, 1, 0, 52658, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260886, 10859, 0, 0, 21929, 15, 0, 0, 0, 0, 0, 0, 0, 'Razaani Light Orb collected', 19034), +(260887, 10859, 1, 1, 31668, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260888, 9252, 0, 0, 15658, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260889, 9252, 0, 1, 15657, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260894, 28459, 1, 0, 64308, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260902, 10095, 0, 0, 18708, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260916, 9666, 0, 0, 17701, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260917, 9523, 1, 0, 23779, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260918, 9582, 0, 0, 17556, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260919, 9582, 1, 1, 23925, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260921, 10224, 1, 0, 28527, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260922, 11373, 1, 0, 33835, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260923, 9731, 1, 0, 24330, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260924, 9731, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260925, 9669, 0, 0, 17523, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260926, 9669, 0, 1, 17522, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260927, 9669, 0, 2, 17683, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260932, 28470, 0, 0, 10738, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(260944, 30329, 1, 0, 79864, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260953, 10555, 1, 0, 30529, 18, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260955, 9580, 1, 0, 24026, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260957, 9727, 0, 0, 18089, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260958, 9727, 0, 1, 18088, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260963, 9649, 1, 0, 24049, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260964, 25271, 1, 0, 52658, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260965, 10240, 0, 0, 19866, 1, 0, 0, 0, 0, 0, 0, 0, 'Activate Eastern Rune', 19034), +(260966, 10240, 0, 1, 19867, 1, 0, 0, 0, 0, 0, 0, 0, 'Activate Northeastern Rune', 19034), +(260967, 10240, 0, 2, 19868, 1, 0, 0, 0, 0, 0, 0, 0, 'Activate Western Rune', 19034), +(260968, 10240, 1, 3, 28725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260969, 14282, 1, 0, 49104, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260979, 9571, 1, 0, 23860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 260979 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(260982, 9772, 1, 0, 24373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260990, 10142, 0, 0, 19434, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260991, 10142, 0, 1, 19136, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260992, 10142, 0, 2, 19261, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260993, 9626, 1, 0, 23930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260994, 13665, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260995, 10226, 1, 0, 28548, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(260996, 10226, 1, 1, 28547, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261002, 9389, 2, 0, 181566, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261003, 9389, 2, 1, 181564, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261004, 9389, 2, 2, 181565, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261005, 9389, 2, 3, 181567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261006, 9544, 0, 0, 17375, 8, 0, 0, 0, 0, 0, 0, 0, 'Stillpine Captive Freed', 19034), +(261007, 9777, 1, 0, 24383, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261008, 10799, 1, 0, 31132, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261009, 28467, 1, 0, 12813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261015, 10562, 0, 0, 21419, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261016, 9530, 1, 0, 23790, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261017, 9530, 1, 1, 23791, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261021, 11221, 0, 0, 23998, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Razael''s Report', 19034), +(261022, 11221, 0, 1, 23778, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Lyana''s Report', 19034), +(261023, 9332, 1, 0, 23184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261024, 28815, 1, 0, 65734, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261027, 10248, 0, 0, 19851, 1, 0, 0, 0, 0, 0, 0, 0, 'Scrap Reaver X6000 Test Complete', 19034), +(261028, 10248, 1, 1, 28634, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261029, 9769, 1, 0, 24372, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261035, 10050, 0, 0, 16904, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261036, 10050, 0, 1, 16905, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261037, 10050, 0, 2, 16906, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261038, 9570, 1, 0, 23860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261039, 9352, 0, 0, 15968, 1, 0, 0, 0, 0, 0, 0, 0, 'Intruder Defeated', 19034), +(261048, 9743, 1, 0, 24291, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261053, 11326, 0, 0, 24277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261054, 11326, 1, 1, 33618, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261055, 13163, 0, 0, 31159, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261056, 9628, 1, 0, 23932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261059, 11332, 0, 0, 24290, 5, 0, 0, 0, 0, 0, 0, 0, 'Plague Tank Hits', 19034), +(261060, 10185, 0, 0, 18867, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261061, 10185, 0, 1, 18866, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261062, 9925, 0, 0, 17981, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261063, 9629, 0, 0, 17654, 6, 0, 0, 0, 0, 0, 0, 0, 'Blacksilt Scouts Tagged', 19034), +(261064, 9629, 1, 1, 23995, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261071, 9353, 1, 0, 23227, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261072, 11304, 1, 0, 33619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261076, 9388, 2, 0, 181561, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261077, 9388, 2, 1, 181560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261078, 9388, 2, 2, 181563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261079, 9388, 2, 3, 181562, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261082, 11099, 1, 0, 32842, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261083, 11318, 0, 0, 24263, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Trot for 8 seconds', 19034), +(261084, 11318, 0, 1, 24264, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Canter for 8 seconds', 19034), +(261085, 11318, 0, 2, 24265, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Gallop for 8 seconds', 19034), +(261086, 9602, 1, 0, 23899, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261087, 11954, 0, 0, 26216, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261088, 9738, 0, 0, 17885, 1, 0, 0, 0, 0, 0, 0, 0, 'Earthbinder Rayge Discovered', 19034), +(261089, 9738, 0, 1, 17893, 1, 0, 0, 0, 0, 0, 0, 0, 'Naturalist Bite Discovered', 19034), +(261090, 9738, 0, 2, 17890, 1, 0, 0, 0, 0, 0, 0, 0, 'Weeder Greenthumb Discovered', 19034), +(261091, 9738, 0, 3, 17894, 1, 0, 0, 0, 0, 0, 0, 0, 'Windcaller Claw Discovered', 19034), +(261098, 9378, 6, -1, 529, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261102, 9345, 1, 0, 23205, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261109, 10612, 0, 0, 21959, 60, 0, 0, 0, 0, 0, 0, 0, 'Deathforged Infernal Destroyed', 19034), +(261110, 10435, 1, 0, 29798, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261111, 9324, 1, 0, 23179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261112, 11511, 1, 0, 34236, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261113, 9624, 1, 0, 23927, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261114, 9283, 0, 0, 16483, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei Survivors Saved', 19034), +(261124, 9576, 1, 0, 23870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261125, 9708, 1, 0, 24238, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261128, 9667, 0, 0, 17682, 1, 0, 0, 0, 0, 0, 0, 0, 'Princess Stillpine Saved', 19034), +(261129, 11649, 1, 0, 34800, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261130, 9572, 1, 0, 23881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261131, 9572, 1, 1, 23886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261132, 9572, 1, 2, 23901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261133, 10058, 1, 0, 25938, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261134, 11093, 0, 0, 23438, 10, 0, 0, 0, 0, 0, 0, 0, 'Nether Ray Meal', 19034), +(261135, 11093, 1, 1, 32834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261136, 8843, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261142, 9770, 0, 0, 18130, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261143, 9356, 1, 0, 23239, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261144, 10622, 0, 0, 21827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261147, 9215, 1, 0, 22640, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261148, 8640, 1, 0, 20927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261149, 8640, 1, 1, 20875, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261150, 8640, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261151, 8640, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261152, 8640, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261155, 8833, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261159, 8839, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261163, 8710, 1, 0, 20890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261164, 8710, 1, 1, 20867, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261165, 8710, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261166, 8710, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261167, 8710, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261168, 14359, 0, 0, 35581, 1, 0, 0, 0, 0, 0, 0, 0, 'Sacrificial Offering Accepted', 19034), +(261169, 9635, 1, 0, 23981, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261171, 27388, 1, 0, 13202, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261172, 27388, 1, 1, 12954, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261173, 27388, 1, 2, 12955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261174, 8891, 1, 0, 21783, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261175, 10618, 1, 0, 30792, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261176, 28410, 1, 0, 64318, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261177, 11885, 0, 0, 23161, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261178, 11885, 0, 1, 23165, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261179, 11885, 0, 2, 23163, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261180, 11885, 0, 3, 23162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261181, 8860, 1, 0, 21545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261182, 9648, 1, 0, 24041, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261183, 9648, 1, 1, 24040, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261184, 9648, 1, 2, 24042, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261185, 9648, 1, 3, 24043, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261186, 11088, 1, 0, 23855, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261187, 28409, 0, 0, 48762, 1, 0, 0, 0, 0, 0, 0, 0, 'Supply Caravan Escorted', 19034), +(261188, 9259, 1, 0, 4306, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261189, 9259, 1, 1, 2604, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261194, 9263, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261195, 9263, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261196, 9855, 0, 0, 18220, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261205, 28408, 1, 0, 64317, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261207, 10190, 0, 0, 19595, 10, 0, 0, 0, 0, 0, 0, 0, 'Battery Charge Level', 19034), +(261208, 10190, 1, 1, 28369, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261210, 10556, 0, 0, 21511, 1, 0, 0, 0, 0, 0, 0, 0, 'Have Daranelle analyze the Kaliri aura', 19034), +(261211, 10556, 1, 1, 30530, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261216, 27389, 1, 0, 13155, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261217, 27389, 1, 1, 13156, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261222, 11301, 1, 0, 33558, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261223, 10627, 1, 0, 30786, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261224, 10627, 1, 1, 30785, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261229, 9480, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261234, 11358, 0, 0, 24381, 1, 0, 0, 0, 0, 0, 0, 0, 'Compare Runes with the Broken Tablet', 19034), +(261235, 8703, 1, 0, 20884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261236, 8703, 1, 1, 20872, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261237, 8703, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261238, 8703, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261239, 8703, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261240, 11081, 1, 0, 32726, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261241, 27019, 1, 0, 10682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261243, 10613, 0, 0, 21959, 60, 0, 0, 0, 0, 0, 0, 0, 'Deathforged Infernal destroyed', 19034), +(261247, 9323, 2, 0, 181344, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261248, 9323, 2, 1, 181338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261249, 9323, 2, 2, 181345, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261250, 9323, 2, 3, 181341, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261253, 9515, 0, 0, 17298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261254, 11083, 0, 0, 23305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261255, 11083, 0, 1, 23324, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261265, 30807, 1, 0, 81269, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261266, 8707, 1, 0, 20890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261267, 8707, 1, 1, 20871, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261268, 8707, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261269, 8707, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261270, 8707, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261271, 9589, 1, 0, 23894, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261278, 9634, 0, 0, 17525, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261280, 8972, 1, 0, 22123, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261281, 8972, 1, 1, 22142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261282, 8972, 1, 2, 22175, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261283, 9595, 0, 0, 17612, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261284, 14284, 0, 0, 35898, 1, 0, 0, 0, 0, 0, 0, 0, 'Valishj Slain', 19034), +(261285, 12953, 0, 0, 30096, 6, 0, 0, 0, 0, 0, 0, 0, 'Fires Started', 19034), +(261288, 9726, 0, 0, 18089, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261289, 9726, 0, 1, 18088, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261291, 12094, 0, 0, 26856, 1, 0, 0, 0, 0, 0, 0, 0, 'Power Drawn from First Ancient Stone', 19034), +(261292, 12094, 0, 1, 26855, 1, 0, 0, 0, 0, 0, 0, 0, 'Power Drawn from Second Ancient Stone', 19034), +(261293, 12094, 0, 2, 26857, 1, 0, 0, 0, 0, 0, 0, 0, 'Power Drawn from Third Ancient Stone', 19034), +(261294, 12094, 1, 3, 36787, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261295, 10658, 1, 0, 30810, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261301, 28133, 0, 0, 47669, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261302, 9728, 1, 0, 24280, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261303, 8761, 1, 0, 21209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261304, 8971, 1, 0, 22117, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261305, 8971, 1, 1, 22143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261306, 8971, 1, 2, 22176, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261307, 8973, 1, 0, 22120, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261308, 8973, 1, 1, 22140, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261309, 8973, 1, 2, 21960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261310, 11469, 1, 0, 34122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261312, 29552, 0, 0, 54929, 6, 0, 0, 610, 1090, 1091, 1092, 0, 'Wounded Pilots revived', 19034), +(261323, 30805, 0, 0, 60767, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261324, 30805, 0, 1, 60560, 6, 0, 0, 0, 0, 0, 0, 0, 'Blackmane Mercenaries slain', 19034), +(261325, 9573, 0, 0, 17448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261326, 9573, 0, 1, 17189, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261327, 8693, 1, 0, 20885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261328, 8693, 1, 1, 20866, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261329, 8693, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261330, 8693, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261331, 8693, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261332, 9214, 1, 0, 23165, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261333, 9214, 1, 1, 23167, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261334, 9214, 1, 2, 22677, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261335, 9214, 1, 3, 23166, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261340, 29361, 0, 0, 53592, 10, 0, 0, 0, 0, 0, 0, 0, 'Feed Bloated Frogs to the Moat Monster', 19034), +(261341, 9709, 1, 0, 24240, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261343, 10777, 1, 0, 31169, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261346, 9152, 1, 0, 22583, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261347, 9360, 1, 0, 23249, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261350, 8708, 1, 0, 20890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261351, 8708, 1, 1, 20870, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261352, 8708, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261353, 8708, 1, 3, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261354, 8708, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261355, 27390, 0, 0, 10936, 1, 0, 0, 0, 0, 0, 0, 0, 'Accept Redpath''s Forgiveness', 19034), +(261356, 9548, 1, 0, 23830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261357, 10159, 0, 0, 19349, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261358, 10159, 0, 1, 19350, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261359, 8712, 1, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261360, 8712, 1, 1, 20866, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261361, 8712, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261362, 8712, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261363, 8712, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261366, 9663, 0, 0, 17440, 1, 0, 0, 0, 0, 0, 0, 0, 'High Chief Stillpine Warned', 19034), +(261367, 9663, 0, 1, 17116, 1, 0, 0, 0, 0, 0, 0, 0, 'Exarch Menelaous Warned', 19034), +(261368, 9663, 0, 2, 17240, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Odesyus Warned', 19034), +(261370, 11654, 1, 0, 34815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261371, 9641, 1, 0, 23984, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261372, 8706, 1, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261373, 8706, 1, 1, 20869, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261374, 8706, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261375, 8706, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261376, 8706, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261377, 8702, 1, 0, 20888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261378, 8702, 1, 1, 20870, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261379, 8702, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261380, 8702, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261381, 8702, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261382, 10433, 1, 0, 29801, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261383, 8845, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261384, 10013, 1, 0, 25765, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261385, 26071, 0, 0, 41646, 8, 0, 0, 0, 0, 0, 0, 0, 'Defiled Scalding Chasm wildlife', 19034), +(261386, 8698, 1, 0, 20884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261387, 8698, 1, 1, 20872, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261388, 8698, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261389, 8698, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261390, 8698, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261391, 9308, 1, 0, 22989, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261392, 9900, 0, 0, 18298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261395, 9997, 0, 0, 5355, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261396, 9997, 0, 1, 1410, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261397, 9997, 0, 2, 16769, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261398, 10184, 0, 0, 19881, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261399, 9924, 0, 0, 20812, 1, 0, 0, 0, 0, 0, 0, 0, 'Corki Freed Again', 19034), +(261400, 28644, 0, 0, 49265, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261402, 9938, 0, 0, 18411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261403, 10320, 0, 0, 20483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261404, 10041, 0, 0, 26464, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Initiate Spoken To', 19034), +(261405, 10041, 0, 1, 26465, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Laborer Spoken To', 19034), +(261406, 10041, 0, 2, 26466, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Advisor Spoken To', 19034), +(261407, 9892, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261412, 14160, 1, 0, 47247, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261413, 9927, 0, 0, 18388, 10, 0, 0, 0, 0, 0, 0, 0, 'Warmaul Ogre Banner Planted', 19034), +(261414, 9927, 1, 1, 25552, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261415, 8766, 1, 0, 21205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261416, 8766, 1, 1, 20864, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261417, 8766, 1, 2, 20865, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261418, 8766, 1, 3, 20858, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261419, 9956, 1, 0, 25647, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261420, 29555, 0, 0, 55161, 3, 0, 0, 612, 613, 614, 0, 0, 'Clues found', 19034), +(261421, 29556, 0, 0, 66153, 14, 0, 0, 0, 0, 0, 0, 0, 'Hozen slain', 19034), +(261422, 10163, 0, 0, 19398, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261423, 10163, 0, 1, 19397, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261424, 10163, 0, 2, 19399, 5, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannon Destroyed', 19034), +(261425, 10163, 1, 3, 28132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261426, 9835, 0, 0, 18118, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261427, 9835, 0, 1, 18117, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261428, 10393, 1, 0, 29589, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261429, 10395, 1, 0, 29589, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261430, 9217, 1, 0, 22641, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261431, 10018, 1, 0, 25812, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261433, 27876, 1, 0, 62593, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261435, 28643, 0, 0, 49263, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261436, 8699, 1, 0, 20884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261437, 8699, 1, 1, 20866, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261438, 8699, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261439, 8699, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261440, 8699, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261443, 10197, 1, 0, 28636, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261444, 10197, 1, 1, 28637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261445, 10197, 1, 2, 28635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261446, 8711, 1, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261447, 8711, 1, 1, 20869, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261448, 8711, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261449, 8711, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261450, 8711, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261451, 10253, 1, 0, 28677, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261452, 14416, 0, 0, 36560, 5, 0, 0, 0, 0, 0, 0, 0, 'Mountain Horse rescued', 19034), +(261453, 11661, 0, 0, 32576, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261454, 8705, 1, 0, 20890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261455, 8705, 1, 1, 20868, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261456, 8705, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261457, 8705, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261458, 8705, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261459, 12092, 0, 0, 26321, 3, 0, 0, 0, 0, 0, 0, 0, 'Lothalor Ancient strengthened', 19034), +(261464, 10868, 0, 0, 18449, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261465, 10868, 0, 1, 18450, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261466, 11096, 0, 0, 23450, 20, 0, 0, 0, 0, 0, 0, 0, 'Gordunni Ogre', 19034), +(261467, 9366, 1, 0, 23269, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261468, 10008, 0, 0, 16772, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261469, 10008, 0, 1, 16810, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261470, 9150, 1, 0, 22580, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261471, 9148, 1, 0, 22717, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261472, 8709, 1, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261473, 8709, 1, 1, 20872, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261474, 8709, 1, 2, 20859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261475, 8709, 1, 3, 20863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261476, 8709, 6, -1, 609, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261477, 8668, 1, 0, 20931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261478, 8668, 1, 1, 20882, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261479, 8668, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261480, 8668, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261481, 8668, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261482, 9894, 0, 0, 18282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261483, 11082, 1, 0, 32734, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261484, 12911, 0, 0, 29902, 1, 0, 0, 0, 0, 0, 0, 0, 'Working', 19034), +(261485, 14360, 0, 0, 35381, 1, 0, 0, 0, 0, 0, 0, 0, 'Cleansing Ritual Completed', 19034), +(261486, 27392, 1, 0, 60987, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261487, 10245, 1, 0, 28580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261488, 14361, 0, 0, 35632, 1, 0, 0, 0, 0, 0, 0, 0, 'Kohor Slain', 19034), +(261489, 29357, 1, 0, 30816, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261490, 9564, 1, 0, 23850, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261491, 28646, 0, 0, 49266, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261492, 9605, 1, 0, 23903, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261493, 10031, 0, 0, 18460, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261494, 10031, 0, 1, 16805, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261495, 27983, 0, 0, 47381, 7, 0, 0, 0, 0, 0, 0, 0, 'Dark Iron Steamsmiths put to sleep', 19034), +(261496, 10778, 1, 0, 31316, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261497, 10778, 1, 1, 31317, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261498, 9412, 1, 0, 23567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261499, 9842, 1, 0, 24493, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261500, 27509, 0, 0, 45901, 1, 0, 0, 0, 0, 0, 0, 0, 'Twilight Portal destroyed', 19034), +(261501, 11422, 1, 0, 34035, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261506, 27391, 1, 0, 15328, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261507, 9798, 1, 0, 24414, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261510, 9918, 0, 0, 18354, 1, 0, 0, 0, 0, 0, 0, 0, 'Lump Interrogated', 19034), +(261511, 9219, 1, 0, 22642, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261517, 10001, 1, 0, 25751, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261518, 10040, 0, 0, 26464, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Initiate Spoken To', 19034), +(261519, 10040, 0, 1, 26465, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Laborer Spoken To', 19034), +(261520, 10040, 0, 2, 26466, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadowy Advisor Spoken To', 19034), +(261521, 9603, 1, 0, 23902, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261522, 8861, 1, 0, 21545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261523, 8975, 1, 0, 22122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261524, 8975, 1, 1, 22144, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261525, 8975, 1, 2, 22177, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261526, 8696, 1, 0, 20889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261527, 8696, 1, 1, 20868, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261528, 8696, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261529, 8696, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261530, 8696, 6, -1, 609, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261531, 10367, 1, 0, 29501, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261532, 8700, 1, 0, 20884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261533, 8700, 1, 1, 20873, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261534, 8700, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261535, 8700, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261536, 8700, 6, -1, 609, 9000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261544, 10025, 1, 0, 25744, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261545, 9897, 1, 0, 25449, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261550, 9895, 0, 0, 18281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261551, 10235, 1, 0, 28563, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261555, 10918, 1, 0, 25719, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261560, 27875, 1, 0, 62550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261561, 9863, 1, 0, 24542, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261563, 13300, 0, 0, 31866, 10, 0, 0, 0, 0, 0, 0, 0, 'Saronite Mine Slave rescued', 19034), +(261564, 8632, 1, 0, 20926, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261565, 8632, 1, 1, 20875, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261566, 8632, 1, 2, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261567, 8632, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261568, 8632, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261569, 10116, 1, 0, 27943, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261574, 9996, 0, 0, 5355, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261575, 9996, 0, 1, 1410, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261576, 9996, 0, 2, 16769, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261577, 14318, 0, 0, 36142, 1, 0, 0, 0, 0, 0, 0, 0, 'Will of the Magram Broken', 19034), +(261582, 11370, 1, 0, 33827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261586, 28806, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(261587, 10002, 0, 0, 18583, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261588, 9853, 1, 0, 24503, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261589, 28645, 0, 0, 49264, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261595, 9803, 1, 0, 24573, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261596, 9803, 1, 1, 24428, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261597, 10115, 0, 0, 18116, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261598, 10115, 0, 1, 18115, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261600, 10037, 1, 0, 25891, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261601, 13339, 1, 0, 44319, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261602, 13339, 1, 1, 44320, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261603, 13339, 1, 2, 44321, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261604, 9765, 1, 0, 24368, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261605, 10874, 2, 0, 185216, 1, 0, 0, 0, 0, 0, 0, 0, 'Sapphire Fire Extinguished', 19034), +(261606, 10874, 2, 1, 185217, 1, 0, 0, 0, 0, 0, 0, 0, 'Emerald Fire Extinguished', 19034), +(261607, 10874, 2, 2, 185218, 1, 0, 0, 0, 0, 0, 0, 0, 'Violet Fire Extinguished', 19034), +(261608, 10874, 2, 3, 185219, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodstone Fire Extinguished', 19034), +(261609, 10030, 1, 0, 25842, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261610, 9401, 1, 0, 23550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261611, 10203, 2, 0, 183805, 1, 0, 0, 0, 0, 0, 0, 0, 'Hyper Rotational Dig-A-Matic retrieved', 19034), +(261612, 10203, 2, 1, 183806, 1, 0, 0, 0, 0, 0, 0, 0, 'Servo-Pneumatic Dredging Claw retrieved', 19034), +(261613, 10203, 2, 2, 183807, 1, 0, 0, 0, 0, 0, 0, 0, 'Multi-Spectrum Terrain Analyzer retrieved', 19034), +(261614, 10203, 2, 3, 183808, 1, 0, 0, 0, 0, 0, 0, 0, 'Big Wagon Full of Explosives retrieved', 19034), +(261615, 10022, 1, 0, 25837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261616, 11333, 1, 0, 33635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261617, 9646, 1, 0, 24025, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261618, 9955, 0, 0, 18444, 1, 0, 0, 0, 0, 0, 0, 0, 'Corki Freed', 19034), +(261619, 27152, 0, 0, 45155, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261620, 27152, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261621, 10917, 1, 0, 25719, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261622, 10399, 0, 0, 16951, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261628, 10004, 1, 0, 25751, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261629, 9928, 1, 0, 25554, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261630, 9935, 0, 0, 18391, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261631, 9935, 0, 1, 21276, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261632, 9851, 1, 0, 24496, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261633, 10802, 0, 0, 22434, 3, 0, 0, 0, 0, 0, 0, 0, 'Plant Grisly Totem', 19034), +(261634, 10802, 1, 1, 31827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261635, 9789, 0, 0, 18205, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261641, 24995, 1, 0, 2859, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261642, 27511, 0, 0, 45757, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Mechanism Examined', 19034), +(261643, 27511, 0, 1, 45760, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Hieroglyphs Examined', 19034), +(261644, 27511, 0, 2, 45759, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Hieroglyphs Examined', 19034), +(261645, 28647, 0, 0, 49268, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261647, 10012, 1, 0, 25765, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261648, 12249, 0, 0, 27372, 1, 0, 0, 0, 0, 0, 0, 0, 'Ursoc cleansed', 19034), +(261649, 10246, 0, 0, 20136, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261650, 10246, 0, 1, 20134, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261651, 9906, 0, 0, 17135, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261652, 9906, 0, 1, 17134, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261653, 10071, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(261654, 10071, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(261656, 10369, 0, 0, 20680, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261657, 10369, 1, 1, 29513, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261659, 10017, 1, 0, 25802, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261660, 9160, 0, 0, 16330, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261661, 9160, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261662, 9858, 0, 0, 17131, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261663, 9932, 0, 0, 18395, 1, 0, 0, 0, 0, 0, 0, 0, 'Kil''sorrow Bodies Planted', 19034), +(261664, 9932, 1, 1, 25658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261665, 9986, 0, 0, 18539, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261666, 9986, 0, 1, 18540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261667, 9986, 0, 2, 18541, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261668, 10349, 1, 0, 29477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261669, 9914, 1, 0, 25463, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261670, 9893, 1, 0, 25433, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261671, 9810, 0, 0, 18145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261672, 9810, 0, 1, 17155, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261673, 10199, 1, 0, 28417, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261674, 10347, 0, 0, 19398, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261675, 10347, 0, 1, 19397, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261676, 10347, 0, 2, 19399, 5, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannon Destroyed', 19034), +(261677, 10347, 1, 3, 28132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261678, 9824, 0, 0, 18161, 1, 0, 0, 0, 0, 0, 0, 0, 'Underground Well Reading', 19034), +(261679, 9824, 0, 1, 18162, 1, 0, 0, 0, 0, 0, 0, 0, 'Underground Pond Reading', 19034), +(261680, 9824, 1, 2, 24474, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261682, 9843, 1, 0, 24492, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261687, 10230, 1, 0, 28562, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261690, 9325, 1, 0, 23180, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261691, 11627, 0, 0, 25416, 1, 0, 0, 0, 0, 0, 0, 0, 'Simmer has submitted', 19034), +(261692, 11627, 0, 1, 25418, 1, 0, 0, 0, 0, 0, 0, 0, 'Churn has submitted', 19034), +(261694, 8759, 1, 0, 21207, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261695, 29359, 1, 0, 69987, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261696, 9896, 1, 0, 25448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261697, 9267, 1, 0, 2589, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261698, 9267, 1, 1, 3371, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261699, 9828, 1, 0, 24484, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261701, 9904, 0, 0, 20477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261702, 9852, 1, 0, 24505, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261703, 9915, 1, 0, 25463, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261704, 9968, 1, 0, 25672, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261705, 9968, 1, 1, 24279, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261706, 8628, 1, 0, 20930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261707, 8628, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261708, 8628, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261709, 8628, 1, 3, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261710, 8628, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261711, 10024, 1, 0, 25744, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261712, 11266, 1, 0, 33347, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261713, 10192, 1, 0, 28472, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261714, 10192, 1, 1, 28473, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261715, 10192, 1, 2, 28474, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261717, 9859, 1, 0, 24523, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261718, 10346, 0, 0, 19398, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261719, 10346, 0, 1, 19397, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261720, 10346, 0, 2, 19399, 5, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannon Destroyed', 19034), +(261721, 10346, 1, 3, 28132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261727, 9670, 0, 0, 17681, 5, 0, 0, 0, 0, 0, 0, 0, 'Expedition Researcher Freed', 19034), +(261731, 10659, 1, 0, 30810, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261734, 8976, 1, 0, 22119, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261735, 8976, 1, 1, 22141, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261736, 8976, 1, 2, 22173, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261737, 28413, 0, 0, 48712, 1, 0, 0, 0, 0, 0, 0, 0, 'Create a Song', 19034), +(261738, 9934, 1, 0, 25586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261739, 10045, 1, 0, 25863, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261740, 10045, 1, 1, 25862, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261741, 10045, 1, 2, 25864, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261742, 10045, 1, 3, 25865, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261743, 9623, 1, 0, 23928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261744, 9781, 0, 0, 18213, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261745, 8665, 1, 0, 20932, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261746, 8665, 1, 1, 20878, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261747, 8665, 1, 2, 20858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261748, 8665, 1, 3, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261749, 8665, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261754, 12191, 0, 0, 24108, 5, 0, 0, 0, 0, 0, 0, 0, 'S.T.O.U.T. Hit', 19034), +(261755, 10319, 1, 0, 29361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261757, 8659, 1, 0, 20928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261758, 8659, 1, 1, 20882, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 261758 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(261759, 8659, 1, 2, 20862, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261760, 8659, 1, 3, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261761, 8659, 6, -1, 910, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261762, 10186, 1, 0, 28364, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261763, 12271, 1, 0, 37432, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261767, 9579, 1, 0, 23873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261768, 28139, 1, 0, 63053, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261769, 9878, 0, 0, 18207, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261770, 9878, 0, 1, 18203, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261771, 9817, 0, 0, 18044, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261772, 10338, 0, 0, 20418, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Duro Shut Down', 19034), +(261773, 10338, 1, 1, 29397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261774, 9998, 0, 0, 18595, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261775, 9883, 1, 0, 25416, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261777, 9907, 0, 0, 17136, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261778, 9907, 0, 1, 17137, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261779, 10563, 0, 0, 21502, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover Legion''s Plans', 19034), +(261780, 10563, 1, 1, 30638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261781, 10869, 0, 0, 18449, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261782, 10869, 0, 1, 18450, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261783, 12503, 0, 0, 28022, 10, 0, 0, 0, 0, 0, 0, 0, 'Scourge at The Argent Stand destroyed', 19034), +(261788, 10864, 0, 0, 22334, 20, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Souls Reaped', 19034), +(261789, 10016, 1, 0, 25807, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261790, 10323, 0, 0, 20440, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Ara Shut Down', 19034), +(261791, 10323, 1, 1, 29411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261792, 27520, 0, 0, 45755, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261793, 9822, 1, 0, 24471, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261794, 9937, 0, 0, 18411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261795, 9910, 0, 0, 18305, 1, 0, 0, 0, 0, 0, 0, 0, 'First Battle Standard Placed', 19034), +(261796, 9910, 0, 1, 18306, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Battle Standard Placed', 19034), +(261797, 9910, 0, 2, 18307, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Battle Standard Placed', 19034), +(261798, 9910, 1, 3, 25458, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261800, 12257, 0, 0, 27260, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261801, 10416, 1, 0, 29739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261802, 11424, 1, 0, 34043, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261803, 11327, 1, 0, 33620, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261804, 11468, 1, 0, 34120, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261805, 11468, 1, 1, 34121, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261807, 9800, 1, 0, 24419, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261808, 10739, 1, 0, 29289, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261809, 10739, 6, -1, 967, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261810, 9872, 1, 0, 24558, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261811, 9872, 6, -1, 941, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261812, 10872, 0, 0, 22112, 1, 0, 0, 0, 0, 0, 0, 0, 'Karynaku freed', 19034), +(261813, 10872, 0, 1, 11980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261814, 10855, 0, 0, 22293, 1, 0, 0, 0, 0, 0, 0, 0, 'Inactive Fel Reaver Destroyed', 19034), +(261815, 10728, 1, 0, 29278, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261816, 10728, 6, -1, 967, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261817, 8658, 1, 0, 20931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261818, 8658, 1, 1, 20874, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261819, 8658, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261820, 8658, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261821, 8658, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261822, 9831, 1, 0, 24514, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261826, 10027, 0, 0, 18464, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261831, 9644, 1, 0, 24139, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261832, 10026, 0, 0, 18464, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261833, 25070, 0, 0, 39077, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(261834, 9376, 1, 0, 23343, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261835, 9785, 0, 0, 17900, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark of Lore', 19034), +(261836, 9785, 0, 1, 17901, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark of War', 19034), +(261837, 9847, 0, 0, 18185, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon Serpent Spirit', 19034), +(261838, 9847, 1, 1, 24498, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261842, 10397, 0, 0, 19298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261843, 10397, 2, 1, 182935, 1, 0, 0, 0, 0, 0, 0, 0, 'Close Burning Legion Gate', 19034), +(261844, 10397, 1, 2, 29795, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261845, 10019, 1, 0, 25802, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261846, 9805, 0, 0, 18110, 1, 0, 0, 0, 0, 0, 0, 0, 'Large Hut Destroyed', 19034), +(261847, 9805, 0, 1, 18142, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Hut Destroyed', 19034), +(261848, 9805, 0, 2, 18143, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Hut Destroyed', 19034), +(261849, 9805, 0, 3, 18144, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Hut Destroyed', 19034), +(261850, 9813, 1, 0, 23930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261854, 29558, 0, 0, 55193, 12, 0, 0, 0, 0, 0, 0, 0, 'Slingtail hozen slain', 19034), +(261856, 11311, 0, 0, 24228, 8, 0, 0, 0, 0, 0, 0, 0, 'Mountain Elementals slain', 19034), +(261860, 9779, 1, 0, 24399, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261864, 10034, 0, 0, 18470, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261865, 27154, 0, 0, 45152, 1, 1, 0, 0, 0, 0, 0, 0, 'Magus Bisp "spoken with"', 19034), +(261866, 9993, 1, 0, 25745, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261867, 9373, 1, 0, 23338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261868, 10368, 0, 0, 20677, 1, 0, 0, 0, 0, 0, 0, 0, 'Morod Freed', 19034), +(261869, 10368, 0, 1, 20678, 1, 0, 0, 0, 0, 0, 0, 0, 'Akoru Freed', 19034), +(261870, 10368, 0, 2, 20679, 1, 0, 0, 0, 0, 0, 0, 0, 'Aylaan Freed', 19034), +(261871, 10368, 1, 3, 29501, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261872, 10405, 1, 0, 29591, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261873, 9940, 0, 0, 18413, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261874, 9940, 0, 1, 18064, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261875, 9940, 0, 2, 17138, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261876, 10836, 0, 0, 22197, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261877, 10847, 1, 0, 25638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261878, 10847, 1, 1, 25642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261879, 28660, 0, 0, 47616, 9, 0, 0, 0, 0, 0, 0, 0, 'Ghosts Slain', 19034), +(261888, 10411, 0, 0, 20806, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261889, 10411, 0, 1, 20805, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261890, 10411, 1, 2, 29737, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261891, 10043, 0, 0, 16519, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261892, 10043, 0, 1, 17088, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261893, 10043, 0, 2, 18720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261894, 28659, 0, 0, 48144, 12, 0, 0, 0, 0, 0, 0, 0, 'Alliance Infantry', 19034), +(261895, 10697, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261896, 9923, 0, 0, 18369, 1, 0, 0, 0, 0, 0, 0, 0, 'Corki Freed', 19034), +(261897, 10087, 0, 0, 18849, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Cannon Burned', 19034), +(261898, 10087, 0, 1, 19008, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Cannon Burned', 19034), +(261899, 10087, 1, 2, 27479, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261900, 29356, 0, 1, 67207, 1, 0, 0, 1258, 0, 0, 0, 0, 'Cask of Drugan''s IPA', 19034), +(261901, 29356, 0, 0, 53574, 1, 0, 0, 0, 0, 0, 0, 0, 'Deliver Cask of Drugan''s IPA', 19034), +(261902, 29358, 1, 0, 69988, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261903, 9899, 0, 0, 18280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261904, 27519, 0, 0, 45715, 8, 0, 0, 0, 0, 0, 0, 0, 'Orsis Survivor rescued', 19034), +(261905, 10414, 1, 0, 29426, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261906, 10007, 0, 0, 16772, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261907, 10007, 0, 1, 16810, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261908, 10321, 0, 0, 20417, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Coruu Shut Down', 19034), +(261909, 10321, 1, 1, 29396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261910, 10421, 1, 0, 29740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261911, 9850, 0, 0, 17132, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261912, 28664, 1, 0, 63143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261913, 9905, 0, 0, 18286, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261914, 10033, 0, 0, 18470, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261916, 9971, 2, 0, 183789, 1, 0, 0, 0, 0, 0, 0, 0, 'Strange Object examined', 19034), +(261917, 29365, 1, 0, 70000, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261918, 29365, 1, 1, 70001, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261919, 29365, 1, 2, 70002, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261920, 29365, 1, 3, 70003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261921, 12829, 0, 0, 29412, 12, 0, 0, 0, 0, 0, 0, 0, 'Crystalweb Spiders slain', 19034), +(261924, 10417, 1, 0, 29741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261925, 10250, 0, 0, 19862, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261926, 10250, 1, 1, 28651, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261927, 9999, 0, 0, 17152, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261928, 9999, 0, 1, 16945, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261929, 9999, 0, 2, 17151, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261930, 29560, 1, 0, 74033, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261931, 9911, 1, 0, 25459, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261932, 10695, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261933, 9790, 1, 0, 24372, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261935, 9830, 1, 0, 24485, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261936, 29355, 1, 0, 30816, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261940, 9815, 1, 0, 24469, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261941, 9281, 0, 0, 16352, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261942, 9281, 0, 1, 16349, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261943, 10834, 1, 0, 31529, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261944, 9832, 1, 0, 24487, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261945, 9832, 1, 1, 24488, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261946, 9936, 0, 0, 18391, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261947, 9936, 0, 1, 21276, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261948, 10894, 1, 0, 31740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261949, 10429, 1, 0, 29768, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261950, 9994, 1, 0, 25746, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261951, 10856, 0, 0, 18858, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261952, 9607, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261954, 11103, 1, 0, 29305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261955, 11103, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261960, 8629, 1, 0, 20931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261961, 8629, 1, 1, 20881, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261962, 8629, 1, 2, 20865, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261963, 8629, 1, 3, 20861, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261964, 8629, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261965, 10394, 0, 0, 16947, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261966, 10394, 0, 1, 20798, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261967, 11232, 0, 0, 23957, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Cannon Marked', 19034), +(261968, 11232, 0, 1, 23972, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Cannon Marked', 19034), +(261969, 9903, 0, 0, 18286, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261970, 10424, 1, 0, 29769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261971, 10424, 1, 1, 29803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261972, 9814, 1, 0, 24468, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261974, 29559, 0, 0, 55201, 6, 0, 0, 1152, 1153, 0, 0, 0, 'Prisoners freed', 19034), +(261975, 10000, 0, 0, 18595, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261976, 9931, 0, 0, 18393, 10, 0, 0, 0, 0, 0, 0, 0, 'Kil''sorrow Banner Planted', 19034), +(261977, 9931, 1, 1, 25555, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261980, 9857, 0, 0, 17130, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261981, 10422, 0, 0, 20787, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Tyralius Freed', 19034), +(261982, 10412, 1, 0, 29426, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261983, 9939, 0, 0, 18413, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261984, 9939, 0, 1, 18064, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261985, 9939, 0, 2, 17138, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261986, 10118, 0, 0, 18116, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261987, 10118, 0, 1, 18115, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261990, 9854, 0, 0, 17128, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261991, 9990, 1, 0, 25727, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261992, 9874, 0, 0, 18240, 10, 0, 0, 0, 0, 0, 0, 0, 'Sunspring Villager Corpse Burned', 19034), +(261993, 9874, 1, 1, 24560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261994, 10407, 1, 0, 29624, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261995, 10407, 1, 1, 29625, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261996, 10823, 1, 0, 30810, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261997, 9846, 1, 0, 24497, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(261998, 11271, 1, 0, 33348, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262000, 27156, 0, 0, 45162, 7, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Trainee challenged and defeated', 19034), +(262001, 10201, 0, 0, 19606, 1, 0, 0, 0, 0, 0, 0, 0, 'Have Grek Test Olemba Oil', 19034), +(262006, 10860, 1, 0, 31670, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262007, 10860, 1, 1, 31671, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262008, 11314, 0, 0, 24117, 7, 0, 0, 0, 0, 0, 0, 0, 'Chill Nymphs Freed', 19034), +(262009, 10232, 0, 0, 16944, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262010, 10232, 0, 1, 16948, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262011, 9919, 1, 0, 25491, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262012, 10023, 1, 0, 25837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262013, 9827, 1, 0, 24483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262014, 9825, 1, 0, 24480, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262015, 11305, 1, 0, 38098, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262016, 9782, 1, 0, 24400, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262017, 9763, 0, 0, 17798, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262018, 9902, 0, 0, 20477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262021, 27153, 0, 0, 45148, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Morris Vant', 19034), +(262022, 27153, 0, 1, 45149, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Outfitter Mendelev', 19034), +(262023, 27153, 0, 2, 45150, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Bree Ironstock', 19034), +(262024, 27153, 0, 3, 45151, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with High Cleric Alphus', 19034), +(262025, 10042, 0, 0, 16519, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262026, 10042, 0, 1, 17088, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262027, 10042, 0, 2, 18720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262028, 9898, 1, 0, 25448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262029, 11309, 1, 0, 33611, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262030, 11309, 1, 1, 33612, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262031, 30786, 0, 0, 60683, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262032, 30787, 1, 0, 81176, 6, 0, 0, 974, 0, 0, 0, 0, '', 19034), +(262033, 30788, 0, 0, 60734, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon Golgoss', 19034), +(262034, 30789, 0, 0, 60764, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon Arconiss', 19034), +(262035, 12432, 0, 0, 27688, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroyed Alliance Lumber Shipment', 19034), +(262036, 28328, 2, 0, 207088, 8, 0, 0, 0, 0, 0, 0, 0, 'Copies of The Twilight Creed burned', 19034), +(262037, 10866, 0, 0, 22112, 1, 0, 0, 0, 0, 0, 0, 0, 'Karynaku freed', 19034), +(262038, 10866, 0, 1, 11980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262040, 9987, 0, 0, 18539, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262041, 9987, 0, 1, 18540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262042, 9987, 0, 2, 18541, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262043, 9780, 1, 0, 24374, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262046, 10322, 0, 0, 20418, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge Duro Shut Down', 19034), +(262047, 10322, 1, 1, 29397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262049, 10653, 1, 0, 30809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262051, 10408, 0, 0, 20454, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262052, 10408, 1, 1, 29618, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262053, 13297, 0, 0, 31767, 1, 0, 0, 0, 0, 0, 0, 0, 'Plague Cauldron Neutralized', 19034), +(262055, 10849, 1, 0, 31662, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262057, 28460, 0, 0, 48586, 15, 0, 0, 0, 0, 0, 0, 0, 'Winterfall Furbolg slain', 19034), +(262066, 9882, 1, 0, 25416, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262067, 10082, 0, 0, 18043, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262070, 10687, 1, 0, 30679, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262071, 13086, 0, 0, 30670, 100, 0, 0, 0, 0, 0, 0, 0, 'Scourge Attackers slain', 19034), +(262072, 13086, 0, 1, 30575, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262073, 9642, 1, 0, 23984, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262074, 11245, 0, 0, 24087, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Tower Targeted', 19034), +(262075, 11245, 0, 1, 24092, 1, 0, 0, 0, 0, 0, 0, 0, 'East Tower Targeted', 19034), +(262076, 11245, 0, 2, 24093, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwest Tower Targeted', 19034), +(262077, 11245, 0, 3, 24094, 1, 0, 0, 0, 0, 0, 0, 0, 'Southeast Tower Targeted', 19034), +(262078, 9995, 1, 0, 25746, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262079, 10400, 0, 0, 19191, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262080, 11391, 0, 0, 24440, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262084, 13311, 1, 0, 44185, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262085, 9901, 0, 0, 18280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262086, 9794, 1, 0, 26048, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262088, 10726, 1, 0, 29291, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262089, 10726, 6, -1, 967, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262090, 10727, 1, 0, 29282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262091, 10727, 6, -1, 967, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262092, 10753, 0, 0, 21123, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262093, 10753, 0, 1, 21124, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262094, 10753, 0, 2, 21300, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262095, 9875, 1, 0, 24407, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262098, 27431, 0, 0, 45742, 1, 0, 0, 0, 0, 0, 0, 0, 'Stayed Out of Harrison''s Way', 19034), +(262100, 28662, 1, 0, 63034, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262101, 12155, 1, 0, 36876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262102, 27302, 1, 0, 60982, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262104, 10288, 1, 0, 28105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262105, 28661, 1, 0, 63033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262108, 25969, 0, 0, 41566, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262109, 10343, 1, 0, 29461, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262110, 27610, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262113, 12482, 0, 0, 23654, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262114, 12482, 0, 1, 23656, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262115, 12482, 0, 2, 23994, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262116, 27102, 0, 0, 44967, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262117, 10508, 1, 0, 29624, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262118, 10508, 1, 1, 29625, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262119, 10415, 1, 0, 29426, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262120, 10620, 0, 0, 20714, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262121, 10800, 1, 0, 31349, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262122, 10800, 1, 1, 31403, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262123, 9849, 0, 0, 18181, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262124, 9916, 1, 0, 25460, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262125, 9839, 0, 0, 18160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262126, 9839, 0, 1, 18120, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262127, 11656, 0, 0, 25510, 1, 0, 0, 0, 0, 0, 0, 0, 'The Serpent''s Maw destroyed', 19034), +(262128, 11656, 0, 1, 25511, 1, 0, 0, 0, 0, 0, 0, 0, 'The Kur Drakkar destroyed', 19034), +(262129, 11656, 0, 2, 25512, 1, 0, 0, 0, 0, 0, 0, 0, 'Bor''s Hammer destroyed', 19034), +(262130, 11656, 0, 3, 25513, 1, 0, 0, 0, 0, 0, 0, 0, 'Bor''s Anvil destroyed', 19034), +(262131, 11415, 0, 0, 24516, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262132, 11415, 0, 1, 24517, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262133, 10656, 1, 0, 30810, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262134, 10335, 0, 0, 20473, 1, 0, 0, 0, 0, 0, 0, 0, 'Surveying Marker One placed', 19034), +(262135, 10335, 0, 1, 20475, 1, 0, 0, 0, 0, 0, 0, 0, 'Surveying Marker Two placed', 19034), +(262136, 10335, 0, 2, 20476, 1, 0, 0, 0, 0, 0, 0, 0, 'Surveying Marker Three placed', 19034), +(262137, 10335, 1, 3, 29445, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262138, 29579, 0, 0, 54872, 5, 0, 0, 1211, 0, 0, 0, 0, 'Survivors Rescued', 19034), +(262139, 9933, 1, 0, 25586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262140, 11348, 0, 0, 24345, 1, 0, 0, 0, 0, 0, 0, 0, 'Test Rune of Command', 19034), +(262141, 11348, 0, 1, 24334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262144, 9788, 1, 0, 24411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262145, 9833, 0, 0, 18131, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262148, 9606, 1, 0, 23903, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262150, 30790, 1, 0, 81250, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262151, 9820, 1, 0, 24472, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262152, 10857, 0, 0, 22348, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Teleporter Destroyed', 19034), +(262153, 10857, 0, 1, 22350, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Teleporter Destroyed', 19034), +(262154, 10857, 0, 2, 22351, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Teleporter Destroyed', 19034), +(262155, 10857, 1, 3, 31678, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262156, 11346, 1, 0, 33781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262158, 9278, 1, 0, 22888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262162, 12138, 0, 0, 27017, 10, 0, 0, 0, 0, 0, 0, 0, 'Charge Level', 19034), +(262163, 30791, 1, 0, 81260, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262164, 30792, 0, 0, 60862, 8, 0, 0, 0, 0, 0, 0, 0, 'Gushing Mist Collected', 19034), +(262165, 30793, 0, 0, 60802, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262171, 11390, 0, 0, 24439, 3, 0, 0, 0, 0, 0, 0, 0, 'Sack of Relics Delivered', 19034), +(262173, 9806, 1, 0, 24449, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262174, 10878, 0, 0, 21661, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262175, 10878, 0, 1, 21902, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262176, 10878, 0, 2, 21907, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262177, 10685, 1, 0, 30692, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262178, 10685, 1, 1, 30691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262179, 10685, 1, 2, 30693, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262180, 10685, 1, 3, 30694, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262181, 9632, 1, 0, 23937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262183, 9804, 0, 0, 17153, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262184, 10003, 0, 0, 18583, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262186, 10410, 1, 0, 29699, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262187, 9948, 0, 0, 18428, 5, 0, 0, 0, 0, 0, 0, 0, 'Mag''har Prisoner Freed', 19034), +(262188, 10193, 0, 0, 18857, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262189, 10193, 0, 1, 18852, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262190, 10193, 0, 2, 19779, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262191, 28663, 0, 0, 47785, 10, 0, 0, 0, 0, 0, 0, 0, 'Demons Slain', 19034), +(262192, 11412, 0, 0, 24337, 3, 0, 0, 0, 0, 0, 0, 0, 'Kegs Delivered', 19034), +(262193, 9844, 0, 0, 15690, 1, 0, 0, 0, 0, 0, 0, 0, 'Demonic Presence Destroyed', 19034), +(262194, 27157, 0, 0, 45156, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262196, 9889, 0, 0, 18260, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262197, 29574, 1, 0, 72126, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262198, 29574, 1, 1, 72127, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262201, 29573, 0, 0, 18311, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262202, 29573, 0, 1, 18313, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262203, 29573, 0, 2, 18314, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262204, 29573, 0, 3, 18312, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262205, 30268, 1, 0, 79199, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262206, 30269, 0, 0, 58946, 1, 0, 0, 1223, 0, 0, 0, 0, 'Accompany Koro to Crane Wing Refuge', 19034), +(262207, 10028, 1, 0, 25841, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262208, 12312, 1, 0, 37601, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262209, 13115, 1, 0, 43136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262210, 10700, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262211, 9643, 1, 0, 23994, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262212, 10838, 1, 0, 31607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262213, 10838, 1, 1, 31606, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262214, 28798, 1, 0, 63127, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262215, 10011, 0, 0, 19067, 1, 0, 0, 0, 0, 0, 0, 0, 'Forge Camp: Hate Destroyed', 19034), +(262216, 10011, 0, 1, 19210, 1, 0, 0, 0, 0, 0, 0, 0, 'Forge Camp: Fear Destroyed', 19034), +(262219, 11233, 0, 0, 23962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262220, 11233, 0, 1, 23964, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262221, 11233, 0, 2, 23963, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262222, 10696, 1, 0, 21436, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262223, 11936, 2, 0, 188133, 5, 0, 0, 0, 0, 0, 0, 0, 'Dragon Eggs destroyed', 19034), +(262226, 10830, 0, 0, 22226, 5, 0, 0, 0, 0, 0, 0, 0, 'Leafbeard Exorcised', 19034), +(262229, 10198, 1, 0, 28607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262230, 9637, 1, 0, 25461, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262231, 9637, 1, 1, 25462, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262232, 12057, 1, 0, 36744, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262233, 10036, 1, 0, 25852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262234, 9834, 1, 0, 24486, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262235, 8631, 1, 0, 20927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262236, 8631, 1, 1, 20877, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262237, 8631, 1, 2, 20860, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262238, 8631, 1, 3, 20864, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262239, 8631, 6, -1, 910, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262240, 9836, 1, 0, 24489, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262241, 9773, 1, 0, 24374, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262242, 11360, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(262243, 9268, 1, 0, 4338, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262244, 9268, 1, 1, 3466, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262245, 27318, 0, 0, 45410, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262246, 10430, 1, 0, 29770, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262247, 9848, 1, 0, 24499, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262248, 9848, 1, 1, 24500, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262249, 9774, 1, 0, 24375, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262250, 12066, 0, 0, 26773, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley line focus information retrieved', 19034), +(262251, 9199, 1, 0, 22633, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262252, 9683, 0, 0, 17715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262253, 9783, 0, 0, 18124, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262254, 11306, 1, 0, 33617, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262256, 9917, 1, 0, 25468, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262257, 11310, 0, 0, 24274, 20, 0, 0, 0, 0, 0, 0, 0, 'Plagued Vrykul exterminated', 19034), +(262258, 9264, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262259, 9264, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262260, 30806, 1, 0, 80907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262261, 30806, 1, 2, 81261, 8, 0, 0, 1269, 0, 0, 0, 0, '', 19034), +(262263, 11666, 1, 0, 34865, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262264, 10684, 1, 0, 30649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262265, 11567, 1, 0, 34239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262266, 10432, 1, 0, 29797, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262267, 9621, 1, 0, 23929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262268, 12124, 1, 0, 36833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262269, 9739, 1, 0, 24290, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262272, 12272, 1, 0, 37359, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262273, 29363, 1, 0, 69996, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262275, 9255, 1, 0, 22735, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262276, 9992, 1, 0, 25745, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262277, 11798, 0, 0, 27995, 1, 0, 0, 0, 0, 0, 0, 0, 'The Gearmaster''s Manual researched', 19034), +(262278, 11798, 1, 1, 35486, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262279, 12261, 0, 0, 28820, 1, 0, 0, 0, 0, 0, 0, 0, 'Destructive Ward Fully Charged', 19034), +(262280, 11475, 1, 0, 34131, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262282, 12237, 0, 0, 27341, 5, 0, 0, 0, 0, 0, 0, 0, 'Helpless Villager Rescued', 19034), +(262288, 29364, 2, 0, 208880, 6, 0, 0, 0, 0, 0, 0, 0, 'Grind Corn Kernels', 19034), +(262293, 12324, 0, 0, 27568, 20, 0, 0, 0, 0, 0, 0, 0, 'Venture Company Stragglers smoked out', 19034), +(262294, 11619, 0, 0, 26449, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262295, 9135, 1, 0, 22550, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262296, 9640, 1, 0, 23933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262297, 11944, 0, 0, 26202, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262298, 12956, 1, 0, 41557, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262299, 10694, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262300, 10803, 0, 0, 21046, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262301, 10803, 0, 1, 21047, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262305, 11912, 1, 0, 35492, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262306, 28655, 0, 0, 49234, 1, 0, 0, 0, 0, 0, 0, 0, 'Nuptials Completed', 19034), +(262307, 10845, 0, 0, 21032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262308, 10329, 0, 0, 20209, 1, 0, 0, 0, 0, 0, 0, 0, 'Manaforge B''naar Shut Down', 19034), +(262309, 10329, 1, 1, 29366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262310, 29580, 1, 0, 72133, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262311, 11533, 0, 0, 25031, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262312, 11533, 0, 1, 25033, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262313, 11533, 0, 2, 25030, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262315, 29716, 0, 0, 55267, 6, 0, 0, 520, 0, 0, 0, 0, 'Rescue Cubs', 19034), +(262317, 10848, 0, 0, 21198, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262318, 10848, 0, 1, 21200, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262319, 10848, 0, 2, 21324, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262320, 9647, 0, 0, 17350, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262321, 10725, 1, 0, 29286, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262322, 10725, 6, -1, 967, 42000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262323, 9527, 1, 0, 23789, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262324, 10345, 0, 0, 20561, 12, 0, 0, 0, 0, 0, 0, 0, 'Withered Corpses Burned', 19034), +(262325, 10345, 1, 1, 29473, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262326, 9845, 0, 0, 18214, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262327, 11269, 1, 0, 33348, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262328, 11967, 1, 0, 35671, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262329, 11382, 1, 0, 33858, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262330, 12663, 0, 0, 28663, 1, 0, 0, 0, 0, 0, 0, 0, 'Tour of Zul''Drak complete', 19034), +(262331, 27305, 1, 0, 14679, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262332, 28665, 1, 0, 63149, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262333, 11384, 1, 0, 33859, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262334, 12022, 0, 0, 24108, 5, 0, 0, 0, 0, 0, 0, 0, 'S.T.O.U.T. Hit', 19034), +(262335, 11938, 0, 0, 26195, 20, 0, 0, 0, 0, 0, 0, 0, 'En''kilah Casualty', 19034), +(262336, 28117, 0, 0, 47616, 9, 0, 0, 0, 0, 0, 0, 0, 'Ghosts Slain', 19034), +(262337, 12472, 1, 0, 37920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262338, 10795, 0, 0, 20753, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262340, 10419, 1, 0, 29739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262341, 7383, 1, 0, 18151, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262342, 11869, 0, 0, 25836, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262343, 11668, 1, 0, 34866, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262344, 11417, 1, 0, 34027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262345, 9616, 1, 0, 23910, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262346, 11699, 1, 0, 34957, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262347, 11699, 1, 1, 34958, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262348, 11699, 1, 2, 34959, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262349, 12858, 1, 0, 41132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262350, 10843, 0, 0, 20768, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262352, 10861, 2, 0, 185211, 3, 0, 0, 0, 0, 0, 0, 0, 'Hatchlings Redeemed', 19034), +(262353, 10861, 0, 1, 22337, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262354, 9791, 0, 0, 18130, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262355, 10047, 2, 0, 182789, 8, 0, 0, 0, 0, 0, 0, 0, 'Cleanse Trampled Skeleton', 19034), +(262356, 10047, 1, 1, 25889, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262357, 9147, 1, 0, 22570, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262358, 10072, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(262359, 10072, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(262360, 12147, 1, 0, 36856, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262362, 11617, 0, 0, 25442, 1, 0, 0, 0, 0, 0, 0, 0, 'East Platform Destroyed', 19034), +(262363, 11617, 0, 1, 25441, 1, 0, 0, 0, 0, 0, 0, 0, 'North Platform Destroyed', 19034), +(262364, 11617, 0, 2, 25443, 1, 0, 0, 0, 0, 0, 0, 0, 'West Platform Destroyed', 19034), +(262365, 9575, 1, 0, 23881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262366, 9575, 1, 1, 23886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262367, 9575, 1, 2, 23901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262368, 29575, 1, 0, 28490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262369, 11324, 0, 0, 24277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262370, 11324, 1, 1, 33618, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262371, 9574, 1, 0, 23869, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262372, 9557, 1, 0, 23851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262373, 11652, 0, 0, 25495, 100, 0, 0, 0, 0, 0, 0, 0, 'Scourge Unit obliterated', 19034), +(262374, 11652, 0, 1, 27109, 3, 0, 0, 0, 0, 0, 0, 0, 'Injured Warsong Soldier rescued', 19034), +(262375, 11652, 10, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262376, 10796, 0, 0, 19993, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262377, 10796, 0, 1, 19994, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262378, 10854, 0, 0, 22316, 5, 0, 0, 0, 0, 0, 0, 0, 'Enslaved Netherwing Drake freed', 19034), +(262379, 10854, 1, 1, 31652, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262380, 25087, 1, 0, 52324, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262381, 29362, 1, 0, 69994, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262386, 24952, 0, 0, 38842, 1, 0, 0, 0, 0, 0, 0, 0, 'Rockin'' Powder Infused Rocket Boots used', 19034), +(262387, 24952, 1, 1, 52032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262388, 11796, 0, 0, 25847, 1, 0, 0, 0, 0, 0, 0, 0, 'Scuttle the Eastern Wreck', 19034), +(262389, 11796, 0, 1, 25846, 1, 0, 0, 0, 0, 0, 0, 0, 'Scuttle a Southern Wreck', 19034), +(262390, 11796, 0, 2, 25845, 1, 0, 0, 0, 0, 0, 0, 0, 'Scuttle a Northwestern Wreck', 19034), +(262391, 11313, 1, 0, 33605, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262392, 10055, 1, 0, 25912, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262393, 10055, 1, 1, 25911, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262394, 12148, 1, 0, 36854, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262396, 10073, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(262397, 10073, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Corruption', 19034), +(262400, 10611, 1, 0, 30713, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262404, 9841, 0, 0, 18133, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262405, 9682, 1, 0, 24153, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262406, 10617, 1, 0, 30791, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262407, 11541, 0, 0, 25086, 10, 0, 0, 0, 0, 0, 0, 0, 'Greengill Slave freed', 19034), +(262408, 10336, 0, 0, 20141, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 262408 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(262409, 10336, 0, 1, 20394, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262410, 12104, 1, 0, 36807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262411, 12262, 0, 0, 27356, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262412, 12262, 0, 1, 27360, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262413, 10801, 1, 0, 31351, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262414, 11361, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(262415, 29807, 1, 0, 43411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262416, 12283, 1, 0, 37540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262417, 11536, 1, 0, 34479, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262419, 11730, 0, 0, 25815, 15, 0, 0, 0, 0, 0, 0, 0, 'Robots reprogrammed', 19034), +(262420, 10183, 1, 0, 28359, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262421, 11685, 1, 0, 34956, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262422, 24997, 0, 0, 1941, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262423, 24997, 0, 1, 1675, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262424, 24997, 1, 2, 2834, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262425, 29808, 2, 0, 193051, 6, 0, 0, 0, 0, 0, 0, 0, 'Nerubian Scourge Eggs Destroyed', 19034), +(262426, 30270, 0, 0, 58858, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262427, 11695, 1, 0, 34964, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262428, 11695, 1, 1, 34963, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262429, 29587, 0, 0, 54996, 10, 0, 0, 1220, 0, 0, 0, 0, 'Farmers Set Free', 19034), +(262430, 12532, 1, 0, 38483, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262431, 12140, 0, 0, 26810, 1, 0, 0, 0, 0, 0, 0, 0, 'Roanauk Icemist initiated', 19034), +(262432, 12199, 0, 0, 26405, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262433, 11503, 0, 0, 24867, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262434, 9608, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262435, 9550, 1, 0, 23837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262436, 12481, 0, 0, 24276, 1, 0, 0, 0, 0, 0, 0, 0, 'Bjorn Halgurdsson insulted', 19034), +(262437, 12481, 0, 1, 24275, 1, 0, 0, 0, 0, 0, 0, 0, 'Bjorn Halgurdsson defeated', 19034), +(262438, 12209, 1, 0, 37136, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262439, 12209, 1, 1, 37137, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262440, 28136, 0, 0, 47602, 1, 1, 0, 0, 0, 0, 0, 0, 'Codemaster Deethuk assassinated', 19034), +(262441, 28136, 0, 1, 47620, 1, 1, 0, 0, 0, 0, 0, 0, 'Commander Fastfuse assassinated', 19034), +(262442, 28136, 0, 2, 47619, 1, 1, 0, 0, 0, 0, 0, 0, 'Elementalist Starion assassinated', 19034), +(262443, 13083, 1, 0, 44789, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262444, 9133, 1, 0, 22549, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262445, 10085, 0, 0, 18840, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Sunspring Post', 19034), +(262446, 10085, 0, 1, 18841, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Laughing Skull Clan Ruins', 19034), +(262447, 10085, 0, 2, 18842, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Garadar', 19034), +(262448, 10085, 0, 3, 18843, 1, 0, 0, 0, 0, 0, 0, 0, 'Visit Bleeding Hollow Clan Ruins', 19034), +(262451, 12690, 0, 0, 29099, 60, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Skullcrushers Slain', 19034), +(262452, 12690, 0, 1, 28873, 3, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Chieftain Lured', 19034), +(262453, 12690, 1, 2, 39238, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262454, 11547, 0, 0, 25156, 1, 0, 0, 0, 0, 0, 0, 0, 'Portal Reading Taken', 19034), +(262455, 11547, 0, 1, 25154, 1, 0, 0, 0, 0, 0, 0, 0, 'Shrine Reading Taken', 19034), +(262456, 11547, 0, 2, 25157, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodcrystal Reading Taken', 19034), +(262457, 11547, 1, 3, 34533, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262458, 12304, 0, 0, 27220, 20, 0, 0, 0, 0, 0, 0, 0, 'Forgotten ghosts slain', 19034), +(262459, 11535, 1, 0, 34479, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262460, 12308, 0, 0, 28019, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape from Silverbrook', 19034), +(262461, 12438, 0, 0, 27105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262462, 12298, 1, 0, 37003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262465, 11267, 0, 0, 24029, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262466, 11267, 0, 1, 24019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262467, 11267, 1, 2, 33282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262468, 11906, 1, 0, 34972, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262469, 27720, 0, 0, 46472, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Goldmine to get in the cart', 19034), +(262470, 27720, 0, 1, 46459, 1, 0, 0, 0, 0, 0, 0, 0, 'End of the line', 19034), +(262471, 27719, 0, 0, 46819, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact information extracted', 19034), +(262472, 29811, 1, 0, 74616, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262473, 11489, 0, 0, 24820, 1, 0, 0, 0, 0, 0, 0, 0, 'Test Data Collected', 19034), +(262474, 11687, 0, 0, 25678, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262475, 11687, 0, 1, 25682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262476, 12136, 1, 0, 36861, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262477, 10413, 1, 0, 29738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262478, 11969, 0, 0, 26237, 1, 0, 0, 0, 0, 0, 0, 0, 'Malygos Lured', 19034), +(262480, 11520, 1, 0, 34254, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262481, 12879, 1, 0, 41260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262482, 11918, 0, 0, 25722, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262483, 12978, 0, 0, 30152, 10, 0, 0, 0, 0, 0, 0, 0, 'Nidavelir Stormforged slain', 19034), +(262484, 10009, 1, 0, 25767, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262485, 10009, 1, 1, 25768, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262486, 10009, 1, 2, 25769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262487, 12177, 1, 0, 3857, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262488, 12177, 1, 1, 30817, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262490, 12145, 0, 0, 27004, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262491, 12422, 1, 0, 37741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262492, 25110, 1, 0, 52483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262493, 11616, 1, 0, 34720, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262494, 11899, 0, 0, 26096, 10, 0, 0, 0, 0, 0, 0, 0, 'Gnome soul captured', 19034), +(262495, 27515, 1, 0, 61319, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262496, 9744, 1, 0, 24291, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262498, 13236, 0, 0, 31329, 100, 0, 0, 0, 0, 0, 0, 0, 'Ghoulish Minion Raised', 19034), +(262499, 9560, 1, 0, 23845, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262500, 12075, 1, 0, 36765, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262501, 12413, 0, 0, 27676, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262502, 11718, 1, 0, 34977, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262503, 11966, 1, 0, 35725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262504, 13512, 0, 0, 32868, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262505, 13512, 0, 1, 32869, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262506, 10068, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(262507, 10068, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(262508, 9823, 0, 0, 18160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262509, 9823, 0, 1, 18120, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262510, 9823, 0, 2, 18121, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262511, 10070, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(262512, 10070, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(262513, 12841, 1, 0, 40690, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262514, 12484, 0, 0, 27929, 1, 0, 0, 0, 0, 0, 0, 0, 'Mummified Carcass Burned', 19034), +(262515, 12710, 0, 0, 28929, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakuru''s upper chamber explored', 19034), +(262519, 12288, 0, 0, 27466, 10, 0, 0, 0, 0, 0, 0, 0, 'Wounded Skirmishers Healed', 19034), +(262520, 12169, 0, 0, 26655, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262521, 12215, 0, 0, 26592, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262522, 12558, 1, 0, 38523, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262523, 11669, 1, 0, 34867, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262524, 12263, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262525, 10797, 1, 0, 31363, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262526, 11722, 1, 0, 34980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262527, 12307, 2, 0, 189313, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262529, 11546, 1, 0, 34502, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262532, 11881, 0, 0, 25969, 1, 0, 0, 0, 0, 0, 0, 0, 'Return Jenny to safety without losing cargo', 19034), +(262533, 12838, 1, 0, 40640, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262534, 12561, 0, 0, 28101, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262535, 12561, 0, 1, 28108, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262537, 29803, 0, 0, 23953, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262538, 9273, 1, 0, 22822, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262539, 29232, 1, 0, 68937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262540, 12959, 1, 0, 43270, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262541, 30271, 0, 0, 59297, 10, 0, 0, 0, 0, 0, 0, 0, 'Hopeless Crane Wing Defenders Inspired', 19034), +(262542, 9793, 1, 0, 24415, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262543, 12176, 1, 0, 37020, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262544, 12110, 0, 0, 26887, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley Line Focus information retrieved', 19034), +(262545, 12110, 0, 1, 26889, 1, 0, 0, 0, 0, 0, 0, 0, 'Azure Dragonshrine observed', 19034), +(262546, 11638, 1, 0, 34773, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262547, 12080, 0, 0, 26360, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262548, 13041, 1, 0, 36923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262549, 12032, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262550, 10069, 5, -1, 105361, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 and Learn Seal of Command', 19034), +(262551, 10069, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Seal of Command or Truth and Hit a Training Dummy', 19034), +(262553, 12146, 1, 0, 36855, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262554, 11667, 1, 0, 34868, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262555, 11670, 0, 0, 25581, 1, 0, 0, 0, 0, 0, 0, 0, 'Warsong Banner Planted in Magmothregar', 19034), +(262556, 11670, 1, 1, 34870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262557, 12647, 0, 0, 28416, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262558, 12214, 0, 0, 27296, 3, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Onslaught Warhorse reins handed over', 19034), +(262559, 12002, 0, 0, 26284, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262560, 27611, 0, 0, 45174, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262561, 11911, 1, 0, 35490, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262562, 11521, 1, 0, 34254, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262563, 11948, 0, 0, 26204, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262564, 11408, 0, 0, 24202, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark outside the Auction House', 19034), +(262565, 11408, 0, 1, 24203, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Honor', 19034), +(262566, 11408, 0, 2, 24204, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Wisdom', 19034), +(262567, 11408, 0, 3, 24205, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Valley of Spirits', 19034), +(262568, 12326, 0, 0, 27625, 6, 0, 0, 0, 0, 0, 0, 0, 'Plague Wagon Sabotaged', 19034), +(262569, 12326, 0, 1, 27588, 1, 0, 0, 0, 0, 0, 0, 0, '7th Legion Elite Safely Dropped Off', 19034), +(262570, 9140, 1, 0, 22566, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262571, 9140, 1, 1, 22567, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262572, 29823, 0, 0, 55693, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Riko''s report', 19034), +(262573, 29824, 0, 0, 55667, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort Shademaster Kiryn through the camp', 19034), +(262574, 11865, 0, 0, 25835, 8, 0, 0, 0, 0, 0, 0, 0, 'Nesingwary Trapper Trapped', 19034), +(262575, 11953, 0, 0, 26215, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262576, 12031, 0, 0, 26343, 15, 0, 0, 0, 0, 0, 0, 0, 'Indu''le spirits put to rest', 19034), +(262577, 11693, 0, 0, 25615, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262578, 12866, 0, 0, 29792, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262579, 12866, 0, 1, 29793, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262580, 12755, 1, 0, 39647, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262581, 12454, 0, 0, 27244, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262582, 29581, 1, 0, 76973, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262583, 11563, 1, 0, 34617, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262584, 11723, 0, 0, 25629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262585, 11723, 0, 1, 25794, 1, 0, 0, 0, 0, 0, 0, 0, 'Deploy the Shake-n-Quake 5000', 19034), +(262586, 11712, 0, 0, 25773, 6, 0, 0, 0, 0, 0, 0, 0, 'Fizzcrank Gnome cursed & ported', 19034), +(262587, 12740, 0, 0, 29060, 10, 0, 0, 0, 0, 0, 0, 0, 'Argent forces equipped with a parachute', 19034), +(262588, 11594, 0, 0, 25351, 20, 0, 0, 0, 0, 0, 0, 0, 'Taunka spirits laid to rest', 19034), +(262589, 12255, 0, 0, 27377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262590, 9812, 1, 0, 23929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262591, 12311, 0, 0, 27508, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262593, 9631, 1, 0, 24152, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262594, 11690, 0, 0, 25698, 8, 0, 0, 0, 0, 0, 0, 0, 'Kodo rescued', 19034), +(262595, 12097, 1, 0, 36793, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262596, 11875, 1, 0, 35229, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262597, 11643, 1, 0, 34785, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262598, 11998, 1, 0, 35796, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262599, 11650, 1, 0, 34802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262600, 11650, 1, 1, 39682, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262601, 11650, 1, 2, 34804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262602, 11320, 0, 0, 24263, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain Green Speed for 6 seconds', 19034), +(262603, 11320, 0, 1, 24264, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain Yellow Speed for 6 seconds', 19034), +(262604, 11320, 0, 2, 24265, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain Red Speed for 6 seconds', 19034), +(262605, 30794, 0, 0, 60720, 1, 0, 0, 620, 0, 0, 0, 0, 'Heal Sage Liao with Spells or the Draught in his Hut', 19034), +(262607, 11513, 1, 0, 34246, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262608, 11499, 1, 0, 34160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262610, 12014, 1, 0, 35819, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262611, 12014, 1, 1, 35837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262612, 11728, 1, 0, 35123, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262613, 12133, 1, 0, 36876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262617, 13928, 1, 0, 46543, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262618, 9821, 1, 0, 24473, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262619, 12123, 1, 0, 36832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262620, 11507, 1, 0, 34226, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262621, 11886, 1, 0, 35277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262622, 11943, 1, 0, 35669, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262623, 11943, 1, 1, 35668, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262624, 11715, 0, 0, 25781, 8, 0, 0, 0, 0, 0, 0, 0, 'Barrels of Oil Collected', 19034), +(262625, 11715, 1, 1, 34975, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262626, 12607, 0, 0, 28374, 1, 0, 0, 0, 0, 0, 0, 0, 'Shattertusk Mammoth Delivered', 19034), +(262627, 11537, 0, 0, 25065, 1, 0, 0, 0, 0, 0, 0, 0, 'Emissary of Hate impaled', 19034), +(262628, 11537, 0, 1, 25068, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262629, 11537, 1, 2, 34414, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262630, 11628, 1, 0, 34775, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262632, 11721, 1, 0, 34980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262633, 12090, 0, 0, 26836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262634, 12639, 1, 0, 38681, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262635, 12134, 0, 0, 26389, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262636, 11514, 1, 0, 34246, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262637, 11866, 1, 0, 35188, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262638, 10810, 1, 0, 31384, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262639, 11240, 0, 0, 24048, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262640, 11686, 0, 0, 25669, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout Warsong Granary', 19034), +(262641, 11686, 0, 1, 25671, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout Torp''s Farm', 19034), +(262642, 11686, 0, 2, 25672, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout Warsong Slaughterhouse', 19034), +(262643, 9355, 0, 0, 16857, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262644, 12099, 0, 0, 26783, 4, 0, 0, 0, 0, 0, 0, 0, 'Runed Giants Freed', 19034), +(262645, 29830, 0, 0, 31134, 1, 0, 0, 0, 0, 0, 0, 0, 'Cyanigosa Slain', 19034), +(262646, 12423, 1, 0, 37830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262647, 14483, 1, 0, 49641, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262648, 12419, 1, 0, 37833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262649, 26080, 1, 0, 56802, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262650, 12773, 1, 0, 39698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262651, 24428, 1, 0, 49644, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262652, 11665, 1, 0, 34864, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262653, 11891, 1, 0, 35237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262655, 12790, 2, 0, 191229, 1, 0, 0, 0, 0, 0, 0, 0, 'Teleport to Violet Stand Crystal used', 19034), +(262656, 12790, 2, 1, 191230, 1, 0, 0, 0, 0, 0, 0, 0, 'Teleport to Dalaran Crystal used', 19034), +(262657, 27395, 1, 0, 60877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262658, 27395, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262659, 27395, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262660, 12293, 1, 0, 37572, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262661, 11549, 8, -1, 0, 10000000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262663, 12127, 1, 0, 36846, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262664, 11316, 0, 0, 23874, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262665, 11917, 0, 0, 26116, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262666, 10809, 1, 0, 31374, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262667, 29864, 0, 0, 26668, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262668, 11609, 1, 0, 34713, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262670, 12726, 0, 0, 29008, 3, 0, 0, 0, 0, 0, 0, 0, 'Aqueous Spirit devoured', 19034), +(262671, 12726, 0, 1, 29009, 3, 0, 0, 0, 0, 0, 0, 0, 'Storm Revenant devoured', 19034), +(262672, 11645, 1, 0, 34787, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262673, 12441, 0, 0, 27762, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262674, 11607, 0, 0, 25321, 3, 0, 0, 0, 0, 0, 0, 0, 'Kaskala Craftsman spirits freed', 19034), +(262675, 11607, 0, 1, 25322, 3, 0, 0, 0, 0, 0, 0, 0, 'Kaskala Shaman spirits freed', 19034), +(262676, 12219, 1, 0, 37199, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262677, 11713, 0, 0, 25664, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of South Sinkhole', 19034), +(262678, 11713, 0, 1, 25665, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of Northeast Sinkhole', 19034), +(262679, 11713, 0, 2, 25666, 1, 0, 0, 0, 0, 0, 0, 0, 'Mark Location of Northwest Sinkhole', 19034), +(262680, 11713, 1, 3, 34920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262681, 12797, 1, 0, 38708, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262683, 27985, 1, 0, 10458, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262684, 11909, 0, 0, 27995, 1, 0, 0, 0, 0, 0, 0, 0, 'The Gearmaster''s Manual researched', 19034), +(262685, 11909, 1, 1, 35486, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262686, 12122, 1, 0, 36833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262687, 25183, 0, 0, 39315, 6, 0, 0, 0, 0, 0, 0, 0, 'Frazzlecraz Explosives Armed', 19034), +(262688, 11896, 0, 0, 26082, 15, 0, 0, 0, 0, 0, 0, 0, 'Robots weakened and destroyed', 19034), +(262689, 12531, 1, 0, 38473, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262690, 11962, 1, 0, 35706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262692, 12121, 0, 0, 26902, 1, 0, 0, 0, 0, 0, 0, 0, 'Death by Warlord Jin''arrak', 19034), +(262693, 11293, 0, 0, 24202, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark Outside the Bank', 19034), +(262694, 11293, 0, 1, 24203, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Military Ward', 19034), +(262695, 11293, 0, 2, 24204, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Hall of Explorers', 19034), +(262696, 11293, 0, 3, 24205, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Mystic Ward', 19034), +(262697, 29860, 0, 0, 28587, 1, 0, 0, 0, 0, 0, 0, 0, 'Volkhan Defeated', 19034), +(262698, 11647, 0, 0, 25490, 1, 0, 0, 0, 0, 0, 0, 0, 'East Cauldron Cleansed', 19034), +(262699, 11647, 0, 1, 25492, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Cauldron Cleansed', 19034), +(262700, 11647, 0, 2, 25493, 1, 0, 0, 0, 0, 0, 0, 0, 'West Cauldron Cleansed', 19034), +(262701, 12297, 1, 0, 37003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262702, 12242, 1, 0, 37302, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262703, 12056, 1, 0, 36741, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262704, 11958, 1, 0, 35686, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262705, 29861, 1, 0, 43151, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262706, 12730, 0, 0, 29028, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262707, 12424, 1, 0, 37831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262708, 12648, 1, 0, 38698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262709, 12290, 1, 0, 37569, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262710, 11898, 0, 0, 25601, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262711, 11898, 0, 1, 27860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262712, 11898, 0, 2, 27859, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262713, 11515, 0, 0, 24955, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262714, 11515, 1, 1, 34257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262715, 12142, 0, 0, 26705, 10, 0, 0, 0, 0, 0, 0, 0, 'Snowplain Snobolds', 19034), +(262716, 12142, 0, 1, 26481, 3, 0, 0, 0, 0, 0, 0, 0, 'Dragonblight Magnataur', 19034), +(262717, 11794, 0, 0, 25827, 1, 0, 0, 0, 0, 0, 0, 0, 'Cultist in docks defeated', 19034), +(262718, 11794, 0, 1, 25828, 1, 0, 0, 0, 0, 0, 0, 0, 'Cultist in jail defeated', 19034), +(262719, 11794, 0, 2, 25248, 1, 0, 0, 0, 0, 0, 0, 0, 'Cultist in kitchen defeated', 19034), +(262720, 12583, 1, 0, 38560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262722, 12524, 0, 0, 28123, 15, 0, 0, 0, 0, 0, 0, 0, 'Venture Company members killed', 19034), +(262723, 12599, 1, 0, 38563, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262724, 12794, 1, 0, 39740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262725, 11876, 0, 0, 25850, 8, 0, 0, 0, 0, 0, 0, 0, 'Mammoth Calf Freed', 19034), +(262727, 12554, 1, 0, 38521, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262728, 11964, 1, 0, 35725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262729, 12498, 0, 0, 28005, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262730, 12498, 1, 1, 38305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262735, 11949, 0, 0, 25760, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262738, 11470, 1, 0, 34123, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262739, 11470, 1, 1, 34124, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262740, 11972, 1, 0, 35723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262741, 11999, 1, 0, 35783, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262742, 11677, 0, 0, 25654, 1, 0, 0, 0, 0, 0, 0, 0, 'Plague Cauldron neutralized', 19034), +(262743, 11606, 1, 0, 34709, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262744, 14472, 0, 0, 36868, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262745, 12655, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262746, 12193, 1, 0, 33955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262747, 11543, 0, 0, 25090, 1, 0, 0, 0, 0, 0, 0, 0, 'Sin''loren sails burned', 19034), +(262748, 11543, 0, 1, 25091, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodoath sails burned', 19034), +(262749, 11543, 0, 2, 25092, 1, 0, 0, 0, 0, 0, 0, 0, 'Dawnchaser sails burned', 19034), +(262750, 11543, 0, 3, 25087, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262751, 12068, 1, 0, 36757, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262752, 11978, 1, 0, 35726, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262753, 12069, 1, 0, 36759, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262754, 11471, 1, 0, 34128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262755, 12456, 1, 0, 37880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262756, 12735, 0, 0, 29033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262757, 12735, 0, 1, 29018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262758, 12735, 0, 2, 29034, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262759, 11947, 0, 0, 26178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262760, 11676, 0, 0, 25610, 5, 0, 0, 0, 0, 0, 0, 0, 'Scourge Prisoner Freed', 19034), +(262762, 11467, 1, 0, 34118, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262763, 12132, 0, 0, 26966, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262764, 11640, 1, 0, 35353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262765, 11640, 1, 1, 35354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262766, 11640, 1, 2, 35355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262767, 28741, 0, 0, 39705, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262768, 28123, 1, 0, 63036, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262769, 12234, 1, 0, 37268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262770, 12234, 1, 1, 37267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262771, 12234, 1, 2, 37269, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262772, 12049, 1, 0, 36731, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262773, 12223, 0, 0, 27260, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262774, 11270, 0, 0, 24008, 10, 0, 0, 0, 0, 0, 0, 0, 'Fallen Combatant burned', 19034), +(262775, 12310, 0, 0, 27546, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262776, 12310, 0, 1, 27547, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262777, 11430, 0, 0, 24644, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262778, 12236, 0, 0, 27372, 1, 0, 0, 0, 0, 0, 0, 0, 'Ursoc Cleansed', 19034), +(262779, 11716, 1, 0, 34974, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262780, 12529, 0, 0, 28098, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262781, 12529, 0, 1, 28096, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262782, 26176, 1, 0, 60495, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262783, 11478, 1, 0, 34132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262784, 11671, 1, 0, 34909, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262785, 12185, 0, 0, 27212, 1, 0, 0, 0, 0, 0, 0, 0, 'Message from Loken received', 19034), +(262786, 12569, 1, 0, 38559, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262787, 26780, 2, 0, 204247, 8, 0, 0, 0, 0, 0, 0, 0, 'Zul''Mamwe Brazier Extinguished', 19034), +(262788, 10699, 1, 0, 21436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262789, 12882, 1, 0, 42780, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262790, 12534, 1, 0, 38477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262791, 11789, 1, 0, 35119, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262792, 11706, 0, 0, 25629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262793, 11706, 0, 1, 25742, 1, 0, 0, 0, 0, 0, 0, 0, 'Nerubian tunnels collapsed', 19034), +(262794, 11706, 1, 2, 34968, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262795, 10418, 0, 0, 20773, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262799, 25207, 0, 0, 39393, 1, 0, 0, 0, 0, 0, 0, 0, 'KTC Oil Platform destroyed', 19034), +(262800, 11440, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(262801, 12555, 0, 0, 28289, 5, 0, 0, 0, 0, 0, 0, 0, 'Plague Sprayers webbed and destroyed', 19034), +(262802, 11429, 0, 0, 24641, 1, 0, 0, 0, 0, 0, 0, 0, 'Alliance Banner Placed', 19034), +(262803, 11429, 1, 1, 34051, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262804, 12005, 1, 0, 35800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262805, 12005, 1, 1, 35801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262806, 14347, 0, 0, 34511, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262807, 12120, 1, 0, 36826, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262808, 11117, 1, 0, 32906, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262809, 11117, 1, 1, 32907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262810, 11500, 0, 0, 24697, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262811, 11494, 0, 0, 24824, 15, 0, 0, 0, 0, 0, 0, 0, 'Iron Rune Data Collected', 19034), +(262812, 13244, 0, 0, 28838, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262813, 10420, 1, 0, 29740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262814, 11887, 1, 0, 35276, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262815, 11476, 1, 0, 35803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262816, 11476, 1, 1, 35813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262818, 11648, 0, 0, 25478, 1, 0, 0, 0, 0, 0, 0, 0, 'Prisoner Interrogated', 19034), +(262819, 13549, 0, 0, 33005, 3, 0, 0, 0, 0, 0, 0, 0, 'Female Frost Leopards recovered', 19034), +(262820, 13549, 0, 1, 33006, 3, 0, 0, 0, 0, 0, 0, 0, 'Female Icepaw Bears recovered', 19034), +(262821, 10940, 1, 0, 31907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262822, 10846, 0, 0, 22305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262823, 11105, 1, 0, 29301, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262824, 11105, 8, -1, 0, 750000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262825, 13651, 1, 0, 45071, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262826, 11598, 0, 0, 25382, 15, 0, 0, 0, 0, 0, 0, 0, 'Nerub''ar slain', 19034), +(262827, 26019, 1, 0, 56570, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262828, 10806, 0, 0, 20555, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262829, 10806, 1, 1, 31808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262831, 11587, 0, 0, 25318, 1, 0, 0, 0, 0, 0, 0, 0, 'Arcane Prisoners Rescued', 19034), +(262832, 14297, 0, 0, 36722, 4, 0, 0, 0, 0, 0, 0, 0, 'Bilgewater Laborer rescued', 19034), +(262833, 12046, 1, 0, 36729, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262834, 11788, 0, 0, 25830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262835, 11788, 0, 1, 25831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262836, 11788, 0, 2, 25832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262837, 11788, 0, 3, 25833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262841, 10693, 1, 0, 21438, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262842, 11279, 1, 0, 33420, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262843, 12457, 0, 0, 27788, 8, 0, 0, 0, 0, 0, 0, 0, 'Injured 7th Legion Soldier Saved', 19034), +(262844, 12517, 1, 0, 43039, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262845, 12306, 1, 0, 37599, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262846, 12019, 0, 0, 28189, 1, 0, 0, 0, 0, 0, 0, 0, 'Last Rites', 19034), +(262847, 12144, 0, 0, 26705, 10, 0, 0, 0, 0, 0, 0, 0, 'Snowplain Snobolds', 19034), +(262848, 12144, 0, 1, 26481, 3, 0, 0, 0, 0, 0, 0, 0, 'Dragonblight Magnataur', 19034), +(262849, 12436, 1, 0, 37185, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262850, 11102, 0, 0, 23118, 15, 0, 0, 0, 0, 0, 0, 0, 'Fel Cannonball Stacks destroyed', 19034), +(262851, 11102, 1, 1, 32456, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262853, 12656, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262854, 10885, 1, 0, 31721, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262855, 10885, 1, 1, 31722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262856, 12650, 1, 0, 38700, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262857, 13075, 1, 0, 44790, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262858, 11623, 0, 0, 25448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262859, 11973, 0, 0, 26723, 1, 0, 0, 0, 0, 0, 0, 0, 'Keristrasza Laid to Rest', 19034), +(262860, 11867, 1, 0, 35188, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262861, 11330, 0, 0, 24284, 1, 0, 0, 0, 0, 0, 0, 0, 'Peppy''s Mix Administered To The Vrykul Prisoner', 19034), +(262862, 12281, 1, 0, 37502, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262863, 10877, 1, 0, 31697, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262864, 10877, 1, 1, 31705, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262865, 11540, 0, 0, 24978, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262866, 11540, 0, 1, 24976, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262867, 11540, 0, 2, 24979, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262868, 12314, 0, 0, 27511, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262869, 11951, 1, 0, 35685, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262870, 11884, 0, 0, 25801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262871, 11884, 0, 1, 25968, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262872, 12319, 1, 0, 37607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262873, 12131, 1, 0, 36857, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262874, 12131, 1, 1, 36858, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262875, 12254, 1, 0, 37350, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262876, 11988, 1, 0, 35747, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262877, 12206, 0, 0, 27253, 1, 0, 0, 0, 0, 0, 0, 0, 'Flask of Blight tested', 19034), +(262878, 10842, 0, 0, 21636, 5, 0, 0, 0, 0, 0, 0, 0, 'Vengeful Draenei Slain', 19034), +(262879, 11238, 0, 0, 24029, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262880, 11238, 0, 1, 24019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262881, 11238, 1, 2, 33282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262882, 12083, 0, 0, 26831, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley line focus information retrieved', 19034), +(262883, 11698, 0, 0, 25660, 20, 0, 0, 0, 0, 0, 0, 0, 'Talramas Scourge Destroyed', 19034), +(262884, 11710, 1, 0, 34972, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262885, 10812, 1, 0, 31387, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262886, 11905, 0, 0, 26105, 1, 0, 0, 0, 0, 0, 0, 0, 'Interdimensional Rift Stalled', 19034), +(262887, 11905, 1, 1, 35479, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262888, 11893, 0, 0, 25987, 10, 0, 0, 0, 0, 0, 0, 0, 'Energy collected', 19034), +(262889, 12316, 0, 0, 28190, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde killed in Venture Bay', 19034), +(262890, 12320, 1, 0, 37607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262891, 12475, 1, 0, 37930, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262892, 29242, 1, 0, 69647, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262893, 11879, 1, 0, 35234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262894, 28121, 0, 0, 7125, 12, 0, 0, 0, 0, 0, 0, 0, 'Jaedenar Forces Slain', 19034), +(262895, 11793, 1, 0, 35122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262896, 13008, 0, 0, 30274, 5, 0, 0, 0, 0, 0, 0, 0, 'Webbed Crusader Freed', 19034), +(262897, 11872, 0, 0, 25800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262898, 10884, 1, 0, 31716, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262899, 11450, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(262900, 10826, 1, 0, 30809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262901, 12291, 0, 0, 27472, 1, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Peasant Questioned', 19034), +(262902, 12291, 0, 1, 27471, 1, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Rifleman Questioned', 19034), +(262903, 12291, 0, 2, 27473, 1, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Knight Questioned', 19034), +(262904, 12291, 0, 3, 27474, 1, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Footman Questioned', 19034), +(262905, 12221, 1, 0, 37233, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262906, 12559, 2, 0, 190508, 1, 0, 0, 0, 0, 0, 0, 0, 'Activation Switch Gamma', 19034), +(262907, 11281, 0, 0, 24173, 1, 0, 0, 0, 0, 0, 0, 0, 'Test Nokoma''s Horn', 19034), +(262909, 12621, 0, 0, 28482, 1, 0, 0, 0, 0, 0, 0, 0, 'Freya''s Pact', 19034), +(262910, 12741, 1, 0, 39614, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262911, 10817, 0, 0, 22082, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262912, 10817, 0, 1, 22084, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262913, 10817, 0, 2, 22081, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262914, 12510, 1, 0, 38325, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262915, 30796, 0, 0, 60825, 5, 0, 0, 0, 0, 0, 0, 0, 'Tormented Spirits slain', 19034), +(262916, 11272, 0, 0, 23953, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262917, 11319, 0, 0, 51087, 8, 0, 0, 0, 0, 0, 0, 0, 'Spores frozen', 19034), +(262918, 11477, 0, 0, 23676, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262919, 11477, 0, 1, 23711, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262920, 11477, 0, 2, 23674, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262921, 12812, 1, 0, 40482, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262922, 11388, 1, 0, 33861, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262923, 12907, 0, 0, 30147, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262924, 10851, 1, 0, 31651, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262925, 24954, 1, 0, 52035, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262926, 12719, 0, 0, 28945, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262927, 12719, 1, 1, 39362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262928, 12520, 0, 0, 28009, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262929, 11328, 1, 0, 33620, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262930, 13996, 0, 0, 34436, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262932, 11907, 0, 0, 25830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262933, 11907, 0, 1, 25831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262934, 11907, 0, 2, 25832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262935, 11907, 0, 3, 25833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262936, 12465, 1, 0, 37910, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262937, 12465, 1, 1, 37911, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262938, 12465, 1, 2, 37912, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262939, 12465, 1, 3, 37913, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262940, 12478, 0, 0, 27879, 1, 0, 0, 0, 0, 0, 0, 0, 'Secrets of the Past Revealed', 19034), +(262941, 11418, 0, 0, 24515, 1, 0, 0, 0, 0, 0, 0, 0, 'Learn Steelfeather''s Secret', 19034), +(262942, 30798, 0, 0, 60572, 1, 1, 0, 0, 0, 0, 0, 0, 'Interrupted the Spiritbinding Ritual', 19034), +(262943, 11298, 1, 0, 33541, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262944, 11455, 1, 0, 34084, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262945, 11428, 0, 0, 24638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262946, 10828, 1, 0, 30809, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262947, 10804, 0, 0, 22131, 8, 0, 0, 0, 0, 0, 0, 0, 'Mature Netherwing Drake fed', 19034), +(262948, 10820, 0, 0, 19961, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262949, 10820, 0, 1, 19960, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262950, 10827, 1, 0, 30809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262951, 12476, 0, 0, 27875, 20, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Onslaught slain', 19034), +(262952, 13642, 1, 0, 45066, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262953, 11387, 0, 0, 19735, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262954, 11403, 1, 0, 33277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262955, 11510, 1, 0, 34235, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262956, 10805, 0, 0, 19997, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 262956 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(262957, 10805, 0, 1, 19996, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262958, 10805, 0, 2, 20729, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262959, 10805, 0, 3, 20757, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262960, 12256, 1, 0, 37229, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262961, 12557, 0, 0, 28293, 1, 0, 0, 0, 0, 0, 0, 0, 'Muddy Mire Maggot found', 19034), +(262962, 12557, 0, 1, 28294, 1, 0, 0, 0, 0, 0, 0, 0, 'Withered Batwing found', 19034), +(262963, 12557, 0, 2, 28295, 1, 0, 0, 0, 0, 0, 0, 0, 'Amberseed found', 19034), +(262964, 12557, 0, 3, 28296, 1, 0, 0, 0, 0, 0, 0, 0, 'Chilled Serpent Mucus found', 19034), +(262965, 12119, 1, 0, 36832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262966, 13796, 1, 0, 45573, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262967, 11871, 1, 0, 35222, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262968, 12541, 0, 0, 28248, 1, 0, 0, 0, 0, 0, 0, 0, 'Truth Serum Created', 19034), +(262969, 12125, 1, 0, 36828, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262970, 11516, 1, 0, 34253, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262971, 10876, 1, 0, 31706, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262972, 10396, 0, 0, 22461, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262973, 26089, 0, 0, 41925, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262974, 26089, 0, 1, 41926, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262975, 11566, 1, 0, 34621, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262976, 11897, 0, 0, 26249, 1, 0, 0, 0, 0, 0, 0, 0, 'Explosives set at southern sinkhole', 19034), +(262977, 11897, 0, 1, 26248, 1, 0, 0, 0, 0, 0, 0, 0, 'Explosives set at northern sinkhole', 19034), +(262978, 27517, 1, 0, 61321, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262979, 12229, 1, 0, 37251, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262980, 11292, 1, 0, 33487, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262981, 10816, 0, 0, 22082, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262982, 10816, 0, 1, 22084, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262983, 10816, 0, 2, 22081, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262984, 13905, 1, 0, 46381, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262985, 12727, 1, 0, 39510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262986, 26575, 0, 0, 43339, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(262987, 12705, 0, 0, 28078, 50, 0, 0, 0, 0, 0, 0, 0, 'Frenzyheart Attacker slain', 19034), +(262988, 12892, 0, 0, 29803, 1, 0, 0, 0, 0, 0, 0, 0, 'The Ocular has been destroyed', 19034), +(262989, 12652, 0, 0, 28591, 10, 0, 0, 0, 0, 0, 0, 0, 'Decaying Ghouls Fed', 19034), +(262990, 11239, 0, 0, 24013, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262991, 11239, 0, 1, 24073, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262992, 11239, 0, 2, 23992, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262993, 12743, 0, 0, 29065, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262994, 11409, 0, 0, 24263, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Trot for 8 seconds', 19034), +(262995, 11409, 0, 1, 24264, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Canter for 8 seconds', 19034), +(262996, 11409, 0, 2, 24265, 1, 0, 0, 0, 0, 0, 0, 0, 'Maintain a Gallop for 8 seconds', 19034), +(262997, 11639, 0, 0, 25428, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262998, 11639, 0, 1, 25429, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(262999, 11639, 0, 2, 25434, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263000, 11639, 0, 3, 25432, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263001, 12709, 1, 0, 39301, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263002, 11957, 1, 0, 35709, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263003, 25006, 0, 0, 38981, 1, 0, 0, 0, 0, 0, 0, 0, 'Procedure Completed', 19034), +(263004, 12757, 1, 0, 39654, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263005, 12926, 1, 0, 41132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263006, 11277, 1, 0, 33355, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263007, 11383, 0, 0, 17839, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263008, 13817, 1, 0, 45857, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263009, 12816, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263010, 12816, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263011, 30795, 0, 3, 61166, 1, 0, 0, 621, 0, 0, 0, 0, 'Use the Tongue of Ba-Shon in the Valley of Emperors', 19034), +(263014, 12644, 1, 0, 38688, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263015, 14003, 1, 0, 11142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263016, 30797, 1, 0, 81892, 1, 0, 0, 1259, 0, 0, 0, 0, '', 19034), +(263017, 28118, 1, 0, 63033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263018, 12675, 1, 0, 39166, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263019, 10941, 1, 0, 31914, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263020, 11385, 0, 0, 19505, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263021, 26043, 1, 0, 55239, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263022, 10881, 1, 0, 31709, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263023, 10881, 1, 1, 31710, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263024, 10881, 1, 2, 31708, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263025, 10837, 1, 0, 31504, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263026, 12076, 1, 0, 36768, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263027, 12987, 0, 0, 30210, 1, 0, 0, 0, 0, 0, 0, 0, 'Hodir''s Helm Mounted', 19034), +(263028, 12747, 0, 0, 29074, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263029, 10873, 0, 0, 22459, 6, 0, 0, 0, 0, 0, 0, 0, 'Sha''tar Warrior Freed', 19034), +(263030, 10867, 1, 0, 30890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263031, 12581, 0, 0, 28659, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263033, 10813, 0, 0, 22177, 1, 0, 0, 0, 0, 0, 0, 0, 'Eye of Grillok Returned', 19034), +(263034, 10813, 1, 1, 31463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263035, 11291, 1, 0, 33488, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263036, 11389, 0, 0, 20869, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263037, 12810, 0, 0, 29391, 10, 0, 0, 0, 0, 0, 0, 0, 'Blood collected from Ravenous Jaws', 19034), +(263038, 27516, 0, 0, 45767, 1, 0, 0, 0, 0, 0, 0, 0, 'Thordun Hammerblow Flown to Highbank', 19034), +(263039, 12007, 1, 0, 35806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263040, 29827, 0, 0, 55707, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263041, 29827, 0, 1, 55701, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263042, 10808, 0, 0, 22137, 1, 0, 0, 0, 0, 0, 0, 0, 'End Dark Conclave Summoning Ritual', 19034), +(263043, 10808, 1, 1, 31386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263044, 11416, 1, 0, 34027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263045, 11660, 1, 0, 34813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263046, 12701, 0, 0, 28849, 100, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Defender slain', 19034), +(263047, 12821, 1, 0, 40731, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263048, 12718, 1, 0, 39328, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263049, 11644, 1, 0, 34786, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263051, 10852, 0, 0, 22314, 12, 0, 0, 0, 0, 0, 0, 0, 'Children Rescued', 19034), +(263052, 11280, 0, 0, 24170, 1, 0, 0, 0, 0, 0, 0, 0, 'Proto-Drake Plague Results Observed', 19034), +(263053, 12252, 0, 0, 27394, 1, 0, 0, 0, 0, 0, 0, 0, 'Torturer LeCraft fully questioned', 19034), +(263054, 12252, 0, 1, 27209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263055, 12641, 0, 0, 28525, 1, 0, 0, 0, 0, 0, 0, 0, 'New Avalon Forge Analyzed', 19034), +(263056, 12641, 0, 1, 28543, 1, 0, 0, 0, 0, 0, 0, 0, 'New Avalon Town Hall Analyzed', 19034), +(263057, 12641, 0, 2, 28542, 1, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Hold Analyzed', 19034), +(263058, 12641, 0, 3, 28544, 1, 0, 0, 0, 0, 0, 0, 0, 'Chapel of the Crimson Flame Analyzed', 19034), +(263061, 11605, 2, 0, 187662, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Kesuk identified', 19034), +(263062, 11605, 2, 1, 187663, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Sagani identified', 19034), +(263063, 11605, 2, 2, 187664, 1, 0, 0, 0, 0, 0, 0, 0, 'Elder Takret identified', 19034), +(263064, 26872, 1, 0, 6443, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263065, 13237, 0, 0, 31140, 5, 0, 0, 0, 0, 0, 0, 0, 'Hulking Abominations Slain', 19034), +(263066, 13237, 0, 1, 31155, 5, 0, 0, 0, 0, 0, 0, 0, 'Malefic Necromancers Slain', 19034), +(263067, 13237, 0, 2, 31145, 5, 0, 0, 0, 0, 0, 0, 0, 'Shadow Adepts Slain', 19034), +(263068, 25164, 0, 0, 40163, 1, 0, 0, 0, 0, 0, 0, 0, 'Fend Off Naga Attack', 19034), +(263069, 25164, 0, 1, 40161, 1, 0, 0, 0, 0, 0, 0, 0, 'Fathom-Lord Zin''Jatar Defeated', 19034), +(263070, 30799, 1, 0, 82393, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263071, 30800, 1, 0, 82764, 1, 0, 0, 622, 0, 0, 0, 0, '', 19034), +(263072, 12533, 0, 0, 28086, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263073, 12533, 0, 1, 28085, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263074, 30272, 0, 0, 59236, 18, 0, 0, 0, 0, 0, 0, 0, 'Sha manifestations slain', 19034), +(263075, 30273, 0, 0, 59651, 1, 1, 0, 725, 0, 0, 0, 0, '', 19034), +(263076, 10821, 0, 0, 19963, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263077, 25551, 0, 0, 40793, 1, 1, 0, 0, 0, 0, 0, 0, 'Ragnaros defeated', 19034), +(263078, 11626, 0, 0, 26452, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263079, 12273, 0, 0, 27426, 1, 0, 0, 0, 0, 0, 0, 0, 'Commander Jordan''s denouncement & death', 19034), +(263080, 12273, 0, 1, 27427, 1, 0, 0, 0, 0, 0, 0, 0, 'Lead Cannoneer Zierhut''s denouncement & death', 19034), +(263081, 12273, 0, 2, 27428, 1, 0, 0, 0, 0, 0, 0, 0, 'Blacksmith Goodman''s denouncement & death', 19034), +(263082, 12273, 0, 3, 27429, 1, 0, 0, 0, 0, 0, 0, 0, 'Stable Master Mercer''s denouncement & death', 19034), +(263083, 8346, 0, 0, 15468, 1, 0, 0, 0, 0, 0, 0, 0, 'Arcane Torrent unleashed', 19034), +(263084, 14362, 1, 0, 49008, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263085, 12981, 1, 0, 42252, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263086, 10807, 0, 0, 21803, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263087, 10807, 0, 1, 21454, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263088, 10807, 0, 2, 21453, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263089, 25013, 1, 0, 2872, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263090, 11625, 1, 0, 35774, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263092, 28524, 1, 0, 64446, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263094, 10880, 1, 0, 31707, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263095, 12716, 1, 0, 39324, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263096, 12716, 1, 1, 39326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263097, 12716, 1, 2, 39328, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263098, 11315, 0, 0, 23763, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263099, 12243, 0, 0, 28013, 1, 0, 0, 0, 0, 0, 0, 0, 'Sails of the Sinner''s Folly set afire', 19034), +(263100, 12243, 1, 1, 37305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263101, 25976, 1, 0, 56235, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263102, 12551, 0, 0, 28002, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263103, 10840, 0, 0, 21370, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263104, 10840, 0, 1, 21368, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263105, 12855, 0, 0, 29677, 1, 0, 0, 0, 0, 0, 0, 0, 'Track down thief', 19034), +(263106, 12855, 0, 1, 29695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263107, 12698, 0, 0, 28845, 5, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Ghoul Returned', 19034), +(263108, 12105, 1, 0, 36940, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263109, 13112, 1, 0, 43099, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263110, 11386, 1, 0, 33860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263111, 11118, 0, 0, 23528, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263112, 11118, 0, 1, 23507, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263113, 11118, 0, 2, 23527, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263114, 11118, 1, 3, 32960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263115, 11612, 0, 0, 25353, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263116, 12598, 0, 0, 28352, 5, 0, 0, 0, 0, 0, 0, 0, 'Nerubian Tunnels Sealed', 19034), +(263117, 10545, 0, 0, 21241, 5, 0, 0, 0, 0, 0, 0, 0, 'Bladespire Ogres drunk', 19034), +(263118, 10545, 1, 1, 30353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263119, 11249, 0, 0, 23671, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263120, 11249, 1, 1, 33339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263121, 11246, 0, 0, 24095, 20, 0, 0, 0, 0, 0, 0, 0, 'Winterskorn Vrykul Dismembered', 19034), +(263123, 12164, 0, 0, 27579, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263124, 12164, 0, 1, 27580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263125, 12164, 0, 2, 27578, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263126, 12164, 0, 3, 27018, 1, 0, 0, 0, 0, 0, 0, 0, 'Shade of Arugal defeated', 19034), +(263127, 12070, 0, 0, 26261, 5, 0, 0, 0, 0, 0, 0, 0, 'Grizzly Hills Giants Rallied', 19034), +(263128, 12070, 0, 1, 26786, 5, 0, 0, 0, 0, 0, 0, 0, 'Iron Rune Avengers Slain', 19034), +(263129, 12153, 0, 0, 26405, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263130, 12734, 0, 0, 28040, 1, 0, 0, 0, 0, 0, 0, 0, 'Blade blooded on Sapphire Hive Wasp', 19034), +(263131, 12734, 0, 1, 36189, 1, 0, 0, 0, 0, 0, 0, 0, 'Blade blooded on Hardknuckle Charger', 19034), +(263132, 12734, 0, 2, 29043, 3, 0, 0, 0, 0, 0, 0, 0, 'Blade Blooded on Mistwhisper members', 19034), +(263133, 12734, 1, 3, 39577, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263134, 12050, 1, 0, 36733, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263135, 11294, 0, 0, 24202, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark Outside the Bank', 19034), +(263136, 11294, 0, 1, 24203, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Military Ward', 19034), +(263137, 11294, 0, 2, 24204, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Hall of Explorers', 19034), +(263138, 11294, 0, 3, 24205, 1, 0, 0, 0, 0, 0, 0, 0, 'Bark in the Mystic Ward', 19034), +(263139, 12848, 0, 0, 29519, 1, 0, 0, 0, 0, 0, 0, 0, 'Unworthy Initiate dominated', 19034), +(263140, 28523, 1, 0, 21383, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263141, 12708, 0, 0, 28882, 12, 0, 0, 0, 0, 0, 0, 0, 'Enchanted Tiki Warriors destroyed', 19034), +(263142, 12029, 0, 0, 26612, 20, 0, 0, 0, 0, 0, 0, 0, 'Scourge Trolls Burned', 19034), +(263143, 12154, 0, 0, 27075, 1, 0, 0, 0, 0, 0, 0, 0, 'Dun Argol Power Core Destroyed', 19034), +(263145, 12750, 0, 0, 29071, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263146, 11349, 1, 0, 33794, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263147, 12635, 1, 0, 38677, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263149, 11288, 1, 0, 33485, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263150, 11052, 1, 0, 32646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263151, 12615, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263152, 10825, 1, 0, 31489, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263154, 12799, 1, 0, 40066, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263156, 12964, 1, 0, 42109, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263157, 14128, 1, 0, 47040, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263158, 12754, 1, 0, 39646, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263159, 12754, 1, 1, 39647, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263160, 12102, 1, 0, 36803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263161, 12679, 1, 0, 39160, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263162, 11982, 0, 0, 26264, 5, 0, 0, 0, 0, 0, 0, 0, 'Iron Dwarf Operations Disrupted', 19034), +(263163, 11449, 0, 0, 23537, 5, 0, 0, 0, 0, 0, 0, 0, 'Fight Fires', 19034), +(263164, 12041, 1, 0, 36735, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263165, 12640, 0, 0, 28452, 7, 0, 0, 0, 0, 0, 0, 0, 'Elemental Rifts sealed', 19034), +(263166, 12748, 0, 0, 29072, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263168, 12707, 0, 0, 28876, 12, 0, 0, 0, 0, 0, 0, 0, 'Mam''toth Disciples trampled to death', 19034), +(263169, 12722, 0, 0, 28984, 10, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusade Soldier slain', 19034), +(263170, 12722, 0, 1, 28986, 15, 0, 0, 0, 0, 0, 0, 0, 'Citizen of New Avalon slain', 19034), +(263171, 12961, 1, 0, 43274, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263172, 11427, 1, 0, 34032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263173, 12217, 0, 0, 26369, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263174, 12587, 0, 0, 28042, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Brandon''s Task', 19034), +(263175, 12587, 0, 1, 28044, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Rupert''s Task', 19034), +(263176, 12587, 0, 2, 28043, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Grondel''s Task', 19034), +(263177, 12587, 0, 3, 28205, 1, 0, 0, 0, 0, 0, 0, 0, 'Alchemist Finklestein''s Task', 19034), +(263178, 12572, 1, 0, 38575, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263179, 12611, 0, 0, 28443, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263180, 12328, 1, 0, 37662, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263181, 12565, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263182, 11275, 1, 0, 33351, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263183, 12744, 0, 0, 29067, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263184, 12742, 0, 0, 29061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263185, 12756, 1, 0, 39654, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263186, 12003, 0, 0, 26468, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate North Building', 19034), +(263187, 12003, 0, 1, 26470, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate East Building', 19034), +(263188, 12003, 0, 2, 26469, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate South Building', 19034), +(263189, 12067, 1, 0, 36756, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263191, 24861, 0, 0, 38438, 1, 0, 0, 0, 0, 0, 0, 0, 'Offering Placed', 19034), +(263192, 11247, 0, 0, 24098, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Longhouse Set Ablaze', 19034), +(263193, 11247, 0, 1, 24100, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Longhouse Set Ablaze', 19034), +(263194, 11247, 0, 2, 24102, 1, 0, 0, 0, 0, 0, 0, 0, 'Barracks Set Ablaze', 19034), +(263195, 14308, 0, 0, 36025, 8, 0, 0, 0, 0, 0, 0, 0, 'Lab Fires Extinguished', 19034), +(263196, 14308, 0, 1, 36061, 6, 0, 0, 0, 0, 0, 0, 0, 'Research Interns Rescued', 19034), +(263197, 14308, 1, 2, 49132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263198, 11985, 0, 0, 26348, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263199, 12683, 0, 0, 28771, 5, 0, 0, 0, 0, 0, 0, 0, 'Sputum Samples Collected', 19034), +(263200, 12683, 0, 1, 28003, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263201, 12683, 1, 2, 39164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263202, 12861, 0, 0, 29686, 8, 0, 0, 0, 0, 0, 0, 0, 'Captured Rageclaw Freed', 19034), +(263203, 12462, 0, 0, 27805, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263204, 12462, 0, 1, 27826, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263205, 12462, 0, 2, 27825, 15, 0, 0, 0, 0, 0, 0, 0, 'Naxxramas Scourge slain', 19034), +(263206, 10850, 1, 0, 31653, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263207, 13174, 1, 0, 43688, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263208, 13174, 1, 1, 43689, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263209, 13174, 1, 2, 43691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263210, 13174, 1, 3, 43690, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263211, 12736, 0, 0, 29056, 1, 0, 0, 0, 0, 0, 0, 0, 'Contemplation at Glimmering Pillar', 19034), +(263212, 12736, 0, 1, 29057, 1, 0, 0, 0, 0, 0, 0, 0, 'Contemplation at Mosslight Pillar', 19034), +(263213, 12736, 0, 2, 29069, 1, 0, 0, 0, 0, 0, 0, 0, 'Contemplation at Skyreach Pillar', 19034), +(263214, 12736, 0, 3, 29058, 1, 0, 0, 0, 0, 0, 0, 0, 'Contemplation at Suntouched Pillar', 19034), +(263216, 11717, 1, 0, 34976, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263217, 14342, 0, 0, 35591, 10, 0, 0, 0, 0, 0, 0, 0, 'Lesser Infernals Destroyed', 19034), +(263218, 12096, 0, 0, 26321, 3, 0, 0, 0, 0, 0, 0, 0, 'Lothalor Ancient strengthened', 19034), +(263219, 12459, 0, 0, 27821, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263220, 12459, 0, 1, 27809, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263221, 12459, 0, 2, 27807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263222, 30771, 1, 0, 81174, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263224, 13361, 0, 0, 32797, 1, 0, 0, 0, 0, 0, 0, 0, 'The Prince''s Destiny', 19034), +(263225, 10698, 1, 0, 21438, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263226, 12745, 0, 0, 29068, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263227, 11980, 0, 0, 26402, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263228, 12971, 0, 0, 30012, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263229, 12758, 1, 0, 39667, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263230, 13326, 1, 0, 44326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263231, 12165, 1, 0, 36848, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263232, 12930, 1, 0, 41614, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263233, 12930, 1, 1, 33470, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263234, 14322, 0, 0, 36147, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263235, 28522, 1, 0, 21383, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263236, 11868, 0, 0, 25803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263237, 12137, 1, 0, 36859, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263238, 12137, 1, 1, 36868, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263240, 12045, 1, 0, 36728, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263241, 12190, 1, 0, 38144, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263242, 26592, 1, 0, 59031, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263243, 26592, 1, 1, 59032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263244, 12448, 0, 0, 27685, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263245, 12448, 0, 1, 27686, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263246, 12448, 0, 2, 27531, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263247, 10888, 0, 0, 17257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263248, 12513, 1, 0, 38329, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263249, 12627, 2, 0, 190618, 1, 0, 0, 0, 0, 0, 0, 0, 'Blue Cauldron disturbed', 19034), +(263250, 12627, 2, 1, 190630, 1, 0, 0, 0, 0, 0, 0, 0, 'Green Cauldron disturbed', 19034), +(263251, 12627, 2, 2, 190619, 1, 0, 0, 0, 0, 0, 0, 0, 'Purple Cauldron disturbed', 19034), +(263252, 12627, 2, 3, 190620, 1, 0, 0, 0, 0, 0, 0, 0, 'Red Cauldron disturbed', 19034), +(263253, 12483, 1, 0, 35798, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263254, 12483, 1, 1, 35782, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263255, 12483, 1, 2, 37087, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263256, 12072, 0, 0, 26607, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263257, 12713, 1, 0, 40425, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263258, 12085, 1, 0, 36780, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263259, 12245, 0, 0, 27376, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263260, 12245, 0, 1, 27378, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263261, 12245, 0, 2, 27379, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263262, 12245, 0, 3, 27381, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263263, 12622, 1, 0, 38637, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263264, 12622, 1, 1, 38639, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263265, 12622, 1, 2, 38638, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263267, 30769, 0, 0, 60647, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263268, 30770, 0, 0, 60669, 8, 0, 0, 887, 888, 0, 0, 0, 'Yaks or Steppebeasts freed', 19034), +(263269, 12469, 1, 0, 37922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263270, 12269, 1, 0, 37411, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263271, 12678, 0, 0, 28763, 10, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader slain', 19034), +(263272, 12678, 0, 1, 28764, 10, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire slain', 19034), +(263274, 27220, 0, 0, 23928, 1, 0, 0, 0, 0, 0, 0, 0, 'Fish Paste Tested', 19034), +(263275, 27220, 1, 1, 33166, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263276, 11087, 1, 0, 29906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263277, 11087, 1, 1, 29905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263278, 12000, 1, 0, 35783, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263279, 12372, 0, 0, 27608, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263280, 12372, 0, 1, 27682, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263281, 12372, 0, 2, 27698, 1, 0, 0, 0, 0, 0, 0, 0, 'Destabilize the Azure Dragonshrine', 19034), +(263282, 12514, 1, 0, 38326, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263283, 12455, 1, 0, 37879, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263284, 26102, 0, 0, 42010, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263285, 12417, 0, 0, 27530, 6, 0, 0, 0, 0, 0, 0, 0, 'Ruby Keeper Returned to the Earth', 19034), +(263286, 12637, 0, 0, 28532, 1, 0, 0, 0, 0, 0, 0, 0, 'Choker''s Purpose Exposed', 19034), +(263287, 12605, 1, 0, 38600, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263288, 12512, 0, 0, 28136, 1, 0, 0, 0, 0, 0, 0, 0, 'Saved Crusader Jonathan', 19034), +(263289, 12512, 0, 1, 28142, 1, 0, 0, 0, 0, 0, 0, 0, 'Saved Crusader Lamoof', 19034), +(263290, 12512, 0, 2, 28148, 1, 0, 0, 0, 0, 0, 0, 0, 'Saved Crusader Josephine', 19034), +(263291, 30772, 0, 0, 60692, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263292, 30773, 0, 0, 60759, 6, 0, 0, 889, 0, 0, 0, 0, 'Osul Ballistas destroyed', 19034), +(263293, 12704, 1, 0, 38575, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263294, 13056, 0, 0, 30167, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263295, 12717, 1, 0, 39329, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263296, 12986, 0, 0, 30315, 1, 0, 0, 0, 0, 0, 0, 0, 'Temple of Invention Investigated', 19034), +(263297, 12986, 0, 1, 30317, 1, 0, 0, 0, 0, 0, 0, 0, 'Temple of Winter Investigated', 19034), +(263298, 12986, 0, 2, 30316, 1, 0, 0, 0, 0, 0, 0, 0, 'Temple of Life Investigated', 19034), +(263299, 12986, 0, 3, 30318, 1, 0, 0, 0, 0, 0, 0, 0, 'Temple of Order Investigated', 19034), +(263300, 12739, 0, 0, 29032, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263301, 12820, 0, 0, 29618, 12, 0, 0, 0, 0, 0, 0, 0, 'Garm Attackers slain', 19034), +(263302, 12205, 0, 0, 27203, 20, 0, 0, 0, 0, 0, 0, 0, 'Members of the Scarlet Onslaught slain', 19034), +(263303, 12664, 0, 0, 28663, 1, 0, 0, 0, 0, 0, 0, 0, 'Tour of Zul''Drak complete', 19034), +(263304, 12606, 0, 0, 28415, 3, 0, 0, 0, 0, 0, 0, 0, 'Freed Captive Footmen', 19034), +(263305, 12728, 0, 0, 25309, 1, 0, 0, 0, 0, 0, 0, 0, 'Winterfin Cavern Reading Taken', 19034), +(263309, 26007, 0, 0, 41885, 1, 0, 0, 0, 0, 0, 0, 0, 'Gurrok Debriefed', 19034), +(263310, 12900, 1, 0, 41424, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263311, 12039, 1, 0, 36725, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263312, 27880, 0, 0, 2717, 12, 0, 0, 0, 0, 0, 0, 0, 'Dustbelcher combatant slain', 19034), +(263316, 12166, 0, 0, 27111, 6, 0, 0, 0, 0, 0, 0, 0, 'Blighted Elk''s corpse cleansed', 19034), +(263317, 12166, 0, 1, 27112, 6, 0, 0, 0, 0, 0, 0, 0, 'Rabid Grizzly''s corpse cleansed', 19034), +(263318, 12638, 0, 0, 28532, 1, 0, 0, 0, 0, 0, 0, 0, 'Choker''s purpose exposed', 19034), +(263319, 12624, 1, 0, 38642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263320, 12274, 0, 0, 27445, 1, 0, 0, 0, 0, 0, 0, 0, 'Abbey bell rung', 19034), +(263321, 12274, 0, 1, 27444, 1, 0, 0, 0, 0, 0, 0, 0, 'High Abbot spoken with', 19034), +(263322, 12525, 0, 0, 28186, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263323, 12525, 0, 1, 28188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263324, 12159, 0, 0, 27561, 8, 0, 0, 0, 0, 0, 0, 0, 'Miner at Rest', 19034), +(263325, 12891, 1, 0, 41359, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263326, 12891, 1, 1, 41361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263327, 12891, 1, 2, 41362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263328, 12891, 1, 3, 41363, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263329, 28649, 0, 0, 49355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263330, 13195, 1, 0, 44809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263331, 12798, 1, 0, 42922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263334, 12962, 1, 0, 43275, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263335, 13040, 1, 0, 42770, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263336, 11615, 1, 0, 34719, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263337, 28650, 0, 0, 49356, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263338, 13049, 1, 0, 42782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263339, 13049, 1, 1, 42783, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263340, 12992, 0, 0, 29880, 15, 0, 0, 0, 0, 0, 0, 0, 'Jotunheim vrykul slain', 19034), +(263341, 12303, 1, 0, 37580, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263342, 12665, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263343, 12026, 1, 0, 35738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263344, 28120, 1, 0, 63034, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263347, 12994, 0, 0, 30222, 3, 0, 0, 0, 0, 0, 0, 0, 'Stormforged Infiltrators Slain', 19034), +(263348, 12546, 0, 0, 28271, 200, 0, 0, 0, 0, 0, 0, 0, 'Scourge Minions destroyed', 19034), +(263349, 12546, 0, 1, 28212, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263350, 12546, 0, 2, 28103, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263351, 12546, 0, 3, 28208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263352, 24928, 0, 0, 38660, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Shack', 19034), +(263353, 24928, 0, 1, 38662, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwest Shack', 19034), +(263354, 24928, 0, 2, 38665, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Shack', 19034), +(263355, 14311, 0, 0, 36123, 5, 0, 0, 0, 0, 0, 0, 0, 'Cenarion Seeds planted', 19034), +(263356, 12791, 1, 0, 39740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263357, 12732, 1, 0, 39575, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263358, 14335, 0, 0, 11563, 5, 0, 0, 0, 0, 0, 0, 0, 'Drysnap Pincers slain', 19034), +(263359, 14335, 0, 1, 11562, 5, 0, 0, 0, 0, 0, 0, 0, 'Drysnap Crawlers slain', 19034), +(263360, 12617, 0, 0, 28373, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263362, 12540, 0, 0, 28325, 1, 0, 0, 0, 0, 0, 0, 0, 'Locate Injured Rainspeaker Oracle', 19034), +(263363, 12955, 0, 0, 30086, 1, 0, 0, 0, 0, 0, 0, 0, 'Sigrid Iceborn defeated', 19034), +(263364, 12955, 0, 1, 30081, 1, 0, 0, 0, 0, 0, 0, 0, 'Efrem the Faithful defeated', 19034), +(263365, 12955, 0, 2, 30180, 1, 0, 0, 0, 0, 0, 0, 0, 'Onu''zun defeated', 19034), +(263366, 12955, 0, 3, 30162, 1, 0, 0, 0, 0, 0, 0, 0, 'Tinky Wickwhistle defeated', 19034), +(263367, 12976, 1, 0, 42163, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263368, 13000, 1, 0, 42510, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263369, 12691, 1, 0, 39227, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263370, 12220, 0, 0, 27263, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Heart', 19034), +(263371, 12220, 0, 1, 27264, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Limb', 19034), +(263372, 12220, 0, 2, 27265, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Tears', 19034), +(263375, 26092, 1, 0, 56811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263376, 13009, 1, 0, 42700, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263377, 12248, 1, 0, 37303, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263378, 12167, 1, 0, 36957, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263379, 13084, 2, 0, 191820, 10, 0, 0, 0, 0, 0, 0, 0, 'Vrykul banners burned', 19034), +(263380, 13089, 1, 0, 43013, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263381, 12817, 1, 0, 22892, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263382, 12817, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263383, 12666, 1, 0, 39150, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263384, 14385, 0, 0, 36420, 1, 0, 0, 0, 0, 0, 0, 0, 'Try to Feed Gormungan', 19034), +(263385, 14385, 1, 1, 49230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263386, 12596, 0, 0, 28042, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Brandon''s Task', 19034), +(263387, 12596, 0, 1, 28044, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Rupert''s Task', 19034), +(263388, 12596, 0, 2, 28043, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Grondel''s Task', 19034), +(263389, 12596, 0, 3, 28205, 1, 0, 0, 0, 0, 0, 0, 0, 'Alchemist Finklestein''s Task', 19034), +(263390, 12300, 0, 0, 27493, 1, 0, 0, 0, 0, 0, 0, 0, 'Test of Mettle', 19034), +(263391, 12545, 0, 0, 28270, 15, 0, 0, 0, 0, 0, 0, 0, 'Jintha''kalar Scourge Slain', 19034), +(263392, 12908, 1, 0, 41428, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263393, 12699, 1, 0, 39264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263394, 13039, 0, 0, 30402, 15, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Depths Nerubians slain', 19034), +(263395, 12658, 1, 0, 38705, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263396, 12813, 0, 0, 29398, 10, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Onslaught corpse transformed', 19034), +(263397, 12504, 0, 0, 28041, 10, 0, 0, 0, 0, 0, 0, 0, 'Argent Soldiers told to report back to the sergeant', 19034), +(263398, 12416, 0, 0, 27685, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263399, 12416, 0, 1, 27686, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263400, 12416, 0, 2, 27531, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263401, 12796, 1, 0, 39740, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263402, 12173, 0, 0, 27135, 1, 0, 0, 0, 0, 0, 0, 0, 'Attuned to the Ley Lines of Northrend', 19034), +(263403, 12260, 0, 0, 27419, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest''s image stolen', 19034), +(263404, 12260, 1, 1, 37381, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263405, 12997, 0, 0, 30174, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263406, 27316, 1, 0, 60959, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263408, 12840, 0, 0, 29489, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Welsington beaten for information and killed', 19034), +(263409, 12840, 0, 1, 29490, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Hartford beaten for information and killed', 19034), +(263410, 12444, 0, 0, 51312, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde in Blackriver slain', 19034), +(263411, 12412, 0, 0, 27546, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263412, 12412, 0, 1, 27547, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263413, 29768, 1, 0, 74298, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263414, 29769, 0, 0, 55483, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263415, 29770, 1, 0, 74295, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263416, 29770, 1, 1, 74296, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263417, 29770, 1, 2, 74297, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263418, 30774, 0, 0, 60730, 4, 0, 0, 892, 0, 0, 0, 0, 'Longying Ranger rescued', 19034), +(263419, 30774, 0, 1, 60899, 1, 0, 0, 505, 0, 0, 0, 0, 'Free Lin Silentstrike', 19034), +(263420, 12575, 0, 0, 28105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263421, 12575, 1, 1, 38601, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263427, 12258, 0, 0, 27370, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263428, 12749, 0, 0, 29073, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263430, 12507, 1, 0, 38321, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263431, 12246, 1, 0, 37251, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263432, 12680, 0, 0, 28767, 1, 0, 0, 0, 0, 0, 0, 0, 'Horse Successfully Stolen', 19034), +(263433, 12450, 0, 0, 27539, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263434, 12450, 0, 1, 27680, 1, 0, 0, 0, 0, 0, 0, 0, 'Ruby Corruption Cleansed', 19034), +(263435, 12130, 1, 0, 36852, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263436, 12522, 1, 0, 38334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263437, 12931, 0, 0, 29377, 10, 0, 0, 0, 0, 0, 0, 0, 'Stormforged Attacker slain', 19034), +(263438, 27396, 1, 0, 60880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263439, 27396, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263440, 27396, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263441, 12868, 0, 0, 29794, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263442, 12477, 1, 0, 37931, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263444, 12151, 1, 0, 36853, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263448, 13228, 0, 0, 31272, 1, 0, 0, 0, 0, 0, 0, 0, 'Dying Berserker Questioned', 19034), +(263449, 12270, 0, 0, 27396, 3, 0, 0, 0, 0, 0, 0, 0, 'Shredder delivered', 19034), +(263450, 30775, 0, 0, 60728, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263451, 30775, 0, 1, 60725, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263452, 30775, 0, 2, 60726, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263453, 30776, 0, 0, 60801, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263454, 12729, 1, 0, 39540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263455, 12729, 1, 1, 39541, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263456, 11990, 1, 0, 3371, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263457, 11990, 1, 1, 37085, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263458, 11990, 1, 2, 35795, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263459, 12827, 1, 0, 40645, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263460, 12887, 0, 0, 29803, 1, 0, 0, 0, 0, 0, 0, 0, 'The Ocular has been destroyed', 19034), +(263461, 12884, 1, 0, 41262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263462, 12592, 0, 0, 53183, 60, 0, 0, 0, 0, 0, 0, 0, 'Game Animals Killed', 19034), +(263463, 12058, 2, 0, 188264, 1, 0, 0, 0, 0, 0, 0, 0, 'First Prophecy Deciphered', 19034), +(263464, 12058, 2, 1, 188288, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Prophecy Deciphered', 19034), +(263465, 12058, 2, 2, 188289, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Prophecy Deciphered', 19034), +(263466, 12467, 1, 0, 37920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263467, 12149, 0, 0, 27007, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263468, 12149, 0, 1, 27008, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263469, 12149, 0, 2, 27009, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263470, 14266, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(263471, 14266, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(263472, 12920, 0, 0, 29579, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Brann', 19034), +(263473, 12968, 0, 0, 30046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263474, 24772, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(263475, 24772, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(263476, 12279, 1, 0, 37501, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263477, 12418, 0, 0, 27539, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263478, 12418, 0, 1, 27680, 1, 0, 0, 0, 0, 0, 0, 0, 'Ruby Corruption Cleansed', 19034), +(263479, 13133, 0, 0, 30880, 1, 0, 0, 0, 0, 0, 0, 0, 'Iskalder delivered to The Bone Witch', 19034), +(263480, 13327, 1, 0, 44294, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263481, 12584, 1, 0, 38562, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263482, 12230, 1, 0, 37248, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263483, 11559, 1, 0, 34597, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263484, 12323, 0, 0, 27568, 20, 0, 0, 0, 0, 0, 0, 0, 'Venture Company Stragglers smoked out', 19034), +(263485, 12073, 0, 0, 26270, 10, 0, 0, 0, 0, 0, 0, 0, 'Iron Dwarf Defenders Killed', 19034), +(263486, 12100, 0, 0, 26874, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263487, 12100, 1, 1, 36800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263488, 12053, 1, 0, 36738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263489, 12660, 2, 0, 190590, 4, 0, 0, 0, 0, 0, 0, 0, 'Unstable Explosives destroyed', 19034), +(263490, 12091, 0, 0, 26838, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263491, 12733, 0, 0, 29025, 5, 0, 0, 0, 0, 0, 0, 0, 'Death Knights defeated in a duel', 19034), +(263492, 12967, 0, 0, 30125, 10, 0, 0, 0, 0, 0, 0, 0, 'Seething Revenants slain', 19034), +(263493, 12629, 1, 0, 38686, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263494, 12629, 1, 1, 38687, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263495, 12619, 1, 0, 38631, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263496, 13883, 1, 0, 46357, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263497, 12211, 0, 0, 27280, 15, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Onslaught corpses picked clean', 19034), +(263498, 12589, 0, 0, 28053, 1, 0, 0, 0, 0, 0, 0, 0, 'Shot apple on Lucky Wilhelm''s Head', 19034), +(263499, 12437, 0, 0, 27702, 1, 0, 0, 0, 0, 0, 0, 0, 'Horde Lumberboat destroyed', 19034), +(263500, 12464, 1, 0, 37565, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 263500 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(263501, 27822, 0, 0, 46486, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263502, 12172, 0, 0, 27135, 1, 0, 0, 0, 0, 0, 0, 0, 'Attuned to the Ley Lines of Northrend', 19034), +(263503, 13010, 0, 0, 30327, 1, 0, 0, 0, 0, 0, 0, 0, 'Krolmir''s Fate Discovered', 19034), +(263504, 13010, 6, -1, 1119, 3000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263505, 12502, 0, 0, 28064, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Crusade Banner South', 19034), +(263506, 12502, 0, 1, 28304, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Crusade Banner North', 19034), +(263507, 12502, 0, 2, 28305, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Crusade Banner East', 19034), +(263508, 12084, 0, 0, 26831, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley line focus information retrieved', 19034), +(263509, 14316, 1, 0, 49164, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263510, 12673, 0, 0, 28740, 7, 0, 0, 0, 0, 0, 0, 0, 'Blight Crystals collected', 19034), +(263511, 12673, 1, 1, 39157, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263512, 30597, 1, 0, 80240, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263513, 30597, 1, 1, 72238, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263514, 12550, 2, 0, 190700, 3, 0, 0, 0, 0, 0, 0, 0, 'Shango Track identified', 19034), +(263515, 12872, 1, 0, 41258, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263516, 13309, 0, 0, 32224, 4, 0, 0, 0, 0, 0, 0, 0, 'Skybreaker Infiltrators dropped', 19034), +(263517, 14374, 0, 0, 11937, 6, 0, 0, 0, 0, 0, 0, 0, 'Portals Banished', 19034), +(263519, 12914, 1, 0, 41504, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263520, 12914, 1, 1, 41503, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263522, 11655, 1, 0, 34814, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263523, 14196, 0, 0, 35392, 1, 0, 0, 0, 0, 0, 0, 0, 'Raging Vortex Created', 19034), +(263524, 12991, 0, 0, 29376, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263525, 12613, 2, 0, 190509, 1, 0, 0, 0, 0, 0, 0, 0, 'Activation Switch Theta', 19034), +(263526, 12207, 1, 0, 37199, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263527, 13037, 0, 0, 30381, 1, 0, 0, 0, 0, 0, 0, 0, 'Ask Chieftain Swiftspear about his memories', 19034), +(263528, 12240, 0, 0, 27238, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263529, 30778, 0, 0, 60925, 20, 0, 0, 0, 0, 0, 0, 0, 'Palewind Villagers burned', 19034), +(263530, 30779, 0, 0, 60932, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263531, 30780, 1, 0, 81355, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263533, 12202, 0, 0, 26885, 8, 0, 0, 0, 0, 0, 0, 0, 'Iron Dwarf Images Captured', 19034), +(263534, 12202, 1, 1, 37125, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263535, 12960, 1, 0, 43272, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263536, 12289, 0, 0, 56891, 15, 0, 0, 0, 0, 0, 0, 0, 'Horde units eliminated', 19034), +(263537, 13602, 0, 0, 3711, 15, 0, 0, 0, 0, 0, 0, 0, 'Wrathtail naga slain', 19034), +(263538, 12195, 1, 0, 37104, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263539, 12549, 0, 0, 28001, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263540, 12315, 0, 0, 27509, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263541, 13411, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(263542, 13411, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(263543, 13411, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(263544, 12674, 0, 0, 28753, 1, 0, 0, 0, 0, 0, 0, 0, 'High Priest Mu''funu hexed at death', 19034), +(263545, 12674, 0, 1, 28755, 1, 0, 0, 0, 0, 0, 0, 0, 'High Priestess Tua-Tua hexed at death', 19034), +(263546, 12674, 0, 2, 28757, 1, 0, 0, 0, 0, 0, 0, 0, 'High Priest Hawinni hexed at death', 19034), +(263547, 12244, 0, 0, 27396, 3, 0, 0, 0, 0, 0, 0, 0, 'Shredder Delivered', 19034), +(263548, 9520, 1, 0, 23780, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263549, 30781, 0, 0, 60948, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Smoke Trail examined', 19034), +(263550, 30781, 0, 1, 60949, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Smoke Trail examined', 19034), +(263551, 30781, 0, 2, 60950, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Smoke Trail examined', 19034), +(263552, 30782, 0, 0, 61025, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263553, 30783, 0, 0, 61054, 8, 0, 0, 1036, 0, 0, 0, 0, 'Crazed Shado-Pan Rangers purified', 19034), +(263554, 30784, 0, 0, 61055, 1, 1, 0, 0, 0, 0, 0, 0, 'Find Suna Silentstrike', 19034), +(263555, 12969, 0, 0, 30154, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263556, 13949, 0, 0, 53613, 1, 0, 0, 0, 0, 0, 0, 0, 'Caravan Escorted', 19034), +(263557, 13949, 1, 1, 46714, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263558, 12703, 0, 0, 28111, 50, 0, 0, 0, 0, 0, 0, 0, 'Sparktouched Gorloc slain', 19034), +(263560, 12530, 0, 0, 28213, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263561, 12515, 1, 0, 38329, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263562, 13006, 1, 0, 42640, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263563, 12449, 0, 0, 27530, 6, 0, 0, 0, 0, 0, 0, 0, 'Ruby Keeper Returned to the Earth', 19034), +(263564, 12560, 1, 0, 38553, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263565, 13162, 0, 0, 31161, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263566, 12852, 0, 0, 29627, 1, 0, 0, 0, 0, 0, 0, 0, 'Grand Admiral Westwind dealt with', 19034), +(263567, 12556, 1, 0, 38522, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263568, 12958, 1, 0, 43269, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263570, 13007, 0, 0, 30300, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263571, 12576, 0, 0, 28080, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263572, 12576, 0, 1, 28081, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263573, 11792, 1, 0, 35122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263576, 12508, 0, 0, 28036, 10, 0, 0, 0, 0, 0, 0, 0, 'Followers of Sseratus slain', 19034), +(263577, 12061, 0, 0, 27853, 1, 0, 0, 0, 0, 0, 0, 0, 'Object on the Surge Needle observed', 19034), +(263578, 12065, 0, 0, 26773, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley line focus information retrieved', 19034), +(263579, 14373, 0, 0, 35591, 10, 0, 0, 0, 0, 0, 0, 0, 'Lesser Infernals Destroyed', 19034), +(263580, 12253, 0, 0, 27359, 6, 0, 0, 0, 0, 0, 0, 0, 'Trapped Wintergarde Villager Rescued', 19034), +(263581, 13142, 0, 0, 31016, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263582, 12989, 0, 0, 29605, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263583, 12277, 0, 0, 27436, 1, 0, 0, 0, 0, 0, 0, 0, 'Upper Wintergarde Mine Shaft Destroyed', 19034), +(263584, 12277, 0, 1, 27437, 1, 0, 0, 0, 0, 0, 0, 0, 'Lower Wintergarde Mine Shaft Destroyed', 19034), +(263585, 12415, 0, 0, 27221, 15, 0, 0, 0, 0, 0, 0, 0, 'Highland Mustangs Frightened', 19034), +(263586, 12047, 1, 0, 36730, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263587, 12963, 1, 0, 43276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263588, 12610, 1, 0, 38620, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263589, 13259, 0, 0, 31413, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263590, 13178, 0, 0, 31086, 10, 0, 0, 0, 0, 0, 0, 0, 'Alliance members slain', 19034), +(263591, 12830, 1, 0, 40744, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263592, 25093, 1, 0, 52346, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263593, 25093, 1, 1, 52347, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263594, 25093, 1, 2, 52349, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263595, 14295, 0, 0, 35880, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263596, 14295, 0, 1, 35881, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263597, 12706, 1, 0, 39269, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263598, 12580, 0, 0, 28644, 6, 0, 0, 0, 0, 0, 0, 0, 'Mosswalker Victims Rescued', 19034), +(263599, 12712, 1, 0, 39318, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263600, 27315, 0, 0, 45387, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263602, 12957, 0, 0, 51933, 6, 0, 0, 0, 0, 0, 0, 0, 'Attempt to free Captive Mechagnome', 19034), +(263603, 12957, 0, 1, 29369, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263604, 12282, 1, 0, 37538, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263605, 12126, 1, 0, 36836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263606, 12888, 1, 0, 39681, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263607, 12888, 1, 1, 39682, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263608, 12888, 1, 2, 41267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263609, 13365, 0, 0, 32314, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Messenger summoned', 19034), +(263610, 12988, 0, 0, 30209, 1, 0, 0, 0, 0, 0, 0, 0, 'North Lightning Forge damaged', 19034), +(263611, 12988, 0, 1, 30211, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Lightning Forge damaged', 19034), +(263612, 12988, 0, 2, 30212, 1, 0, 0, 0, 0, 0, 0, 0, 'South Lightning Forge damaged', 19034), +(263613, 12506, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263614, 12804, 1, 0, 40394, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263615, 13240, 0, 0, 27641, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263616, 11797, 0, 0, 25227, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263617, 11993, 2, 0, 188264, 1, 0, 0, 0, 0, 0, 0, 0, 'First Prophecy Deciphered', 19034), +(263618, 11993, 2, 1, 188288, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Prophecy Deciphered', 19034), +(263619, 11993, 2, 2, 188289, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Prophecy Deciphered', 19034), +(263620, 27314, 0, 0, 45387, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263621, 12823, 0, 0, 29999, 1, 0, 0, 0, 0, 0, 0, 0, 'Place Explosive Bundle', 19034), +(263622, 12823, 0, 1, 29626, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263623, 12299, 0, 0, 27424, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263624, 12787, 1, 0, 40482, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263625, 12458, 1, 0, 37882, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263626, 26873, 1, 0, 5339, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263627, 27317, 1, 0, 60959, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263628, 11613, 0, 0, 25522, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263629, 11613, 0, 1, 25521, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263630, 11960, 1, 0, 35692, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263631, 12702, 1, 0, 38483, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263632, 12111, 0, 0, 26895, 5, 0, 0, 0, 0, 0, 0, 0, 'Snowfall Elk Inoculated', 19034), +(263633, 12111, 0, 1, 26882, 5, 0, 0, 0, 0, 0, 0, 0, 'Arctic Grizzly Inoculated', 19034), +(263634, 13673, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263635, 12865, 0, 0, 29816, 8, 0, 0, 0, 0, 0, 0, 0, 'Stormcrest Eagles fed', 19034), +(263636, 12196, 1, 0, 36852, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263637, 27312, 0, 0, 45381, 20, 0, 0, 0, 0, 0, 0, 0, 'Grimtotem on Darkcloud Pinnacle slain', 19034), +(263638, 12871, 1, 0, 41258, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263639, 14035, 0, 0, 34738, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Slow-Roasted Turkey', 19034), +(263640, 14035, 1, 1, 44838, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263641, 13182, 2, 0, 193051, 6, 0, 0, 0, 0, 0, 0, 0, 'Nerubian Scourge Eggs Destroyed', 19034), +(263642, 28520, 0, 0, 47753, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263643, 13003, 0, 0, 30415, 1, 0, 0, 0, 0, 0, 0, 0, 'Wild Wyrm Slain', 19034), +(263644, 27612, 0, 0, 46102, 1, 0, 0, 0, 0, 0, 0, 0, 'Open portal within Hall of Arms', 19034), +(263645, 27612, 0, 1, 46103, 1, 0, 0, 0, 0, 0, 0, 0, 'Open portal within Library Wing', 19034), +(263646, 13671, 0, 0, 33192, 8, 0, 0, 0, 0, 0, 0, 0, 'Icecrown Scourge slain', 19034), +(263647, 28530, 1, 0, 64449, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263648, 12833, 0, 0, 29618, 12, 0, 0, 0, 0, 0, 0, 0, 'Garm Invader slain', 19034), +(263649, 12672, 1, 0, 39156, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263650, 12996, 0, 0, 30221, 1, 0, 0, 0, 0, 0, 0, 0, 'Kirgaraak Defeated', 19034), +(263651, 27313, 0, 0, 45381, 20, 0, 0, 0, 0, 0, 0, 0, 'Grimtotem on Darkcloud Pinnacle slain', 19034), +(263652, 12218, 0, 0, 27290, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263653, 14141, 0, 0, 34899, 8, 0, 0, 0, 0, 0, 0, 0, 'Snowblind Follower captured', 19034), +(263654, 12646, 1, 0, 38695, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263655, 12876, 0, 0, 29586, 10, 0, 0, 0, 0, 0, 0, 0, 'Stormforged Invaders slain', 19034), +(263656, 12442, 0, 0, 27334, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263657, 12620, 0, 0, 28595, 1, 0, 0, 0, 0, 0, 0, 0, 'The Lifewarden''s Wrath', 19034), +(263658, 26942, 0, 0, 7800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263660, 13090, 1, 0, 43013, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263661, 13307, 0, 0, 31900, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263662, 13307, 0, 1, 32255, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263663, 13307, 0, 2, 32257, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263664, 13207, 0, 0, 27978, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann''s Exploration complete', 19034), +(263665, 13148, 1, 0, 43298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263666, 12571, 0, 0, 28011, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263667, 12571, 0, 1, 28358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263668, 12267, 0, 0, 27450, 1, 0, 0, 0, 0, 0, 0, 0, 'Summoning Area Cleansed', 19034), +(263669, 12267, 0, 1, 27355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263670, 12181, 1, 0, 37027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263671, 9522, 1, 0, 45477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263672, 9522, 1, 1, 45476, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263673, 12843, 0, 0, 29466, 5, 0, 0, 0, 0, 0, 0, 0, 'Goblin Prisoner freed', 19034), +(263674, 12101, 1, 0, 36800, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263675, 12597, 1, 0, 38552, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263676, 12970, 0, 0, 30467, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Lok''lira''s proposal', 19034), +(263677, 30295, 1, 0, 79250, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263678, 12724, 1, 0, 39504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263679, 12216, 1, 0, 37200, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263680, 14314, 0, 0, 36134, 1, 0, 0, 0, 0, 0, 0, 0, 'Kolkar Prisoners Freed', 19034), +(263681, 12250, 1, 0, 37302, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263682, 13045, 0, 0, 30407, 3, 0, 0, 0, 0, 0, 0, 0, 'Captured Crusader Rescued', 19034), +(263683, 28801, 1, 0, 64397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263684, 12523, 1, 0, 38349, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263685, 12844, 1, 0, 40726, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263686, 27687, 1, 0, 62138, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263687, 27614, 1, 0, 61959, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263688, 27614, 1, 1, 61960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263689, 27614, 1, 2, 61961, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263690, 27614, 1, 3, 61962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263691, 12984, 0, 0, 29368, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263692, 12982, 0, 0, 30186, 8, 0, 0, 0, 0, 0, 0, 0, 'Ebon Blade Prisoners set free', 19034), +(263693, 14194, 0, 0, 35375, 8, 0, 0, 0, 0, 0, 0, 0, 'Mountainfoot Miner Destoned', 19034), +(263694, 14194, 1, 1, 48104, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263695, 11989, 0, 0, 27921, 1, 0, 0, 0, 0, 0, 0, 0, 'Blood Pact With Drakuru', 19034), +(263696, 27311, 2, 0, 205368, 8, 0, 0, 0, 0, 0, 0, 0, 'Weapon racks burned', 19034), +(263697, 11571, 1, 0, 34623, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263698, 28799, 1, 0, 52843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263699, 13294, 1, 0, 43997, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263700, 12171, 1, 0, 37003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263701, 14166, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263702, 12567, 1, 0, 38551, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263703, 13241, 0, 0, 26696, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263704, 12115, 1, 0, 36820, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263705, 12906, 0, 0, 29886, 6, 0, 0, 0, 0, 0, 0, 0, 'Exhausted Vrykul Disciplined', 19034), +(263706, 14144, 0, 0, 34852, 8, 0, 0, 0, 0, 0, 0, 0, 'Last Rites administered', 19034), +(263707, 14144, 1, 1, 46870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263708, 11961, 1, 0, 35701, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263709, 12662, 0, 0, 28636, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263710, 13584, 0, 0, 33083, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263712, 13910, 0, 0, 34349, 1, 0, 0, 0, 0, 0, 0, 0, 'Greymist Murloc Home Built', 19034), +(263713, 13910, 1, 1, 46385, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263714, 12669, 0, 0, 28631, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakuru''s task complete', 19034), +(263715, 12669, 0, 1, 28739, 5, 0, 0, 0, 0, 0, 0, 0, 'Blight Cauldrons diluted', 19034), +(263716, 11904, 2, 0, 188104, 1, 0, 0, 0, 0, 0, 0, 0, 'Ore Cart released', 19034), +(263717, 13604, 1, 0, 45506, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263718, 14217, 0, 0, 35581, 1, 0, 0, 0, 0, 0, 0, 0, 'Sacrificial Offering Accepted', 19034), +(263719, 12552, 0, 0, 28257, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263720, 11504, 1, 0, 34222, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263721, 11504, 1, 1, 34223, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263722, 11504, 1, 2, 34224, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263723, 11504, 1, 3, 34225, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263724, 12107, 0, 0, 26887, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley Line Focus information retrieved', 19034), +(263725, 12107, 0, 1, 26889, 1, 0, 0, 0, 0, 0, 0, 0, 'Azure Dragonshrine observed', 19034), +(263726, 12077, 1, 0, 36769, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263727, 13169, 0, 0, 31119, 18, 0, 0, 0, 0, 0, 0, 0, 'Hungering Plaguehounds fed', 19034), +(263728, 13631, 1, 0, 46052, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263729, 13839, 0, 0, 33972, 1, 0, 0, 0, 0, 0, 0, 0, 'Rugan Steelbelly''s advice', 19034), +(263730, 13839, 0, 1, 33340, 2, 0, 0, 0, 0, 0, 0, 0, 'Charge vulnerable Charge Target', 19034), +(263731, 12779, 0, 0, 29150, 150, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Soldiers slain', 19034), +(263732, 12779, 0, 1, 29104, 10, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Ballista destroyed', 19034), +(263733, 12980, 0, 0, 30190, 1, 0, 0, 0, 0, 0, 0, 0, 'Armor plate investigated', 19034), +(263734, 12980, 1, 1, 42394, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263736, 13614, 1, 0, 45791, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263737, 12188, 1, 0, 37121, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263738, 24773, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263739, 11945, 1, 0, 35711, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263740, 13606, 1, 0, 45788, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263741, 12259, 0, 0, 27377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263742, 29862, 0, 0, 28582, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263743, 29862, 0, 1, 28581, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263744, 29862, 0, 2, 28586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263745, 28800, 1, 0, 64397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263746, 12654, 1, 0, 38703, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263747, 13824, 1, 0, 45816, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263748, 13350, 0, 0, 32300, 1, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended Slain', 19034), +(263749, 28125, 1, 0, 63035, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263750, 11590, 0, 0, 25474, 1, 0, 0, 0, 0, 0, 0, 0, 'Captured Beryl Sorcerer', 19034), +(263751, 13239, 0, 0, 31364, 3, 0, 0, 0, 0, 0, 0, 0, 'Field Tests Conducted', 19034), +(263752, 30140, 1, 0, 78960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263753, 14173, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263754, 29778, 0, 0, 55600, 5, 0, 0, 0, 0, 0, 0, 0, 'Defaced Scroll of Wisdom burned', 19034), +(263755, 29779, 0, 0, 55632, 20, 0, 0, 0, 0, 0, 0, 0, 'Fe-Feng Hozen slain', 19034), +(263756, 29780, 0, 0, 55634, 1, 1, 0, 658, 0, 0, 0, 0, '', 19034), +(263757, 30808, 1, 0, 81293, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263758, 13416, 1, 0, 41197, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263759, 13153, 1, 0, 44808, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263760, 12527, 1, 0, 38382, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263761, 30135, 0, 0, 58212, 8, 0, 0, 0, 0, 0, 0, 0, 'Slitherscale saurok slain', 19034), +(263762, 30144, 0, 0, 58426, 6, 0, 0, 0, 0, 0, 0, 0, 'Cloud Rings flown through', 19034), +(263766, 13273, 1, 0, 43984, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263767, 13273, 1, 1, 43983, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263768, 29828, 1, 0, 74755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263769, 30307, 0, 0, 58412, 8, 0, 0, 0, 0, 0, 0, 0, 'Shao-Tien mogu slain', 19034), +(263770, 30308, 0, 0, 59157, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263773, 11679, 1, 0, 34909, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263774, 12247, 0, 0, 27322, 1, 0, 0, 0, 0, 0, 0, 0, 'Orsonn''s Story', 19034), +(263775, 12247, 0, 1, 27321, 1, 0, 0, 0, 0, 0, 0, 0, 'Kodian''s Story', 19034), +(263776, 12516, 0, 0, 28151, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263777, 12847, 0, 0, 29542, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263778, 12847, 0, 1, 29550, 1, 0, 0, 0, 0, 0, 0, 0, 'Arete''s Gate summoned', 19034), +(263779, 30141, 1, 0, 78961, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263780, 11527, 1, 0, 34387, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263783, 30158, 1, 0, 79025, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263784, 30159, 1, 0, 79067, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263785, 30160, 1, 0, 79264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263786, 30337, 0, 0, 59276, 1, 0, 0, 0, 0, 0, 0, 0, 'Stolen weapons exploded', 19034), +(263787, 30337, 0, 1, 59278, 1, 0, 0, 0, 0, 0, 0, 0, 'Stolen tools exploded', 19034), +(263788, 30337, 0, 2, 59279, 1, 0, 0, 0, 0, 0, 0, 0, 'Stolen beer exploded', 19034), +(263789, 30337, 0, 3, 59280, 1, 0, 0, 0, 0, 0, 0, 0, 'Stolen grain exploded', 19034), +(263790, 13138, 1, 0, 43288, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263791, 29834, 0, 0, 29304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263792, 29834, 0, 1, 29305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263793, 29834, 0, 2, 29306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263794, 13833, 1, 0, 45905, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263795, 12093, 0, 0, 26920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263796, 12093, 0, 1, 26921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263797, 12093, 0, 2, 26922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263798, 12093, 0, 3, 26923, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263799, 26048, 1, 0, 56577, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263800, 13050, 1, 0, 42784, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263801, 13346, 0, 0, 32300, 1, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended Defeated', 19034), +(263802, 29835, 0, 0, 29304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263803, 29835, 0, 1, 29305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263804, 29835, 0, 2, 29306, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263806, 14174, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263807, 13421, 1, 0, 44724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263809, 11653, 0, 0, 25505, 5, 0, 0, 0, 0, 0, 0, 0, 'Crafty''s Blaster Tested', 19034), +(263810, 11637, 0, 0, 25425, 1, 0, 0, 0, 0, 0, 0, 0, 'Farseer Grimwalker set free', 19034), +(263811, 11637, 1, 1, 34781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263812, 14253, 1, 0, 49032, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263813, 12851, 0, 0, 29595, 7, 0, 0, 0, 0, 0, 0, 0, 'Frostworgs Burned', 19034), +(263814, 12851, 0, 1, 29597, 15, 0, 0, 0, 0, 0, 0, 0, 'Frost Giants Burned', 19034), +(263815, 13322, 0, 0, 32266, 1, 0, 0, 0, 0, 0, 0, 0, 'Writhing Mass Banished', 19034), +(263816, 30145, 0, 0, 58444, 1, 0, 0, 0, 0, 0, 0, 0, 'Instructor Windblade''s course completed', 19034), +(263817, 30331, 1, 0, 79894, 20, 0, 0, 958, 0, 0, 0, 0, '', 19034), +(263818, 13714, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263819, 12089, 0, 0, 26828, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263820, 11512, 1, 0, 34237, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263821, 12995, 0, 0, 30220, 15, 0, 0, 0, 0, 0, 0, 0, 'Ebon Blade Banner planted near vrykul corpse', 19034), +(263822, 30137, 1, 0, 78959, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263823, 27310, 2, 0, 205368, 8, 0, 0, 0, 0, 0, 0, 0, 'Weapon racks burned', 19034), +(263824, 14172, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263825, 13633, 1, 0, 45058, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263826, 12883, 1, 0, 41262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263828, 13650, 0, 0, 33487, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact of the Broken Tablet Inspected', 19034), +(263829, 13650, 0, 1, 33485, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact of the Upturned Giant Inspected', 19034), +(263830, 13650, 0, 2, 33486, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact of the Overdressed Woman Inspected', 19034), +(263831, 30136, 0, 0, 58246, 6, 0, 0, 628, 629, 630, 0, 0, 'Windward Hatchlings returned to their nests', 19034), +(263832, 30804, 0, 0, 59656, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263833, 13204, 1, 0, 43511, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263834, 26939, 0, 0, 7079, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263835, 30146, 1, 0, 79046, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263836, 13038, 0, 0, 30444, 4, 0, 0, 0, 0, 0, 0, 0, 'Frostfloe Rifts closed', 19034), +(263837, 13038, 1, 1, 42781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263838, 13283, 0, 0, 31766, 1, 0, 0, 0, 0, 0, 0, 0, 'Horde Battle Standard planted', 19034), +(263839, 12919, 0, 0, 29943, 100, 0, 0, 0, 0, 0, 0, 0, 'Scourge slain', 19034), +(263840, 12919, 0, 1, 29872, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263841, 12919, 0, 2, 29895, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263842, 12919, 0, 3, 29821, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263844, 14167, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263845, 13161, 0, 0, 31160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263846, 30142, 0, 0, 58315, 1, 0, 0, 0, 0, 0, 0, 0, 'Egg hatched', 19034), +(263848, 14092, 1, 0, 46889, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263849, 30315, 1, 0, 79244, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263851, 13364, 0, 0, 32648, 1, 0, 0, 0, 0, 0, 0, 0, 'Tirion''s Gambit', 19034), +(263852, 11659, 0, 0, 25534, 5, 0, 0, 0, 0, 0, 0, 0, 'Blood Globes Shattered', 19034), +(263854, 12180, 0, 0, 27113, 1, 0, 0, 0, 0, 0, 0, 0, 'Prospector Gann Rescued', 19034), +(263855, 12180, 0, 1, 27114, 1, 0, 0, 0, 0, 0, 0, 0, 'Prospector Torgan Rescued', 19034), +(263856, 12180, 0, 2, 27115, 1, 0, 0, 0, 0, 0, 0, 0, 'Prospector Varana Rescued', 19034), +(263858, 27998, 0, 0, 46964, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263859, 30147, 1, 0, 79049, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263860, 30148, 0, 0, 58417, 8, 0, 0, 1365, 0, 0, 0, 0, 'Injured Hatchlings bandaged', 19034), +(263861, 13117, 2, 0, 192858, 1, 0, 0, 0, 0, 0, 0, 0, 'Summoning Altar investigated', 19034), +(263862, 13832, 1, 0, 45903, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263863, 13397, 0, 0, 31731, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263864, 13397, 0, 1, 31738, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263865, 13397, 0, 2, 31783, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263866, 11565, 1, 0, 34619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263867, 30139, 1, 0, 78962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263868, 30143, 0, 0, 58572, 1, 0, 0, 634, 0, 0, 0, 0, 'Speak to Instructor Windblade', 19034), +(263869, 13592, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263870, 11986, 1, 0, 35738, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263871, 13354, 0, 0, 32250, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Faedris Killed', 19034), +(263872, 13354, 0, 1, 32285, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Jhaeqon Killed', 19034), +(263873, 13354, 0, 2, 32263, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Veraj Killed', 19034), +(263874, 13354, 0, 3, 32291, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Savryn Killed', 19034), +(263875, 13627, 1, 0, 45045, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263876, 30763, 1, 0, 81122, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263877, 30828, 0, 1, 59170, 6, 0, 0, 1178, 0, 0, 0, 0, 'Pools of Corruption Cleansed', 19034), +(263879, 13120, 2, 0, 192914, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb placed in abomination lab', 19034), +(263880, 13120, 2, 1, 192915, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb placed in flesh giant lab', 19034), +(263881, 13120, 2, 2, 192916, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb placed in cauldron area', 19034), +(263882, 14171, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263883, 13310, 0, 0, 31888, 4, 0, 0, 0, 0, 0, 0, 0, 'Kor''kron Infiltrators dropped', 19034), +(263884, 11956, 1, 0, 35687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263885, 27613, 0, 0, 46095, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263886, 12035, 0, 0, 25993, 5, 0, 0, 0, 0, 0, 0, 0, 'Harvest Collector Rewired', 19034), +(263887, 12759, 0, 0, 28111, 50, 0, 0, 0, 0, 0, 0, 0, 'Sparktouched Gorloc', 19034), +(263889, 13110, 0, 0, 30546, 10, 0, 0, 0, 0, 0, 0, 0, 'Restless Soul Freed', 19034), +(263890, 29781, 1, 0, 74631, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263891, 29783, 1, 0, 74624, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263892, 13249, 1, 0, 43670, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263893, 12213, 0, 0, 27263, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Heart.', 19034), +(263894, 12213, 0, 1, 27264, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Limb.', 19034), +(263895, 12213, 0, 2, 27265, 1, 0, 0, 0, 0, 0, 0, 0, 'Orb used beneath Vordrassil''s Tears.', 19034), +(263896, 13610, 1, 0, 45784, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263897, 30150, 1, 0, 79030, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263898, 30151, 0, 0, 58395, 8, 0, 0, 0, 0, 0, 0, 0, 'Balls caught', 19034), +(263899, 30332, 1, 0, 79867, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263900, 30333, 0, 0, 59516, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263901, 30334, 1, 0, 79824, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263902, 30335, 0, 0, 59119, 12, 0, 0, 0, 0, 0, 0, 0, 'Kunzen hozen slain', 19034), +(263903, 13393, 1, 0, 44529, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263904, 13611, 1, 0, 45787, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263905, 14204, 0, 0, 35463, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263906, 12453, 0, 0, 27786, 6, 0, 0, 0, 0, 0, 0, 0, 'Imperial Eagle''s sight bound', 19034), +(263907, 25823, 0, 0, 41408, 12, 0, 0, 0, 0, 0, 0, 0, 'Horde at Unearthed Grounds Slain', 19034), +(263908, 11724, 1, 0, 34982, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263910, 29590, 0, 0, 18371, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263912, 11529, 1, 0, 34468, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263913, 12182, 1, 0, 37027, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263914, 29777, 1, 0, 74615, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263915, 30306, 0, 0, 58992, 20, 0, 0, 0, 0, 0, 0, 0, 'Shado-Pan Trainees defeated', 19034), +(263916, 13423, 0, 0, 30012, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263917, 28802, 1, 0, 64397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263918, 12491, 1, 0, 38280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263922, 30154, 1, 0, 85282, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263923, 30155, 0, 0, 58212, 8, 0, 0, 0, 0, 0, 0, 0, 'Slitherscale saurok slain', 19034), +(263924, 30330, 0, 0, 59490, 8, 0, 0, 0, 0, 0, 0, 0, 'Shadelight Spore planted', 19034), +(263925, 30330, 1, 1, 79833, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263926, 30156, 0, 0, 58351, 3, 0, 0, 0, 0, 0, 0, 0, 'Hatchling fed', 19034), +(263927, 30157, 0, 0, 58246, 6, 0, 0, 628, 629, 630, 0, 0, 'Windward Hatchlings returned', 19034), +(263928, 30336, 0, 0, 59126, 1, 1, 0, 0, 0, 0, 0, 0, 'Kunzen Hunter-Chief slain', 19034), +(263929, 13139, 1, 0, 43290, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263930, 13131, 1, 0, 43238, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263931, 13131, 1, 1, 43239, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263932, 13131, 1, 2, 43240, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263933, 13131, 1, 3, 43241, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263934, 14152, 0, 0, 34947, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263935, 14152, 0, 1, 34907, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263936, 13623, 1, 0, 45025, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263937, 13681, 1, 0, 45278, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263942, 13145, 0, 0, 31065, 1, 0, 0, 0, 0, 0, 0, 0, 'Altar of Sacrifice explored', 19034), +(263943, 13145, 0, 1, 31068, 1, 0, 0, 0, 0, 0, 0, 0, 'Blood Forge explored', 19034), +(263944, 13145, 0, 2, 31064, 1, 0, 0, 0, 0, 0, 0, 0, 'Icy Lookout explored', 19034), +(263945, 13145, 0, 3, 31066, 1, 0, 0, 0, 0, 0, 0, 0, 'Runeworks explored', 19034), +(263946, 13331, 0, 0, 32189, 6, 0, 0, 0, 0, 0, 0, 0, 'Skybreaker Recon Fighters shot down', 19034), +(263947, 11900, 2, 0, 188100, 1, 0, 0, 0, 0, 0, 0, 0, 'Nexus Geological Reading', 19034), +(263948, 11900, 2, 1, 188101, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Coldarra Reading', 19034), +(263949, 11900, 2, 2, 188102, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Coldarra Reading', 19034), +(263950, 11900, 2, 3, 188103, 1, 0, 0, 0, 0, 0, 0, 0, 'Western Coldarra Reading', 19034), +(263951, 13352, 0, 0, 32229, 3, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator dragged and dropped', 19034), +(263952, 13206, 1, 0, 43513, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263954, 13130, 1, 0, 43217, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263955, 13130, 1, 1, 43218, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263956, 13194, 1, 0, 43324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263957, 26205, 0, 0, 42563, 5, 0, 0, 0, 0, 0, 0, 0, 'Clean up Toxic Geysers', 19034), +(263959, 13318, 0, 0, 32229, 3, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator dragged and dropped', 19034), +(263960, 12924, 0, 0, 30126, 1, 0, 0, 0, 0, 0, 0, 0, 'Fjorn''s Anvil Brought to Dun Niffelem', 19034), +(263961, 28537, 1, 0, 64463, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263962, 13674, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263963, 13321, 0, 0, 32266, 1, 0, 0, 0, 0, 0, 0, 0, 'Writhing Mass Banished', 19034), +(263964, 13372, 1, 0, 44569, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263965, 13788, 0, 0, 33687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263966, 13788, 0, 1, 33695, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263967, 24586, 0, 0, 33186, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263968, 13223, 0, 0, 31284, 3, 0, 0, 0, 0, 0, 0, 0, 'Horde Siege Vehicles Defended', 19034), +(263969, 13724, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(263970, 12268, 1, 0, 37412, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263971, 12268, 1, 1, 37413, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263972, 12268, 1, 2, 37416, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263973, 13432, 1, 0, 29906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263974, 13432, 1, 1, 29905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263975, 29771, 1, 0, 74301, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263976, 12746, 0, 0, 29070, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263977, 28540, 1, 0, 64465, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(263978, 29847, 0, 0, 56426, 1, 0, 0, 0, 0, 0, 0, 0, 'Egg Located', 19034), +(263979, 29790, 0, 0, 56688, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to Master Shang Xi', 19034), +(263980, 29791, 0, 0, 56378, 1, 0, 0, 1194, 1195, 0, 0, 0, 'Board the Hot Air Balloon', 19034), +(263981, 29791, 0, 1, 55939, 1, 0, 0, 0, 0, 0, 0, 0, 'Uncover the source of Shen-zin Su''s pain', 19034), +(263982, 29792, 0, 0, 59946, 1, 0, 0, 0, 0, 0, 0, 0, 'Open the Mandori Village Gate', 19034), +(263983, 29792, 0, 1, 59947, 1, 0, 0, 0, 0, 0, 0, 0, 'Open the Pei-Wu Forest Gate', 19034), +(263984, 29793, 0, 0, 56007, 8, 0, 0, 0, 0, 0, 0, 0, 'Darkened Horrors or Darkened Terrors slain', 19034), +(263985, 14143, 1, 0, 46859, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263986, 29797, 1, 0, 74958, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263987, 29798, 0, 0, 56009, 1, 1, 0, 658, 0, 0, 0, 0, '', 19034), +(263988, 29799, 0, 0, 56011, 1, 0, 0, 950, 951, 952, 953, 954, 'Protect the healers', 19034), +(263989, 13580, 0, 0, 34371, 1, 0, 0, 0, 0, 0, 0, 0, 'Ritual of Soothing complete', 19034), +(263990, 13295, 0, 0, 31767, 1, 0, 0, 0, 0, 0, 0, 0, 'Batch of Plague Neutralized', 19034), +(263991, 13353, 0, 0, 32229, 3, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator dragged and dropped', 19034), +(263992, 13415, 1, 0, 41197, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263993, 13576, 0, 0, 33165, 8, 0, 0, 0, 0, 0, 0, 0, 'Unbound Fire Elemental absorbed', 19034), +(263995, 29794, 0, 0, 55999, 3, 0, 0, 1000, 0, 0, 0, 0, 'Injured Sailors rescued', 19034), +(263996, 29795, 1, 0, 80806, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(263998, 13725, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(263999, 13648, 0, 0, 33456, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264000, 13609, 1, 0, 45786, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264002, 26179, 0, 0, 2978, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264003, 13344, 0, 0, 32314, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Messenger summoned', 19034), +(264004, 13357, 0, 0, 32266, 1, 0, 0, 0, 0, 0, 0, 0, 'Writhing Mass Banished', 19034), +(264005, 14245, 0, 0, 38024, 1, 0, 0, 0, 0, 0, 0, 0, 'Town-In-A-Box Set Off!', 19034), +(264006, 13425, 2, 0, 191840, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264007, 13332, 0, 0, 31887, 8, 0, 0, 0, 0, 0, 0, 0, 'Barricades constructed', 19034), +(264009, 29774, 0, 0, 55548, 1, 0, 0, 972, 0, 0, 0, 0, 'Ask Shu for help', 19034), +(264010, 29774, 0, 1, 55547, 1, 0, 0, 0, 0, 0, 0, 0, 'Wake Wugou', 19034), +(264011, 13284, 0, 0, 31794, 4, 0, 0, 0, 0, 0, 0, 0, 'Alliance troops escorted to Ymirheim', 19034), +(264012, 13316, 0, 0, 32278, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264013, 13316, 0, 1, 32280, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264014, 28803, 1, 0, 52843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264015, 13243, 0, 0, 27744, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264016, 13338, 0, 0, 32278, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264017, 13338, 0, 1, 32280, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264018, 12822, 0, 0, 29553, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264019, 12822, 0, 1, 29554, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264020, 13114, 1, 0, 43149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264021, 29627, 1, 0, 72926, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264022, 29627, 1, 1, 72954, 1, 0, 0, 636, 0, 0, 0, 0, '', 19034), +(264023, 29627, 1, 2, 72979, 3, 0, 0, 637, 0, 0, 0, 0, '', 19034), +(264024, 29628, 0, 0, 55086, 1, 0, 0, 638, 0, 0, 0, 0, 'Boiling Cauldron obtained', 19034), +(264025, 29628, 0, 1, 55105, 1, 0, 0, 0, 0, 0, 0, 0, 'Boiling Cauldron returned', 19034), +(264026, 29629, 1, 0, 73193, 80, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264027, 29630, 0, 0, 54987, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264028, 29631, 0, 0, 54988, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264029, 14203, 1, 0, 48681, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264030, 13323, 0, 0, 32229, 3, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugators dragged and dropped', 19034), +(264031, 13279, 0, 0, 31767, 1, 0, 0, 0, 0, 0, 0, 0, 'Plague Cauldron Neutralized', 19034), +(264032, 13277, 1, 0, 43997, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264033, 13789, 0, 0, 35297, 15, 0, 0, 0, 0, 0, 0, 0, 'Cult of the Damned member slain', 19034), +(264034, 29619, 1, 0, 72589, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264035, 29620, 0, 0, 55057, 1, 0, 0, 639, 0, 0, 0, 0, 'Speak with High Elder Cloudfall', 19034), +(264036, 13414, 0, 0, 32534, 5, 0, 0, 0, 0, 0, 0, 0, 'Scalesworn Elites Slain', 19034), +(264037, 29632, 0, 0, 54944, 8, 0, 0, 1179, 0, 0, 0, 0, 'Tian Pupil defeated', 19034), +(264038, 29633, 0, 0, 54924, 1, 1, 0, 505, 0, 0, 0, 0, 'Zhi-Zhi defeated', 19034), +(264039, 29634, 0, 0, 54925, 1, 1, 0, 505, 0, 0, 0, 0, 'Husshun defeated', 19034), +(264040, 13766, 0, 0, 33767, 10, 0, 0, 0, 0, 0, 0, 0, 'Demon Gates closed', 19034), +(264041, 13306, 0, 0, 31887, 8, 0, 0, 0, 0, 0, 0, 0, 'Barricades constructed', 19034), +(264042, 29785, 0, 0, 55666, 1, 0, 0, 0, 0, 0, 0, 0, 'Locate Dafeng', 19034), +(264043, 29786, 0, 0, 55786, 1, 0, 0, 830, 0, 0, 0, 0, '', 19034); -- 264043 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(264044, 29787, 0, 0, 56274, 1, 1, 0, 658, 0, 0, 0, 0, '', 19034), +(264045, 14175, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264046, 13315, 0, 0, 32195, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar South Visited', 19034), +(264047, 13315, 0, 1, 32196, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Central Visited', 19034), +(264048, 13315, 0, 2, 32197, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar North Visited', 19034), +(264049, 13315, 0, 3, 32199, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Northwest Visited', 19034), +(264050, 13622, 1, 0, 45039, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264055, 29623, 0, 0, 54970, 12, 0, 0, 0, 0, 0, 0, 0, 'Practice Strikes completed', 19034), +(264056, 29624, 0, 0, 55183, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264057, 29788, 0, 0, 55640, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264058, 29789, 1, 0, 74634, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264059, 13403, 0, 0, 32648, 1, 0, 0, 0, 0, 0, 0, 0, 'Tirion''s Gambit', 19034), +(264060, 13366, 1, 0, 44462, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264061, 14037, 0, 0, 34737, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Spice Bread Stuffing', 19034), +(264062, 14037, 1, 1, 44837, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264063, 12869, 0, 0, 29753, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264064, 12869, 1, 1, 42159, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264065, 13634, 1, 0, 45062, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264066, 13349, 0, 0, 31731, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264067, 13349, 0, 1, 31738, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264068, 13349, 0, 2, 31783, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264069, 12917, 1, 0, 41514, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264070, 13829, 0, 0, 33973, 1, 0, 0, 0, 0, 0, 0, 0, 'Jeran Lockwood''s advice', 19034), +(264071, 13829, 0, 1, 33341, 5, 0, 0, 0, 0, 0, 0, 0, 'Use Thrust on Melee Target', 19034), +(264073, 13726, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264074, 13869, 1, 0, 23776, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264075, 13298, 0, 0, 31198, 1, 0, 0, 0, 0, 0, 0, 0, 'Coprous the Defiler Slain', 19034), +(264076, 13111, 1, 0, 43158, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264077, 13098, 1, 0, 43140, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264078, 13359, 1, 0, 44631, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264079, 13937, 0, 0, 36209, 1, 0, 0, 0, 0, 0, 0, 0, 'Throw Small Paper Zeppelin to Roo', 19034), +(264080, 13334, 0, 0, 31900, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264081, 13334, 0, 1, 32255, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264082, 13334, 0, 2, 32257, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264085, 29717, 0, 0, 55236, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264086, 13886, 0, 0, 34333, 1, 0, 0, 0, 0, 0, 0, 0, 'Lord Magmathar slain', 19034), +(264087, 13384, 1, 0, 44650, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264089, 13167, 1, 0, 43411, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264090, 12152, 0, 0, 27199, 1, 0, 0, 0, 0, 0, 0, 0, 'Warlord Jin''arrak Destroyed', 19034), +(264091, 29772, 0, 0, 55546, 1, 0, 0, 945, 0, 0, 0, 0, 'Ring the town gong', 19034), +(264092, 13312, 0, 0, 32162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264093, 13787, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264098, 13783, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264099, 26058, 0, 0, 42016, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264100, 26058, 0, 1, 42017, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264101, 12677, 0, 0, 28762, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakuru''s task complete', 19034), +(264102, 12677, 1, 1, 39159, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264104, 12880, 1, 0, 41260, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264105, 13818, 1, 0, 45855, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264106, 14057, 1, 0, 46836, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264107, 13756, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264108, 29759, 1, 0, 79753, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264109, 13288, 0, 0, 31743, 15, 0, 0, 0, 0, 0, 0, 0, 'Icy Ghouls Exploded', 19034), +(264110, 13288, 0, 1, 32168, 15, 0, 0, 0, 0, 0, 0, 0, 'Vicious Geists Exploded', 19034), +(264111, 13288, 0, 2, 32167, 15, 0, 0, 0, 0, 0, 0, 0, 'Risen Alliance Soldiers Exploded', 19034), +(264112, 13177, 0, 0, 39019, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde members slain', 19034), +(264113, 13676, 0, 0, 33192, 8, 0, 0, 0, 0, 0, 0, 0, 'Icecrown Scourge slain', 19034), +(264114, 13051, 0, 0, 30461, 1, 0, 0, 0, 0, 0, 0, 0, 'Veranus Lured', 19034), +(264115, 13900, 0, 0, 51314, 1, 0, 0, 0, 0, 0, 0, 0, 'Offering to Azshara prevented', 19034), +(264116, 13304, 1, 0, 44529, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264118, 13810, 0, 0, 35297, 15, 0, 0, 0, 0, 0, 0, 0, 'Cult of the Damned member slain', 19034), +(264119, 29675, 0, 0, 20886, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264120, 29675, 0, 1, 20885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264121, 13727, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264122, 14241, 1, 0, 49424, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264124, 13212, 1, 0, 43526, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264125, 13212, 1, 1, 43527, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264126, 13212, 1, 2, 43528, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264127, 13212, 1, 3, 43529, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264128, 13202, 1, 0, 43322, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264129, 13046, 0, 0, 30421, 5, 0, 0, 0, 0, 0, 0, 0, 'Arngrim''s spirit fed', 19034), +(264130, 29681, 0, 0, 20912, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264131, 13793, 1, 0, 45500, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264132, 13413, 0, 0, 32534, 5, 0, 0, 0, 0, 0, 0, 0, 'Scalesworn Elites Killed', 19034), +(264133, 13342, 0, 0, 32314, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Messenger summoned', 19034), +(264134, 13149, 0, 0, 30996, 1, 0, 0, 0, 0, 0, 0, 0, 'Plagued Grain Crates Dispelled', 19034), +(264135, 13476, 1, 0, 20560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264136, 13476, 1, 1, 47395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264137, 13476, 4, -1, 392, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264139, 12998, 0, 0, 30299, 1, 0, 0, 0, 0, 0, 0, 0, 'Attempt to secure the Heart of the Storm', 19034), +(264140, 12901, 1, 0, 41399, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264141, 13847, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264142, 13847, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264143, 13847, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264144, 13256, 1, 0, 43823, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264145, 13160, 0, 0, 31012, 12, 0, 0, 0, 0, 0, 0, 0, 'Iceskin Sentry destroyed', 19034), +(264146, 13812, 0, 0, 33687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264147, 13812, 0, 1, 33695, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264148, 13126, 0, 0, 27641, 10, 0, 0, 0, 0, 0, 0, 0, 'Centrifuge Constructs Destroyed', 19034), +(264149, 13126, 0, 1, 27447, 1, 0, 0, 0, 0, 0, 0, 0, 'Varos Cloudstrider Defeated', 19034), +(264150, 13320, 0, 0, 32242, 1, 0, 0, 0, 0, 0, 0, 0, 'Blue Sample Collected', 19034), +(264151, 13320, 0, 1, 32244, 1, 0, 0, 0, 0, 0, 0, 0, 'Green Sample Collected', 19034), +(264152, 13320, 0, 2, 32245, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Sample Collected', 19034), +(264153, 13320, 1, 3, 44251, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264154, 11544, 1, 0, 34501, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264155, 13480, 1, 0, 44806, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264157, 13005, 0, 0, 30296, 7, 0, 0, 0, 0, 0, 0, 0, 'Iron Sentinel slain', 19034), +(264158, 13005, 0, 1, 30297, 20, 0, 0, 0, 0, 0, 0, 0, 'Iron Dwarf Assailant slain', 19034), +(264159, 13092, 1, 0, 43089, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264160, 28804, 1, 0, 52843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264161, 13669, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264162, 13603, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264163, 13612, 0, 0, 33193, 5, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Skirmishers Slain', 19034), +(264164, 13612, 0, 1, 33195, 5, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Bowmen Slain', 19034), +(264165, 13198, 1, 0, 44808, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264166, 13192, 1, 0, 43322, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264167, 13630, 2, 0, 194309, 1, 0, 0, 0, 0, 0, 0, 0, 'Blue Moonstone deactivated', 19034), +(264168, 13630, 2, 1, 194310, 1, 0, 0, 0, 0, 0, 0, 0, 'Green Moonstone deactivated', 19034), +(264169, 13630, 2, 2, 194311, 1, 0, 0, 0, 0, 0, 0, 0, 'Red Moonstone deactivated', 19034), +(264170, 13337, 0, 0, 32162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264171, 13335, 0, 0, 32288, 6, 0, 0, 0, 0, 0, 0, 0, 'Skeletal Reaver bones dissolved', 19034), +(264173, 12925, 2, 0, 191840, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264174, 30274, 2, 0, 210527, 1, 1, 0, 538, 0, 0, 0, 0, 'Northeast Oubliette Shackle destroyed', 19034), +(264175, 30274, 2, 1, 210533, 1, 1, 0, 538, 0, 0, 0, 0, 'Northwest Oubliette Shackle destroyed', 19034), +(264176, 30274, 2, 2, 210535, 1, 1, 0, 538, 0, 0, 0, 0, 'Southwest Oubliette Shackle destroyed', 19034), +(264177, 26040, 1, 0, 56167, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264178, 14142, 0, 0, 34956, 1, 0, 0, 0, 0, 0, 0, 0, 'Kul the Reckless rescued', 19034), +(264179, 14142, 0, 1, 34716, 4, 0, 0, 0, 0, 0, 0, 0, 'Captive Aspirant rescued', 19034), +(264181, 13754, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264182, 13274, 1, 0, 44047, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264183, 13752, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264184, 13001, 1, 0, 42541, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264185, 13001, 1, 1, 42542, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264186, 30820, 0, 0, 60883, 1, 0, 0, 1154, 0, 0, 0, 0, 'Light the Incense of Life', 19034), +(264190, 29750, 1, 0, 74763, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264191, 13938, 0, 0, 36209, 1, 0, 0, 0, 0, 0, 0, 0, 'Throw Small Paper Zeppelin to Kekek', 19034), +(264192, 13121, 0, 0, 30750, 1, 0, 0, 0, 0, 0, 0, 0, 'Information gained for The Bone Witch', 19034), +(264193, 13358, 0, 0, 32314, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Messenger summoned', 19034), +(264194, 13856, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264195, 13856, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264196, 13856, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264197, 27823, 1, 0, 62510, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264198, 13400, 0, 0, 32797, 1, 0, 0, 0, 0, 0, 0, 0, 'The Prince''s Destiny', 19034), +(264199, 13140, 1, 0, 43291, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264200, 29635, 0, 0, 54926, 1, 1, 0, 505, 0, 0, 0, 0, 'Xiao defeated', 19034), +(264201, 29637, 0, 0, 54918, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive the Melee', 19034), +(264202, 29751, 1, 0, 74762, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264203, 29751, 1, 1, 74760, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264204, 29751, 1, 2, 74761, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264205, 29752, 0, 0, 61290, 10, 0, 0, 1254, 0, 0, 0, 0, 'Wayward Ancestors Recovered', 19034), +(264206, 29753, 0, 0, 55462, 8, 0, 0, 0, 0, 0, 0, 0, 'Beast Spirits Returned to Nature', 19034), +(264207, 29754, 0, 0, 55964, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Pei-Zhi during his ritual.', 19034), +(264208, 29755, 0, 0, 56596, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264209, 13351, 0, 0, 32195, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar South Visited', 19034), +(264210, 13351, 0, 1, 32196, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Central Visited', 19034), +(264211, 13351, 0, 2, 32197, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar North Visited', 19034), +(264212, 13351, 0, 3, 32199, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Northwest Visited', 19034), +(264213, 13222, 0, 0, 31284, 3, 0, 0, 0, 0, 0, 0, 0, 'Siege Vehicles Defended', 19034), +(264214, 13394, 0, 0, 31812, 150, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264215, 13394, 0, 1, 31813, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264216, 13394, 0, 2, 31815, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264218, 29745, 0, 0, 55288, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264219, 29745, 0, 1, 55471, 1, 0, 0, 0, 0, 0, 0, 0, 'Source of the destroyers found', 19034), +(264221, 29747, 0, 0, 55279, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264222, 13731, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264223, 29756, 1, 0, 75214, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264224, 29757, 0, 0, 56744, 8, 0, 0, 0, 0, 0, 0, 0, 'Toad Eggs Scooped', 19034), +(264225, 29674, 0, 0, 20870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264226, 13197, 1, 0, 43314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264227, 13147, 0, 0, 31481, 5, 0, 0, 0, 0, 0, 0, 0, 'Worker fight started', 19034), +(264228, 12993, 1, 0, 42475, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264229, 12993, 1, 1, 42476, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264230, 13410, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(264231, 13410, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(264232, 13410, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(264233, 13675, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264236, 13132, 0, 0, 26861, 1, 0, 0, 0, 0, 0, 0, 0, 'King Ymiron Slain', 19034), +(264237, 29748, 0, 0, 55289, 6, 0, 0, 1274, 0, 0, 0, 0, 'Vacant Destroyer Kicked', 19034), +(264238, 29749, 1, 0, 74258, 1, 0, 0, 1003, 0, 0, 0, 0, '', 19034), +(264239, 29749, 0, 1, 55480, 1, 0, 0, 1004, 0, 0, 0, 0, 'Interrupt the Ritual of Spiritbinding', 19034), +(264240, 13187, 0, 0, 30414, 3, 0, 0, 0, 0, 0, 0, 0, 'Forgotten Ones Destroyed', 19034), +(264241, 13187, 0, 1, 29311, 1, 0, 0, 0, 0, 0, 0, 0, 'Herald Volazj Defeated', 19034), +(264242, 13129, 1, 0, 43215, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264243, 13291, 0, 0, 31364, 3, 0, 0, 0, 0, 0, 0, 0, 'Field Tests Conducted', 19034), +(264244, 14242, 0, 0, 36145, 1, 0, 0, 0, 0, 0, 0, 0, 'Precious Cargo located', 19034), +(264246, 13136, 1, 0, 43259, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264247, 24595, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264248, 13780, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264249, 12856, 0, 0, 29734, 9, 0, 0, 0, 0, 0, 0, 0, 'Rescued Brunnhildar Prisoners', 19034), +(264250, 12856, 0, 1, 29709, 3, 0, 0, 0, 0, 0, 0, 0, 'Freed Proto-Drakes', 19034), +(264251, 13801, 0, 0, 3803, 15, 0, 0, 0, 0, 0, 0, 0, 'Night Elf Ghosts Slain', 19034), +(264252, 13624, 0, 0, 33283, 3, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Wreckers destroyed', 19034), +(264253, 13624, 0, 1, 33334, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde Invaders slain', 19034), +(264255, 13375, 1, 0, 44577, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264256, 13722, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264257, 13860, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264258, 13860, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264259, 13860, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264260, 13854, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264261, 13854, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264262, 13854, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264263, 13330, 0, 0, 31258, 20, 0, 0, 0, 0, 0, 0, 0, 'Ymirheim Vrykul slain', 19034), +(264264, 13116, 1, 0, 43144, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264265, 24589, 0, 0, 34780, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264266, 13328, 1, 0, 44319, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264267, 13328, 1, 1, 44320, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264268, 13328, 1, 2, 44321, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264269, 13144, 0, 0, 30995, 3, 0, 0, 0, 0, 0, 0, 0, 'Chained Abominations burned', 19034), +(264270, 13128, 0, 0, 27656, 1, 0, 0, 0, 0, 0, 0, 0, 'Ley-Guardian Eregos Defeated', 19034), +(264271, 13723, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264272, 13387, 0, 0, 31411, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264273, 13368, 0, 0, 32300, 1, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended Defeated', 19034), +(264274, 13385, 1, 0, 44651, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264275, 12895, 1, 0, 40947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264276, 13319, 0, 0, 32250, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Faedris Killed', 19034), +(264277, 13319, 0, 1, 32285, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Jhaeqon Killed', 19034), +(264278, 13319, 0, 2, 32263, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Veraj Killed', 19034), +(264279, 13319, 0, 3, 32291, 1, 0, 0, 0, 0, 0, 0, 0, 'Overseer Savryn Killed', 19034), +(264280, 13846, 8, -1, 0, 100000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264281, 13855, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264282, 13855, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264283, 13855, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264284, 13301, 0, 0, 31845, 4, 0, 0, 0, 0, 0, 0, 0, 'Horde troops escorted to Ymirheim', 19034), +(264286, 13718, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264287, 13336, 0, 0, 31258, 20, 0, 0, 0, 0, 0, 0, 0, 'Ymirheim Vrykul slain', 19034), +(264288, 13713, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264289, 13784, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264290, 13680, 0, 0, 38595, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Valiant defeated', 19034), +(264291, 26730, 1, 0, 60274, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264292, 13146, 0, 0, 31075, 4, 0, 0, 0, 0, 0, 0, 0, 'Scourge Bomb gift delivered', 19034), +(264299, 13196, 1, 0, 43323, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264300, 13772, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264301, 13391, 1, 0, 44001, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264302, 13770, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264303, 13698, 2, 0, 194482, 8, 0, 0, 0, 0, 0, 0, 0, 'Horde Explosives destroyed', 19034), +(264304, 13698, 0, 1, 33709, 1, 0, 0, 0, 0, 0, 0, 0, 'Warsong Shredder returned', 19034), +(264305, 13822, 1, 0, 45815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264306, 13823, 1, 0, 45817, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264307, 13811, 1, 0, 45500, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264308, 13961, 1, 0, 46722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264309, 13961, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264310, 13857, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264311, 13857, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264312, 13857, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264313, 13728, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264314, 13837, 0, 0, 33972, 1, 0, 0, 0, 0, 0, 0, 0, 'Rugan Steelbelly''s advice', 19034), +(264315, 13837, 0, 1, 33340, 2, 0, 0, 0, 0, 0, 0, 0, 'Charge vulnerable Charge Target', 19034), +(264316, 13154, 1, 0, 43323, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264317, 12915, 0, 0, 29503, 1, 0, 0, 0, 0, 0, 0, 0, 'Fjorn slain', 19034), +(264318, 12915, 0, 1, 29375, 5, 0, 0, 0, 0, 0, 0, 0, 'Stormforged Iron Giants slain', 19034), +(264319, 13750, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264320, 13048, 0, 0, 30395, 6, 0, 0, 0, 0, 0, 0, 0, 'Lorehammer attuned to Stormhoof''s time', 19034), +(264321, 13048, 1, 1, 42839, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264322, 13767, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264323, 29765, 1, 0, 74160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264324, 29765, 1, 1, 74161, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264325, 29765, 1, 2, 74162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264326, 29765, 1, 3, 74163, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264331, 29804, 0, 0, 55509, 1, 1, 0, 0, 0, 0, 0, 0, 'Konk Slain', 19034), +(264332, 13720, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264333, 12903, 0, 0, 29468, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Dargath found', 19034), +(264334, 12903, 0, 1, 29455, 1, 0, 0, 0, 0, 0, 0, 0, 'Gerk found', 19034), +(264335, 12903, 0, 2, 29454, 1, 0, 0, 0, 0, 0, 0, 0, 'Burr found', 19034), +(264336, 13409, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(264337, 13409, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(264338, 13409, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(264339, 13746, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264340, 13408, 0, 0, 19028, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture The Overlook', 19034), +(264341, 13408, 0, 1, 19029, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture the Stadium', 19034), +(264342, 13408, 0, 2, 19032, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Broken Hill', 19034), +(264343, 13743, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264344, 13125, 0, 0, 30829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264345, 13125, 0, 1, 30830, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264346, 13125, 0, 2, 30831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264347, 13719, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264348, 13761, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264349, 13663, 0, 0, 33519, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Knight''s Gryphon taken', 19034), +(264350, 13663, 1, 1, 45121, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264351, 13663, 1, 2, 45122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264352, 29877, 0, 0, 56146, 7, 0, 0, 0, 0, 0, 0, 0, 'Buried farm equipment found', 19034), +(264353, 27013, 0, 0, 44551, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264354, 13078, 1, 0, 43084, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264355, 13356, 0, 0, 32266, 1, 0, 0, 0, 0, 0, 0, 0, 'Writhing Mass Banished', 19034), +(264356, 12857, 1, 0, 41115, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264357, 13697, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264358, 13620, 1, 0, 45012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264359, 13151, 0, 0, 31006, 1, 0, 0, 0, 0, 0, 0, 0, 'Mal''Ganis Defeated', 19034), +(264360, 13815, 0, 0, 34138, 6, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Oaks Chopped Down', 19034), +(264361, 13616, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264362, 13864, 0, 0, 34127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264363, 13748, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264364, 13781, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264365, 13853, 0, 0, 34176, 15, 0, 0, 0, 0, 0, 0, 0, 'Hellions & Wind Riders shot down', 19034), +(264366, 13729, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264367, 13079, 1, 0, 43096, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264368, 25120, 0, 0, 39187, 1, 0, 0, 0, 0, 0, 0, 0, 'Fly with Marley Twinbraid', 19034), +(264369, 13118, 0, 0, 30543, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264370, 13118, 0, 1, 30541, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264371, 13118, 0, 2, 30202, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264372, 13717, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264373, 13621, 0, 0, 33302, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Elendilad slain', 19034), +(264374, 13931, 1, 0, 33955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264375, 13325, 1, 0, 44276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264376, 12828, 1, 0, 40728, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264377, 13220, 0, 0, 31235, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith revived', 19034), +(264378, 13641, 1, 0, 45064, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264379, 13034, 2, 0, 192493, 1, 0, 0, 0, 0, 0, 0, 0, 'Read First History Scroll', 19034), +(264380, 13034, 2, 1, 192494, 1, 0, 0, 0, 0, 0, 0, 0, 'Read Second History Scroll', 19034), +(264381, 13034, 2, 2, 192495, 1, 0, 0, 0, 0, 0, 0, 0, 'Read Third History Scroll', 19034), +(264382, 13677, 0, 0, 33341, 5, 0, 0, 0, 0, 0, 0, 0, 'Use Thrust on Melee Target', 19034), +(264383, 13677, 0, 1, 33339, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Shield-Breaker on vulnerable Ranged Target', 19034), +(264384, 13677, 0, 2, 33340, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Charge on vulnerable Charge Target', 19034), +(264385, 12975, 1, 0, 42162, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264386, 13838, 0, 0, 33974, 1, 0, 0, 0, 0, 0, 0, 0, 'Valis Windchaser''s advice', 19034), +(264387, 13838, 0, 1, 33339, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Shield-Breaker on vulnerable Ranged Target', 19034), +(264388, 13059, 0, 0, 32821, 1, 0, 0, 0, 0, 0, 0, 0, 'Challenge issued using Bethod''s Sword', 19034), +(264389, 13059, 0, 1, 30475, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264390, 13329, 0, 0, 32288, 6, 0, 0, 0, 0, 0, 0, 0, 'Skeletal Reaver bones dissolved', 19034), +(264391, 13302, 0, 0, 31866, 10, 0, 0, 0, 0, 0, 0, 0, 'Saronite Mine Slave rescued', 19034), +(264392, 13852, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264393, 13852, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264394, 13852, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264395, 13678, 1, 0, 45192, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264396, 13281, 0, 0, 31767, 1, 0, 0, 0, 0, 0, 0, 0, 'Plague Cauldron Neutralized', 19034), +(264397, 25156, 1, 0, 52506, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264398, 13607, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264399, 13087, 1, 0, 43013, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264400, 13431, 1, 0, 31750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264401, 13431, 1, 1, 31751, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264402, 14140, 0, 0, 34838, 10, 0, 0, 0, 0, 0, 0, 0, 'Kvaldir slain', 19034), +(264403, 13345, 1, 0, 44462, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264404, 13699, 0, 0, 33708, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion defeated', 19034), +(264405, 13289, 0, 0, 31743, 15, 0, 0, 0, 0, 0, 0, 0, 'Icy Ghouls Exploded', 19034), +(264406, 13289, 0, 1, 32168, 15, 0, 0, 0, 0, 0, 0, 0, 'Vicious Geists Exploded', 19034), +(264407, 13289, 0, 2, 32167, 15, 0, 0, 0, 0, 0, 0, 0, 'Risen Alliance Soldier Exploded', 19034), +(264408, 13189, 1, 0, 43441, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264409, 29670, 0, 0, 55016, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264410, 13091, 0, 0, 30644, 10, 0, 0, 0, 0, 0, 0, 0, 'Jotunheim vrykul slain while possessing a Water Terror', 19034), +(264411, 13122, 1, 0, 43169, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264412, 14190, 1, 0, 47819, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264413, 14068, 1, 0, 46851, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264414, 14068, 1, 1, 46853, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264415, 14066, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264416, 13742, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264417, 12977, 0, 0, 30138, 5, 0, 0, 0, 0, 0, 0, 0, 'Niffelem Forefather freed', 19034), +(264418, 12977, 0, 1, 30139, 5, 0, 0, 0, 0, 0, 0, 0, 'Restless Frostborn freed', 19034), +(264419, 13629, 1, 0, 45897, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264420, 13973, 0, 0, 34503, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264421, 14017, 1, 0, 47048, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264422, 13745, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264423, 13922, 1, 0, 5508, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264425, 28808, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(264426, 13862, 0, 0, 34127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264427, 13278, 0, 0, 31198, 1, 0, 0, 0, 0, 0, 0, 0, 'Coprous the Defiled Defeated', 19034), +(264428, 13747, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264429, 13188, 1, 0, 43440, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264430, 14024, 0, 0, 34740, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Pumpkin Pie', 19034), +(264431, 14024, 1, 1, 44836, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264432, 12761, 0, 0, 28078, 50, 0, 0, 0, 0, 0, 0, 0, 'Frenzyheart Attacker', 19034), +(264433, 13672, 1, 0, 45192, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264434, 13625, 0, 0, 33341, 5, 0, 0, 0, 0, 0, 0, 0, 'Use Thrust on Melee Target', 19034), +(264435, 13625, 0, 1, 33339, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Shield-Breaker on vulnerable Ranged Target', 19034), +(264436, 13625, 0, 2, 33340, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Charge on vulnerable Charge Target', 19034), +(264437, 12563, 0, 0, 28042, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Brandon''s Task', 19034), +(264438, 12563, 0, 1, 28044, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Rupert''s Task', 19034), +(264439, 12563, 0, 2, 28043, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Grondel''s Task', 19034), +(264440, 12563, 0, 3, 28205, 1, 0, 0, 0, 0, 0, 0, 0, 'Alchemist Finklestein''s Task', 19034), +(264441, 13816, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264442, 13760, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264443, 13786, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264444, 13324, 1, 0, 44259, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264445, 13790, 1, 0, 45500, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264447, 25055, 0, 0, 39021, 20, 0, 0, 0, 0, 0, 0, 0, 'Earth Spirits Subdued', 19034), +(264448, 13395, 0, 0, 31329, 100, 0, 0, 0, 0, 0, 0, 0, 'Ghoulish Minion Raised', 19034), +(264449, 12197, 1, 0, 36857, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264450, 12197, 1, 1, 36858, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264451, 13191, 1, 0, 43314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264452, 14222, 0, 0, 35627, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264453, 13094, 1, 0, 43095, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264454, 12836, 0, 0, 30003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264455, 12859, 0, 0, 29692, 15, 0, 0, 0, 0, 0, 0, 0, 'Hut Fire Doused', 19034), +(264456, 12296, 0, 0, 27466, 10, 0, 0, 0, 0, 0, 0, 0, 'Westfall Infantry Healed', 19034), +(264457, 13741, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264458, 13821, 1, 0, 45814, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264459, 13721, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264460, 12222, 1, 0, 37229, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264461, 30815, 0, 0, 60857, 1, 0, 0, 0, 0, 0, 0, 0, 'Remove the spear from Orbiss', 19034), +(264462, 13119, 0, 0, 30742, 1, 0, 0, 0, 0, 0, 0, 0, 'First Summoning Altar destroyed', 19034), +(264463, 13119, 0, 1, 30744, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Summoning Altar destroyed', 19034), +(264464, 13119, 0, 2, 30745, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Summoning Altar destroyed', 19034), +(264465, 13119, 0, 3, 30950, 1, 0, 0, 0, 0, 0, 0, 0, 'Fourth Summoning Altar destroyed', 19034), +(264466, 12760, 0, 0, 28111, 30, 0, 0, 0, 0, 0, 0, 0, 'Sparktouched Gorloc', 19034), +(264467, 13758, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264468, 12818, 1, 0, 40603, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264469, 13230, 0, 0, 31304, 5, 0, 0, 0, 0, 0, 0, 0, 'Dying Alliance Soldiers Slain', 19034), +(264470, 12681, 1, 0, 39161, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264471, 13744, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264472, 13069, 0, 0, 30330, 15, 0, 0, 0, 0, 0, 0, 0, 'Jotunheim Proto-Drakes & their riders shot down', 19034), +(264473, 13682, 0, 0, 33687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264474, 13682, 0, 1, 33695, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264475, 13774, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264476, 13865, 0, 0, 34208, 1, 0, 0, 0, 0, 0, 0, 0, 'Protector Endolar slain', 19034), +(264477, 13865, 0, 1, 34294, 1, 0, 0, 0, 0, 0, 0, 0, 'Protector Dorinar slain', 19034), +(264478, 13865, 0, 2, 34204, 1, 0, 0, 0, 0, 0, 0, 0, 'Protector Arminon slain', 19034), +(264479, 13865, 0, 3, 34177, 12, 0, 0, 0, 0, 0, 0, 0, 'Ashenvale Scouts defeated', 19034), +(264480, 13775, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264482, 27615, 0, 0, 46093, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264483, 14412, 0, 0, 36488, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264484, 13859, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264485, 13859, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264486, 13859, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264487, 29725, 0, 0, 55349, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the southeastern shrine', 19034), +(264488, 29725, 0, 1, 55350, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the southwestern shrine', 19034), +(264489, 29725, 0, 2, 55351, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the northern shrine', 19034), +(264490, 29725, 0, 3, 55352, 1, 0, 0, 0, 0, 0, 0, 0, 'Return to camp', 19034), +(264491, 29726, 2, 0, 209615, 1, 0, 0, 569, 0, 0, 0, 0, 'Inspect sign', 19034), +(264492, 29726, 0, 1, 55378, 1, 0, 0, 569, 0, 0, 0, 0, 'Inspect Lifelike Jade Statue', 19034), +(264493, 29726, 0, 2, 55380, 1, 0, 0, 569, 0, 0, 0, 0, 'Inspect Suspicious Jade Statue', 19034), +(264494, 29726, 0, 3, 55381, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Widow Greenpaw', 19034), +(264495, 29727, 0, 0, 55408, 1, 0, 0, 0, 0, 0, 0, 0, 'Guide Sully through the hozen camp', 19034), +(264496, 26198, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(264497, 26198, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(264498, 13205, 1, 0, 43513, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264499, 13135, 1, 0, 43225, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264500, 13776, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264501, 13779, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264502, 29730, 2, 0, 209615, 1, 0, 0, 569, 0, 0, 0, 0, 'Inspect the warning sign', 19034), +(264503, 29730, 0, 1, 55378, 1, 0, 0, 569, 0, 0, 0, 0, 'Inspect a Lifelike Jade Statue', 19034), +(264504, 29730, 0, 2, 55381, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Widow Greenpaw', 19034), +(264505, 29731, 0, 0, 55770, 1, 0, 0, 0, 0, 0, 0, 0, 'Search the Serpent''s Heart for signs of life', 19034), +(264506, 13199, 1, 0, 43323, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264507, 13193, 1, 0, 43323, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264508, 14234, 1, 0, 49090, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264509, 13840, 1, 0, 11109, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264510, 13211, 0, 0, 31130, 7, 0, 0, 0, 0, 0, 0, 0, 'Festering Corpse burned', 19034), +(264511, 14033, 0, 0, 34739, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Candied Sweet Potato', 19034), +(264512, 14033, 1, 1, 44839, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264513, 13867, 0, 0, 3925, 15, 0, 0, 0, 0, 0, 0, 0, 'Thistlefur Village furbolgs killed', 19034), +(264514, 13285, 0, 0, 31810, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Brann create the keystone', 19034), +(264515, 13287, 0, 0, 31140, 5, 0, 0, 0, 0, 0, 0, 0, 'Hulking Abominations killed', 19034), +(264516, 13287, 0, 1, 31155, 5, 0, 0, 0, 0, 0, 0, 0, 'Malefic Necromancers killed', 19034), +(264517, 13287, 0, 2, 31145, 5, 0, 0, 0, 0, 0, 0, 0, 'Shadow Adepts killed', 19034), +(264518, 13777, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264519, 12983, 0, 0, 29563, 1, 0, 0, 0, 0, 0, 0, 0, 'Icemaw Matriarch Rescued', 19034), +(264520, 12686, 0, 0, 28793, 1, 0, 0, 0, 0, 0, 0, 0, 'Darmuk Slain', 19034), +(264521, 12686, 1, 1, 39206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264522, 13043, 0, 0, 30404, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264523, 13805, 0, 0, 33847, 1, 0, 0, 0, 0, 0, 0, 0, 'Forest Heart Corrupted', 19034), +(264524, 13828, 0, 0, 33973, 1, 0, 0, 0, 0, 0, 0, 0, 'Jeran Lockwood''s advice', 19034), +(264525, 13828, 0, 1, 33341, 5, 0, 0, 0, 0, 0, 0, 0, 'Use Thrust on Melee Target', 19034), +(264526, 13819, 1, 0, 46053, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264528, 29723, 0, 0, 55368, 1, 0, 0, 937, 0, 0, 0, 0, 'Confront the Jade Witch', 19034), +(264529, 13664, 0, 0, 33785, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat the Black Knight', 19034), +(264530, 13906, 1, 0, 46362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264531, 13906, 1, 1, 47196, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264532, 13906, 1, 2, 14047, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264533, 13906, 1, 3, 8170, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264534, 13906, 8, -1, 0, 800000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264535, 13844, 0, 0, 34033, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264536, 13844, 1, 1, 45944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264537, 13755, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264540, 13782, 1, 0, 45127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264541, 13035, 0, 0, 30341, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264542, 13035, 0, 1, 30376, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264543, 13035, 0, 2, 30353, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264544, 13765, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264545, 12893, 0, 0, 29845, 1, 0, 0, 0, 0, 0, 0, 0, 'Vile turned', 19034), +(264546, 12893, 0, 1, 29846, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Nightswood turned', 19034), +(264547, 12893, 0, 2, 29847, 1, 0, 0, 0, 0, 0, 0, 0, 'The Leaper turned', 19034), +(264548, 13011, 0, 0, 30340, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264549, 14067, 0, 0, 44164, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264550, 14067, 0, 1, 3256, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264551, 14067, 1, 2, 5061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264552, 13055, 1, 0, 42926, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264553, 13055, 1, 1, 42927, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264554, 13716, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264555, 13753, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264557, 13835, 0, 0, 33974, 1, 0, 0, 0, 0, 0, 0, 0, 'Valis Windchaser''s advice', 19034), +(264558, 13835, 0, 1, 33339, 2, 0, 0, 0, 0, 0, 0, 0, 'Use Shield-Breaker on vulnerable Ranged Target', 19034), +(264559, 27616, 0, 0, 46094, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264560, 14051, 1, 0, 44837, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264561, 13773, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264562, 13942, 1, 0, 46698, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264563, 13715, 1, 0, 44987, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264564, 12819, 1, 0, 40642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264565, 12815, 0, 0, 29333, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264566, 13101, 1, 0, 34747, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264567, 13101, 1, 1, 43128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264568, 13778, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264569, 13762, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264570, 13653, 0, 0, 33507, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorka accompanied to Mor''shan Ramparts', 19034), +(264571, 13785, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264572, 13809, 0, 0, 33687, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264573, 13809, 0, 1, 33695, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264574, 14006, 1, 0, 11149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264575, 12965, 2, 0, 192120, 1, 0, 0, 0, 0, 0, 0, 0, 'Loken''s Fury destroyed', 19034), +(264576, 12965, 2, 1, 192121, 1, 0, 0, 0, 0, 0, 0, 0, 'Loken''s Power destroyed', 19034), +(264577, 12965, 2, 2, 192122, 1, 0, 0, 0, 0, 0, 0, 0, 'Loken''s Favor destroyed', 19034), +(264578, 13851, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264579, 13851, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264580, 13851, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264581, 12668, 0, 0, 28713, 12, 0, 0, 0, 0, 0, 0, 0, 'Trolls killed near a Soul Font', 19034), +(264582, 13103, 1, 0, 43136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264583, 14118, 1, 0, 47038, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264584, 13100, 1, 0, 43099, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264585, 12943, 0, 0, 29919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264586, 12896, 0, 0, 29851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264587, 14293, 0, 0, 35753, 1, 0, 0, 2914, 0, 0, 0, 0, 'Krennan Aranas rescued', 19034), +(264588, 12643, 1, 0, 38686, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264589, 12643, 1, 1, 38687, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 264589 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(264591, 13791, 0, 0, 35297, 15, 0, 0, 0, 0, 0, 0, 0, 'Cult of the Damned member slain', 19034), +(264592, 13845, 1, 0, 46005, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264593, 236, 1, 0, 43314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264597, 13813, 0, 0, 35297, 15, 0, 0, 0, 0, 0, 0, 0, 'Cult of the Damned member slain', 19034), +(264598, 14030, 1, 0, 44837, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264599, 14030, 1, 1, 44836, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264600, 13768, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264601, 13164, 0, 0, 31283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264602, 12609, 1, 0, 38610, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264603, 14134, 1, 0, 47050, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264604, 26054, 0, 0, 40961, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264605, 14089, 1, 0, 46881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264606, 13398, 1, 0, 44631, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264607, 12603, 0, 0, 28378, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264608, 12579, 1, 0, 39063, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264613, 14055, 1, 0, 44839, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264614, 12874, 0, 0, 30142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264615, 12645, 0, 0, 27986, 1, 0, 0, 0, 0, 0, 0, 0, 'Hemet''s taste test', 19034), +(264616, 12645, 0, 1, 28047, 1, 0, 0, 0, 0, 0, 0, 0, 'Hadrius'' taste test', 19034), +(264617, 12645, 0, 2, 28568, 1, 0, 0, 0, 0, 0, 0, 0, 'Tamara''s taste test', 19034), +(264618, 13764, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264619, 12594, 0, 0, 28323, 7, 0, 0, 0, 0, 0, 0, 0, 'Mossy Rampagers Slain', 19034), +(264620, 12212, 1, 0, 37185, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264621, 13643, 2, 0, 194537, 1, 0, 0, 0, 0, 0, 0, 0, 'Sir Wendell Balfour''s death investigated', 19034), +(264622, 13643, 2, 1, 194539, 1, 0, 0, 0, 0, 0, 0, 0, 'Lorien Sunblaze''s death investigated', 19034), +(264623, 13643, 2, 2, 194538, 1, 0, 0, 0, 0, 0, 0, 0, 'Conall Irongrip''s death investigated', 19034), +(264624, 29866, 1, 0, 75023, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264625, 14083, 1, 0, 46877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264626, 13156, 1, 0, 44809, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264627, 12317, 0, 0, 28190, 10, 0, 0, 0, 0, 0, 0, 0, 'Alliance killed in Venture Bay', 19034), +(264628, 13102, 1, 0, 43149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264629, 25157, 0, 0, 39237, 10, 0, 0, 0, 0, 0, 0, 0, 'Stardust No. 2 Tested', 19034), +(264630, 13064, 0, 0, 30514, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim''s History Heard', 19034), +(264633, 13276, 0, 0, 31743, 15, 0, 0, 0, 0, 0, 0, 0, 'Icy Ghouls Exploded', 19034), +(264634, 13276, 0, 1, 32168, 15, 0, 0, 0, 0, 0, 0, 0, 'Vicious Geists Exploded', 19034), +(264635, 13276, 0, 2, 32167, 15, 0, 0, 0, 0, 0, 0, 0, 'Risen Alliance Soldiers Exploded', 19034), +(264636, 13759, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264637, 13042, 0, 0, 30412, 1, 0, 0, 0, 0, 0, 0, 0, 'Information beaten out of Apprentice Osterkilgr', 19034), +(264638, 13042, 0, 1, 30409, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264640, 12630, 0, 0, 28523, 10, 0, 0, 0, 0, 0, 0, 0, 'Hair Samples Collected', 19034), +(264641, 13814, 1, 0, 45500, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264642, 13261, 0, 0, 31364, 3, 0, 0, 0, 0, 0, 0, 0, 'Field Tests Conducted', 19034), +(264643, 13763, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264644, 29801, 1, 0, 74246, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264645, 12414, 0, 0, 26212, 5, 0, 0, 0, 0, 0, 0, 0, 'Highland Mustangs Returned', 19034), +(264646, 13757, 1, 0, 44981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264647, 12927, 0, 0, 29752, 7, 0, 0, 0, 0, 0, 0, 0, 'Hidden Data gathered', 19034), +(264648, 12927, 1, 1, 41179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264649, 25122, 0, 0, 38441, 1, 0, 0, 0, 0, 0, 0, 0, 'Ace''s mind freed', 19034), +(264650, 25122, 0, 1, 38647, 1, 0, 0, 0, 0, 0, 0, 0, 'Izzy''s mind freed', 19034), +(264651, 25122, 0, 2, 38746, 1, 0, 0, 0, 0, 0, 0, 0, 'Gobber''s mind freed', 19034), +(264652, 25122, 0, 3, 38409, 6, 0, 0, 0, 0, 0, 0, 0, 'Other goblin''s minds freed', 19034), +(264653, 14013, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(264654, 14013, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practiced Charge', 19034), +(264655, 12904, 0, 0, 29882, 15, 0, 0, 0, 0, 0, 0, 0, 'Vargul slain', 19034), +(264656, 27163, 0, 0, 44318, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264657, 13113, 1, 0, 34747, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264658, 13113, 1, 1, 43128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264659, 27084, 0, 0, 44955, 6, 0, 0, 0, 0, 0, 0, 0, 'Ebon Gargoyle released', 19034), +(264666, 13887, 1, 0, 46364, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264667, 28556, 0, 0, 48862, 1, 0, 0, 0, 0, 0, 0, 0, 'Pocket-Nuke Armed at Sofera''s Naze', 19034), +(264668, 28556, 0, 1, 48864, 1, 0, 0, 0, 0, 0, 0, 0, 'Pocket-Nuke Armed at Corrahn''s Dagger', 19034), +(264669, 28556, 0, 2, 48865, 1, 0, 0, 0, 0, 0, 0, 0, 'Pocket-Nuke Armed at the Headland', 19034), +(264670, 28556, 0, 3, 48867, 1, 0, 0, 0, 0, 0, 0, 0, 'Pocket-Nuke Armed at Gavin''s Naze', 19034), +(264671, 13834, 1, 0, 45904, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264672, 28566, 0, 0, 48880, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264673, 28566, 0, 1, 48878, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264675, 14081, 1, 0, 46882, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264676, 13074, 1, 0, 44790, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264677, 12562, 0, 0, 28303, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264678, 13355, 0, 0, 32242, 1, 0, 0, 0, 0, 0, 0, 0, 'Blue Sample Collected', 19034), +(264679, 13355, 0, 1, 32244, 1, 0, 0, 0, 0, 0, 0, 0, 'Green Sample Collected', 19034), +(264680, 13355, 0, 2, 32245, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Sample Collected', 19034), +(264681, 13355, 1, 3, 44251, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264682, 29802, 0, 0, 55691, 1, 0, 0, 0, 0, 0, 0, 0, 'Decoder Ring Charged', 19034), +(264683, 29802, 0, 1, 55690, 1, 0, 0, 0, 0, 0, 0, 0, 'Acquire the Singed Cipher', 19034), +(264684, 29802, 1, 2, 74752, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264685, 29865, 0, 0, 56070, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264689, 13292, 0, 0, 31364, 3, 0, 0, 0, 0, 0, 0, 0, 'Frostbrood Skytalons Destroyed', 19034), +(264690, 12801, 0, 0, 29245, 1, 0, 0, 0, 0, 0, 0, 0, 'The Light of Dawn Uncovered', 19034), +(264691, 12762, 0, 0, 28078, 30, 0, 0, 0, 0, 0, 0, 0, 'Frenzyheart Attacker', 19034), +(264692, 12762, 1, 1, 39748, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264693, 13861, 0, 0, 34127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264695, 29685, 1, 0, 34157, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264696, 14104, 0, 0, 35012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264697, 13152, 2, 0, 193025, 1, 0, 0, 0, 0, 0, 0, 0, 'Patches freed', 19034), +(264698, 13152, 0, 1, 30993, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Patches kill Doctor Sabnok', 19034), +(264699, 12632, 0, 0, 28526, 7, 0, 0, 0, 0, 0, 0, 0, 'Cursed Offspring of Har''koa resurrected', 19034), +(264700, 14023, 0, 0, 34737, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Spice Bread Stuffing', 19034), +(264701, 14023, 1, 1, 44837, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264702, 12867, 1, 0, 41341, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264703, 12443, 1, 0, 37664, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264704, 13670, 1, 0, 45003, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264705, 29686, 1, 0, 73084, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264706, 13654, 1, 0, 45082, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264707, 14053, 1, 0, 44840, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264708, 13367, 0, 0, 32300, 1, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended Defeated', 19034), +(264709, 13771, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264710, 28538, 0, 0, 48752, 10, 0, 0, 0, 0, 0, 0, 0, 'SI:7 Agent captured', 19034), +(264711, 13201, 1, 0, 43324, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264712, 14090, 0, 0, 34899, 8, 0, 0, 0, 0, 0, 0, 0, 'Snowblind Follower captured', 19034), +(264713, 12916, 0, 0, 29928, 1, 0, 0, 0, 0, 0, 0, 0, 'Scourge Enclosure Blown Up', 19034), +(264714, 12854, 1, 0, 40947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264715, 13749, 0, 0, 32255, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264716, 29687, 0, 0, 24723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264717, 29687, 0, 1, 24560, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264718, 26201, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(264719, 26201, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice casting Corruption', 19034), +(264720, 12433, 1, 0, 37664, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264721, 12979, 1, 0, 42204, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264722, 13679, 0, 0, 38595, 1, 0, 0, 0, 0, 0, 0, 0, 'Argent Valiant defeated', 19034), +(264723, 13234, 9, 0, 332, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264724, 12685, 0, 0, 28795, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264725, 13769, 1, 0, 44978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264726, 13962, 0, 0, 4273, 1, 0, 0, 0, 0, 0, 0, 0, 'Keeper Ordanus slain', 19034), +(264727, 12928, 1, 0, 41258, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264728, 14268, 1, 0, 49104, 1, 0, 0, 1456, 0, 0, 0, 0, '', 19034), +(264729, 9826, 1, 0, 24482, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264730, 12897, 0, 0, 29851, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264732, 13982, 1, 0, 46774, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264735, 13235, 0, 0, 30698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264737, 26108, 1, 0, 4513, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264738, 26279, 0, 0, 1142, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264739, 26279, 0, 1, 1144, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264740, 12886, 0, 0, 29800, 10, 0, 0, 0, 0, 0, 0, 0, 'Hyldsmeet Drakerider Defeated', 19034), +(264741, 27444, 0, 0, 10429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264742, 13992, 0, 0, 34614, 8, 0, 0, 0, 0, 0, 0, 0, 'Kolkar Centaur Killed', 19034), +(264743, 27656, 0, 0, 45807, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264744, 14136, 0, 0, 34947, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264745, 14136, 0, 1, 34907, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264746, 14085, 1, 0, 46876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264747, 12985, 1, 0, 42423, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264748, 13272, 8, -1, 0, 50000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264749, 13200, 1, 0, 43314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264750, 13519, 0, 0, 32899, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264751, 13519, 0, 1, 32888, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264752, 26256, 1, 0, 60264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264753, 1, 0, 0, 20000, 1, 0, 0, 0, 0, 0, 0, 0, 'Remember your talents', 19034), +(264754, 1, 9, 1, 333, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264755, 14075, 0, 0, 34865, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264756, 14438, 0, 0, 42354, 15, 0, 0, 0, 0, 0, 0, 0, 'Palemane Gnolls', 19034), +(264757, 14101, 0, 0, 34980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264758, 12493, 5, -1, 5143, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264759, 14005, 0, 0, 34521, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264760, 14060, 1, 0, 44836, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264761, 14123, 1, 0, 48937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264762, 14123, 1, 1, 48939, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264763, 14123, 1, 2, 48941, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264764, 14034, 1, 0, 46827, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264765, 14376, 0, 0, 5771, 1, 0, 0, 0, 0, 0, 0, 0, 'Jugkar Grim''rod Slain', 19034), +(264766, 24591, 0, 0, 37843, 1, 0, 0, 0, 0, 0, 0, 0, 'Go to the Top of the Tower', 19034), +(264767, 24591, 0, 1, 37811, 1, 1, 0, 0, 0, 0, 0, 0, 'Gar''dul "Relieved" of Command', 19034), +(264768, 27161, 0, 0, 44360, 1, 0, 0, 0, 0, 0, 0, 0, 'Scourge Bone Animus destroyed', 19034), +(264769, 27161, 0, 1, 44329, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264770, 29762, 1, 0, 79811, 8, 0, 0, 645, 0, 0, 0, 0, '', 19034), +(264771, 26275, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264772, 30359, 0, 0, 58224, 1, 1, 0, 904, 0, 0, 0, 0, '', 19034), +(264773, 13985, 0, 0, 3774, 12, 0, 0, 0, 0, 0, 0, 0, 'Demons at Fire Scar Shrine slain', 19034), +(264774, 14102, 0, 0, 34965, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264775, 12614, 0, 0, 28467, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264776, 13171, 0, 0, 31131, 10, 0, 0, 0, 0, 0, 0, 0, 'Banished Scourge Crystals', 19034), +(264777, 13988, 0, 0, 34631, 1, 0, 0, 0, 0, 0, 0, 0, 'Tonga''s Eyes Taken to Summit', 19034), +(264778, 13988, 1, 1, 46782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264779, 14076, 1, 0, 46889, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264781, 13948, 0, 0, 34411, 1, 0, 0, 0, 0, 0, 0, 0, 'Master''s Glaive surveillance', 19034), +(264782, 14080, 0, 0, 34838, 10, 0, 0, 0, 0, 0, 0, 0, 'Kvaldir slain', 19034), +(264783, 25872, 0, 0, 41460, 1, 0, 0, 0, 0, 0, 0, 0, 'Captured Freewind Brave freed', 19034), +(264784, 13889, 0, 0, 34327, 15, 0, 0, 0, 0, 0, 0, 0, 'Fresh Dinosaur Meat fed to Venomhide Hatchling', 19034), +(264785, 12805, 0, 0, 29303, 8, 0, 0, 0, 0, 0, 0, 0, 'Lifeblood Energy Recovered', 19034), +(264786, 25158, 0, 0, 39221, 3, 0, 0, 0, 0, 0, 0, 0, 'Solid Zephyrites Cut', 19034), +(264787, 25158, 1, 1, 52086, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264788, 13904, 0, 0, 34338, 12, 0, 0, 0, 0, 0, 0, 0, 'Silithid Eggs fed to Venomhide Hatchling', 19034), +(264789, 13166, 0, 0, 31099, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264790, 13166, 0, 1, 31100, 10, 0, 0, 0, 0, 0, 0, 0, 'Scourge slain', 19034), +(264791, 30361, 0, 0, 58367, 10, 0, 0, 0, 0, 0, 0, 0, 'Ik''thik Mantid slain', 19034), +(264792, 24806, 1, 0, 50289, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264795, 14382, 0, 0, 36397, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264796, 14382, 0, 1, 36399, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264797, 27056, 1, 0, 60766, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264798, 26401, 1, 0, 55180, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264799, 25161, 0, 0, 39223, 3, 0, 0, 0, 0, 0, 0, 0, 'Jagged Jasper Cut', 19034), +(264800, 25161, 1, 1, 52121, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264801, 13264, 0, 0, 31743, 15, 0, 0, 0, 0, 0, 0, 0, 'Icy Ghouls Exploded', 19034), +(264802, 13264, 0, 1, 32168, 15, 0, 0, 0, 0, 0, 0, 0, 'Vicious Geists Exploded', 19034), +(264803, 13264, 0, 2, 32167, 15, 0, 0, 0, 0, 0, 0, 0, 'Risen Alliance Soldiers Exploded', 19034), +(264804, 14107, 0, 0, 35055, 6, 0, 0, 0, 0, 0, 0, 0, 'Fallen Hero''s Spirit blessed', 19034), +(264805, 13926, 0, 0, 34365, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Orphan Matron Aria', 19034), +(264806, 27622, 0, 0, 46108, 1, 0, 0, 0, 0, 0, 0, 0, 'Salvageable Shredder Located', 19034), +(264807, 27622, 0, 1, 46109, 1, 0, 0, 0, 0, 0, 0, 0, 'Salvageable Shredder Defended', 19034), +(264809, 14059, 1, 0, 44840, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264811, 24594, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264813, 13180, 0, 0, 31086, 10, 0, 0, 0, 0, 0, 0, 0, 'Alliance members slain', 19034), +(264814, 28002, 0, 0, 47516, 1, 0, 0, 0, 0, 0, 0, 0, 'Prolific Writer Questioned', 19034), +(264815, 28002, 0, 1, 47519, 1, 0, 0, 0, 0, 0, 0, 0, 'Privileged Socialite Soothed', 19034), +(264816, 28002, 0, 2, 47520, 1, 0, 0, 0, 0, 0, 0, 0, 'Pretentious Businessman Chastened', 19034), +(264817, 28002, 0, 3, 47707, 1, 0, 0, 0, 0, 0, 0, 0, 'Budding Artist Counseled', 19034), +(264819, 12553, 1, 0, 38514, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264820, 27441, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264821, 27441, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264822, 27441, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264823, 12939, 0, 0, 30038, 6, 0, 0, 0, 0, 0, 0, 0, 'Mjordin Combatants challenged and defeated', 19034), +(264824, 14109, 1, 0, 47045, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264825, 14109, 1, 1, 47046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264826, 14109, 1, 2, 47047, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264827, 25450, 1, 0, 18947, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264829, 25229, 0, 0, 39623, 5, 0, 0, 0, 0, 0, 0, 0, 'Gnomes Motivated', 19034), +(264830, 25229, 0, 1, 39466, 5, 0, 0, 0, 0, 0, 0, 0, 'Motivated Gnomes Brought to Captain Sparknozzle', 19034), +(264831, 26107, 1, 0, 4512, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264832, 14028, 0, 0, 34741, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Cranberry Chutney', 19034), +(264833, 14028, 1, 1, 44840, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264835, 26996, 0, 0, 4542, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264836, 26004, 1, 0, 56469, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264837, 13943, 0, 0, 34419, 10, 0, 0, 0, 0, 0, 0, 0, 'Astranaar Skirmishers slain', 19034), +(264838, 13943, 0, 1, 34420, 3, 0, 0, 0, 0, 0, 0, 0, 'Astranaar Officers slain', 19034), +(264839, 12839, 1, 0, 40666, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264840, 14079, 1, 0, 46875, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264841, 25559, 0, 0, 38997, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264842, 14108, 0, 0, 35009, 8, 0, 0, 0, 0, 0, 0, 0, 'Hurl Spears at North Sea Kraken', 19034), +(264843, 14108, 0, 1, 35092, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264844, 14108, 1, 2, 46954, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264845, 13127, 0, 0, 27655, 1, 0, 0, 0, 0, 0, 0, 0, 'Mage-Lord Urom Defeated', 19034), +(264846, 13863, 0, 0, 34127, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264851, 13876, 1, 0, 5544, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264852, 28809, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(264853, 24580, 0, 0, 15956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264854, 14131, 1, 0, 49162, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264855, 12649, 1, 0, 38698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264856, 29733, 0, 0, 67152, 1, 0, 0, 1212, 1213, 0, 0, 0, 'Listen to Rell''s report', 19034), +(264857, 13997, 0, 0, 34436, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264858, 14145, 1, 0, 47037, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264859, 28807, 1, 0, 65732, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264860, 14127, 1, 0, 47040, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264861, 12863, 1, 0, 41336, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264862, 14048, 1, 0, 44838, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264863, 14368, 0, 0, 36287, 1, 0, 0, 0, 0, 0, 0, 0, 'Cynthia rescued', 19034), +(264864, 14368, 0, 1, 36288, 1, 0, 0, 0, 0, 0, 0, 0, 'Ashley rescued', 19034), +(264865, 14368, 0, 2, 36289, 1, 0, 0, 0, 0, 0, 0, 0, 'James rescued', 19034), +(264866, 12634, 1, 0, 38656, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264867, 12634, 1, 1, 38653, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264868, 12634, 1, 2, 38655, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264869, 14044, 1, 0, 44837, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264870, 14044, 1, 1, 44840, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264871, 14064, 0, 0, 34806, 1, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Sharing', 19034), +(264872, 14401, 1, 0, 49281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264873, 29195, 0, 0, 52863, 1, 1, 0, 0, 0, 0, 0, 0, 'Open the portal to the Firelands', 19034), +(264874, 12684, 1, 0, 39167, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264879, 25162, 1, 0, 52506, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264881, 12676, 0, 0, 28777, 5, 0, 0, 0, 0, 0, 0, 0, 'Scourgewagons destroyed', 19034), +(264882, 12676, 0, 1, 28786, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakuru''s task complete', 19034), +(264883, 12676, 0, 2, 28928, 1, 0, 0, 0, 0, 0, 0, 0, 'Learn Drakuru''s secret', 19034), +(264884, 14197, 1, 0, 48128, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264885, 13970, 1, 0, 46742, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264888, 12831, 1, 0, 40944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264889, 14082, 1, 0, 46879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264890, 26140, 1, 0, 56822, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264891, 12860, 0, 0, 29752, 7, 0, 0, 0, 0, 0, 0, 0, 'Hidden Data gathered', 19034), +(264892, 12860, 1, 1, 41179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264893, 26433, 1, 0, 58811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264894, 28500, 1, 0, 64649, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264895, 13903, 0, 0, 34336, 10, 0, 0, 0, 0, 0, 0, 0, 'Silithid Meat fed to Venomhide Hatchling', 19034), +(264899, 26887, 1, 0, 54829, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264900, 26999, 1, 0, 60760, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264901, 26999, 1, 1, 60761, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264902, 26999, 1, 2, 60762, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264903, 26999, 1, 3, 60763, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264908, 13545, 0, 0, 33000, 7, 0, 0, 0, 0, 0, 0, 0, 'Blackwood Furbolg Cleansed', 19034), +(264909, 25149, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(264910, 25149, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(264911, 25143, 5, -1, 73899, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Primal Strike', 19034), +(264913, 25181, 1, 0, 52276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264914, 24610, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264917, 27748, 0, 0, 46646, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidian Colossus Defeated', 19034), +(264918, 26053, 0, 0, 2562, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264919, 26053, 0, 1, 2564, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264920, 27804, 0, 0, 46849, 50, 0, 0, 0, 0, 0, 0, 0, 'Village Fires Extinguished', 19034), +(264921, 14112, 1, 0, 47037, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264922, 14115, 0, 0, 35200, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264923, 28811, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(264924, 14124, 1, 0, 48766, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264926, 26227, 1, 0, 57766, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264927, 24584, 0, 0, 28859, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264928, 26787, 1, 0, 60334, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264929, 14093, 0, 0, 34884, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264930, 14039, 1, 0, 5188, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264931, 27619, 0, 0, 46092, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264932, 25065, 1, 0, 52281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264933, 14062, 1, 0, 44837, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264934, 28736, 0, 0, 48859, 100, 0, 0, 0, 0, 0, 0, 0, 'Infantrymen Slain', 19034), +(264937, 26065, 0, 0, 41642, 1, 1, 0, 0, 0, 0, 0, 0, 'Free Wil''hai', 19034), +(264938, 25458, 1, 0, 53099, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264939, 25641, 1, 0, 55175, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264940, 30698, 1, 0, 80830, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264943, 24718, 1, 0, 11476, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264944, 14014, 1, 0, 46828, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264945, 25141, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(264946, 25141, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(264948, 14218, 0, 0, 35229, 80, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264949, 30363, 1, 0, 79332, 1, 0, 0, 648, 0, 0, 0, 0, '', 19034), +(264950, 27805, 1, 0, 62545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264951, 27805, 1, 1, 62546, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264952, 27805, 1, 2, 62543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264953, 26553, 0, 0, 43257, 1, 1, 0, 0, 0, 0, 0, 0, 'Destroy High Priestess Jeklik''s body', 19034), +(264954, 24849, 0, 0, 38340, 1, 0, 0, 0, 0, 0, 0, 0, 'Stormwind Counting House searched', 19034), +(264955, 24849, 0, 1, 38341, 1, 0, 0, 0, 0, 0, 0, 0, 'Stormwind Auction House searched', 19034), +(264956, 24849, 0, 2, 38342, 1, 0, 0, 0, 0, 0, 0, 0, 'Stormwind Barber Shop searched', 19034), +(264957, 14096, 0, 0, 34956, 1, 0, 0, 0, 0, 0, 0, 0, 'Kul the Reckless rescued', 19034), +(264958, 14096, 0, 1, 34716, 4, 0, 0, 0, 0, 0, 0, 0, 'Captive Aspirant rescued', 19034), +(264961, 14031, 0, 0, 37872, 1, 0, 0, 0, 0, 0, 0, 0, 'Cave Painting 1 Captured', 19034), +(264962, 14031, 0, 1, 37895, 1, 0, 0, 0, 0, 0, 0, 0, 'Cave Painting 2 Captured', 19034), +(264963, 14031, 0, 2, 37896, 1, 0, 0, 0, 0, 0, 0, 0, 'Cave Painting 3 Captured', 19034), +(264964, 14031, 0, 3, 37897, 1, 0, 0, 0, 0, 0, 0, 0, 'Pygmy Altar Captured', 19034), +(264965, 26096, 1, 0, 56810, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264966, 13888, 0, 0, 34333, 1, 0, 0, 0, 0, 0, 0, 0, 'Lord Magmathar slain', 19034), +(264970, 13975, 0, 1, 65892, 1, 0, 0, 0, 0, 0, 0, 0, 'Crossroads Caravan Escorted', 19034), +(264971, 24666, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(264972, 24666, 0, 1, 38032, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264973, 24836, 1, 0, 50384, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264974, 24836, 8, -1, 0, 2000000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264975, 29690, 0, 0, 67040, 1, 0, 0, 1055, 0, 0, 0, 0, 'Discovered Pandaria', 19034), +(264976, 13898, 0, 0, 33079, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264977, 13927, 0, 0, 34365, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Orphan Matron Aria', 19034), +(264978, 24603, 0, 0, 37929, 13, 0, 0, 0, 0, 0, 0, 0, 'Razormane Quilboar Slain', 19034), +(264979, 25860, 0, 0, 42057, 20, 0, 0, 0, 0, 0, 0, 0, 'Attacking Kvaldir slain', 19034), +(264980, 25129, 1, 0, 4905, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264982, 13947, 0, 0, 34494, 20, 0, 0, 0, 0, 0, 0, 0, 'Astranaar Sentinels slain', 19034), +(264983, 13947, 0, 1, 34492, 10, 0, 0, 0, 0, 0, 0, 0, 'Astranaar Throwers destroyed', 19034), +(264984, 13613, 0, 0, 33266, 5, 0, 0, 0, 0, 0, 0, 0, 'Wounded Mor''shan Defenders Rescued', 19034), +(264985, 26003, 0, 0, 41865, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264986, 14043, 0, 0, 34739, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Candied Sweet Potato', 19034), +(264987, 14043, 1, 1, 44839, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264988, 26188, 1, 0, 4805, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264990, 25895, 1, 0, 56181, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264991, 25981, 1, 0, 56254, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264992, 14132, 0, 0, 6370, 10, 0, 0, 0, 0, 0, 0, 0, 'Ruins of Arkkoran Makrinni slain', 19034), +(264993, 14216, 1, 0, 48921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264994, 26088, 1, 0, 56569, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264995, 25263, 1, 0, 6658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264996, 14061, 1, 0, 44838, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(264997, 13897, 0, 0, 34485, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(264998, 26248, 0, 0, 42758, 6, 0, 0, 0, 0, 0, 0, 0, 'Slain Crew Member information', 19034), +(264999, 24576, 1, 0, 49915, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265000, 26110, 1, 0, 4482, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265001, 25147, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(265002, 25147, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(265003, 14077, 0, 0, 34852, 8, 0, 0, 0, 0, 0, 0, 0, 'Last Rites administered', 19034), +(265004, 14077, 1, 1, 46870, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265005, 27991, 0, 0, 47304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265006, 14094, 1, 0, 46896, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265007, 24863, 1, 0, 50445, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265008, 13858, 0, 0, 33438, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265009, 13858, 0, 1, 33550, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265010, 13858, 0, 2, 33429, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265011, 14105, 0, 0, 34808, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265013, 25136, 1, 0, 11583, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265014, 24802, 0, 0, 37554, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Sylvanas Windrunner', 19034), +(265015, 24802, 0, 1, 38211, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape the Lich King', 19034), +(265016, 14040, 0, 0, 34740, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Pumpkin Pie', 19034), +(265017, 14040, 1, 1, 44836, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265018, 25749, 0, 0, 41235, 8, 0, 0, 0, 0, 0, 0, 0, 'Alliance Lookout restocked', 19034), +(265020, 14223, 0, 0, 35632, 1, 0, 0, 0, 0, 0, 0, 0, 'Kohor Slain', 19034), +(265021, 14041, 0, 0, 34741, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Cranberry Chutney', 19034), +(265022, 14041, 1, 1, 44840, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265023, 28122, 0, 0, 47593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265024, 26132, 0, 0, 41650, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265025, 24635, 0, 0, 37990, 10, 0, 0, 0, 0, 0, 0, 0, 'Samples Given', 19034), +(265026, 14074, 1, 0, 46859, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265027, 26017, 1, 0, 56569, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265030, 27811, 0, 0, 46968, 8, 0, 0, 0, 0, 0, 0, 0, 'Mullan Gryphons found and returned', 19034), +(265031, 13884, 0, 0, 34314, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265032, 14054, 1, 0, 44836, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265033, 14004, 1, 0, 46801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265034, 26124, 0, 0, 42114, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265037, 27803, 0, 0, 46838, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265038, 24712, 0, 0, 36658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265039, 27620, 0, 0, 46096, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265040, 14047, 0, 0, 34738, 5, 0, 0, 0, 0, 0, 0, 0, 'Prepare Slow-Roasted Turkey', 19034), +(265041, 14047, 1, 1, 44838, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265042, 14103, 1, 0, 46849, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265044, 13952, 1, 0, 46691, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265045, 24655, 0, 0, 37558, 6, 0, 0, 0, 0, 0, 0, 0, 'Perfumed Guards Analyzed', 19034), +(265046, 25199, 0, 0, 39355, 1, 0, 0, 0, 0, 0, 0, 0, 'Salute the Drill Sergeant', 19034), +(265047, 25199, 0, 1, 39356, 1, 0, 0, 0, 0, 0, 0, 0, 'Roar with the Drill Sergeant', 19034), +(265048, 25199, 0, 2, 39362, 1, 0, 0, 0, 0, 0, 0, 0, 'Cheer with the Drill Sergeant', 19034), +(265049, 25199, 0, 3, 39361, 1, 0, 0, 0, 0, 0, 0, 0, 'Dance with the Drill Sergeant', 19034), +(265050, 28824, 0, 0, 42188, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265051, 24611, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265053, 24614, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265054, 25366, 1, 0, 9266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265055, 25262, 1, 0, 4871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265056, 14193, 0, 0, 35381, 1, 0, 0, 0, 0, 0, 0, 0, 'Cleansing Ritual Completed', 19034), +(265057, 26380, 1, 0, 58271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265058, 27747, 0, 0, 46551, 10, 0, 0, 0, 0, 0, 0, 0, 'Wildhammer Kegs Smashed', 19034), +(265059, 24717, 1, 0, 11478, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265060, 24717, 1, 1, 11479, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265061, 24717, 1, 2, 11480, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265062, 26266, 1, 0, 57988, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265063, 24704, 0, 0, 38252, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265064, 28810, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(265065, 26250, 0, 0, 42801, 1, 1, 0, 0, 0, 0, 0, 0, 'Mor''norokk the Hateful subdued', 19034), +(265066, 24745, 1, 0, 50320, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265067, 27992, 1, 0, 62830, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265068, 26254, 0, 0, 43198, 1, 0, 0, 0, 0, 0, 0, 0, 'Mor''norokk interrogated', 19034), +(265074, 24573, 0, 0, 37747, 1, 0, 0, 0, 0, 0, 0, 0, 'Krulmoo Eulogized', 19034), +(265075, 24573, 0, 1, 37756, 1, 0, 0, 0, 0, 0, 0, 0, 'Dranh Eulogized', 19034), +(265076, 24573, 0, 2, 37758, 1, 0, 0, 0, 0, 0, 0, 0, 'Yonada Eulogized', 19034), +(265077, 24573, 0, 3, 37759, 1, 0, 0, 0, 0, 0, 0, 0, 'Omusa Eulogized', 19034), +(265078, 24573, 1, 4, 49880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265079, 26133, 0, 0, 41650, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265080, 24652, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265081, 24652, 0, 1, 38032, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265082, 25451, 1, 0, 55166, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265086, 14095, 1, 0, 46955, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265087, 24653, 1, 0, 50044, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265089, 28853, 1, 0, 66927, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265090, 24720, 1, 0, 11186, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265091, 24720, 1, 1, 11188, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265092, 24720, 1, 2, 11185, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265093, 24720, 1, 3, 11184, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265094, 24636, 0, 0, 37990, 10, 0, 0, 0, 0, 0, 0, 0, 'Samples Given', 19034), +(265095, 24642, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(265096, 24642, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265097, 26261, 0, 0, 44772, 6, 0, 0, 0, 0, 0, 0, 0, 'Enslaved miner freed', 19034), +(265098, 24851, 0, 0, 38340, 1, 0, 0, 0, 0, 0, 0, 0, 'Orgrimmar Bank searched', 19034), +(265099, 24851, 0, 1, 38341, 1, 0, 0, 0, 0, 0, 0, 0, 'Orgrimmar Auction House searched', 19034), +(265100, 24851, 0, 2, 38342, 1, 0, 0, 0, 0, 0, 0, 0, 'Orgrimmar Barber Shop searched', 19034), +(265101, 25165, 0, 0, 39236, 6, 0, 0, 0, 0, 0, 0, 0, 'Sample of Scorpid Venom Collected', 19034), +(265108, 24679, 0, 0, 38147, 1, 0, 0, 0, 0, 0, 0, 0, 'Offering placed', 19034), +(265109, 24731, 1, 0, 11504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265111, 24609, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265112, 27159, 0, 0, 44574, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265113, 24660, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265114, 24660, 0, 1, 37984, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265115, 26989, 0, 0, 44793, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265116, 25134, 0, 0, 10556, 4, 0, 0, 0, 0, 0, 0, 0, 'Peons Awoken', 19034), +(265117, 25134, 1, 1, 16114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265118, 25340, 1, 0, 9528, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265120, 13946, 0, 0, 34440, 12, 0, 0, 0, 0, 0, 0, 0, 'Fel Rock grellkin killed with Ireroot Seeds', 19034), +(265122, 30344, 1, 0, 79713, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265124, 30346, 1, 0, 78917, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265125, 27810, 0, 0, 46813, 1, 0, 0, 0, 0, 0, 0, 0, 'Mullan Gryphon Rider defeated', 19034), +(265126, 24498, 0, 0, 36764, 15, 0, 0, 0, 0, 0, 0, 0, 'Alliance Slaves freed', 19034), +(265127, 24498, 0, 1, 36494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265128, 24658, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265129, 24658, 0, 1, 37214, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265130, 24665, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265131, 24665, 0, 1, 38030, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265132, 24676, 0, 0, 37692, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265133, 24676, 0, 1, 37686, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265134, 24676, 0, 2, 37685, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265135, 27633, 0, 0, 8443, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265139, 27624, 1, 0, 61044, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265140, 27624, 1, 1, 61975, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265141, 27624, 1, 2, 61976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265142, 27624, 1, 3, 61977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265144, 13944, 0, 0, 34424, 1, 0, 0, 0, 0, 0, 0, 0, 'Broken Wagon exploded', 19034), +(265146, 24582, 0, 0, 16061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265147, 30347, 1, 0, 78934, 1, 0, 0, 545, 0, 0, 0, 0, '', 19034), +(265148, 30348, 0, 0, 58894, 1, 0, 0, 505, 0, 0, 0, 0, 'Observe Lorekeeper Vaeldrin''s Ritual', 19034), +(265149, 30349, 0, 0, 58068, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265150, 30349, 0, 1, 58117, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265151, 30350, 1, 0, 78911, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265152, 30351, 1, 0, 78918, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265153, 27069, 0, 0, 44915, 5, 0, 0, 0, 0, 0, 0, 0, 'Sea Dog Crate recovered', 19034), +(265154, 24734, 1, 0, 15722, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265159, 26252, 1, 0, 57935, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265160, 24659, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265161, 24659, 0, 1, 37917, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265162, 24690, 0, 0, 9376, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265164, 24529, 0, 0, 37520, 5, 0, 0, 0, 0, 0, 0, 0, 'Taurajo Refugee Released from Cage', 19034), +(265165, 24529, 0, 1, 37521, 8, 0, 0, 0, 0, 0, 0, 0, 'Bristleback Quilboar Slain', 19034), +(265166, 26186, 1, 0, 57184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265168, 26295, 1, 0, 58113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265169, 26295, 1, 1, 58114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265170, 26295, 1, 2, 58115, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265171, 26295, 1, 3, 58116, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265172, 24674, 0, 0, 37802, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265173, 25139, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(265174, 25139, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(265175, 25127, 1, 0, 4862, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265176, 30352, 0, 0, 58116, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265177, 30353, 1, 0, 78914, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265178, 30354, 0, 0, 58639, 8, 0, 0, 520, 0, 0, 0, 0, 'Captives Freed', 19034), +(265179, 30355, 1, 0, 79120, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265180, 30356, 0, 0, 58614, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265181, 27904, 1, 0, 62749, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265182, 26362, 0, 0, 42881, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Tan''shang', 19034), +(265183, 26362, 0, 1, 42882, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Tenjiyu', 19034), +(265184, 26362, 0, 2, 42883, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Chiyu', 19034), +(265185, 26362, 0, 3, 42884, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape from Zul''Gurub', 19034), +(265186, 26769, 0, 0, 44054, 1, 0, 0, 0, 0, 0, 0, 0, 'Board the Riverboat to Nozzlepot', 19034), +(265187, 26769, 1, 1, 60296, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265188, 27760, 1, 0, 62483, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265193, 28126, 2, 0, 176158, 1, 0, 0, 0, 0, 0, 0, 0, 'Extinguish the Brazier of Pain', 19034), +(265194, 28126, 2, 1, 176159, 1, 0, 0, 0, 0, 0, 0, 0, 'Extinguish the Brazier of Malice', 19034), +(265195, 28126, 2, 2, 176160, 1, 0, 0, 0, 0, 0, 0, 0, 'Extinguish the Brazier of Suffering', 19034), +(265196, 28126, 2, 3, 176161, 1, 0, 0, 0, 0, 0, 0, 0, 'Extinguish the Brazier of Hatred', 19034), +(265197, 24715, 1, 0, 50236, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265198, 24737, 1, 0, 11834, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265199, 14346, 0, 0, 36232, 1, 0, 0, 0, 0, 0, 0, 0, 'Grimfeather Mounted', 19034), +(265200, 14346, 0, 1, 36228, 10, 0, 0, 0, 0, 0, 0, 0, 'Slitherblade Sirens Defeated', 19034); -- 265200 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(265201, 14346, 0, 2, 36230, 3, 0, 0, 0, 0, 0, 0, 0, 'Sea Giants Defeated', 19034), +(265202, 14346, 0, 3, 36229, 10, 0, 0, 0, 0, 0, 0, 0, 'Slitherblade Invaders Defeated', 19034), +(265203, 26241, 1, 0, 57911, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265204, 26241, 1, 1, 57788, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265205, 26241, 1, 2, 57786, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265206, 24733, 1, 0, 11510, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265207, 30357, 0, 0, 58955, 7, 0, 0, 520, 0, 0, 0, 0, 'Stoneplow Envoy Saved', 19034), +(265208, 24579, 0, 0, 28860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265209, 26605, 1, 0, 59057, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265210, 26605, 1, 1, 59058, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265211, 26605, 1, 2, 59059, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265212, 26605, 1, 3, 59060, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265213, 24628, 1, 0, 50017, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265214, 24768, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(265215, 24768, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265216, 14050, 1, 0, 46833, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265217, 25246, 1, 0, 52572, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265218, 25246, 8, -1, 0, 2000000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265221, 25870, 0, 0, 41431, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265222, 24583, 0, 0, 16028, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265223, 14065, 0, 0, 34806, 1, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Sharing', 19034), +(265224, 25135, 1, 0, 16332, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265226, 24663, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265227, 24663, 0, 1, 38016, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265228, 24803, 1, 0, 50289, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265229, 24662, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265230, 24662, 0, 1, 38006, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265231, 28813, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(265232, 26232, 0, 0, 42417, 1, 0, 0, 0, 0, 0, 0, 0, 'Eavesdrop on Thugs.', 19034), +(265233, 25131, 0, 0, 3101, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265235, 24650, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265236, 24650, 0, 1, 38023, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265237, 24695, 0, 0, 38358, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodpetal Observation', 19034), +(265238, 24695, 0, 1, 38521, 1, 0, 0, 0, 0, 0, 0, 0, 'Diemetradon Observation', 19034), +(265239, 24695, 0, 2, 38519, 1, 0, 0, 0, 0, 0, 0, 0, 'Gorilla Observation', 19034), +(265240, 24695, 0, 3, 38520, 1, 0, 0, 0, 0, 0, 0, 0, 'Pterrordax Observation', 19034), +(265241, 28812, 0, 0, 50047, 4, 0, 0, 0, 0, 0, 0, 0, 'Injured Soldier Revived', 19034), +(265242, 25205, 0, 0, 39365, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen to the shaman''s fable', 19034), +(265247, 27089, 0, 0, 45102, 5, 0, 0, 0, 0, 0, 0, 0, 'Frightened Provincial Minuteman slain and converted', 19034), +(265248, 27089, 0, 1, 45103, 5, 0, 0, 0, 0, 0, 0, 0, 'Forsaken Trooper mobilized', 19034), +(265249, 27089, 0, 2, 44453, 1, 0, 0, 0, 0, 0, 0, 0, 'Hunt Thassarian', 19034), +(265253, 14399, 1, 0, 49280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265257, 25970, 1, 0, 56251, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265258, 29197, 0, 0, 52906, 6, 0, 0, 0, 0, 0, 0, 0, 'Kill elementals near Elderlimb', 19034), +(265259, 29197, 0, 1, 52907, 6, 0, 0, 0, 0, 0, 0, 0, 'Kill elementals near Thisalee', 19034), +(265260, 29197, 0, 2, 52903, 6, 0, 0, 0, 0, 0, 0, 0, 'Kill elementals near Tholo and Anren', 19034), +(265261, 26813, 0, 0, 43321, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass through Zanzil''s Portal', 19034), +(265262, 24753, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265263, 24551, 1, 0, 49850, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265264, 25001, 0, 0, 38880, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265265, 26245, 0, 0, 43027, 1, 0, 0, 0, 0, 0, 0, 0, 'First Clue', 19034), +(265266, 26245, 0, 1, 43028, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Clue', 19034), +(265267, 26245, 0, 2, 43029, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Clue', 19034), +(265268, 25260, 1, 0, 52580, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265269, 29198, 0, 0, 52845, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Malfurion', 19034), +(265270, 25258, 0, 0, 39353, 1, 1, 0, 0, 0, 0, 0, 0, 'Griswold defeated', 19034), +(265271, 26376, 0, 0, 42921, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265272, 26376, 0, 1, 42917, 12, 0, 0, 0, 0, 0, 0, 0, 'Lorthuna''s Gate Cultists slain', 19034), +(265273, 27103, 1, 0, 18540, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265274, 26387, 0, 0, 42907, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265275, 26692, 0, 0, 579, 20, 0, 0, 0, 0, 0, 0, 0, 'Shadowhide Gnoll slain', 19034), +(265276, 13619, 1, 0, 45012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265277, 26825, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265278, 24740, 1, 0, 11829, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265279, 26314, 0, 0, 45083, 3, 0, 0, 0, 0, 0, 0, 0, 'Servants of Therazane brought down', 19034), +(265280, 24615, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265281, 24702, 1, 0, 11315, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265282, 14270, 1, 0, 49094, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265283, 24572, 0, 0, 37743, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265284, 29199, 4, -1, 416, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265285, 24641, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265286, 25168, 0, 0, 39262, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265287, 24597, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265288, 29243, 0, 0, 54230, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265291, 27825, 1, 0, 62544, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265292, 27825, 1, 1, 62547, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265293, 24730, 1, 0, 11114, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265298, 27766, 1, 0, 62390, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265300, 14457, 1, 0, 49536, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265301, 25178, 1, 0, 4863, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265302, 24585, 0, 0, 33113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265303, 26343, 1, 0, 4053, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265304, 29200, 0, 0, 53014, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Leyara', 19034), +(265305, 26244, 0, 0, 43026, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265307, 25182, 0, 0, 39280, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265308, 27649, 1, 0, 62327, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265309, 26219, 0, 0, 42486, 1, 0, 0, 0, 0, 0, 0, 0, 'Board the Pincer X2 once it arrives', 19034), +(265310, 26219, 0, 1, 42487, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure Darkbreak Cove', 19034), +(265311, 25259, 0, 0, 39352, 1, 1, 0, 0, 0, 0, 0, 0, 'Gaur defeated', 19034), +(265312, 24590, 0, 0, 36612, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265317, 24852, 2, 0, 202112, 4, 0, 0, 0, 0, 0, 0, 0, 'Braves Freed', 19034), +(265323, 25453, 1, 0, 18947, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265324, 14038, 0, 0, 34764, 1, 0, 0, 0, 0, 0, 0, 0, 'The Bellipotent Mined', 19034), +(265325, 29201, 0, 0, 53370, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure a foothold in the Firelands', 19034), +(265326, 25194, 0, 0, 39336, 3, 0, 0, 0, 0, 0, 0, 0, 'Wayward Plainstrider Returned', 19034), +(265327, 25937, 1, 0, 56225, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265328, 25186, 0, 0, 38384, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265329, 24657, 1, 0, 49915, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265330, 27761, 2, 0, 206395, 1, 0, 0, 0, 0, 0, 0, 0, 'First Bomb Cluster disarmed', 19034), +(265331, 27761, 2, 1, 206396, 1, 0, 0, 0, 0, 0, 0, 0, 'Second Bomb Cluster disarmed', 19034), +(265332, 27761, 2, 2, 206397, 1, 0, 0, 0, 0, 0, 0, 0, 'Third Bomb Cluster disarmed', 19034), +(265333, 27761, 0, 3, 46888, 4, 0, 0, 0, 0, 0, 0, 0, 'Unstable Bomb Bot deactivated', 19034), +(265334, 14069, 0, 0, 34830, 8, 0, 0, 2100, 0, 0, 0, 0, 'Attitudes Adjusted', 19034), +(265335, 27769, 0, 0, 46654, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover Rhea''s true identity', 19034), +(265337, 24824, 1, 0, 50385, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265338, 29657, 0, 0, 19219, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265340, 26177, 1, 0, 57175, 6, 0, 0, 1729, 0, 0, 0, 0, '', 19034), +(265343, 27993, 0, 0, 47318, 1, 0, 0, 0, 0, 0, 0, 0, 'Khartut''s Tomb Investigated', 19034), +(265344, 24830, 1, 0, 50386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265346, 29658, 0, 0, 19220, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265347, 24664, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265348, 24664, 0, 1, 38023, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265349, 25173, 0, 0, 39267, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265350, 25173, 0, 1, 39268, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265351, 25173, 0, 2, 39269, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265352, 24761, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265355, 27902, 1, 0, 62609, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265356, 27648, 0, 0, 46174, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompany Cayden through Dunwald Market Row', 19034), +(265357, 26337, 0, 0, 42798, 1, 0, 0, 0, 0, 0, 0, 0, 'Bilgewater Foreman Intimidated', 19034), +(265358, 25942, 0, 0, 39313, 8, 0, 0, 0, 0, 0, 0, 0, 'Zin''jatar Raiders Slain', 19034), +(265359, 26824, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265360, 30700, 1, 0, 80831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265361, 13871, 1, 0, 46147, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265362, 27538, 1, 0, 60337, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265363, 25075, 1, 0, 52285, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265364, 24681, 0, 0, 37916, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265365, 24681, 0, 1, 37938, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265366, 24681, 0, 2, 37921, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265371, 14135, 0, 0, 35149, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265372, 25266, 1, 0, 52582, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265373, 24774, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(265374, 24774, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265375, 26766, 1, 0, 60297, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265376, 24736, 1, 0, 11831, 35, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265377, 26344, 1, 0, 4104, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265378, 24651, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265379, 24651, 0, 1, 38030, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265380, 27815, 1, 0, 66939, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265381, 24778, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(265382, 24778, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(265383, 24613, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265384, 25813, 2, 0, 203248, 1, 0, 0, 0, 0, 0, 0, 0, 'Blow the horn', 19034), +(265385, 25813, 0, 1, 41334, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265386, 14019, 0, 0, 35760, 10, 0, 0, 0, 0, 0, 0, 0, 'Bomb-Throwing Monkeys Fed', 19034), +(265387, 14444, 0, 0, 36715, 1, 0, 0, 0, 0, 0, 0, 0, 'Ask Krasus about the hilt''s origins', 19034), +(265389, 24612, 1, 0, 49916, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265390, 27627, 0, 0, 46129, 5, 0, 0, 0, 0, 0, 0, 0, 'Amethyst Scarabs Slain', 19034), +(265391, 27627, 0, 1, 46128, 5, 0, 0, 0, 0, 0, 0, 0, 'Emerald Scarabs Slain', 19034), +(265392, 27627, 0, 2, 46127, 5, 0, 0, 0, 0, 0, 0, 0, 'Sapphire Scarabs Slain', 19034), +(265393, 27627, 0, 3, 46126, 5, 0, 0, 0, 0, 0, 0, 0, 'Turquoise Scarabs Slain', 19034), +(265394, 27824, 1, 0, 62509, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265395, 28131, 0, 0, 9861, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265396, 28131, 0, 1, 9860, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265397, 27623, 1, 0, 61970, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265398, 27623, 1, 1, 61971, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265399, 24581, 0, 0, 15954, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265400, 26551, 0, 0, 43245, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265401, 26771, 0, 0, 44148, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265402, 24751, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265403, 24454, 1, 0, 49698, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265405, 27814, 1, 0, 62511, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265407, 27107, 1, 0, 18261, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265408, 25169, 2, 0, 3189, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack Plan: Valley of Trials burned', 19034), +(265409, 25169, 2, 1, 3190, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack Plan: Sen''jin Village burned', 19034), +(265410, 25169, 2, 2, 3192, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack Plan: Orgrimmar burned', 19034), +(265411, 27104, 0, 0, 11490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265412, 27104, 0, 1, 11492, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265415, 25853, 1, 0, 56082, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265416, 26304, 2, 0, 204247, 8, 0, 0, 0, 0, 0, 0, 0, 'Zul''Mamwe Brazier Extinguished', 19034), +(265417, 27085, 0, 0, 44448, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265419, 27106, 0, 0, 44979, 1, 0, 0, 0, 0, 0, 0, 0, 'Samuelson Unmasked', 19034), +(265420, 27106, 0, 1, 2439, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265421, 14404, 1, 0, 49337, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265422, 14404, 1, 1, 49338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265423, 14404, 1, 2, 49339, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265424, 29203, 0, 0, 53366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265425, 24709, 1, 0, 50410, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265426, 26773, 0, 0, 42840, 1, 0, 0, 0, 0, 0, 0, 0, 'Mind Vision complete', 19034), +(265427, 14070, 0, 0, 34835, 1, 1, 0, 0, 0, 0, 0, 0, 'Bruno Flameretardant beaten down', 19034), +(265428, 14070, 0, 1, 34876, 1, 1, 0, 0, 0, 0, 0, 0, 'Frankie Gearslipper beaten down', 19034), +(265429, 14070, 0, 2, 34877, 1, 1, 0, 0, 0, 0, 0, 0, 'Jack the Hammer beaten down', 19034), +(265430, 14070, 0, 3, 34878, 1, 1, 0, 0, 0, 0, 0, 0, 'Sudsy Magee beaten down', 19034), +(265431, 25993, 2, 0, 203309, 7, 0, 0, 0, 0, 0, 0, 0, 'Nespirah Abscess attacked', 19034), +(265432, 27770, 0, 0, 46658, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the final piece of Rhea''s studies', 19034), +(265433, 27813, 0, 0, 46851, 6, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Straggler defeated', 19034), +(265434, 24930, 0, 0, 35118, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265435, 25051, 2, 0, 205267, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265437, 26315, 0, 0, 42731, 1, 0, 0, 0, 0, 0, 0, 0, 'Seek Peace with Boden the Imposing', 19034), +(265438, 24602, 1, 0, 49921, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265439, 26845, 1, 0, 60404, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265440, 24629, 0, 0, 37990, 10, 0, 0, 0, 0, 0, 0, 0, 'Samples Given', 19034), +(265443, 24944, 0, 0, 38805, 6, 0, 0, 0, 0, 0, 0, 0, 'Wounded Defenders Bandaged', 19034), +(265444, 24944, 1, 1, 52014, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265445, 24472, 0, 0, 36293, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265446, 24472, 1, 1, 49742, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265447, 28854, 0, 0, 40484, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265449, 26190, 1, 0, 57245, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265450, 24621, 1, 0, 49947, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265452, 26226, 1, 0, 57765, 10, 0, 0, 1727, 0, 0, 0, 0, '', 19034), +(265453, 24639, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265454, 27086, 0, 0, 44450, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265455, 25992, 1, 0, 56185, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265456, 27539, 1, 0, 61372, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265457, 27064, 0, 0, 44921, 1, 0, 0, 0, 0, 0, 0, 0, 'Samuelson''s Papers Examined by Anduin', 19034), +(265459, 25439, 0, 0, 40275, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265460, 13968, 0, 0, 34544, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265461, 26332, 1, 0, 58201, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265462, 27744, 0, 0, 46671, 1, 0, 0, 0, 0, 0, 0, 0, 'Rune of Earth destroyed', 19034), +(265463, 27744, 2, 1, 206314, 1, 0, 0, 0, 0, 0, 0, 0, 'Rune of Water destroyed', 19034), +(265464, 27744, 2, 2, 206312, 1, 0, 0, 0, 0, 0, 0, 0, 'Rune of Air destroyed', 19034), +(265465, 27744, 2, 3, 206313, 1, 0, 0, 0, 0, 0, 0, 0, 'Rune of Fire destroyed', 19034), +(265466, 24771, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265467, 24904, 0, 0, 38854, 1, 0, 0, 1976, 0, 0, 0, 0, 'Battle for Gilneas City Complete', 19034), +(265468, 26871, 1, 0, 60504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265469, 25978, 0, 0, 41768, 6, 0, 0, 0, 0, 0, 0, 0, 'Frozen Mountaineers freed', 19034), +(265470, 26163, 1, 0, 56019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265471, 26342, 0, 0, 42796, 5, 0, 0, 0, 0, 0, 0, 0, 'Crushcog''s Sentry Bot blinded', 19034), +(265472, 26400, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265473, 25118, 0, 0, 1195, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265474, 27108, 1, 0, 18426, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265475, 14348, 0, 0, 36233, 4, 0, 0, 0, 0, 0, 0, 0, 'Gunpowder thrown at abomination', 19034), +(265476, 26405, 0, 0, 43024, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265477, 27105, 1, 0, 18299, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265478, 26555, 0, 0, 43323, 1, 1, 0, 0, 0, 0, 0, 0, 'Deal with High Priest Venoxis', 19034), +(265479, 24800, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265480, 24801, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265482, 25236, 0, 0, 39464, 8, 0, 0, 0, 0, 0, 0, 0, 'Drowned Thunder Lizard removed', 19034), +(265483, 24760, 5, -1, 73899, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Primal Strike', 19034), +(265485, 24732, 1, 0, 11509, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265486, 25939, 0, 0, 41628, 7, 0, 0, 0, 0, 0, 0, 0, 'Marsh Fire Extinguished', 19034), +(265488, 24814, 3, 0, 38225, 1, 5, 0, 505, 0, 0, 0, 0, 'Speak with Vol''jin at Spitescale Cove', 19034), +(265489, 24814, 0, 1, 38306, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265490, 26153, 1, 0, 57137, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265491, 27755, 0, 0, 46590, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265492, 27755, 0, 1, 46592, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265493, 27088, 0, 0, 44367, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265494, 14117, 0, 0, 35095, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265495, 25267, 1, 0, 52581, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265497, 27895, 0, 0, 46860, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265498, 27895, 0, 1, 46938, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265499, 27895, 0, 2, 46917, 6, 0, 0, 0, 0, 0, 0, 0, 'Darkflight dragonspawn slain', 19034), +(265501, 25027, 0, 0, 38941, 1, 1, 0, 0, 0, 0, 0, 0, 'Three-Tooth Dealt With', 19034), +(265502, 25027, 0, 1, 38940, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265503, 25027, 1, 2, 52073, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265508, 24784, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(265509, 24784, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(265510, 28129, 0, 0, 9877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265511, 24560, 1, 0, 49750, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265512, 14276, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(265513, 14276, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(265514, 14243, 0, 0, 36176, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265519, 24507, 0, 0, 36770, 15, 0, 0, 0, 0, 0, 0, 0, 'Horde Slaves freed', 19034), +(265520, 24507, 0, 1, 36494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265521, 25237, 1, 0, 52573, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265523, 26623, 1, 0, 60988, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265524, 24710, 0, 0, 36658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265525, 29652, 0, 0, 16700, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265526, 29652, 0, 1, 17465, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265527, 29652, 0, 2, 17671, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265528, 24812, 0, 0, 38300, 12, 0, 0, 0, 0, 0, 0, 0, 'Spitescale Naga', 19034), +(265529, 26112, 1, 0, 56823, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265530, 25995, 0, 0, 41731, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265532, 26403, 1, 0, 4106, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265533, 24648, 0, 0, 38035, 1, 0, 0, 0, 0, 0, 0, 0, 'Chemical Wagon Destroyed', 19034), +(265534, 24648, 0, 1, 38006, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265535, 26271, 0, 0, 42617, 20, 0, 0, 0, 0, 0, 0, 0, 'Westfall Homeless fed', 19034), +(265536, 26312, 0, 0, 44352, 1, 0, 0, 0, 0, 0, 0, 0, 'Tawn Winterbluff relieved', 19034), +(265537, 26312, 0, 1, 44353, 1, 0, 0, 0, 0, 0, 0, 0, 'Stormcaller Mylra relieved', 19034), +(265538, 26312, 0, 2, 42788, 1, 0, 0, 0, 0, 0, 0, 0, 'Hargoth Dimblaze relieved', 19034), +(265539, 25170, 1, 0, 4888, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265540, 26772, 1, 0, 3863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265541, 24518, 1, 0, 49776, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265542, 24795, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265543, 25234, 1, 0, 52568, 36, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265545, 24746, 0, 0, 37558, 6, 0, 0, 0, 0, 0, 0, 0, 'Perfumed Townsfolk Analyzed', 19034), +(265546, 29653, 1, 0, 23723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265547, 14238, 0, 0, 36092, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265549, 25274, 1, 0, 52685, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265550, 24577, 0, 0, 37816, 1, 0, 0, 0, 0, 0, 0, 0, 'Gar''dul Notified', 19034), +(265553, 14488, 1, 0, 49635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265554, 26351, 1, 0, 3863, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265555, 25218, 0, 0, 40399, 1, 0, 0, 0, 0, 0, 0, 0, 'Fill Sambino''s Air Balloon', 19034), +(265556, 25218, 1, 1, 54611, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265557, 27996, 0, 0, 46963, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265558, 26797, 1, 0, 2162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265559, 25767, 1, 0, 55971, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265560, 14201, 1, 0, 48525, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265561, 24796, 1, 0, 49871, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265562, 14215, 0, 0, 35593, 1, 0, 0, 0, 0, 0, 0, 0, 'Kalytha''s Secret Learned', 19034), +(265563, 25230, 0, 0, 39384, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265564, 25028, 1, 0, 49815, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265565, 24592, 0, 0, 37735, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265566, 24592, 0, 1, 37733, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265567, 26299, 1, 0, 1532, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265568, 25220, 0, 0, 40200, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265569, 26002, 1, 0, 56469, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265570, 26397, 1, 0, 58366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265571, 25775, 1, 0, 56002, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265572, 24631, 0, 0, 37977, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265573, 24631, 1, 1, 50031, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265575, 14400, 1, 0, 49279, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265576, 24587, 0, 0, 33118, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265577, 24946, 1, 0, 52024, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265578, 25533, 0, 0, 40727, 1, 0, 0, 0, 0, 0, 0, 0, 'Get boat from Griznak', 19034), +(265579, 25533, 2, 1, 203009, 15, 0, 0, 0, 0, 0, 0, 0, 'Fires extinguished', 19034), +(265580, 26815, 1, 0, 4016, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265581, 26171, 0, 0, 41280, 1, 1, 0, 0, 0, 0, 0, 0, 'Razelikh''s body destroyed', 19034), +(265582, 26171, 0, 1, 41292, 1, 0, 0, 0, 0, 0, 0, 0, 'Razelikh''s soul imprisoned', 19034), +(265584, 24501, 0, 0, 37045, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265585, 26774, 1, 0, 58225, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265588, 25132, 0, 0, 3102, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265589, 25132, 1, 1, 4859, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265590, 26183, 1, 0, 57197, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265591, 25052, 0, 0, 39026, 15, 0, 0, 0, 0, 0, 0, 0, 'Southsea Pirates slain', 19034), +(265592, 27642, 0, 0, 46609, 12, 0, 0, 0, 0, 0, 0, 0, 'Dunwald Victims found', 19034), +(265593, 26808, 1, 0, 60373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265594, 27058, 2, 0, 205161, 1, 0, 0, 0, 0, 0, 0, 0, 'Waygate destroyed', 19034), +(265595, 27059, 2, 0, 205161, 1, 0, 0, 0, 0, 0, 0, 0, 'Waygate destroyed', 19034), +(265596, 25184, 0, 0, 39335, 1, 0, 0, 0, 0, 0, 0, 0, 'Mine Cart ridden', 19034), +(265597, 27632, 1, 0, 62280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265598, 26648, 0, 0, 43553, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265599, 25797, 0, 0, 40062, 15, 0, 0, 0, 0, 0, 0, 0, 'Splithoof Heights centaurs slain', 19034), +(265600, 27012, 1, 0, 60748, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265601, 27012, 1, 1, 60747, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265602, 27764, 1, 0, 62387, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265603, 26357, 0, 0, 42704, 8, 0, 0, 0, 0, 0, 0, 0, 'Tiki Masks Burned', 19034), +(265604, 26802, 1, 0, 3265, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265605, 26802, 1, 1, 3264, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265606, 27771, 1, 0, 62393, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265607, 26189, 0, 0, 46122, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265608, 26189, 0, 1, 42151, 16, 0, 0, 0, 0, 0, 0, 0, 'Angerfang Dragonmaw slain', 19034), +(265609, 25277, 0, 0, 39642, 8, 0, 0, 0, 0, 0, 0, 0, 'Minion of Gar''gol Slain', 19034), +(265610, 25996, 0, 0, 41531, 1, 0, 0, 0, 0, 0, 0, 0, 'Listen as Duarn speaks to Nespirah', 19034), +(265611, 25996, 0, 1, 41776, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape on Erunak''s Seahorse', 19034), +(265612, 26924, 0, 0, 44323, 1, 1, 0, 0, 0, 0, 0, 0, 'Darkmaster Gandling dealt with', 19034), +(265613, 24687, 0, 0, 38214, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265614, 26230, 1, 0, 57787, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265615, 26230, 1, 1, 57789, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265616, 29654, 1, 0, 23723, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265618, 26354, 1, 0, 1358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265619, 24606, 1, 0, 49934, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265623, 25406, 0, 0, 11440, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265624, 25406, 0, 1, 11443, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265625, 26301, 1, 0, 3906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265626, 26301, 1, 1, 3907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265627, 29655, 1, 0, 72597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265628, 25814, 2, 0, 203248, 1, 0, 0, 0, 0, 0, 0, 0, 'Blow the horn', 19034), +(265629, 25814, 0, 1, 41334, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265630, 24667, 1, 0, 50162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265631, 25255, 0, 0, 39437, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265632, 26352, 1, 0, 5852, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265633, 29649, 1, 0, 23726, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265634, 24920, 0, 0, 38287, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265635, 24920, 0, 1, 38363, 40, 0, 0, 0, 0, 0, 0, 0, 'Invading Forsaken', 19034), +(265636, 27896, 0, 0, 46861, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265637, 27896, 0, 1, 46916, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265638, 29656, 1, 0, 72597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265639, 25090, 1, 0, 2855, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265640, 24933, 1, 0, 51778, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265641, 25824, 0, 0, 41340, 1, 0, 0, 0, 0, 0, 0, 0, 'Private Pollard Debriefed', 19034), +(265642, 26334, 1, 0, 58165, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265643, 26883, 1, 0, 5879, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265644, 27651, 0, 0, 46624, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265645, 24785, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265646, 29650, 1, 0, 23726, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265648, 25398, 0, 0, 39834, 1, 0, 0, 0, 0, 0, 0, 0, 'Portal Sealed', 19034), +(265649, 26313, 1, 0, 58168, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265650, 24964, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(265651, 24964, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(265652, 29651, 0, 0, 16700, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265653, 29651, 0, 1, 17465, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265654, 29651, 0, 2, 17671, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265655, 26264, 1, 0, 57987, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265656, 25115, 0, 0, 40509, 10, 0, 0, 0, 0, 0, 0, 0, 'Blisterpaw Hyenas Harvested', 19034), +(265657, 25209, 0, 0, 5234, 16, 0, 0, 0, 0, 0, 0, 0, 'Gordunni Ogre Slain', 19034), +(265658, 14251, 1, 0, 49026, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265659, 30701, 1, 0, 80832, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265660, 27765, 1, 0, 62388, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265661, 24588, 0, 0, 33293, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265662, 14138, 1, 0, 60203, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265663, 26466, 1, 0, 5445, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265664, 27073, 0, 0, 44547, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265665, 25561, 0, 0, 40707, 15, 0, 0, 0, 0, 0, 0, 0, 'Rowboats sunk', 19034), +(265666, 26990, 0, 0, 40961, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265667, 14473, 0, 0, 36740, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265669, 26912, 1, 0, 4473, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265670, 27745, 0, 0, 46677, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the Fire Portal Controller', 19034), +(265671, 27745, 1, 1, 62394, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265672, 25419, 1, 0, 55187, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265674, 26192, 1, 0, 57246, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265675, 14305, 1, 0, 49140, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265676, 13504, 0, 0, 32861, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265678, 24624, 0, 0, 37961, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265679, 25330, 0, 0, 39806, 4, 0, 0, 0, 0, 0, 0, 0, 'Immolated Supplicant saved', 19034), +(265680, 27092, 0, 0, 44816, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265681, 27882, 1, 0, 62594, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265682, 27882, 1, 1, 62595, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265683, 27882, 1, 2, 62596, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265684, 27882, 1, 3, 62597, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265685, 26157, 1, 0, 57136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265686, 24817, 0, 0, 38318, 1, 1, 0, 1452, 0, 0, 0, 0, 'Use the Mechashark X-Steam Controller', 19034), +(265687, 24817, 0, 1, 36682, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265688, 27057, 1, 0, 13193, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265689, 14246, 0, 0, 35751, 3, 0, 0, 0, 0, 0, 0, 0, 'Swoop Egg Protected', 19034), +(265691, 27828, 0, 0, 46862, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Eric''s Charge', 19034), +(265692, 27828, 0, 1, 46863, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Eric''s Pocket Potion', 19034), +(265693, 26042, 1, 0, 4469, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265694, 26345, 1, 0, 4105, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265695, 25062, 1, 0, 52279, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265696, 26310, 1, 0, 58120, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265697, 27647, 1, 0, 62317, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265698, 25054, 1, 0, 51549, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265699, 26285, 1, 0, 58202, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265700, 27054, 1, 0, 60772, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265701, 24786, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(265702, 24786, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265703, 24620, 1, 0, 49946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265704, 25410, 0, 0, 40090, 6, 0, 0, 0, 0, 0, 0, 0, 'Treants Rallied', 19034), +(265705, 27826, 1, 0, 62513, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265706, 14264, 0, 0, 35843, 5, 0, 0, 0, 0, 0, 0, 0, 'Servants of Neptulon defeated', 19034), +(265707, 26265, 0, 0, 42185, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265708, 14254, 1, 0, 49034, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265709, 27448, 0, 0, 45400, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride in Fiona''s Caravan', 19034), +(265710, 27082, 1, 0, 60793, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265711, 26259, 1, 0, 59062, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265712, 27091, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(265713, 27091, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(265716, 29822, 0, 1, 63058, 1, 0, 0, 0, 0, 0, 0, 0, 'Shrine of the Sun Visited', 19034), +(265717, 26033, 1, 0, 56804, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265718, 25427, 0, 0, 5258, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265719, 26510, 1, 0, 58894, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265721, 26465, 1, 0, 5424, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265722, 27005, 1, 0, 60745, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265723, 27659, 0, 0, 46273, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265724, 27659, 0, 1, 46270, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265725, 27659, 0, 2, 46272, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265726, 26208, 0, 0, 42463, 1, 0, 0, 0, 0, 0, 0, 0, 'Learn about Operation: Gnomeregan', 19034), +(265727, 25342, 1, 0, 52832, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265728, 25465, 1, 0, 18956, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265729, 24748, 0, 0, 38153, 1, 0, 0, 0, 0, 0, 0, 0, 'Lich King Defeated', 19034), +(265730, 27646, 0, 0, 46599, 1, 0, 0, 0, 0, 0, 0, 0, 'Search the cellar in southern Dunwald Hovel', 19034), +(265731, 27646, 0, 1, 46600, 1, 0, 0, 0, 0, 0, 0, 0, 'Search the cellar in northwestern Dunwald Hovel', 19034), +(265732, 27646, 0, 2, 46601, 1, 0, 0, 0, 0, 0, 0, 0, 'Search the buildings in eastern Dunwald Hovel', 19034), +(265733, 26200, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(265734, 26200, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(265735, 25250, 0, 0, 39834, 1, 0, 0, 0, 0, 0, 0, 0, 'Portal Sealed', 19034), +(265736, 14378, 1, 0, 49221, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265737, 26162, 0, 0, 41193, 1, 0, 0, 0, 0, 0, 0, 0, 'Loramus resurrected', 19034), +(265738, 25319, 0, 0, 38926, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265739, 25319, 0, 1, 38913, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265741, 25310, 0, 0, 39726, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265742, 25842, 0, 0, 41396, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265743, 25504, 1, 0, 54644, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265744, 27792, 1, 0, 62485, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265745, 27792, 1, 1, 62486, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265746, 27792, 1, 2, 62487, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265747, 27792, 1, 3, 62488, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265748, 26015, 1, 0, 56568, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265749, 26399, 1, 0, 58205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265750, 25003, 0, 0, 1534, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265751, 25003, 0, 1, 1530, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265752, 25026, 1, 0, 52072, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265753, 25667, 0, 0, 40941, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265754, 26209, 0, 0, 42414, 1, 0, 0, 0, 0, 0, 0, 0, 'Clue #1 obtained', 19034), +(265755, 26209, 0, 1, 42415, 1, 0, 0, 0, 0, 0, 0, 0, 'Clue #2 obtained', 19034), +(265756, 26209, 0, 2, 42416, 1, 0, 0, 0, 0, 0, 0, 0, 'Clue #3 obtained', 19034), +(265757, 26209, 0, 3, 42417, 1, 0, 0, 0, 0, 0, 0, 0, 'Clue #4 obtained', 19034), +(265758, 25241, 0, 0, 40972, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265759, 26810, 0, 0, 43245, 1, 0, 0, 0, 0, 0, 0, 0, 'Deal with Zanzil the Outcast', 19034), +(265760, 28128, 0, 0, 7120, 12, 0, 0, 0, 0, 0, 0, 0, 'Shadow Hold Defenders Slain', 19034), +(265761, 27885, 0, 0, 46339, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden''s Game Completed', 19034), +(265762, 26468, 1, 0, 5461, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265763, 26474, 1, 0, 5460, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265764, 13901, 0, 0, 4802, 6, 0, 0, 0, 0, 0, 0, 0, 'Blackfathom Tide Priestesses slain', 19034), +(265765, 27743, 0, 0, 46579, 12, 0, 0, 0, 0, 0, 0, 0, 'Elementium Depths cultists slain', 19034), +(265766, 25048, 1, 0, 50829, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265767, 14260, 0, 0, 51145, 1, 0, 0, 0, 0, 0, 0, 0, 'Slitherblade Charm used', 19034), +(265768, 26918, 5, -1, 105361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265769, 26918, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Seal of Command and Hit a Training Dummy', 19034), +(265771, 26394, 1, 0, 58364, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265772, 27772, 1, 0, 62395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265773, 25627, 1, 0, 55160, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265774, 26447, 1, 0, 23798, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265775, 27641, 0, 0, 46144, 20, 0, 0, 0, 0, 0, 0, 0, 'Twilight guests welcomed to Dunwald', 19034), +(265776, 25352, 0, 0, 39843, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265777, 25352, 0, 1, 39844, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265778, 14304, 1, 0, 49136, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265779, 25517, 0, 0, 40501, 1, 0, 0, 0, 0, 0, 0, 0, 'Bar Fight started!', 19034), +(265780, 24862, 0, 0, 37170, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265781, 26820, 1, 0, 58877, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265782, 14344, 0, 0, 5771, 1, 0, 0, 0, 0, 0, 0, 0, 'Jugkar Grim''rod Slain', 19034), +(265783, 26899, 1, 0, 5881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265784, 25770, 1, 0, 55977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265785, 24766, 5, -1, 8921, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Moonfire', 19034), +(265786, 24766, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Moonfire', 19034), +(265787, 25339, 0, 0, 5362, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265788, 25339, 0, 1, 5366, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265789, 24601, 0, 0, 37753, 1, 0, 0, 0, 0, 0, 0, 0, 'Nightmare Scar Sealed', 19034), +(265790, 25206, 0, 0, 39596, 12, 0, 0, 0, 0, 0, 0, 0, 'Warring Elemental slain', 19034), +(265791, 24950, 0, 0, 38749, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034); -- 265791 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(265792, 26857, 0, 0, 44228, 8, 0, 0, 0, 0, 0, 0, 0, 'Abyssion''s underlings defeated', 19034), +(265794, 14225, 1, 0, 48951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265795, 25041, 0, 0, 37207, 5, 0, 0, 0, 0, 0, 0, 0, 'Barrens Lion Slain', 19034), +(265796, 26046, 0, 0, 41993, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265797, 27817, 0, 0, 47199, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265798, 27817, 0, 1, 46839, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265799, 25951, 0, 0, 42135, 1, 0, 0, 0, 0, 0, 0, 0, 'Hold the eastern end of Quel''Dormir Terrace', 19034), +(265800, 25951, 0, 1, 42063, 1, 0, 0, 0, 0, 0, 0, 0, 'Push the Kvaldir back across the bridge', 19034), +(265801, 27021, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(265802, 27021, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(265804, 27830, 0, 0, 46860, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265805, 27830, 0, 1, 46938, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265806, 27830, 0, 2, 46917, 6, 0, 0, 0, 0, 0, 0, 0, 'Darkflight dragonspawn slain', 19034), +(265807, 25408, 1, 0, 53102, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265808, 27141, 0, 0, 45143, 1, 0, 0, 0, 0, 0, 0, 0, 'Assisted Harrison at Khartut''s Tomb', 19034), +(265809, 25195, 0, 0, 39385, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265810, 27330, 0, 0, 45447, 1, 1, 0, 0, 0, 0, 0, 0, 'Arikara defeated', 19034), +(265812, 24684, 0, 0, 3378, 10, 0, 0, 0, 0, 0, 0, 0, 'Bael''dun Dwarves Slain', 19034), +(265813, 27171, 1, 0, 60863, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265814, 27171, 1, 1, 60864, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265815, 25436, 0, 0, 40168, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265816, 24865, 1, 0, 11113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265817, 25370, 0, 0, 39926, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265818, 25211, 0, 0, 41080, 5, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Orc slain', 19034), +(265819, 27186, 1, 0, 33110, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265821, 27831, 0, 0, 46861, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265822, 27831, 0, 1, 46916, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265823, 24931, 1, 0, 51793, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265824, 26643, 0, 0, 42907, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265825, 30827, 0, 4, 65256, 1, 0, 0, 898, 0, 0, 0, 0, 'Speak to Yalia Sagewhisper', 19034), +(265826, 30827, 0, 0, 60933, 1, 0, 0, 0, 0, 0, 0, 0, 'Totem of Kindness activated', 19034), +(265827, 30827, 0, 1, 60990, 1, 0, 0, 0, 0, 0, 0, 0, 'Totem of Tranquility activated', 19034), +(265828, 30827, 0, 2, 60991, 1, 0, 0, 0, 0, 0, 0, 0, 'Totem of Serenity activated', 19034), +(265829, 25166, 0, 0, 38749, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265830, 27738, 0, 0, 46496, 1, 0, 0, 0, 0, 0, 0, 0, 'Tahet Freed', 19034), +(265831, 14230, 1, 0, 49012, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265832, 27189, 1, 0, 33112, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265834, 25733, 0, 0, 1111, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265835, 25733, 0, 1, 4040, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265836, 27210, 0, 0, 23602, 5, 0, 0, 0, 0, 0, 0, 0, 'Deserter Agitator Exposed', 19034), +(265837, 25111, 0, 0, 40507, 12, 0, 0, 0, 0, 0, 0, 0, 'Fire Rocs Harvested', 19034), +(265839, 26213, 1, 0, 57755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265840, 25314, 0, 0, 40922, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265841, 25468, 0, 0, 43345, 10, 0, 0, 0, 0, 0, 0, 0, 'Faerie Dragons Rallied', 19034), +(265842, 24993, 0, 0, 38967, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265843, 14455, 0, 0, 36697, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265844, 27523, 1, 0, 15850, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265845, 27213, 0, 0, 23941, 1, 0, 0, 0, 0, 0, 0, 0, 'Gavis Greyshield Captured', 19034), +(265846, 27192, 1, 0, 13172, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265847, 24566, 0, 0, 37726, 6, 0, 0, 0, 0, 0, 0, 0, 'Results Observed', 19034), +(265848, 26661, 1, 0, 59345, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265849, 13909, 1, 0, 46384, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265850, 26224, 0, 0, 2929, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265851, 24866, 1, 0, 11112, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265852, 27188, 0, 0, 23861, 10, 0, 0, 0, 0, 0, 0, 0, 'Information Gathered', 19034), +(265853, 26464, 1, 0, 5463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265854, 26469, 1, 0, 5481, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265855, 27068, 0, 0, 7267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265856, 26618, 0, 0, 43704, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265857, 27829, 0, 0, 46859, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265858, 27829, 0, 1, 46915, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265859, 27522, 0, 0, 17878, 6, 0, 0, 0, 0, 0, 0, 0, 'Scourge Siege Engineer beaten', 19034), +(265860, 27522, 0, 1, 45845, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover Gidwin''s location', 19034), +(265861, 27522, 0, 2, 45846, 1, 0, 0, 0, 0, 0, 0, 0, 'Discover Gidwin''s captor', 19034), +(265862, 26364, 0, 0, 42860, 1, 1, 0, 0, 0, 0, 0, 0, 'Razlo Crushcog defeated', 19034), +(265863, 25112, 0, 0, 39702, 10, 0, 0, 0, 0, 0, 0, 0, 'Glasshide Basilisks Harvested', 19034), +(265864, 27190, 0, 0, 23864, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Hill Cleansed', 19034), +(265865, 27190, 1, 1, 33113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265866, 26682, 0, 0, 4382, 7, 0, 0, 0, 0, 0, 0, 0, 'Withervine slain', 19034), +(265867, 27742, 1, 0, 62331, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265868, 25629, 0, 0, 41999, 8, 0, 0, 0, 0, 0, 0, 0, 'Naz''jar Honor Guard relieved', 19034), +(265869, 27169, 0, 0, 45194, 1, 0, 0, 0, 0, 0, 0, 0, 'Uther''s Blessing', 19034), +(265870, 27053, 1, 0, 13189, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265871, 27053, 1, 1, 13196, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265872, 26800, 0, 0, 49340, 6, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Corpses gathered', 19034), +(265873, 14306, 0, 0, 36062, 7, 0, 0, 0, 0, 0, 0, 0, 'Uprooted Lashers Slain', 19034), +(265874, 25589, 0, 0, 40092, 15, 0, 0, 0, 0, 0, 0, 0, 'Southsea pirates slain', 19034), +(265875, 25722, 1, 0, 55231, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265876, 27571, 0, 0, 9537, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265877, 27571, 0, 1, 9499, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265878, 27571, 0, 2, 9543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265879, 25200, 0, 0, 39354, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265880, 14257, 1, 0, 49056, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265881, 14257, 1, 1, 49058, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265882, 14257, 1, 2, 49060, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265883, 25193, 1, 0, 60615, 250, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265884, 26435, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265885, 26158, 2, 0, 203753, 1, 0, 0, 0, 0, 0, 0, 0, 'Use internal Bloodstone Teleporter', 19034), +(265886, 26158, 2, 1, 203752, 1, 0, 0, 0, 0, 0, 0, 0, 'Use external Bloodstone Teleporter', 19034), +(265887, 26414, 1, 0, 58503, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265888, 25654, 1, 0, 9528, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265890, 881, 0, 0, 3475, 1, 0, 0, 0, 0, 0, 0, 0, 'Conquer Echeyakee', 19034), +(265891, 25050, 0, 0, 38576, 5, 0, 0, 0, 0, 0, 0, 0, 'Life Rockets Delivered', 19034), +(265892, 25050, 0, 1, 40583, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265893, 25661, 1, 0, 55196, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265894, 25661, 1, 1, 55197, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265895, 25661, 1, 2, 55199, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265898, 26388, 0, 0, 42977, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompany the Air Fleet', 19034), +(265899, 26831, 0, 0, 44135, 1, 1, 0, 0, 0, 0, 0, 0, 'Zoltrik Drakebane defeated', 19034), +(265900, 25487, 0, 0, 39947, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265901, 25724, 0, 0, 41121, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265902, 25724, 0, 1, 41122, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265904, 27162, 0, 0, 44323, 1, 1, 0, 0, 0, 0, 0, 0, 'Darkmaster Gandling dealt with', 19034), +(265905, 26273, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265906, 25932, 0, 0, 42169, 1, 0, 0, 0, 0, 0, 0, 0, 'Defend Amberstill Ranch', 19034), +(265907, 26283, 1, 0, 58082, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265908, 26374, 0, 0, 42893, 12, 0, 0, 0, 0, 0, 0, 0, 'AWOL Grunt Disciplined', 19034), +(265909, 26347, 1, 0, 58204, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265910, 27096, 1, 0, 60811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265911, 26222, 1, 0, 57764, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265913, 26333, 0, 0, 42224, 5, 0, 0, 0, 0, 0, 0, 0, 'Repaired Mechano-Tanks destroyed', 19034), +(265914, 25426, 1, 0, 9237, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265915, 25866, 0, 0, 41409, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265916, 26855, 1, 0, 3183, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265917, 26855, 1, 1, 3117, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265918, 25336, 1, 0, 9594, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265919, 25336, 1, 1, 9618, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265920, 26029, 1, 0, 4551, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265921, 25448, 0, 0, 5362, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265922, 25448, 0, 1, 5366, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265923, 26518, 1, 0, 58236, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265924, 26164, 1, 0, 55989, 24, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265925, 25518, 0, 0, 40501, 1, 0, 0, 0, 0, 0, 0, 0, 'Bar Fight started!', 19034), +(265926, 26419, 0, 0, 43007, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265927, 25687, 1, 0, 55829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265928, 25687, 1, 1, 55836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265929, 25687, 1, 2, 55837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265930, 25534, 0, 0, 40593, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265931, 27166, 1, 0, 60850, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265932, 27173, 0, 0, 45209, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265934, 27185, 0, 0, 11120, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265935, 26196, 1, 0, 57259, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265936, 26511, 0, 0, 422, 10, 0, 0, 0, 0, 0, 0, 0, 'Lake Everstill Murloc slain', 19034), +(265937, 25325, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265938, 25758, 1, 0, 55809, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265939, 26485, 1, 0, 58867, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265940, 27537, 1, 0, 60333, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265941, 25780, 0, 0, 41273, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265942, 26888, 0, 0, 4829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265943, 26207, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(265944, 26207, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice using Eviscerate', 19034), +(265945, 27663, 1, 0, 62043, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265946, 25989, 1, 0, 56182, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265947, 28529, 1, 0, 64450, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265948, 26214, 1, 0, 57756, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265949, 25299, 0, 0, 39824, 10, 0, 0, 0, 0, 0, 0, 0, 'Mental Training', 19034), +(265950, 27168, 0, 0, 45166, 12, 0, 0, 0, 0, 0, 0, 0, 'Withdrawn Soul released', 19034), +(265951, 25431, 0, 0, 14661, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265952, 25080, 1, 0, 52305, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265953, 27031, 1, 0, 60792, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265954, 25407, 0, 0, 40079, 3, 0, 0, 0, 0, 0, 0, 0, 'Wisps Rallied', 19034), +(265955, 24719, 1, 0, 11477, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265956, 25850, 0, 0, 41389, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265957, 13563, 0, 0, 33181, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265958, 13563, 1, 1, 5382, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265959, 26891, 1, 0, 16762, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265960, 26389, 1, 0, 58361, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265961, 27167, 1, 0, 60851, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265962, 26801, 0, 0, 1890, 8, 0, 0, 0, 0, 0, 0, 0, 'Deathknell Scourge slain', 19034), +(265963, 26318, 2, 0, 204042, 1, 0, 0, 3143, 0, 0, 0, 0, 'Detonate trogg tunnel', 19034), +(265964, 26318, 0, 1, 42773, 1, 0, 0, 3144, 0, 0, 0, 0, '', 19034), +(265965, 25734, 1, 0, 55242, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265966, 26498, 0, 0, 2643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265967, 26498, 0, 1, 2642, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265968, 25021, 1, 0, 52064, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265969, 13920, 1, 0, 46392, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265970, 14021, 0, 0, 35816, 1, 0, 0, 0, 0, 0, 0, 0, 'Kaja''mite Ore mining a success!', 19034), +(265971, 27451, 1, 0, 15448, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265972, 14056, 1, 0, 46834, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265973, 27333, 0, 0, 45292, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265976, 26688, 0, 0, 898, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265979, 27322, 1, 0, 60956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265980, 27055, 0, 0, 44445, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265981, 27055, 0, 1, 44484, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265982, 27055, 0, 2, 44485, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265983, 27055, 0, 3, 44486, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265984, 25409, 0, 0, 40072, 10, 0, 0, 0, 0, 0, 0, 0, 'Hippogryphs Rallied', 19034), +(265985, 24570, 1, 0, 49875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265986, 25014, 1, 0, 52047, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265987, 27450, 1, 0, 61292, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265988, 27450, 1, 1, 61293, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265989, 27450, 1, 2, 61294, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265990, 24469, 0, 0, 37070, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265991, 13868, 1, 0, 46128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265992, 26393, 1, 0, 58364, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265993, 25454, 1, 0, 55167, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265994, 24574, 0, 0, 37092, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265995, 24574, 1, 1, 49883, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(265996, 27135, 1, 0, 60837, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(265999, 14252, 1, 0, 49030, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266000, 24542, 1, 0, 49815, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266001, 27661, 0, 0, 46785, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266002, 27235, 1, 0, 33037, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266003, 25311, 0, 0, 39724, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266004, 27337, 1, 0, 60885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266005, 27337, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266006, 27337, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266007, 26267, 0, 0, 2656, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266008, 27833, 0, 0, 2717, 12, 0, 0, 0, 0, 0, 0, 0, 'Dustbelcher combatant slain', 19034), +(266009, 26547, 0, 0, 2923, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266010, 13730, 0, 0, 33736, 7, 0, 0, 0, 0, 0, 0, 0, 'Fel Fires Siphoned', 19034), +(266011, 14389, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266012, 27327, 0, 0, 45438, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266013, 27662, 0, 0, 46327, 10, 0, 0, 0, 0, 0, 0, 0, 'Enslaved elementals freed', 19034), +(266014, 24634, 1, 0, 50054, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266015, 13561, 0, 0, 33179, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266016, 13561, 0, 1, 33180, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266017, 25233, 0, 0, 39436, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266018, 27521, 0, 0, 8563, 9, 0, 0, 0, 0, 0, 0, 0, 'Quel''lithien Wretched slain', 19034), +(266019, 26349, 1, 0, 3636, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266020, 27284, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266021, 26691, 1, 0, 2113, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266022, 13528, 1, 0, 44913, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266023, 24525, 0, 0, 37086, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266024, 28744, 0, 0, 49553, 2, 0, 0, 0, 0, 0, 0, 0, 'Massive Wave Survived', 19034), +(266025, 27229, 1, 0, 60883, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266026, 26685, 1, 0, 1968, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266027, 27774, 0, 0, 46695, 9, 0, 0, 0, 0, 0, 0, 0, 'Dustbelcher slain', 19034), +(266028, 27449, 0, 0, 45579, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266029, 14325, 1, 0, 49170, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266030, 24626, 0, 0, 37989, 1, 0, 0, 0, 0, 0, 0, 0, 'Capture Swiftclaw', 19034), +(266031, 24626, 0, 1, 38002, 1, 0, 0, 0, 0, 0, 0, 0, 'Return Swiftclaw to the Raptor Pens', 19034), +(266032, 26180, 1, 0, 4819, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266033, 25400, 0, 0, 5234, 16, 0, 0, 0, 0, 0, 0, 0, 'Gordunni Ogre slain', 19034), +(266034, 27232, 0, 0, 45270, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266035, 25735, 1, 0, 55241, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266036, 27174, 0, 0, 45212, 1, 1, 0, 0, 0, 0, 0, 0, 'Gory defeated', 19034), +(266037, 27164, 1, 0, 17114, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266038, 26395, 1, 0, 16115, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266039, 26672, 1, 0, 3629, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266040, 26152, 1, 0, 57122, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266041, 25395, 1, 0, 55209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266042, 13521, 1, 0, 44863, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266043, 26723, 2, 0, 204816, 1, 0, 0, 0, 0, 0, 0, 0, 'Remains of Morbent Fel', 19034), +(266044, 25626, 0, 0, 41982, 1, 0, 0, 0, 0, 0, 0, 0, 'Infiltrate Quel''Dormir Temple', 19034), +(266045, 25626, 0, 1, 41222, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Concluding Story of the Battlemaiden', 19034), +(266046, 24855, 0, 0, 38358, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266047, 26841, 1, 0, 60400, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266048, 27122, 0, 0, 41110, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266049, 13591, 1, 0, 46318, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266053, 26901, 1, 0, 5801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266054, 13547, 0, 0, 33001, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundris Windweaver''s spirit coaxed', 19034), +(266055, 13547, 0, 1, 33033, 1, 0, 0, 0, 0, 0, 0, 0, 'Sentinel Elissa Starbreeze''s spirit coaxed', 19034), +(266056, 13547, 0, 2, 33035, 1, 0, 0, 0, 0, 0, 0, 0, 'Taldan''s spirit coaxed', 19034), +(266057, 13547, 0, 3, 33037, 1, 0, 0, 0, 0, 0, 0, 0, 'Caylais Moonfeather''s spirit coaxed', 19034), +(266058, 26486, 1, 0, 3900, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266059, 25382, 0, 0, 39974, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266060, 27258, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266061, 27541, 1, 0, 61929, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266063, 14261, 0, 0, 36640, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266064, 27172, 1, 0, 60866, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266065, 26870, 0, 0, 3669, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266066, 26870, 0, 1, 3671, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266067, 26870, 0, 2, 3670, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266068, 26870, 0, 3, 3673, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266069, 26821, 1, 0, 58490, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266070, 25072, 0, 0, 39081, 8, 0, 0, 0, 0, 0, 0, 0, 'Goblins rescued', 19034), +(266071, 25777, 1, 0, 56005, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266072, 25232, 1, 0, 52564, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266073, 26284, 0, 0, 42645, 6, 0, 0, 0, 0, 0, 0, 0, 'Captured Demolitionists rescued', 19034), +(266074, 13875, 1, 0, 46314, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266075, 25952, 0, 0, 39638, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266076, 27234, 1, 0, 33037, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266077, 25736, 1, 0, 55243, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266078, 26515, 0, 0, 42815, 1, 0, 0, 0, 0, 0, 0, 0, 'Ongo''longo enraged', 19034), +(266079, 29815, 1, 0, 74621, 8, 0, 0, 1143, 0, 0, 0, 0, '', 19034), +(266081, 14323, 1, 0, 49172, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266082, 14323, 1, 1, 49168, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266083, 27329, 0, 0, 45447, 1, 1, 0, 0, 0, 0, 0, 0, 'Arikara defeated', 19034), +(266084, 27325, 1, 0, 60980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266085, 25025, 1, 0, 52069, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266086, 20441, 0, 0, 48544, 1, 0, 0, 0, 0, 0, 0, 0, 'Water of Vision consumed', 19034), +(266087, 26743, 1, 0, 60270, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266088, 26743, 1, 1, 60271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266089, 26743, 1, 2, 60272, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266090, 27324, 0, 0, 45418, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266091, 24742, 0, 0, 10541, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the hottest area of Fire Plume Ridge', 19034), +(266092, 24742, 1, 1, 12472, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266093, 26932, 0, 0, 44184, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266094, 27160, 0, 0, 44562, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266095, 27176, 1, 0, 60868, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266096, 28840, 1, 0, 65903, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266097, 26495, 1, 0, 58883, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266099, 28841, 0, 0, 50291, 5, 0, 0, 0, 0, 0, 0, 0, 'Arcane Tesseract closed', 19034), +(266100, 26892, 0, 0, 4887, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266101, 26892, 0, 1, 4831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266102, 26892, 0, 2, 6243, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266104, 26686, 0, 0, 48, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266105, 26686, 0, 1, 203, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266106, 25421, 1, 0, 52470, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266107, 27026, 0, 0, 44188, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266108, 27208, 0, 0, 10813, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266109, 26604, 0, 0, 2522, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266110, 26965, 0, 0, 44629, 1, 0, 0, 0, 0, 0, 0, 0, 'Stand by for Warchief Garrosh Hellscream''s arrival', 19034), +(266111, 26579, 0, 0, 42475, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266112, 26570, 0, 0, 615, 25, 0, 0, 0, 0, 0, 0, 0, 'Blackrock Orcs of Alther''s Mill or Render''s Camp slain', 19034), +(266113, 25276, 1, 0, 52693, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266114, 28839, 1, 0, 65899, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266115, 28839, 1, 1, 65900, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266116, 28839, 1, 2, 65901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266117, 28842, 0, 0, 50325, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266118, 25472, 1, 0, 54461, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266119, 26366, 1, 0, 58236, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266120, 26602, 0, 0, 1494, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266121, 13582, 1, 0, 46692, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266122, 25949, 0, 0, 41759, 1, 0, 0, 0, 0, 0, 0, 0, 'Defense of The Immortal Coil Complete', 19034), +(266123, 25429, 1, 0, 18961, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266124, 24486, 1, 0, 49751, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266125, 27326, 1, 0, 60980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266126, 24957, 1, 0, 52041, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266128, 27291, 0, 0, 23768, 1, 0, 0, 0, 0, 0, 0, 0, 'Wreath Laid at Hyal Monument', 19034), +(266129, 26641, 1, 0, 58252, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266130, 27263, 1, 0, 5950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266131, 14363, 1, 0, 48951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266132, 27260, 1, 0, 5950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266133, 25761, 0, 0, 41031, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266134, 25761, 1, 1, 55883, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266136, 26528, 1, 0, 58282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266137, 27212, 0, 0, 4979, 6, 0, 0, 0, 0, 0, 0, 0, 'Leaflets Distributed', 19034), +(266138, 27212, 1, 1, 33015, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266139, 27328, 0, 0, 45438, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266140, 26689, 0, 0, 533, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266141, 27128, 0, 0, 11501, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266142, 24963, 0, 0, 39073, 8, 0, 0, 0, 0, 0, 0, 0, 'Ogres Fed', 19034), +(266143, 26734, 1, 0, 60263, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266145, 25764, 0, 0, 41218, 1, 0, 0, 0, 0, 0, 0, 0, 'Aviana''s Egg Unveiled and Defended', 19034), +(266146, 27211, 1, 0, 33008, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266147, 27020, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(266148, 27020, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(266149, 25354, 0, 0, 39843, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266150, 25354, 0, 1, 39844, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266151, 26739, 0, 0, 42742, 40, 0, 0, 0, 0, 0, 0, 0, 'Bites of basilisk meat', 19034), +(266152, 25469, 0, 0, 43347, 5, 0, 0, 0, 0, 0, 0, 0, 'Mountain Giants Rallied', 19034), +(266153, 13565, 0, 0, 33207, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266154, 13565, 0, 1, 34010, 6, 0, 0, 0, 0, 0, 0, 0, 'Withered Ents called', 19034), +(266156, 26671, 1, 0, 59362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266157, 25460, 0, 0, 40229, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266158, 25548, 0, 0, 40709, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266159, 25548, 0, 1, 40463, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266160, 25815, 1, 0, 56031, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266161, 27204, 0, 0, 45235, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266162, 26868, 0, 0, 44266, 1, 0, 0, 0, 0, 0, 0, 0, 'Mosshide Tagged', 19034), +(266163, 27191, 1, 0, 5847, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266164, 27343, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266165, 27343, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266166, 27343, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266167, 14482, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ride the mercenary ship to Vashj''ir', 19034), +(266168, 26127, 0, 0, 42154, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266169, 26508, 1, 0, 10958, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266170, 14113, 0, 0, 35175, 10, 0, 0, 0, 0, 0, 0, 0, 'Partygoer entertained', 19034), +(266171, 25357, 0, 0, 39313, 8, 0, 0, 0, 0, 0, 0, 0, 'Zin''jatari Raiders Slain', 19034), +(266172, 25345, 1, 0, 9596, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266173, 25345, 1, 1, 9620, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266174, 27236, 1, 0, 33038, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266175, 27236, 1, 1, 33039, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266176, 26154, 0, 0, 42343, 1, 0, 0, 0, 0, 0, 0, 0, 'Bound Torrent possessed', 19034), +(266177, 26154, 0, 1, 42280, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266178, 26154, 0, 2, 42285, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266179, 25954, 2, 0, 203386, 1, 0, 0, 0, 0, 0, 0, 0, 'Lestharia Vashj statue', 19034), +(266180, 25954, 2, 1, 203388, 1, 0, 0, 0, 0, 0, 0, 0, 'Queen Azshara statue', 19034), +(266181, 25954, 2, 2, 203390, 1, 0, 0, 0, 0, 0, 0, 0, 'Ranger Valarian statue', 19034), +(266182, 25954, 2, 3, 203391, 1, 0, 0, 0, 0, 0, 0, 0, 'High Priestess Siralen statue', 19034), +(266183, 26919, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(266184, 26919, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(266185, 25167, 0, 0, 39251, 3, 0, 0, 0, 0, 0, 0, 0, 'Northwatch Supply Crates destroyed', 19034), +(266186, 25167, 0, 1, 39245, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266187, 26546, 0, 0, 43236, 7, 0, 0, 0, 0, 0, 0, 0, 'Trained Razorbeak fed', 19034), +(266188, 25344, 0, 0, 39845, 1, 0, 0, 0, 0, 0, 0, 0, 'Gordok Ogre Mage Captured', 19034), +(266189, 26928, 1, 0, 60511, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266190, 26120, 0, 0, 42041, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266191, 25748, 0, 0, 41227, 10, 0, 0, 0, 0, 0, 0, 0, 'Southern Naga Forces slain', 19034), +(266192, 26369, 1, 0, 58241, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266194, 26791, 0, 0, 44126, 1, 0, 0, 0, 0, 0, 0, 0, 'Obtain a War Guardian', 19034), +(266195, 26791, 0, 1, 44049, 5, 0, 0, 0, 0, 0, 0, 0, 'Giant Mushrooms destroyed', 19034), +(266196, 27352, 1, 0, 13180, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266197, 24926, 1, 0, 51546, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266198, 30753, 0, 0, 60408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266199, 26748, 1, 0, 58165, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266200, 25723, 1, 0, 55232, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266201, 27178, 0, 0, 45192, 10, 0, 0, 0, 0, 0, 0, 0, 'Blackscale Naga Slain', 19034), +(266202, 26684, 1, 0, 1946, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266203, 26166, 1, 0, 57140, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266204, 26670, 1, 0, 938, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266205, 14213, 0, 0, 35581, 1, 0, 0, 0, 0, 0, 0, 0, 'Sacrificial Offering Accepted', 19034), +(266206, 27196, 0, 0, 45238, 1, 0, 0, 0, 0, 0, 0, 0, 'Accompany Harrison Jones to the Chamber of the Stars', 19034), +(266207, 27768, 0, 0, 46623, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266208, 26573, 1, 0, 58956, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266209, 26573, 1, 1, 58957, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266210, 27467, 0, 0, 45695, 10, 0, 0, 0, 0, 0, 0, 0, 'Blades buried', 19034), +(266211, 27323, 0, 0, 45418, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266212, 26654, 1, 0, 1518, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266213, 26601, 0, 0, 1493, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266214, 24699, 1, 0, 50374, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266215, 26532, 0, 0, 43007, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266216, 13881, 0, 0, 34302, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266217, 13881, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266218, 27342, 1, 0, 60958, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266220, 25397, 0, 0, 40972, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266221, 26915, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Eviscerate', 19034), +(266222, 26915, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Eviscerate', 19034), +(266223, 26795, 1, 0, 3514, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266225, 27347, 0, 0, 23797, 10, 0, 0, 0, 0, 0, 0, 0, 'Oozes Dissolved', 19034), +(266226, 27347, 1, 1, 33108, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266227, 25502, 0, 0, 40461, 1, 0, 0, 0, 0, 0, 0, 0, 'Flameward Activated', 19034), +(266228, 25502, 0, 1, 40462, 1, 0, 0, 0, 0, 0, 0, 0, 'Flameward Defended', 19034), +(266229, 26658, 1, 0, 59323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266230, 25385, 1, 0, 53060, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266231, 25509, 2, 0, 202952, 5, 0, 0, 0, 0, 0, 0, 0, 'Darkwhisper Lodestone broken', 19034), +(266232, 30586, 1, 0, 80277, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266233, 30598, 0, 0, 59828, 1, 0, 0, 0, 0, 0, 0, 0, 'Pristine Crane Egg Gathered', 19034), +(266234, 30598, 1, 1, 80310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266235, 30754, 1, 0, 81116, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266236, 27835, 0, 0, 46866, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Olaf''s Shield Wall', 19034), +(266237, 27835, 0, 1, 46867, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Olaf''s Mighty Shout', 19034), +(266238, 25549, 0, 0, 40713, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266239, 25549, 0, 1, 40767, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266240, 25549, 0, 2, 40755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266241, 26625, 1, 0, 59144, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266242, 26560, 1, 0, 58969, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266243, 14370, 1, 0, 49207, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266244, 25560, 0, 0, 40762, 40, 0, 0, 0, 0, 0, 0, 0, 'Firelands Egg Destroyed', 19034), +(266245, 26451, 0, 0, 43120, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Your Gurubashi Arena Challenger', 19034), +(266246, 27293, 1, 0, 33051, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266247, 27228, 0, 0, 10439, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266248, 27237, 1, 0, 33041, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266249, 14309, 0, 0, 36079, 5, 0, 0, 0, 0, 0, 0, 0, 'Enraged Kodo calmed', 19034), +(266250, 27177, 1, 0, 60857, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266253, 26784, 1, 0, 60333, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266254, 27353, 1, 0, 60881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266255, 27353, 1, 1, 60873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266256, 27353, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266257, 27244, 1, 0, 5917, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266258, 25496, 0, 0, 40409, 1, 0, 0, 0, 0, 0, 0, 0, 'Grudge Match', 19034), +(266259, 25346, 1, 0, 9597, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266260, 25346, 1, 1, 9621, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266261, 27460, 0, 0, 9447, 10, 0, 0, 0, 0, 0, 0, 0, 'Tyr''s Hand Scarlet Crusader slain', 19034), +(266262, 25043, 0, 0, 37706, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266263, 25491, 1, 0, 54574, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266264, 27187, 0, 0, 45202, 12, 0, 0, 0, 0, 0, 0, 0, 'Mangy Hyenas Eradicated', 19034), +(266265, 13890, 0, 0, 34329, 1, 0, 0, 0, 0, 0, 0, 0, 'Lighthouse Fire Lit', 19034), +(266266, 26677, 1, 0, 884, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266267, 27445, 0, 0, 10363, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266268, 27227, 0, 0, 45412, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266269, 25082, 0, 0, 3252, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266270, 25082, 1, 1, 50128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266271, 25296, 1, 0, 52724, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266272, 25296, 1, 1, 52725, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266273, 26846, 0, 0, 1174, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266274, 27472, 0, 0, 45617, 1, 0, 0, 0, 0, 0, 0, 0, 'Lord Godfrey Reborn', 19034), +(266275, 25868, 0, 0, 41416, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266276, 25464, 0, 0, 40334, 20, 0, 0, 0, 0, 0, 0, 0, 'Baron Geddon Weakened', 19034), +(266277, 27120, 1, 0, 18240, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266278, 25138, 1, 0, 52513, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266279, 26754, 0, 0, 43761, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266280, 27340, 0, 0, 23594, 12, 0, 0, 0, 0, 0, 0, 0, 'Direhorn Grimtotems killed', 19034), +(266281, 27070, 1, 0, 9234, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266282, 27070, 1, 1, 8707, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266283, 27119, 1, 0, 18240, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266284, 26655, 1, 0, 1596, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266285, 26768, 1, 0, 60383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266286, 26557, 1, 0, 58946, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266287, 25176, 1, 0, 52558, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266288, 27465, 0, 0, 8545, 16, 0, 0, 0, 0, 0, 0, 0, 'Noxious Glade Scourge slain', 19034), +(266289, 27465, 0, 1, 45691, 8, 0, 0, 0, 0, 0, 0, 0, 'Noxious Glade Cultists slain', 19034), +(266290, 27051, 1, 0, 60767, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266291, 24637, 0, 0, 38018, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266292, 27252, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266293, 27575, 1, 0, 61506, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266294, 27575, 1, 1, 61507, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266295, 27575, 1, 2, 61508, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266296, 14394, 0, 0, 36442, 1, 0, 0, 0, 0, 0, 0, 0, 'Agogridon Defeated', 19034), +(266297, 25315, 0, 0, 40618, 10, 0, 0, 0, 0, 0, 0, 0, 'Graduation Speech', 19034), +(266298, 26751, 0, 0, 701, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266299, 26751, 0, 1, 588, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266300, 26751, 0, 2, 595, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266301, 26751, 0, 3, 699, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266302, 26128, 0, 0, 41522, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266303, 26587, 1, 0, 58950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266304, 26967, 0, 0, 3976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266305, 26967, 0, 1, 3977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266306, 26713, 0, 0, 486, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266307, 26713, 0, 1, 334, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266308, 25308, 0, 0, 40491, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266309, 25329, 0, 0, 45115, 1, 0, 0, 0, 0, 0, 0, 0, 'Sermon disrupted', 19034), +(266310, 27199, 0, 0, 44449, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266311, 27207, 0, 0, 45214, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266312, 24701, 1, 0, 50443, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266313, 26635, 1, 0, 59151, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266314, 27218, 1, 0, 33127, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266315, 24654, 0, 0, 3252, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266316, 24654, 1, 1, 50128, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266317, 26204, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(266318, 26204, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice using Charge', 19034), +(266319, 27030, 1, 0, 60755, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266320, 25328, 1, 0, 52789, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266321, 24747, 0, 0, 38250, 1, 0, 0, 0, 0, 0, 0, 0, 'Artillery Shell Sabotaged', 19034), +(266322, 24747, 0, 1, 38251, 1, 0, 0, 0, 0, 0, 0, 0, 'Get Out of There!', 19034), +(266323, 26561, 0, 0, 43363, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266324, 26638, 0, 0, 4462, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266325, 27423, 0, 0, 45495, 20, 0, 0, 0, 0, 0, 0, 0, 'Worgen Combatant slain', 19034); -- 266325 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(266326, 26630, 0, 0, 2487, 1, 0, 0, 0, 0, 0, 0, 0, 'Return both items to Fleet Master Seahorn', 19034), +(266327, 26630, 1, 1, 59148, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266328, 26630, 1, 2, 59147, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266329, 27242, 0, 0, 23727, 6, 0, 0, 0, 0, 0, 0, 0, 'Raptors Captured', 19034), +(266330, 27242, 1, 1, 33069, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266331, 27076, 0, 0, 7796, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266332, 27076, 0, 1, 7275, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266333, 27179, 1, 0, 60860, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266334, 26512, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266335, 27349, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266336, 27201, 0, 0, 45239, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266337, 24706, 0, 0, 38253, 2, 0, 0, 0, 0, 0, 0, 0, 'Prayers', 19034), +(266338, 27246, 1, 0, 5917, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266339, 26667, 1, 0, 59357, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266340, 26652, 1, 0, 1453, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266341, 25727, 1, 0, 55988, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266342, 26094, 0, 0, 42093, 30, 0, 0, 0, 0, 0, 0, 0, 'Dark Iron attackers slain', 19034), +(266343, 27758, 0, 0, 47296, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266344, 27247, 1, 0, 5917, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266345, 25059, 1, 0, 52277, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266346, 27049, 0, 0, 42475, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266347, 26720, 0, 0, 43860, 1, 0, 0, 0, 0, 0, 0, 0, 'Lurking Worgen captured', 19034), +(266348, 26538, 0, 0, 43212, 1, 0, 0, 0, 0, 0, 0, 0, 'Medicine Man Persuaded', 19034), +(266349, 27458, 1, 0, 62028, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266350, 24618, 0, 0, 37923, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266351, 24618, 10, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266352, 24604, 1, 0, 50383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266353, 27202, 0, 0, 45240, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266354, 25490, 0, 0, 40336, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266355, 26309, 1, 0, 19071, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266356, 27040, 2, 0, 205145, 6, 0, 0, 0, 0, 0, 0, 0, 'Plans decrypted', 19034), +(266357, 27456, 1, 0, 13853, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266358, 27351, 1, 0, 60880, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266359, 27351, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266360, 27351, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266361, 24971, 0, 0, 49424, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266362, 24971, 0, 1, 49422, 8, 0, 0, 0, 0, 0, 0, 0, 'Rotbrain undead slain', 19034), +(266363, 27110, 0, 0, 11496, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266364, 27110, 0, 1, 11486, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266365, 28059, 0, 0, 47447, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266366, 27675, 1, 0, 62056, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266367, 25550, 0, 0, 40998, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266368, 27198, 0, 0, 44447, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266369, 25565, 1, 0, 52061, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266371, 27355, 1, 0, 60882, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266372, 27355, 1, 1, 60873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266373, 27355, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266374, 14209, 1, 0, 48780, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266375, 24705, 0, 0, 38238, 1, 0, 0, 0, 0, 0, 0, 0, 'Damsel by the Shore saved', 19034), +(266376, 24705, 0, 1, 38239, 1, 0, 0, 0, 0, 0, 0, 0, 'Damsel in the Cliffs saved', 19034), +(266377, 24705, 0, 2, 38240, 1, 0, 0, 0, 0, 0, 0, 0, 'Damsel of the North saved', 19034), +(266378, 25849, 1, 0, 56083, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266379, 25337, 1, 0, 9595, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266380, 25337, 1, 1, 9619, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266381, 13615, 1, 0, 45004, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266382, 26680, 1, 0, 1349, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266383, 27294, 1, 0, 33071, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266384, 27255, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266385, 24533, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(266386, 24533, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(266387, 27345, 1, 0, 60953, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266388, 26733, 1, 0, 60213, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266389, 26165, 1, 0, 55991, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266390, 25651, 1, 0, 62228, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266391, 25841, 0, 0, 41372, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack on Northern Frostmane Retreat', 19034), +(266392, 25841, 0, 1, 41373, 1, 0, 0, 0, 0, 0, 0, 0, 'Attack on Southern Frostmane Retreat', 19034), +(266393, 27354, 1, 0, 60878, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266394, 27354, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266395, 27354, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266396, 28063, 1, 0, 62921, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266397, 27526, 0, 0, 45940, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Gidwin Goldbraids', 19034), +(266398, 24767, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266399, 25492, 0, 0, 46911, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266400, 25525, 0, 0, 39835, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266401, 25020, 1, 0, 52061, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266402, 27665, 1, 0, 62045, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266403, 24575, 2, 0, 201775, 5, 0, 0, 0, 0, 0, 0, 0, 'Enslaved Gilnean freed', 19034), +(266404, 27075, 0, 0, 44758, 7, 0, 0, 0, 0, 0, 0, 0, 'Mo''grosh Ogre slain', 19034), +(266405, 26765, 1, 0, 1987, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266406, 27127, 0, 0, 41110, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266407, 26934, 1, 0, 60679, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266408, 27078, 0, 0, 44771, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266409, 27077, 1, 0, 60738, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266410, 27775, 1, 0, 62396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266411, 25145, 5, -1, 172, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Corruption', 19034), +(266412, 25145, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Corruption', 19034), +(266413, 27296, 0, 0, 23751, 1, 0, 0, 0, 0, 0, 0, 0, 'North Tent Burned', 19034), +(266414, 27296, 0, 1, 23752, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Tent Burned', 19034), +(266415, 27296, 0, 2, 23753, 1, 0, 0, 0, 0, 0, 0, 0, 'East Tent Burned', 19034), +(266416, 27296, 1, 3, 33072, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266417, 26727, 0, 0, 43862, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266418, 27664, 1, 0, 62021, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266419, 26331, 0, 0, 42223, 8, 0, 0, 0, 0, 0, 0, 0, 'Crushcog''s Minions killed', 19034), +(266420, 24671, 0, 0, 38117, 10, 0, 0, 0, 0, 0, 0, 0, 'Wild Cluckers captured', 19034), +(266421, 26913, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(266422, 26913, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(266423, 25840, 0, 0, 41284, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266424, 25840, 0, 1, 41258, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266425, 27344, 1, 0, 60877, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266426, 27344, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266427, 27344, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266428, 24910, 0, 0, 38576, 5, 0, 0, 0, 0, 0, 0, 0, 'Life Rockets Delivered', 19034), +(266429, 24910, 0, 1, 40583, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266430, 26442, 1, 0, 58809, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266431, 26992, 1, 0, 60741, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266432, 27072, 0, 0, 44814, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266433, 24685, 1, 0, 50223, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266434, 27245, 0, 0, 23720, 5, 0, 0, 0, 0, 0, 0, 0, 'Theramore Prisoners Freed', 19034), +(266435, 25847, 0, 0, 41351, 12, 0, 0, 0, 0, 0, 0, 0, 'Grimtotem Armed', 19034), +(266436, 27453, 1, 0, 61285, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266437, 24953, 0, 0, 38996, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy the Hive', 19034), +(266438, 26238, 0, 0, 42518, 10, 0, 0, 0, 0, 0, 0, 0, 'Wildhammer slain', 19034), +(266439, 13594, 0, 0, 3734, 10, 0, 0, 0, 0, 0, 0, 0, 'Horde at Bathran''s Haunt slain', 19034), +(266440, 25084, 0, 0, 37929, 13, 0, 0, 0, 0, 0, 0, 0, 'Razormane Quilboar Slain', 19034), +(266441, 13628, 0, 0, 33374, 1, 0, 0, 0, 0, 0, 0, 0, 'Brutusk mounted', 19034), +(266444, 27035, 0, 0, 44724, 1, 0, 0, 0, 0, 0, 0, 0, 'Twilight Landshaper destroyed', 19034), +(266445, 27028, 1, 0, 60754, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266446, 27773, 0, 0, 46656, 1, 0, 0, 0, 0, 0, 0, 0, 'Jammal''an the Prophet defeated', 19034), +(266447, 14307, 0, 0, 11577, 5, 0, 0, 0, 0, 0, 0, 0, 'Whirlwind Stormwalkers destroyed', 19034), +(266448, 27029, 1, 0, 60756, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266449, 26145, 1, 0, 2536, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266450, 27226, 0, 0, 45196, 8, 0, 0, 0, 0, 0, 0, 0, 'Orc Sea Dog roused', 19034), +(266451, 25673, 1, 0, 55227, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266452, 25673, 1, 1, 55221, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266453, 25673, 1, 2, 55222, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266454, 25673, 1, 3, 55223, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266455, 25725, 1, 0, 55233, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266456, 27112, 0, 0, 11487, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266457, 27112, 0, 1, 11488, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266458, 27424, 1, 0, 5834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266459, 27424, 1, 1, 5835, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266460, 27424, 1, 2, 5836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266461, 24449, 1, 0, 49642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266462, 27669, 0, 0, 46283, 1, 0, 0, 0, 0, 0, 0, 0, 'Obelisk of the Stars Reactivated', 19034), +(266463, 27254, 1, 0, 5919, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266464, 27339, 1, 0, 33103, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266465, 27341, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266466, 25575, 0, 0, 40858, 10, 0, 0, 0, 0, 0, 0, 0, 'Twilight Arms Crate Destroyed', 19034), +(266467, 13995, 0, 0, 34635, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266468, 27045, 0, 0, 44882, 1, 0, 0, 0, 0, 0, 0, 0, 'Learn of Darius Crowley''s Plans', 19034), +(266469, 27525, 0, 0, 45867, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266470, 27525, 0, 1, 45868, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266471, 13566, 1, 0, 44969, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266472, 13566, 1, 1, 45027, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266473, 13566, 1, 2, 45885, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266474, 25807, 0, 0, 41310, 1, 0, 0, 0, 0, 0, 0, 0, 'Herald''s Incense Burned', 19034), +(266475, 26822, 0, 0, 44127, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266476, 25856, 1, 0, 56087, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266477, 25944, 1, 0, 56243, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266478, 25944, 1, 1, 56244, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266479, 25944, 1, 2, 56245, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266480, 26585, 1, 0, 59123, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266483, 27667, 1, 0, 62046, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266484, 25235, 0, 0, 43754, 15, 0, 0, 0, 0, 0, 0, 0, 'Splinter Fist Ogre slain', 19034), +(266485, 25927, 0, 0, 41449, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266486, 26329, 1, 0, 58178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266487, 25876, 1, 0, 56091, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266488, 27336, 0, 0, 23811, 10, 0, 0, 0, 0, 0, 0, 0, 'Totem Tests Performed', 19034), +(266489, 27336, 1, 1, 33101, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266490, 27432, 1, 0, 15785, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266491, 25915, 0, 0, 41602, 1, 0, 0, 0, 0, 0, 0, 0, 'Nemesis Crystal Examined', 19034), +(266492, 25223, 0, 0, 39344, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266493, 27217, 1, 0, 33126, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266494, 27666, 1, 0, 62044, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266497, 26159, 1, 0, 55826, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266498, 26159, 1, 1, 55827, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266499, 27043, 0, 0, 44889, 1, 0, 0, 0, 0, 0, 0, 0, 'Fire Ward acquired', 19034), +(266500, 27043, 0, 1, 44888, 1, 0, 0, 0, 0, 0, 0, 0, 'Water Ward acquired', 19034), +(266501, 27043, 0, 2, 44890, 1, 0, 0, 0, 0, 0, 0, 0, 'Air Ward acquired', 19034), +(266502, 27043, 0, 3, 44835, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266503, 27733, 0, 0, 46383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266504, 25694, 0, 0, 41164, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266505, 25694, 0, 1, 41165, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266506, 25694, 0, 2, 41166, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266507, 27109, 0, 0, 11489, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266508, 27003, 0, 0, 44833, 1, 0, 0, 0, 0, 0, 0, 0, 'Caravan Escorted', 19034), +(266509, 25739, 0, 0, 41185, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266510, 27433, 1, 0, 61048, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266511, 24513, 1, 0, 49771, 2, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266512, 24616, 0, 0, 37953, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266513, 26669, 1, 0, 59361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266514, 27406, 0, 0, 44369, 1, 0, 0, 0, 0, 0, 0, 0, 'Lord Vincent Godfrey''s corpse found', 19034), +(266515, 27048, 1, 0, 65504, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266516, 27048, 1, 1, 65507, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266517, 27048, 1, 2, 65508, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266518, 27048, 1, 3, 65510, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266519, 27729, 0, 0, 40855, 8, 0, 0, 0, 0, 0, 0, 0, 'Disgusting Eels Justifiably Slain', 19034), +(266520, 26917, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(266521, 26917, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(266522, 25107, 1, 0, 52470, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266523, 26995, 1, 0, 60742, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266524, 25616, 0, 0, 34353, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266525, 28852, 0, 0, 51184, 15, 0, 0, 0, 0, 0, 0, 0, 'Twilight''s Hammer Minion slain', 19034), +(266526, 28852, 0, 1, 51182, 30, 0, 0, 0, 0, 0, 0, 0, 'Trogg Dweller slain', 19034), +(266527, 27834, 0, 0, 46864, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Baelog''s Valhalla Shot', 19034), +(266528, 27834, 0, 1, 46865, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Baelog''s Warcry', 19034), +(266529, 27452, 1, 0, 61280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266530, 27452, 1, 1, 61281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266531, 25552, 1, 0, 54973, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266532, 27534, 1, 0, 15884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266533, 26947, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(266534, 26947, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(266535, 27757, 0, 0, 46371, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266536, 26775, 0, 0, 42881, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Tan''shang', 19034), +(266537, 26775, 0, 1, 42882, 1, 0, 0, 0, 0, 0, 0, 0, 'Help Tenjiyu', 19034), +(266538, 26775, 0, 2, 42883, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak with Chiyu', 19034), +(266539, 26775, 0, 3, 42884, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape from Zul''Gurub', 19034), +(266540, 25284, 0, 0, 37160, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266542, 27243, 0, 0, 23727, 1, 0, 0, 0, 0, 0, 0, 0, 'Raptors Released', 19034), +(266543, 26816, 1, 0, 58901, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266544, 27001, 0, 0, 44838, 10, 0, 0, 0, 0, 0, 0, 0, 'Northridge Spider lured to Lumber Mill', 19034), +(266545, 26998, 0, 0, 44825, 1, 0, 0, 0, 0, 0, 0, 0, 'Bat requisitioned from Bat Handler Maggotbreath', 19034), +(266546, 26998, 0, 1, 1908, 50, 0, 0, 0, 0, 0, 0, 0, 'Vile Fin Murloc slain', 19034), +(266547, 25997, 0, 0, 6123, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266548, 25997, 1, 1, 56264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266549, 26949, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(266550, 26949, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(266551, 27886, 0, 0, 46398, 1, 0, 0, 0, 0, 0, 0, 0, 'Sentinel''s Game Completed', 19034), +(266552, 13639, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266553, 24593, 2, 0, 201950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266554, 24593, 2, 1, 201951, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266555, 24593, 2, 2, 201952, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266556, 27093, 0, 0, 44942, 6, 0, 0, 0, 0, 0, 0, 0, 'Orc Sea Dog rescued', 19034), +(266557, 25752, 0, 0, 40639, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Engineer Hexascrub', 19034), +(266558, 25752, 0, 1, 41249, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266559, 25752, 0, 2, 41250, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266560, 25752, 0, 3, 42549, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266561, 25085, 0, 0, 37940, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266562, 27125, 0, 0, 11501, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266563, 25837, 1, 0, 56041, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266564, 25837, 1, 1, 56040, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266565, 25837, 1, 2, 56042, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266566, 14191, 0, 0, 35363, 1, 0, 0, 0, 0, 0, 0, 0, 'Elune''s Cathedral Ruins Visited', 19034), +(266567, 14191, 0, 1, 35367, 1, 0, 0, 0, 0, 0, 0, 0, 'Elune''s Temple Ruins Visited', 19034), +(266568, 14191, 0, 2, 35366, 1, 0, 0, 0, 0, 0, 0, 0, 'Elune''s Sanctuary Ruins Visited', 19034), +(266569, 26600, 1, 0, 59036, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266570, 26600, 1, 1, 59037, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266571, 26645, 0, 0, 202, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266572, 26621, 0, 0, 43654, 3, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Civilian Armed', 19034), +(266573, 26621, 0, 1, 43575, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266574, 26621, 0, 2, 43394, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266575, 27838, 0, 0, 46871, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266576, 25671, 0, 0, 41087, 20, 0, 0, 0, 0, 0, 0, 0, 'Horde Soldier Slain', 19034), +(266578, 6341, 1, 0, 16262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266579, 24531, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(266580, 24531, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(266581, 27256, 1, 0, 5959, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266582, 26210, 1, 0, 19023, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266583, 27695, 1, 0, 62230, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266584, 28836, 0, 0, 40586, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Naz''jar Slain', 19034), +(266585, 25728, 0, 0, 35333, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266586, 25728, 0, 1, 35204, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266587, 27756, 0, 0, 47162, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266588, 24999, 0, 0, 38937, 12, 0, 0, 0, 0, 0, 0, 0, 'Vile Fin Tadpoles frightened', 19034), +(266589, 14476, 2, 0, 197344, 1, 0, 0, 0, 0, 0, 0, 0, 'Detonator Charge 1 Armed', 19034), +(266590, 14476, 2, 1, 197345, 1, 0, 0, 0, 0, 0, 0, 0, 'Detonator Charge 2 Armed', 19034), +(266591, 14476, 2, 2, 197346, 1, 0, 0, 0, 0, 0, 0, 0, 'Detonator Charge 3 Armed', 19034), +(266592, 27528, 0, 0, 45911, 8, 0, 0, 0, 0, 0, 0, 0, 'Overstuffed Golem corpse burned', 19034), +(266596, 25792, 0, 0, 41202, 4, 0, 0, 0, 0, 0, 0, 0, 'Constriction Totems burned', 19034), +(266597, 13514, 0, 0, 32858, 30, 0, 0, 0, 0, 0, 0, 0, 'Shatterspear Vale Trolls killed', 19034), +(266598, 13514, 0, 1, 33913, 6, 0, 0, 0, 0, 0, 0, 0, 'Shatterspear Structures destroyed', 19034), +(266599, 25608, 0, 0, 40573, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266600, 25608, 0, 1, 40947, 40, 0, 0, 0, 0, 0, 0, 0, 'Twilight''s Hammer unit slain', 19034), +(266601, 27700, 0, 0, 46456, 1, 0, 0, 0, 0, 0, 0, 0, 'Lirastrasza freed', 19034), +(266602, 27117, 0, 0, 44317, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266603, 25999, 0, 0, 34341, 8, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar "Elf Killer" armed', 19034), +(266604, 14377, 0, 0, 36333, 1, 0, 0, 0, 0, 0, 0, 0, 'Secret of Azsharite Discovered', 19034), +(266605, 25334, 0, 0, 40307, 1, 0, 0, 0, 0, 0, 0, 0, 'Share in Farseer Gadra''s Spirit Vision', 19034), +(266606, 27464, 0, 0, 45707, 1, 0, 0, 0, 0, 0, 0, 0, 'Trial of the Crypt completed', 19034), +(266607, 25901, 1, 0, 56176, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266609, 27696, 1, 0, 62230, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266610, 26777, 0, 0, 43930, 5, 0, 0, 0, 0, 0, 0, 0, 'Forlorn Spirit soothed', 19034), +(266611, 26536, 1, 0, 58899, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266612, 27209, 0, 0, 45214, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266613, 25741, 1, 0, 55280, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266614, 13891, 0, 0, 34331, 1, 0, 0, 0, 0, 0, 0, 0, 'Devouring Artifact Destroyed', 19034), +(266615, 13891, 1, 1, 46370, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266616, 13925, 0, 0, 34373, 1, 0, 0, 0, 0, 0, 0, 0, 'Lifebringer Sapling Tested', 19034), +(266617, 13925, 1, 1, 46363, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266620, 13529, 0, 0, 33020, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266621, 13529, 0, 1, 33021, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266622, 25389, 1, 0, 53073, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266623, 26212, 1, 0, 19034, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266624, 26948, 5, -1, 8921, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Moonfire', 19034), +(266625, 26948, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Moonfire', 19034), +(266626, 25068, 1, 0, 52284, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266627, 24514, 1, 0, 49772, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266628, 25459, 0, 0, 39948, 4, 0, 0, 0, 0, 0, 0, 0, 'Brinescale Serpents Slain', 19034), +(266629, 25390, 1, 0, 53074, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266630, 27348, 1, 0, 33163, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266631, 25042, 1, 0, 52198, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266632, 27009, 0, 0, 7358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266633, 13999, 1, 0, 46794, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266634, 25151, 1, 0, 52491, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266635, 14249, 1, 0, 49068, 80, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266636, 27529, 0, 0, 11064, 8, 0, 0, 0, 0, 0, 0, 0, 'Darrowshire Spirits Freed', 19034), +(266637, 24504, 0, 0, 37159, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266638, 25362, 1, 0, 9460, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266639, 27532, 1, 0, 61362, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266640, 27071, 0, 0, 7272, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266641, 27071, 0, 1, 7271, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266642, 27071, 0, 2, 8127, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266643, 27071, 0, 3, 7797, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266644, 25905, 0, 0, 43064, 6, 0, 0, 0, 0, 0, 0, 0, 'Stolen Rams recovered', 19034), +(266645, 26708, 0, 0, 43775, 200, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266646, 25719, 1, 0, 57184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266647, 27839, 1, 0, 62533, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266648, 27839, 1, 1, 62534, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266649, 27567, 0, 0, 9018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266650, 24625, 1, 0, 50018, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266651, 25377, 1, 0, 53054, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266652, 26923, 0, 0, 44562, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266653, 27067, 5, -1, 8921, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Moonfire', 19034), +(266654, 27067, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Moonfire', 19034), +(266655, 27917, 0, 0, 46962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266656, 26719, 1, 0, 60205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266657, 25649, 1, 0, 67437, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266658, 14244, 0, 0, 50046, 1, 0, 0, 0, 0, 0, 0, 0, 'Rocket Sling Trip Survived', 19034), +(266659, 25662, 0, 0, 41070, 5, 0, 0, 0, 0, 0, 0, 0, 'Captured Huntress Freed', 19034), +(266660, 27790, 0, 0, 47739, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266661, 27739, 0, 0, 46254, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266662, 25108, 0, 0, 39174, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266663, 27066, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(266664, 27066, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(266665, 28050, 0, 0, 46608, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266666, 27437, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266667, 27437, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266668, 27437, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266669, 24955, 0, 0, 38848, 10, 0, 0, 0, 0, 0, 0, 0, '"Signatures" Obtained', 19034), +(266670, 27531, 1, 0, 61364, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266671, 27531, 1, 1, 61365, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266672, 27531, 1, 2, 61366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266673, 25844, 1, 0, 56059, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266674, 25356, 0, 0, 39897, 1, 0, 0, 0, 0, 0, 0, 0, 'Wind Rider to Westreach Summit', 19034), +(266675, 27533, 0, 0, 16117, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266676, 25388, 1, 0, 53061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266677, 25656, 1, 0, 55189, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266678, 14122, 0, 0, 35486, 1, 0, 0, 0, 0, 0, 0, 0, 'First Bank of Kezan Vault', 19034), +(266679, 14122, 1, 1, 46858, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266680, 27889, 1, 0, 62513, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266681, 27429, 0, 0, 23751, 1, 0, 0, 0, 0, 0, 0, 0, 'North Tent Burned', 19034), +(266682, 27429, 0, 1, 23752, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Tent Burned', 19034), +(266683, 27429, 0, 2, 23753, 1, 0, 0, 0, 0, 0, 0, 0, 'East Tent Burned', 19034), +(266684, 27429, 1, 3, 33072, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266685, 6344, 1, 0, 16262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266686, 14334, 0, 0, 36206, 1, 0, 0, 0, 0, 0, 0, 0, 'Blubbergut Slain', 19034), +(266687, 27046, 0, 0, 44257, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266688, 14300, 0, 0, 34773, 1, 0, 0, 0, 0, 0, 0, 0, 'Fire Trial Completed', 19034), +(266689, 26519, 0, 0, 711, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266690, 13798, 0, 0, 33965, 30, 0, 0, 0, 0, 0, 0, 0, 'Attacking Elves Slain', 19034), +(266691, 13798, 0, 1, 33969, 5, 0, 0, 0, 0, 0, 0, 0, 'Raging Ancients Slain', 19034), +(266693, 27420, 0, 0, 45475, 3, 0, 0, 0, 0, 0, 0, 0, 'Plague Disseminator destroyed', 19034), +(266694, 24692, 0, 0, 38305, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266695, 26523, 1, 0, 58120, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266696, 26721, 1, 0, 60207, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266697, 13967, 1, 0, 46741, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266698, 26493, 1, 0, 58880, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266699, 27000, 0, 0, 44850, 25, 0, 0, 0, 0, 0, 0, 0, 'Northridge Spiders frightened', 19034), +(266700, 28127, 0, 0, 47630, 5, 0, 0, 0, 0, 0, 0, 0, 'Bulwark Prisoners freed', 19034), +(266701, 27776, 0, 0, 46696, 12, 0, 0, 0, 0, 0, 0, 0, 'Billy Goats nudged', 19034), +(266702, 26997, 0, 0, 44827, 6, 0, 0, 0, 0, 0, 0, 0, 'Dock Workers Interrogated', 19034), +(266703, 27037, 1, 0, 2713, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266704, 27673, 1, 0, 62053, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266705, 27673, 1, 1, 62055, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266706, 26516, 0, 0, 2647, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266707, 26516, 0, 1, 2646, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266708, 27403, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266709, 27403, 1, 1, 60872, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266710, 27403, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266711, 24627, 0, 0, 37757, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266712, 26363, 1, 0, 58228, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266713, 27042, 0, 0, 44889, 1, 0, 0, 0, 0, 0, 0, 0, 'Fire Ward acquired', 19034), +(266714, 27042, 0, 1, 44888, 1, 0, 0, 0, 0, 0, 0, 0, 'Water Ward acquired', 19034), +(266715, 27042, 0, 2, 44890, 1, 0, 0, 0, 0, 0, 0, 0, 'Air Ward acquired', 19034), +(266716, 27042, 0, 3, 44835, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266717, 27094, 0, 0, 44906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266718, 26884, 1, 0, 5952, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266719, 26381, 1, 0, 58282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266720, 26717, 2, 0, 204777, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266721, 27652, 1, 0, 62033, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266722, 27547, 0, 0, 45910, 8, 0, 0, 0, 0, 0, 0, 0, 'Cowering Trooper rescued', 19034), +(266723, 26993, 1, 0, 5535, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266724, 14063, 0, 0, 34782, 1, 1, 0, 0, 0, 0, 0, 0, 'Maiden''s Dagger Captured', 19034), +(266725, 14063, 1, 1, 46838, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266726, 26338, 0, 0, 701, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266727, 26338, 0, 1, 588, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266728, 26338, 0, 2, 595, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266729, 26338, 0, 3, 699, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266730, 27038, 1, 0, 60757, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266731, 14125, 2, 0, 201735, 1, 0, 0, 0, 0, 0, 0, 0, 'Overload the Defective Generator', 19034), +(266732, 14125, 2, 1, 201733, 1, 0, 0, 0, 0, 0, 0, 0, 'Activate the Leaky Stove', 19034), +(266733, 14125, 2, 2, 201734, 1, 0, 0, 0, 0, 0, 0, 0, 'Drop a Cigar on the Flammable Bed', 19034), +(266734, 14125, 0, 3, 37598, 1, 0, 0, 0, 0, 0, 0, 0, 'KTC Headquarters Set Ablaze with Gasbot!', 19034), +(266735, 25707, 0, 0, 41402, 1, 0, 0, 0, 0, 0, 0, 0, 'Rockpool Tadpoles returned to the Forbidding Sea', 19034), +(266736, 25668, 1, 0, 55151, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266737, 25930, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266738, 25848, 1, 0, 56080, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266739, 26778, 0, 0, 44032, 20, 0, 0, 0, 0, 0, 0, 0, 'Ghoul slain', 19034), +(266740, 26035, 1, 0, 4503, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266741, 26035, 1, 1, 4522, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266742, 26286, 1, 0, 58111, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266743, 27421, 0, 0, 45486, 1, 0, 0, 0, 0, 0, 0, 0, 'Seed planted in southeastern ziggurat', 19034), +(266744, 27421, 0, 1, 45488, 1, 0, 0, 0, 0, 0, 0, 0, 'Seed planted in western ziggurat', 19034), +(266745, 27421, 0, 2, 45487, 1, 0, 0, 0, 0, 0, 0, 0, 'Seed planted in northeastern ziggurat', 19034), +(266746, 28042, 1, 0, 62913, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266747, 25912, 1, 0, 56186, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266750, 26077, 0, 0, 42037, 1, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar Hot Air Balloon taken to Cliffwalker Post', 19034), +(266751, 25257, 0, 0, 39351, 1, 1, 0, 0, 0, 0, 0, 0, 'Ghislania defeated', 19034), +(266752, 25106, 0, 0, 39153, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266753, 25106, 1, 1, 52360, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266754, 25106, 1, 2, 52469, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266755, 27682, 1, 0, 62053, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266756, 27682, 1, 1, 62055, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266757, 14469, 1, 0, 49599, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266758, 27592, 1, 0, 61356, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266759, 27922, 0, 0, 47466, 1, 0, 0, 0, 0, 0, 0, 0, 'Neferset Secret uncovered', 19034), +(266760, 26500, 0, 0, 43134, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266761, 26700, 0, 0, 43726, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266762, 27655, 0, 0, 46205, 10, 0, 0, 0, 0, 0, 0, 0, 'Twilight Citadel cultists slain', 19034), +(266763, 24707, 0, 0, 38708, 1, 0, 0, 0, 0, 0, 0, 0, 'Un''Goro''s Broodmother slain', 19034), +(266764, 27095, 0, 0, 1781, 12, 0, 0, 0, 0, 0, 0, 0, 'Skitterweb Spider slain', 19034), +(266765, 27887, 0, 0, 46768, 1, 1, 0, 0, 0, 0, 0, 0, 'Thoroughly investigated The Warden', 19034), +(266766, 27887, 0, 1, 46769, 1, 1, 0, 0, 0, 0, 0, 0, 'Thoroughly investigated The Sentinel', 19034), +(266767, 27126, 1, 0, 60831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266768, 27888, 1, 0, 62497, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266769, 25913, 1, 0, 56187, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266770, 27016, 0, 0, 44627, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266771, 27017, 1, 0, 60770, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266772, 27017, 1, 1, 60771, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266773, 25333, 0, 0, 45115, 1, 0, 0, 0, 0, 0, 0, 0, 'Sermon disrupted', 19034), +(266774, 25642, 1, 0, 55174, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266775, 26375, 0, 0, 42900, 6, 0, 0, 0, 0, 0, 0, 0, 'Quartz Rocklings released', 19034), +(266776, 26348, 0, 0, 127, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266777, 26348, 0, 1, 517, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266778, 13806, 2, 0, 194612, 12, 0, 0, 0, 0, 0, 0, 0, 'Demon Portals Interrupted', 19034), +(266779, 25717, 0, 0, 41470, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266780, 25717, 0, 1, 41471, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266781, 25717, 0, 2, 45119, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266782, 25717, 0, 3, 45125, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266783, 25574, 0, 0, 40856, 1, 0, 0, 0, 0, 0, 0, 0, 'Infiltrators'' encampment burnt', 19034), +(266784, 26420, 1, 0, 58787, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266785, 25554, 1, 0, 54907, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266786, 25554, 1, 1, 54906, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266787, 25554, 1, 2, 54905, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266788, 25652, 0, 0, 41009, 1, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar Hot Air Balloon Diverted', 19034), +(266789, 28043, 0, 0, 47416, 1, 0, 0, 0, 0, 0, 0, 0, 'Baited Black Drake Captured', 19034), +(266790, 27397, 1, 0, 60881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266791, 27397, 1, 1, 60873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266792, 27397, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266793, 25221, 0, 0, 40174, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266794, 26161, 1, 0, 55829, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266795, 26161, 1, 1, 55836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266796, 26161, 1, 2, 55837, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266797, 25924, 0, 0, 36901, 1, 0, 0, 0, 0, 0, 0, 0, 'Ride the mercenary ship to Vashj''ir', 19034), +(266798, 27036, 1, 0, 2713, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266799, 25979, 0, 0, 41762, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266800, 24949, 1, 0, 51549, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266801, 26268, 1, 0, 57989, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266802, 26009, 0, 0, 41866, 20, 0, 0, 0, 0, 0, 0, 0, 'Alliance Soldier slain', 19034), +(266803, 25766, 0, 0, 41232, 5, 0, 0, 0, 0, 0, 0, 0, 'Highborne Spirit Bound', 19034), +(266804, 25063, 1, 0, 52282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266805, 24927, 0, 0, 39026, 15, 0, 0, 0, 0, 0, 0, 0, 'Southsea Freebooters slain', 19034), +(266806, 25210, 1, 0, 53642, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266807, 26836, 0, 0, 44151, 1, 1, 0, 0, 0, 0, 0, 0, 'Stonefather Oremantle rescued', 19034), +(266808, 27436, 1, 0, 60879, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266809, 27436, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266810, 27436, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266812, 26664, 0, 0, 43636, 9, 0, 0, 0, 0, 0, 0, 0, 'Bloodsail Corsair accused and killed', 19034), +(266813, 26305, 1, 0, 3913, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266814, 26390, 0, 0, 42938, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266815, 25037, 1, 0, 52080, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266816, 25857, 1, 0, 56089, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266817, 26276, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(266818, 26276, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266819, 24966, 5, -1, 589, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Shadow Word: Pain', 19034), +(266820, 24966, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Shadow Word: Pain', 19034), +(266821, 26074, 0, 0, 42030, 1, 0, 0, 0, 0, 0, 0, 0, 'Krom''gar Hot Air Balloon safely escorted to the Sludgewerks', 19034), +(266822, 26937, 0, 0, 45089, 8, 0, 0, 0, 0, 0, 0, 0, 'Alliance Laborers slain and converted', 19034), +(266823, 26545, 0, 0, 518, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266824, 26545, 1, 1, 58937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266825, 14428, 1, 0, 49356, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266826, 25049, 0, 0, 39022, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266827, 24552, 0, 0, 37207, 5, 0, 0, 0, 0, 0, 0, 0, 'Barrens Lions Slain', 19034), +(266828, 25396, 1, 0, 52573, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266829, 27587, 1, 0, 61633, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266830, 25655, 0, 0, 41027, 10, 0, 0, 0, 0, 0, 0, 0, 'Wormwing Harpy', 19034), +(266831, 24675, 1, 0, 50219, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266832, 25201, 1, 0, 52530, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266833, 26954, 0, 0, 44481, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266834, 26806, 1, 0, 60370, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266835, 26462, 0, 0, 42536, 10, 0, 0, 0, 0, 0, 0, 0, 'Revantusk slain', 19034), +(266836, 26975, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266837, 25544, 0, 0, 40660, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266839, 26497, 0, 0, 2641, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266840, 26497, 0, 1, 2640, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266841, 27427, 1, 0, 33071, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266842, 28041, 1, 0, 62915, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266843, 26631, 1, 0, 59149, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266844, 26091, 0, 0, 42007, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Eel-Splosive Device on Devious Great-Eel', 19034), +(266845, 26091, 0, 1, 41927, 1, 0, 0, 0, 0, 0, 0, 0, 'Avenge Wolf', 19034); -- 266845 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(266847, 25695, 2, 0, 203226, 1, 0, 0, 0, 0, 0, 0, 0, 'Examined the Alliance Plans', 19034), +(266848, 27468, 0, 0, 45580, 1, 0, 0, 0, 0, 0, 0, 0, 'Siege Tank Commander Spoken To', 19034), +(266849, 27468, 0, 1, 45581, 1, 0, 0, 0, 0, 0, 0, 0, 'Siege Tank Defended', 19034), +(266850, 27468, 1, 2, 61282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266851, 27837, 0, 0, 46868, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266852, 13892, 0, 0, 34410, 1, 0, 0, 0, 0, 0, 0, 0, 'Twilight''s Hammer surveillance', 19034), +(266853, 25929, 1, 0, 54828, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266854, 25929, 1, 1, 52504, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266856, 26439, 0, 0, 43115, 6, 0, 0, 0, 0, 0, 0, 0, 'Stonebound Elementals reformed', 19034), +(266857, 25682, 1, 0, 56017, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266858, 26522, 0, 0, 42704, 8, 0, 0, 0, 0, 0, 0, 0, 'Tiki Masks Burned', 19034), +(266859, 25005, 1, 0, 2831, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266860, 27573, 0, 0, 9156, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266861, 27573, 0, 1, 9039, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266862, 27781, 0, 0, 43778, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266863, 26047, 0, 0, 41989, 10, 0, 0, 0, 0, 0, 0, 0, 'Frightened Peon rescued', 19034), +(266864, 26026, 1, 0, 55227, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266865, 26026, 1, 1, 55221, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266866, 26026, 1, 2, 55222, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266867, 26026, 1, 3, 55223, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266868, 25375, 0, 0, 39957, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266869, 26087, 1, 0, 56573, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266870, 26355, 1, 0, 1361, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266871, 26391, 0, 0, 42940, 8, 0, 0, 0, 0, 0, 0, 0, 'Vineyard Fire extinguished', 19034), +(266872, 25757, 1, 0, 55807, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266873, 27596, 1, 0, 11309, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266875, 25102, 0, 0, 37555, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266876, 25102, 0, 1, 37556, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266877, 26960, 0, 0, 44692, 1, 0, 0, 0, 0, 0, 0, 0, 'Introduced to Anduin', 19034), +(266879, 26955, 0, 0, 44902, 4, 0, 0, 0, 0, 0, 0, 0, 'Captive Plaguebear freed and healed', 19034), +(266882, 25716, 1, 0, 57134, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266883, 24981, 0, 0, 1537, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266884, 24981, 0, 1, 1536, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266885, 24981, 1, 2, 52077, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266886, 25481, 0, 0, 39897, 1, 0, 0, 0, 0, 0, 0, 0, 'Hippogryph to New Thalanaar', 19034), +(266887, 25846, 1, 0, 56061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266888, 26085, 0, 0, 42089, 8, 0, 0, 0, 0, 0, 0, 0, 'Ironforge Banners planted', 19034), +(266889, 26021, 0, 0, 42007, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Eel-Splosive Device on Devious Great-Eel', 19034), +(266890, 26021, 0, 1, 41927, 1, 0, 0, 0, 0, 0, 0, 0, 'Avenge Oskar Digsong', 19034), +(266891, 25899, 0, 0, 41500, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266892, 24990, 1, 0, 2858, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266894, 25628, 1, 0, 55160, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266895, 26521, 0, 0, 42704, 8, 0, 0, 0, 0, 0, 0, 0, 'Tiki Masks Burned', 19034), +(266896, 26617, 1, 0, 59142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266897, 25975, 1, 0, 56235, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266898, 24777, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266899, 26367, 0, 0, 42815, 1, 0, 0, 0, 0, 0, 0, 0, 'Ongo''longo Enraged', 19034), +(266900, 14129, 0, 0, 35111, 1, 0, 0, 0, 0, 0, 0, 0, 'Runaway Shredder Captured', 19034), +(266901, 25934, 1, 0, 56224, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266902, 26148, 0, 0, 42230, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266903, 13644, 0, 0, 33444, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266904, 27653, 1, 0, 62033, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266905, 25536, 0, 0, 39664, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266906, 25540, 1, 0, 54884, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266907, 28031, 1, 0, 62913, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266908, 25762, 0, 0, 41242, 1, 0, 0, 0, 0, 0, 0, 0, 'The Ancient Brazier reignited', 19034), +(266909, 25762, 1, 1, 55979, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266910, 26770, 0, 0, 43995, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266911, 24951, 0, 0, 38742, 1, 0, 0, 0, 0, 0, 0, 0, 'Swarmer Wrangled', 19034), +(266912, 25881, 0, 0, 41510, 8, 0, 0, 0, 0, 0, 0, 0, 'Lost Warden Rescued', 19034), +(266913, 26572, 1, 0, 58960, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266914, 27898, 0, 0, 46654, 1, 0, 0, 0, 0, 0, 0, 0, 'Wait for Rhea to retrieve the egg', 19034), +(266915, 27891, 0, 0, 46862, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Amakkar''s Kidney Shot', 19034), +(266916, 27891, 0, 1, 46863, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Amakkar''s Pocket Potion', 19034), +(266917, 27795, 0, 0, 46765, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266918, 25646, 0, 0, 40905, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266919, 26707, 1, 0, 60204, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266920, 26659, 0, 0, 43640, 1, 0, 0, 0, 0, 0, 0, 0, 'Pale Resonating Crystal struck', 19034), +(266921, 26659, 0, 1, 43641, 1, 0, 0, 0, 0, 0, 0, 0, 'Aeosera defeated', 19034), +(266922, 25009, 0, 0, 1537, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266923, 25009, 0, 1, 1538, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266924, 24913, 0, 0, 47541, 1, 0, 0, 0, 0, 0, 0, 0, 'Magtoor passed on', 19034), +(266925, 14471, 0, 0, 6196, 60, 0, 0, 0, 0, 0, 0, 0, 'Spitelash Attackers blown to bits', 19034), +(266926, 26746, 1, 0, 60291, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266927, 25537, 0, 0, 40654, 8, 0, 0, 0, 0, 0, 0, 0, 'Anemone Chemicals Gathered', 19034), +(266928, 26115, 0, 0, 42124, 1, 0, 0, 0, 0, 0, 0, 0, 'Learn what it means to be Horde.', 19034), +(266929, 25800, 1, 0, 56013, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266930, 25691, 1, 0, 55989, 24, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266931, 25607, 1, 0, 55144, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266932, 27400, 1, 0, 60878, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266933, 27400, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266934, 27400, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266935, 27426, 1, 0, 33051, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266936, 27011, 1, 0, 60750, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266937, 26823, 1, 0, 60380, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266938, 25669, 0, 0, 41071, 1, 0, 0, 0, 0, 0, 0, 0, 'Huntress Illiona Freed', 19034), +(266939, 24988, 1, 0, 2876, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266940, 25708, 0, 0, 42252, 13, 0, 0, 0, 0, 0, 0, 0, 'Drowned Gilnean Spirit Freed', 19034), +(266941, 13874, 1, 0, 16602, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266942, 27585, 0, 0, 9033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266943, 27585, 0, 1, 8983, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266944, 27603, 0, 0, 9016, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266945, 27010, 0, 0, 44938, 1, 0, 0, 0, 0, 0, 0, 0, 'World Pillar Fragment clue uncovered', 19034), +(266946, 27044, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266947, 13635, 1, 0, 60494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266948, 25381, 0, 0, 39939, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266949, 27402, 1, 0, 60882, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266950, 27402, 1, 1, 60873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266951, 27402, 1, 2, 60875, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266952, 26263, 0, 0, 42610, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(266953, 13941, 1, 0, 46697, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266954, 27549, 1, 0, 61376, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266955, 25956, 1, 0, 59358, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266956, 27584, 0, 0, 45998, 15, 0, 0, 0, 0, 0, 0, 0, 'Blackscale Naga Slain', 19034), +(266957, 26594, 1, 0, 3922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266958, 26229, 0, 0, 1236, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266959, 25953, 0, 0, 40877, 8, 0, 0, 0, 0, 0, 0, 0, 'Azsh''ir Monitor destroyed', 19034), +(266960, 28046, 0, 0, 46823, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266961, 25962, 1, 0, 55965, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266962, 25441, 0, 0, 40277, 30, 0, 0, 0, 0, 0, 0, 0, 'Swarming Serpents trapped', 19034), +(266963, 27849, 0, 0, 46870, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266964, 26736, 0, 0, 43921, 1, 0, 0, 0, 0, 0, 0, 0, 'Rescue Berrin Burnquill', 19034), +(266965, 26736, 0, 1, 43920, 1, 0, 0, 0, 0, 0, 0, 0, 'Rescue Emerine Junis', 19034), +(266966, 26736, 0, 2, 43919, 1, 0, 0, 0, 0, 0, 0, 0, 'Rescue Osborn Obnoticus', 19034), +(266967, 26297, 0, 0, 42680, 1, 0, 0, 0, 0, 0, 0, 0, 'Information from Moonbrook Rally gathered', 19034), +(266969, 24907, 0, 0, 39022, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266970, 26961, 1, 0, 2636, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266971, 26694, 0, 0, 397, 1, 1, 0, 0, 0, 0, 0, 0, 'Grand Magus Doane confronted', 19034), +(266972, 27589, 0, 0, 9537, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266973, 27589, 0, 1, 9499, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266974, 27589, 0, 2, 9543, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266975, 27836, 2, 0, 206390, 6, 0, 0, 0, 0, 0, 0, 0, 'Slitherer Egg destroyed', 19034), +(266976, 14202, 0, 0, 35488, 1, 0, 0, 0, 0, 0, 0, 0, 'Survey West Marker', 19034), +(266977, 14202, 0, 1, 35487, 1, 0, 0, 0, 0, 0, 0, 0, 'Survey North Marker', 19034), +(266978, 14202, 0, 2, 35489, 1, 0, 0, 0, 0, 0, 0, 0, 'Survey East Marker', 19034), +(266979, 14202, 1, 3, 48665, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266980, 26308, 0, 0, 2647, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266981, 26308, 0, 1, 2646, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266982, 26487, 1, 0, 4029, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266983, 27586, 1, 0, 61634, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266984, 25754, 0, 0, 41304, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the Tunnel to the North', 19034), +(266985, 25754, 0, 1, 41303, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the Northwestern Terrace', 19034), +(266986, 25703, 0, 0, 41386, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266987, 25703, 0, 1, 41387, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266988, 26690, 0, 0, 206, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266989, 26690, 0, 1, 920, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266990, 14121, 1, 0, 47530, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266991, 25808, 0, 0, 41311, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266992, 26444, 0, 0, 11697, 15, 0, 0, 0, 0, 0, 0, 0, 'Demons slain', 19034), +(266993, 25123, 0, 0, 39276, 1, 0, 0, 0, 0, 0, 0, 0, 'Blastshadow''s Soulstone destroyed', 19034), +(266994, 24972, 1, 0, 2885, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266995, 25698, 1, 0, 10754, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266996, 24906, 1, 0, 50829, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(266998, 25896, 0, 0, 41985, 6, 0, 0, 0, 0, 0, 0, 0, 'Sira''kess Tide Priestesses gathered', 19034), +(266999, 25896, 0, 1, 41980, 1, 0, 0, 0, 0, 0, 0, 0, 'Fathom-Caller Azrajar gathered', 19034), +(267000, 24948, 0, 0, 38818, 3, 0, 0, 0, 0, 0, 0, 0, 'Rageroar Catapults Burned', 19034), +(267001, 24948, 0, 1, 38820, 1, 0, 0, 0, 0, 0, 0, 0, 'Rageroar Blade Thrower Burned', 19034), +(267002, 24948, 1, 2, 52017, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267003, 25732, 1, 0, 55805, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267004, 25889, 0, 0, 41528, 5, 0, 0, 0, 0, 0, 0, 0, 'Helpless Young Druid Rescued', 19034), +(267005, 26558, 0, 0, 43067, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwestern Temple', 19034), +(267006, 26558, 0, 1, 43069, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Temple', 19034), +(267007, 26558, 0, 2, 43068, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwestern Temple', 19034), +(267008, 26052, 1, 0, 4493, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267009, 25751, 1, 0, 55965, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267010, 24640, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(267011, 24640, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(267012, 27693, 0, 0, 46339, 1, 0, 0, 0, 0, 0, 0, 0, 'Warden''s Game Completed', 19034), +(267013, 25684, 2, 0, 203181, 1, 0, 0, 0, 0, 0, 0, 0, 'Use internal Bloodstone Teleporter', 19034), +(267014, 25684, 2, 1, 203180, 1, 0, 0, 0, 0, 0, 0, 0, 'Use external Bloodstone Teleporter', 19034), +(267017, 26693, 1, 0, 59522, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267018, 26082, 0, 0, 35150, 5, 0, 0, 0, 0, 0, 0, 0, 'Darnassian Glaive Thrower destroyed', 19034), +(267019, 26082, 0, 1, 42056, 20, 0, 0, 0, 0, 0, 0, 0, 'Alliance Soldier in Battlescar Valley slain', 19034), +(267020, 26507, 1, 0, 58959, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267021, 14281, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(267022, 14281, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(267023, 25571, 1, 0, 56008, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267024, 26792, 0, 0, 44126, 1, 0, 0, 0, 0, 0, 0, 0, 'Obtain a War Guardian', 19034), +(267025, 26792, 0, 1, 44035, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267026, 28045, 1, 0, 62911, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267027, 26976, 0, 0, 3976, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267028, 26976, 0, 1, 3977, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267029, 28048, 0, 0, 47389, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267030, 14423, 0, 0, 35526, 1, 0, 0, 0, 0, 0, 0, 0, 'Clubnik''s Dozer Exorcised', 19034), +(267031, 14423, 1, 1, 49350, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267032, 27594, 0, 0, 46002, 1, 0, 0, 0, 0, 0, 0, 0, 'Commander Lorna Crowley captured', 19034), +(267033, 24759, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267034, 25659, 0, 0, 41115, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267035, 26956, 0, 0, 44489, 6, 0, 0, 0, 0, 0, 0, 0, 'Bad Corn Removed', 19034), +(267036, 26956, 0, 1, 44488, 4, 0, 0, 0, 0, 0, 0, 0, 'Rotten Apple Removed', 19034), +(267037, 26956, 0, 2, 44487, 3, 0, 0, 0, 0, 0, 0, 0, 'Unhealthy-Looking Pumpkin Removed', 19034), +(267038, 26135, 0, 0, 41982, 1, 0, 0, 0, 0, 0, 0, 0, 'Infiltrate Quel''Dormir Temple', 19034), +(267039, 26135, 0, 1, 41222, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Concluding Story of the Battlemaiden', 19034), +(267040, 26963, 5, -1, 56641, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Steady Shot', 19034), +(267041, 26963, 0, 0, 44175, 5, 0, 0, 0, 0, 0, 0, 0, 'Practice Steady Shot', 19034), +(267042, 26843, 0, 0, 44197, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267043, 25680, 0, 0, 41163, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267044, 25000, 1, 0, 49772, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267045, 26490, 1, 0, 58082, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267046, 27671, 0, 0, 46268, 6, 0, 0, 2100, 0, 0, 0, 0, 'Survivors Rescued', 19034), +(267047, 26396, 1, 0, 16115, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267048, 25610, 1, 0, 55138, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267049, 25058, 2, 0, 202472, 10, 0, 0, 0, 0, 0, 0, 0, 'Land Mines detonated', 19034), +(267050, 25963, 0, 0, 40918, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Fiasco Sizzlegrin', 19034), +(267051, 25963, 0, 1, 41249, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267052, 25963, 0, 2, 41250, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267053, 25963, 0, 3, 42549, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267054, 25053, 0, 0, 38660, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwest Shack', 19034), +(267055, 25053, 0, 1, 38662, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwest Shack', 19034), +(267056, 25053, 0, 2, 38665, 1, 0, 0, 0, 0, 0, 0, 0, 'Northeast Shack', 19034), +(267057, 26240, 0, 0, 42597, 6, 0, 0, 0, 0, 0, 0, 0, 'Revantusk Warriors bolstered', 19034), +(267058, 25281, 0, 0, 39663, 6, 0, 0, 0, 0, 0, 0, 0, 'Soldiers Rescued', 19034), +(267059, 25038, 1, 0, 12737, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267060, 27844, 0, 0, 47296, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267062, 25845, 1, 0, 56060, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267063, 25959, 0, 0, 41227, 10, 0, 0, 0, 0, 0, 0, 0, 'Southern Naga Forces', 19034), +(267064, 27574, 1, 0, 61505, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267065, 27593, 0, 0, 9019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267066, 27701, 0, 0, 46456, 1, 0, 0, 0, 0, 0, 0, 0, 'Lirastrasza freed', 19034), +(267068, 14422, 0, 0, 36534, 5, 0, 0, 0, 0, 0, 0, 0, 'Experimental Raptor Delivered', 19034), +(267069, 26958, 5, -1, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Charge', 19034), +(267070, 26958, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Charge', 19034), +(267071, 27670, 0, 0, 46363, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267072, 14386, 0, 0, 36312, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267073, 24976, 1, 0, 52067, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267074, 24976, 1, 1, 52066, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267075, 24976, 1, 2, 52068, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267076, 25864, 0, 0, 41414, 8, 0, 0, 0, 0, 0, 0, 0, 'Highland Raptors slain', 19034), +(267077, 25670, 0, 0, 41098, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnaws Slain', 19034), +(267078, 13989, 0, 0, 12918, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267079, 26882, 1, 0, 5881, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267080, 13918, 1, 0, 46387, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267081, 13918, 1, 1, 46388, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267082, 26531, 0, 0, 43067, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwestern Temple', 19034), +(267083, 26531, 0, 1, 43069, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern Temple', 19034), +(267084, 26531, 0, 2, 43068, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwestern Temple', 19034), +(267085, 27600, 1, 0, 61921, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267086, 27600, 1, 1, 61922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267087, 27600, 1, 2, 61373, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267088, 25894, 0, 0, 41566, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267089, 27577, 1, 0, 61510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267090, 25621, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267091, 24697, 0, 0, 38355, 4, 0, 0, 0, 0, 0, 0, 0, 'Dinosaurs Baited', 19034), +(267092, 14408, 0, 0, 52041, 1, 0, 0, 0, 0, 0, 0, 0, 'Ring Door Buzzer', 19034), +(267093, 14408, 1, 1, 49204, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267094, 28047, 0, 0, 47423, 1, 0, 0, 0, 0, 0, 0, 0, 'First pipe frozen', 19034), +(267095, 28047, 0, 1, 47424, 1, 0, 0, 0, 0, 0, 0, 0, 'Second pipe frozen', 19034), +(267096, 28047, 0, 2, 47425, 1, 0, 0, 0, 0, 0, 0, 0, 'Third pipe frozen', 19034), +(267097, 28047, 0, 3, 47426, 1, 0, 0, 0, 0, 0, 0, 0, 'Fourth pipe frozen', 19034), +(267098, 13983, 1, 0, 46772, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267099, 13983, 1, 1, 46773, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267100, 13983, 1, 2, 46771, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267101, 25965, 0, 0, 41304, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the Tunnel to the North', 19034), +(267102, 25965, 0, 1, 41303, 1, 0, 0, 0, 0, 0, 0, 0, 'Scout the Northwestern Terrace', 19034), +(267103, 27023, 5, -1, 105361, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Seal of Command', 19034), +(267104, 27023, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Seal of Command and Hit Training Dummy', 19034), +(267106, 27411, 0, 0, 23789, 1, 0, 0, 0, 0, 0, 0, 0, 'Stonemaul Clan Avenged', 19034), +(267107, 27411, 1, 1, 33095, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267108, 26307, 0, 0, 2643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267109, 26307, 0, 1, 2642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267110, 27569, 0, 0, 9033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267111, 27569, 0, 1, 8983, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267112, 25004, 1, 0, 3162, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267113, 25004, 1, 1, 3163, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267114, 14480, 0, 0, 7885, 30, 0, 0, 0, 0, 0, 0, 0, 'Spitelash Naga slain', 19034), +(267115, 27654, 0, 0, 46205, 10, 0, 0, 0, 0, 0, 0, 0, 'Twilight Citadel cultists slain', 19034), +(267116, 24492, 1, 0, 49754, 1, 0, 0, 3134, 0, 0, 0, 0, '', 19034), +(267117, 24492, 1, 1, 49755, 1, 0, 0, 3135, 0, 0, 0, 0, '', 19034), +(267118, 24492, 1, 2, 49756, 1, 0, 0, 3136, 0, 0, 0, 0, '', 19034), +(267119, 27025, 1, 0, 60737, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267120, 13626, 1, 0, 45042, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267121, 13626, 1, 1, 45043, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267122, 25678, 0, 0, 5996, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267123, 25678, 0, 1, 5997, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267124, 25678, 0, 2, 5998, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267125, 24996, 1, 0, 3460, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267126, 27401, 0, 0, 45430, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the 7th Legion Telescope to Scout the Harbor.', 19034), +(267127, 13518, 0, 0, 33093, 1, 0, 0, 0, 0, 0, 0, 0, 'Cerellean Whiteclaw rescued', 19034), +(267128, 13518, 0, 1, 32911, 1, 0, 0, 0, 0, 0, 0, 0, 'Gershala Nightwhisper rescued', 19034), +(267129, 13518, 0, 2, 33095, 1, 0, 0, 0, 0, 0, 0, 0, 'Shaldyn rescued', 19034), +(267130, 13518, 0, 3, 33094, 1, 0, 0, 0, 0, 0, 0, 0, 'Volcor rescued', 19034), +(267131, 26122, 1, 0, 56818, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267132, 26122, 1, 1, 56819, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267133, 26122, 1, 2, 56820, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267134, 26971, 0, 0, 43837, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267135, 25755, 0, 0, 41221, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Continuing Story of the Battlemaiden', 19034), +(267136, 25224, 1, 0, 52537, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267137, 27407, 1, 0, 33085, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267138, 25806, 0, 0, 41291, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267140, 26011, 0, 0, 41937, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267142, 25581, 2, 0, 203386, 1, 0, 0, 0, 0, 0, 0, 0, 'Lestharia Vashj statue', 19034), +(267143, 25581, 2, 1, 203388, 1, 0, 0, 0, 0, 0, 0, 0, 'Queen Azshara statue', 19034), +(267144, 25581, 2, 2, 203390, 1, 0, 0, 0, 0, 0, 0, 0, 'Ranger Valarian statue', 19034), +(267145, 25581, 2, 3, 203391, 1, 0, 0, 0, 0, 0, 0, 0, 'High Priestess Siralen statue', 19034), +(267146, 27412, 0, 0, 23873, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267147, 25505, 1, 0, 54644, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267148, 26010, 0, 0, 41936, 8, 0, 0, 0, 0, 0, 0, 0, 'Northwatch Tent incinerated', 19034), +(267149, 26517, 1, 0, 58228, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267150, 25818, 1, 0, 2629, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267151, 27024, 0, 0, 8567, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267152, 27024, 0, 1, 7357, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267153, 27024, 0, 2, 7355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267154, 25060, 0, 0, 39020, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267155, 14433, 1, 0, 49367, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267156, 14433, 1, 1, 49366, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267157, 24569, 2, 0, 201792, 4, 0, 0, 0, 0, 0, 0, 0, 'Siege Engine Destroyed', 19034), +(267158, 24569, 1, 1, 49874, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267159, 26022, 1, 0, 4495, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267160, 25859, 0, 0, 41105, 20, 0, 0, 0, 0, 0, 0, 0, 'Vrykul Ledge Kvaldir slain', 19034), +(267161, 27410, 0, 0, 23786, 10, 0, 0, 0, 0, 0, 0, 0, 'Stonemaul Spirits laid to rest', 19034), +(267162, 27410, 1, 1, 33091, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267167, 26018, 0, 0, 41925, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267168, 26018, 0, 1, 41926, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267169, 25309, 0, 0, 39752, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267170, 26763, 1, 0, 4106, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267171, 13912, 1, 0, 46386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267172, 25079, 1, 0, 52290, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267173, 26492, 1, 0, 57989, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267174, 26737, 0, 0, 43910, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267175, 26737, 0, 1, 43911, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267176, 26737, 0, 2, 43913, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267177, 26737, 0, 3, 43912, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267179, 14098, 0, 0, 35830, 3, 0, 0, 0, 0, 0, 0, 0, 'Market Homes Evacuated', 19034), +(267180, 26583, 0, 0, 43503, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Earthmender Norsala', 19034), +(267181, 26583, 0, 1, 43372, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267185, 14226, 0, 0, 35628, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267186, 24974, 0, 0, 38923, 1, 0, 0, 0, 0, 0, 0, 0, 'Vile Fin captured', 19034), +(267187, 24974, 0, 1, 38887, 1, 0, 0, 0, 0, 0, 0, 0, 'Vile Fin returned', 19034), +(267188, 26714, 0, 0, 43496, 1, 1, 0, 0, 0, 0, 0, 0, 'Darkblaze Defeated', 19034), +(267189, 27413, 1, 0, 33175, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267190, 27580, 0, 0, 45995, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267191, 24700, 1, 0, 50258, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267192, 26590, 1, 0, 58811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267193, 26300, 1, 0, 3905, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267195, 25926, 0, 0, 41424, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267196, 26966, 5, -1, 105361, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Seal of Command', 19034), +(267197, 26966, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Seal of Command and Hit Training Dummy', 19034), +(267199, 27548, 0, 0, 45883, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267204, 26028, 0, 0, 35203, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267205, 26028, 0, 1, 35334, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267207, 25690, 1, 0, 55828, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267208, 25820, 0, 0, 41293, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267209, 24439, 1, 0, 49674, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267210, 26941, 0, 0, 6235, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267211, 26491, 0, 0, 2656, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267212, 14233, 1, 0, 49090, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267213, 14474, 0, 0, 34748, 6, 0, 0, 0, 0, 0, 0, 0, 'Goblin Survivors Rescued', 19034), +(267214, 26931, 0, 0, 44432, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267215, 26931, 0, 1, 44476, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267216, 26931, 0, 2, 44474, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267217, 24686, 1, 0, 50253, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267218, 26008, 0, 0, 41533, 10, 0, 0, 0, 0, 0, 0, 0, 'Imprisoned Warriors Freed', 19034), +(267219, 24762, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(267220, 24762, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267221, 27789, 0, 0, 46737, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive first wave', 19034), +(267222, 27789, 0, 1, 46738, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive second wave', 19034), +(267223, 27789, 0, 2, 46739, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive third wave', 19034), +(267224, 27789, 0, 3, 46740, 1, 0, 0, 0, 0, 0, 0, 0, 'Survive final wave', 19034), +(267225, 24934, 0, 0, 38661, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267227, 24691, 1, 0, 50371, 96, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267228, 26940, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach level 3 to learn Frost Nova', 19034), +(267229, 26940, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice using Frost Nova', 19034), +(267230, 26032, 1, 0, 4458, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267231, 25614, 0, 0, 40942, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267232, 25947, 1, 0, 54957, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267233, 24565, 0, 0, 37090, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267234, 24565, 0, 1, 37091, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267235, 26832, 0, 0, 42923, 1, 1, 0, 0, 0, 0, 0, 0, 'Boldrich Stonerender defeated', 19034), +(267236, 26832, 0, 1, 42914, 1, 1, 0, 0, 0, 0, 0, 0, 'High Priestess Lorthuna defeated', 19034), +(267238, 25541, 1, 0, 54829, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267239, 26382, 1, 0, 58252, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267240, 25521, 1, 0, 54856, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267241, 27550, 0, 0, 45937, 1, 0, 0, 0, 0, 0, 0, 0, 'Pyrewood Inn torched', 19034), +(267242, 27550, 0, 1, 45938, 1, 0, 0, 0, 0, 0, 0, 0, 'Pyrewood Chapel torched', 19034), +(267243, 27550, 0, 2, 45939, 1, 0, 0, 0, 0, 0, 0, 0, 'Pyrewood Town Hall torched', 19034), +(267244, 27601, 0, 0, 46019, 1, 0, 0, 0, 0, 0, 0, 0, 'Victory: Final and Absolute', 19034), +(267245, 27578, 0, 0, 9019, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267246, 24977, 1, 0, 3035, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267247, 24765, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267248, 27408, 1, 0, 33086, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267249, 26818, 1, 0, 58812, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267250, 26818, 1, 1, 58813, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267251, 27551, 1, 0, 61377, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267252, 24519, 0, 0, 37165, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267253, 14212, 0, 0, 35582, 30, 0, 0, 0, 0, 0, 0, 0, 'Bloodfang Stalker rounded up', 19034), +(267254, 27015, 1, 0, 60752, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267255, 25002, 1, 0, 52045, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267256, 14431, 0, 0, 36611, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267257, 14431, 1, 1, 49364, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267258, 27004, 1, 0, 60745, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267259, 26549, 0, 0, 43243, 1, 0, 0, 0, 0, 0, 0, 0, 'Negotiations Concluded', 19034), +(267260, 27591, 0, 0, 9156, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267261, 27591, 0, 1, 9039, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267262, 25349, 0, 0, 40168, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267263, 24941, 1, 0, 51957, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267264, 24433, 0, 0, 36816, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267265, 24433, 0, 1, 36914, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267266, 28710, 1, 0, 64677, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267267, 28729, 1, 0, 5184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267268, 13588, 0, 0, 34316, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267269, 13588, 0, 1, 34282, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267270, 28730, 1, 0, 5184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267271, 26076, 0, 0, 42034, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267272, 26946, 5, -1, 2098, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 and Learn Eviscerate', 19034), +(267273, 26946, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice using Eviscerate', 19034), +(267274, 24436, 0, 0, 36922, 8, 0, 0, 0, 0, 0, 0, 0, 'Wounded Soldier rescued', 19034), +(267275, 26298, 1, 0, 3901, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267276, 28722, 0, 0, 10978, 1, 0, 0, 0, 0, 0, 0, 0, 'Scare Legacki', 19034), +(267277, 28722, 1, 1, 12928, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267278, 26657, 0, 0, 42522, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267279, 27901, 1, 0, 62607, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267281, 28724, 1, 0, 10641, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267282, 28695, 0, 0, 46648, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267283, 28683, 0, 0, 46508, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267284, 26173, 0, 0, 41164, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267285, 26173, 0, 1, 41165, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267286, 26173, 0, 2, 41166, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267287, 28707, 1, 0, 64677, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267288, 26861, 0, 0, 44930, 1, 0, 0, 0, 0, 0, 0, 0, 'Twilight Gate disrupted', 19034), +(267289, 26861, 0, 1, 44931, 1, 0, 0, 0, 0, 0, 0, 0, 'Elemental Gate disrupted', 19034), +(267290, 24939, 0, 0, 38747, 10, 0, 0, 0, 0, 0, 0, 0, 'Rageroar Rowboat Destroyed', 19034), +(267291, 28696, 0, 0, 48286, 10, 0, 0, 0, 0, 0, 0, 0, 'Wellson Supply Boats Destroyed', 19034), +(267292, 27916, 1, 0, 62748, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267293, 26814, 0, 0, 43323, 1, 1, 0, 0, 0, 0, 0, 0, 'Deal with High Priest Venoxis', 19034), +(267294, 26699, 0, 0, 43716, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267295, 27860, 0, 0, 46959, 12, 0, 0, 0, 0, 0, 0, 0, 'Lost One slain', 19034), +(267296, 26168, 1, 0, 10754, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267297, 28719, 0, 0, 7443, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267298, 27845, 0, 0, 46909, 7, 0, 0, 0, 0, 0, 0, 0, 'Footman Marked', 19034), +(267299, 28679, 0, 0, 46605, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267300, 14464, 1, 0, 49540, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267301, 26809, 0, 0, 43252, 1, 0, 0, 0, 0, 0, 0, 0, 'Place incense in front of Totem of Hir''eek', 19034), +(267302, 26809, 0, 1, 43245, 1, 0, 0, 0, 0, 0, 0, 0, 'Spy on Zanzil', 19034), +(267303, 28689, 2, 0, 206570, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267304, 28684, 1, 0, 62803, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267305, 26755, 0, 0, 43978, 30, 0, 0, 0, 0, 0, 0, 0, 'Reinforcements bombarded', 19034), +(267306, 28727, 0, 0, 1994, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267307, 28700, 0, 0, 47304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267308, 26799, 0, 0, 1501, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267309, 13505, 1, 0, 44830, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267310, 28735, 0, 0, 39665, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267311, 28738, 0, 0, 39698, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267312, 28740, 0, 0, 39700, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267313, 28055, 0, 0, 5843, 12, 0, 0, 0, 0, 0, 0, 0, 'Slave Workers freed or killed', 19034), +(267314, 28668, 0, 0, 48035, 10, 0, 0, 0, 0, 0, 0, 0, 'Prisoners Slain', 19034), +(267315, 13544, 1, 0, 44887, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267316, 28726, 0, 0, 1986, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267317, 28697, 0, 0, 47303, 14, 0, 0, 0, 0, 0, 0, 0, 'Largo''s Overlook Ghosts Slain', 19034), +(267318, 25705, 2, 0, 203289, 8, 0, 0, 0, 0, 0, 0, 0, 'Azsh''ir Idol destroyed', 19034), +(267319, 28690, 1, 0, 62808, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267320, 28703, 0, 0, 49346, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267321, 28703, 0, 1, 49347, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267322, 28685, 1, 0, 62921, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267323, 25693, 1, 0, 56025, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267324, 28686, 0, 0, 47664, 14, 0, 0, 0, 0, 0, 0, 0, 'Rustberg Village Residents', 19034), +(267325, 28680, 1, 0, 62810, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267326, 27006, 0, 0, 44839, 1, 0, 0, 0, 0, 0, 0, 0, 'Masters'' Gate investigated', 19034), +(267327, 24813, 0, 0, 38560, 8, 0, 0, 0, 0, 0, 0, 0, 'Territorial Fetish placed', 19034), +(267328, 28831, 0, 0, 50251, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267329, 28678, 0, 0, 47287, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267330, 27785, 0, 0, 47626, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267331, 28698, 1, 0, 62818, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267332, 26306, 0, 0, 2641, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267333, 26306, 0, 1, 2640, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267334, 28057, 1, 0, 18943, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267335, 28669, 1, 0, 63309, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267336, 28049, 1, 0, 62918, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267337, 28693, 0, 0, 46825, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267338, 25921, 0, 0, 41731, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267339, 26149, 0, 0, 42234, 5, 0, 0, 0, 0, 0, 0, 0, 'Horde Prisoners rescued', 19034), +(267340, 28713, 0, 0, 2031, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267341, 28714, 1, 0, 3297, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267342, 28692, 1, 0, 62830, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267343, 28681, 0, 0, 46608, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267344, 28682, 0, 0, 47447, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267345, 28670, 1, 0, 63315, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267346, 14381, 0, 0, 36232, 1, 0, 0, 0, 0, 0, 0, 0, 'Grimfeather Mounted', 19034), +(267347, 14381, 0, 1, 36228, 10, 0, 0, 0, 0, 0, 0, 0, 'Slitherblade Sirens Defeated', 19034), +(267348, 14381, 0, 2, 36230, 3, 0, 0, 0, 0, 0, 0, 0, 'Sea Giants Defeated', 19034), +(267349, 14381, 0, 3, 36229, 10, 0, 0, 0, 0, 0, 0, 0, 'Slitherblade Invaders Defeated', 19034), +(267351, 28715, 1, 0, 46700, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267352, 28694, 1, 0, 62811, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267353, 28687, 1, 0, 63047, 22, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267354, 14296, 0, 0, 35171, 1, 0, 0, 0, 0, 0, 0, 0, 'Arcane Trial Completed', 19034), +(267355, 28701, 1, 0, 64675, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267356, 24523, 1, 0, 4803, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267357, 28032, 1, 0, 62914, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267358, 25674, 0, 0, 41136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267359, 13907, 0, 0, 34344, 10, 0, 0, 0, 0, 0, 0, 0, 'Murloc Squatters Killed', 19034), +(267360, 26169, 1, 0, 10753, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267361, 26410, 1, 0, 58501, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267362, 26499, 0, 0, 43138, 12, 0, 0, 0, 0, 0, 0, 0, 'Stonefather''s Boon granted', 19034), +(267363, 28737, 0, 0, 39679, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267364, 27900, 0, 0, 46979, 10, 0, 0, 0, 0, 0, 0, 0, 'Schnottz Air Troopers Slain', 19034), +(267365, 28054, 0, 0, 5844, 10, 0, 0, 0, 0, 0, 0, 0, 'Dark Iron Taskmaster or Slaver slain', 19034), +(267366, 28056, 0, 0, 8400, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267367, 28056, 0, 1, 8391, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267368, 28691, 0, 0, 46571, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267369, 25994, 1, 0, 56194, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267370, 28030, 1, 0, 62916, 200, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267371, 26411, 0, 0, 43036, 1, 0, 0, 0, 0, 0, 0, 0, 'Explosive Bonding Compound applied', 19034), +(267372, 26130, 0, 0, 41654, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267373, 26130, 0, 1, 41655, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267374, 26130, 0, 2, 41656, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267375, 27698, 0, 0, 13282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267376, 27698, 0, 1, 12258, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267377, 25332, 0, 0, 39808, 1, 0, 0, 0, 0, 0, 0, 0, 'Kristoff Escorted Out', 19034), +(267380, 26819, 1, 0, 4029, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267381, 28060, 0, 0, 14621, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267382, 28060, 0, 1, 47460, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034); -- 267382 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(267383, 25477, 0, 0, 40339, 1, 0, 0, 0, 0, 0, 0, 0, 'Sea Turtle Mounted', 19034), +(267384, 26172, 1, 0, 55828, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267385, 13509, 0, 0, 33056, 12, 0, 0, 0, 0, 0, 0, 0, 'Shatterspear Armaments burned', 19034), +(267386, 26167, 1, 0, 10755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267388, 13558, 1, 1, 44929, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267389, 28051, 0, 0, 47446, 10, 0, 0, 0, 0, 0, 0, 0, 'Dead Employees hooked', 19034), +(267390, 26075, 0, 0, 4012, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267391, 26031, 1, 0, 4450, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267392, 26437, 1, 0, 58845, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267393, 27856, 0, 0, 46913, 7, 0, 0, 0, 0, 0, 0, 0, 'Fallen Stonard Warrior marked', 19034), +(267394, 25885, 1, 0, 56167, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267395, 26368, 1, 0, 58239, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267396, 29205, 0, 0, 53012, 1, 0, 0, 0, 0, 0, 0, 0, 'Druid Assault Group Protected', 19034), +(267397, 24452, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267401, 28028, 0, 0, 8338, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267402, 27853, 0, 0, 46487, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267403, 27691, 0, 0, 45967, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267404, 25706, 0, 0, 41422, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267405, 25706, 0, 1, 41423, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267406, 25706, 0, 2, 41404, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267407, 25706, 0, 3, 41405, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267408, 14262, 0, 0, 35831, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267409, 14262, 0, 1, 35832, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267410, 25918, 1, 0, 56185, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267411, 26413, 0, 0, 44207, 1, 0, 0, 0, 0, 0, 0, 0, 'Flint Oremantle introduced to Earthcaller Yevaa', 19034), +(267412, 27857, 0, 0, 46869, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267413, 27855, 0, 0, 46775, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267414, 24945, 0, 0, 38808, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267415, 24945, 0, 1, 38809, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267416, 24945, 0, 2, 38810, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267417, 26629, 1, 0, 59146, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267418, 14258, 1, 0, 49062, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267419, 13546, 0, 0, 32996, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267420, 26844, 0, 0, 1177, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267421, 26844, 0, 1, 1176, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267422, 26597, 1, 0, 2797, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267423, 27686, 1, 0, 63276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267424, 26703, 0, 0, 43794, 1, 0, 0, 0, 0, 0, 0, 0, 'Kill Fleet Master Firallon', 19034), +(267425, 26842, 1, 0, 60402, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267426, 27892, 0, 0, 46865, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Jurrix''s Fiery Blast', 19034), +(267427, 27892, 0, 1, 46864, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Jurrix''s Time Warp', 19034), +(267428, 26863, 1, 0, 2640, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267429, 25772, 1, 0, 8244, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267430, 26789, 0, 0, 44048, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267431, 26584, 0, 0, 43513, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267432, 26079, 1, 0, 4516, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267433, 26079, 1, 1, 4517, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267434, 26174, 2, 0, 203225, 1, 0, 0, 0, 0, 0, 0, 0, 'Examined the Horde Plans', 19034), +(267435, 13590, 1, 0, 44985, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267436, 26827, 0, 0, 44133, 5, 0, 0, 0, 0, 0, 0, 0, 'Earthen Ring rallied', 19034), +(267437, 28029, 2, 0, 149032, 1, 0, 0, 0, 0, 0, 0, 0, 'Western tower ablaze', 19034), +(267438, 28029, 2, 1, 149025, 1, 0, 0, 0, 0, 0, 0, 0, 'Southwestern tower ablaze', 19034), +(267439, 28029, 2, 2, 149030, 1, 0, 0, 0, 0, 0, 0, 0, 'Southeastern tower ablaze', 19034), +(267440, 28029, 2, 3, 149031, 1, 0, 0, 0, 0, 0, 0, 0, 'Eastern tower ablaze', 19034), +(267441, 28830, 0, 0, 50258, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267442, 26502, 1, 0, 58886, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267443, 24435, 0, 0, 6190, 12, 0, 0, 0, 0, 0, 0, 0, 'Defending Naga slain', 19034), +(267444, 27688, 0, 0, 46341, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267445, 27688, 0, 1, 46342, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267446, 27688, 0, 2, 46343, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267447, 26105, 0, 0, 42115, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267448, 26377, 0, 0, 43038, 1, 0, 0, 0, 0, 0, 0, 0, 'Agitated Tunneler lured', 19034), +(267449, 14354, 0, 0, 35363, 1, 0, 0, 0, 0, 0, 0, 0, 'Handmaiden Of Elune Visited', 19034), +(267450, 14354, 0, 1, 35367, 1, 0, 0, 0, 0, 0, 0, 0, 'Elune''s Brazier Visited', 19034), +(267451, 14354, 0, 2, 35366, 1, 0, 0, 0, 0, 0, 0, 0, 'Cup of Elune Visited', 19034), +(267452, 26663, 0, 0, 43623, 1, 0, 0, 0, 0, 0, 0, 0, 'Sabotage the Grog', 19034), +(267453, 26663, 0, 1, 43631, 1, 0, 0, 0, 0, 0, 0, 0, 'Sabotage the Gunpowder', 19034), +(267454, 26663, 0, 2, 43632, 1, 0, 0, 0, 0, 0, 0, 0, 'Sabotage the Cannonballs', 19034), +(267455, 24961, 0, 0, 38910, 1, 0, 0, 0, 0, 0, 0, 0, 'Show Lilian her reflection', 19034), +(267456, 26788, 1, 0, 60337, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267457, 24479, 0, 0, 36345, 1, 0, 0, 0, 0, 0, 0, 0, 'Shadow Trial Completed', 19034), +(267458, 27858, 0, 0, 46654, 1, 0, 0, 0, 0, 0, 0, 0, 'Wait for Rhea to retrieve the egg', 19034), +(267459, 26649, 0, 0, 43596, 75, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267460, 28829, 0, 0, 7452, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267461, 25908, 0, 0, 41466, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267462, 25908, 0, 1, 41467, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267463, 26483, 0, 0, 42609, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267464, 26807, 1, 0, 60370, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267465, 26193, 0, 0, 42819, 15, 0, 0, 0, 0, 0, 0, 0, 'Kill 15 naga in the Abyssal Breach', 19034), +(267466, 25203, 0, 0, 39363, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267467, 27050, 0, 0, 44900, 10, 0, 0, 0, 0, 0, 0, 0, 'Freshly sprouted mushroom destroyed', 19034), +(267468, 28731, 1, 0, 5186, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267470, 25321, 1, 0, 53139, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267471, 25697, 1, 0, 10755, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267472, 25338, 1, 0, 9593, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267473, 25338, 1, 1, 9606, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267478, 24437, 0, 0, 36953, 1, 0, 0, 0, 0, 0, 0, 0, 'Southern Pagoda claimed', 19034), +(267479, 24437, 0, 1, 36952, 1, 0, 0, 0, 0, 0, 0, 0, 'Big ol'' Tower claimed', 19034), +(267480, 24437, 0, 2, 36951, 1, 0, 0, 0, 0, 0, 0, 0, 'Northern Vista claimed', 19034), +(267481, 26269, 1, 0, 57990, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267482, 14250, 1, 0, 49036, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267483, 27794, 1, 0, 62497, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267484, 26223, 0, 0, 2926, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267485, 27798, 0, 0, 46819, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact information extracted', 19034), +(267488, 28828, 1, 0, 65890, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267489, 25887, 0, 0, 42013, 12, 0, 0, 0, 0, 0, 0, 0, 'Zin''jatar Guardians Eaten Alive', 19034), +(267490, 27854, 0, 0, 46414, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267491, 13511, 0, 0, 32970, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267492, 26321, 0, 0, 42742, 40, 0, 0, 0, 0, 0, 0, 0, 'Bites of Murkgill meat', 19034), +(267493, 25713, 2, 0, 203707, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267494, 26550, 0, 0, 43252, 1, 0, 0, 0, 0, 0, 0, 0, 'Place incense in front of Totem of Hir''eek', 19034), +(267495, 26550, 0, 1, 43245, 1, 0, 0, 0, 0, 0, 0, 0, 'Spy on Zanzil', 19034), +(267496, 26564, 1, 0, 58944, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267497, 27851, 1, 0, 62516, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267498, 26695, 1, 0, 59524, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267499, 26407, 1, 0, 58492, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267500, 26438, 0, 0, 42524, 12, 0, 0, 0, 0, 0, 0, 0, 'Jaspertip flayers slain', 19034), +(267501, 26144, 0, 0, 42225, 5, 0, 0, 0, 0, 0, 0, 0, 'Alliance Prisoners rescued', 19034), +(267502, 26613, 1, 0, 3910, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267503, 28843, 0, 0, 40586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267504, 25982, 1, 0, 56254, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267505, 13572, 2, 0, 194150, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267506, 26876, 1, 0, 60574, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267507, 26929, 1, 0, 57131, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267510, 27007, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267511, 24434, 0, 0, 36849, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267512, 13882, 1, 0, 46354, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267513, 13882, 1, 1, 46356, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267514, 13882, 1, 2, 46355, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267515, 27852, 0, 0, 46164, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267516, 26612, 0, 0, 1565, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267517, 26612, 0, 1, 1653, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267518, 26612, 1, 2, 3920, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267519, 26612, 1, 3, 59145, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267520, 25898, 0, 0, 40645, 1, 0, 0, 0, 0, 0, 0, 0, 'Swim to the rescue balloon at the surface', 19034), +(267521, 25898, 0, 1, 41572, 1, 0, 0, 0, 0, 0, 0, 0, 'Fire a rescue flare towards the Alliance ships', 19034), +(267522, 13523, 0, 0, 32937, 6, 0, 0, 0, 0, 0, 0, 0, 'Tidal Spirit Soothed', 19034), +(267523, 26449, 1, 0, 45477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267524, 26449, 1, 1, 45476, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267525, 25024, 0, 0, 39042, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267526, 27581, 0, 0, 9018, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267527, 25819, 1, 0, 2944, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267528, 28826, 0, 0, 50054, 1, 0, 0, 0, 0, 0, 0, 0, 'Peered into the Waters of Farseeing', 19034), +(267529, 26325, 1, 0, 58171, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267530, 26187, 0, 0, 42334, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267531, 28058, 1, 0, 18950, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267532, 29206, 0, 0, 53218, 1, 0, 0, 0, 0, 0, 0, 0, 'Druid of the Talon Windcaller protected', 19034), +(267533, 27414, 1, 0, 5840, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267534, 27414, 1, 1, 5841, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267535, 26533, 1, 0, 4016, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267536, 25773, 1, 0, 56008, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267537, 26599, 1, 0, 3932, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267538, 26593, 1, 0, 3919, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267539, 24489, 0, 0, 37109, 1, 0, 0, 0, 0, 0, 0, 0, 'Soothsayer Shi''kala Scouted', 19034), +(267540, 24489, 0, 1, 37110, 1, 0, 0, 0, 0, 0, 0, 0, 'Soothsayer Rikkari Scouted', 19034), +(267541, 24489, 0, 2, 37111, 1, 0, 0, 0, 0, 0, 0, 0, 'Soothsayer Mirim''koa Scouted', 19034), +(267542, 25217, 0, 0, 40233, 1, 0, 0, 0, 0, 0, 0, 0, 'Drill Sample Taken', 19034), +(267543, 25966, 0, 0, 41221, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness the Continuing Story of the Battlemaiden', 19034), +(267545, 27404, 1, 0, 60876, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267546, 27404, 1, 1, 60871, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267547, 27404, 1, 2, 60874, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267548, 25657, 0, 0, 41057, 1, 0, 0, 0, 0, 0, 0, 0, 'Explosive Grub fed to Gnaws', 19034), +(267549, 14383, 0, 0, 36407, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267550, 14383, 0, 1, 36385, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267551, 14383, 0, 2, 36384, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267552, 26530, 1, 0, 58779, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267553, 26294, 0, 0, 42674, 1, 0, 0, 0, 0, 0, 0, 0, 'Faulty Demolisher Discovered', 19034), +(267554, 26294, 0, 1, 42675, 1, 0, 0, 0, 0, 0, 0, 0, 'Chief Engineer Disciplined', 19034), +(267555, 25957, 0, 0, 41220, 1, 0, 0, 0, 0, 0, 0, 0, 'Attune With the Broken Blade''s Owner', 19034), +(267556, 27694, 1, 0, 6175, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267557, 26311, 1, 0, 58141, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267558, 26614, 1, 0, 3897, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267560, 25619, 0, 0, 39602, 10, 0, 0, 0, 0, 0, 0, 0, 'Kvaldir defenders', 19034), +(267561, 25854, 1, 0, 56058, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267562, 27843, 0, 0, 46770, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267563, 24430, 0, 0, 36890, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267564, 24430, 0, 1, 36906, 1, 0, 0, 0, 0, 0, 0, 0, 'Command Center Bombed', 19034), +(267565, 27893, 0, 0, 46866, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Gargal''s Shield Wall', 19034), +(267566, 27893, 0, 1, 46867, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Gargal''s Mighty Shout', 19034), +(267567, 27697, 0, 0, 12236, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267568, 26184, 0, 0, 41470, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267569, 26184, 0, 1, 41471, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267570, 26184, 0, 2, 45119, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267571, 26184, 0, 3, 45125, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267572, 25858, 0, 0, 41049, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Fathom-Lord Zin''jatar', 19034), +(267573, 25858, 0, 1, 41456, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Lady Sira''kess', 19034), +(267574, 25858, 0, 2, 41455, 1, 0, 0, 0, 0, 0, 0, 0, 'Speak to Overseer Idra''kess', 19034), +(267575, 26968, 5, -1, 122, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Frost Nova', 19034), +(267576, 26968, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Frost Nova', 19034), +(267577, 25692, 1, 0, 55991, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267578, 26534, 0, 0, 43203, 1, 0, 0, 0, 0, 0, 0, 0, 'Gmurgl tested', 19034), +(267579, 26534, 0, 1, 43204, 1, 0, 0, 0, 0, 0, 0, 0, 'Orgus tested', 19034), +(267580, 26534, 0, 2, 43205, 1, 0, 0, 0, 0, 0, 0, 0, 'Captain Bartholomew Softbeard tested', 19034), +(267581, 26281, 1, 0, 58083, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267583, 26632, 0, 0, 43649, 1, 0, 0, 0, 0, 0, 0, 0, 'Earthen Catapult safely escorted', 19034), +(267584, 25650, 1, 0, 55182, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267585, 26890, 1, 0, 16784, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267586, 24780, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(267587, 24780, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267588, 25699, 1, 0, 10753, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267589, 28034, 0, 0, 47434, 1, 0, 0, 0, 0, 0, 0, 0, 'Build up a three-dwarf conga line', 19034), +(267590, 25066, 0, 0, 39039, 10, 0, 0, 0, 0, 0, 0, 0, 'Gnomeregan Stealth Fighters shot down', 19034), +(267591, 13963, 0, 0, 34529, 1, 0, 0, 0, 0, 0, 0, 0, 'Razormane Prisoner Interrogated', 19034), +(267592, 27599, 1, 0, 61923, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267594, 27848, 0, 0, 47626, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267595, 27008, 0, 0, 44839, 1, 0, 0, 0, 0, 0, 0, 0, 'Masters'' Gate investigated', 19034), +(267596, 26829, 0, 0, 42916, 15, 0, 0, 0, 0, 0, 0, 0, 'Twilight Precipice Cultists slain', 19034), +(267597, 25677, 2, 0, 203183, 6, 0, 0, 0, 0, 0, 0, 0, 'Ore Heap dissolved', 19034), +(267598, 26606, 1, 0, 4103, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267599, 27415, 2, 0, 20359, 5, 0, 0, 0, 0, 0, 0, 0, 'Egg of Onyxia destroyed', 19034), +(267600, 27409, 1, 0, 33087, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267601, 27409, 1, 1, 33088, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267602, 26111, 1, 0, 56822, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267603, 27689, 0, 0, 46341, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267604, 27689, 0, 1, 46342, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267605, 27689, 0, 2, 46343, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267606, 26812, 0, 0, 43257, 1, 1, 0, 0, 0, 0, 0, 0, 'Destroy High Priestess Jeklik''s body', 19034), +(267607, 26513, 1, 0, 58896, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267608, 27047, 1, 0, 60791, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267609, 26258, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267610, 25972, 0, 0, 40921, 1, 0, 0, 0, 0, 0, 0, 0, 'Swim up to the rescue balloon on the surface', 19034), +(267611, 25972, 0, 1, 41572, 1, 0, 0, 0, 0, 0, 0, 0, 'Fire a rescue flare towards the Horde ships', 19034), +(267612, 24478, 0, 0, 35076, 1, 0, 0, 0, 0, 0, 0, 0, 'Frost Trial Completed', 19034), +(267613, 28061, 0, 0, 47463, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267614, 25688, 0, 0, 41193, 1, 0, 0, 0, 0, 0, 0, 0, 'Loramus resurrected', 19034), +(267615, 27793, 0, 0, 46768, 1, 1, 0, 0, 0, 0, 0, 0, 'Thoroughly investigated The Warden', 19034), +(267616, 27793, 0, 1, 46769, 1, 1, 0, 0, 0, 0, 0, 0, 'Thoroughly investigated The Sentinel', 19034), +(267617, 14487, 1, 0, 49642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267618, 25709, 0, 0, 42235, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267619, 26225, 1, 0, 3900, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267620, 25867, 0, 0, 41438, 6, 0, 0, 0, 0, 0, 0, 0, 'Gnolls Freed', 19034), +(267621, 25467, 1, 0, 54344, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267622, 24994, 1, 0, 13702, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267623, 14310, 0, 0, 36096, 1, 0, 0, 0, 0, 0, 0, 0, 'Azsharite Core Delivered', 19034), +(267624, 14310, 1, 1, 49132, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267625, 25760, 0, 0, 41220, 1, 0, 0, 0, 0, 0, 0, 0, 'Attune With the Broken Blade''s Owner', 19034), +(267626, 26595, 1, 0, 3924, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267627, 26595, 1, 1, 59034, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267628, 26595, 1, 2, 59035, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267629, 25219, 1, 0, 52975, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267630, 14165, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267631, 28062, 0, 0, 47462, 1, 1, 0, 0, 0, 0, 0, 0, 'Archduke Calcinder banished', 19034), +(267632, 25675, 0, 0, 5977, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267633, 25675, 0, 1, 5978, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267634, 14485, 0, 0, 36843, 3, 0, 0, 0, 0, 0, 0, 0, 'Spitelash Runestones destroyed', 19034), +(267636, 24494, 1, 0, 49758, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267637, 25358, 1, 0, 52973, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267638, 25030, 1, 0, 3082, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267639, 26078, 0, 0, 42046, 6, 0, 0, 0, 0, 0, 0, 0, 'Fires extinguished', 19034), +(267640, 25865, 1, 0, 56088, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267642, 13885, 0, 0, 34323, 8, 0, 0, 0, 0, 0, 0, 0, 'Grizzled Thistle Bear Protected', 19034), +(267643, 13885, 0, 1, 34325, 8, 0, 0, 0, 0, 0, 0, 0, 'Moonstalker Protected', 19034), +(267644, 13885, 0, 2, 34324, 8, 0, 0, 0, 0, 0, 0, 0, 'Whitetail Deer Protected', 19034), +(267645, 25685, 1, 0, 55826, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267646, 25685, 1, 1, 55827, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267647, 26427, 1, 0, 58798, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267648, 26427, 1, 1, 58806, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267649, 13564, 10, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267650, 26578, 0, 0, 43388, 10, 0, 0, 0, 0, 0, 0, 0, 'Doomshrooms destroyed', 19034), +(267652, 26072, 0, 0, 42027, 5, 0, 0, 0, 0, 0, 0, 0, 'Faceless Defilers energies confined', 19034), +(267653, 26607, 1, 0, 59061, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267654, 27598, 0, 0, 45701, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267655, 26562, 0, 0, 43369, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267656, 26562, 1, 1, 59033, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267657, 25712, 0, 0, 42231, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267658, 26817, 1, 0, 60386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267659, 26303, 1, 0, 3616, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267660, 14192, 1, 0, 47819, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267661, 26489, 1, 0, 4029, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267662, 26830, 0, 0, 44132, 1, 0, 0, 0, 0, 0, 0, 0, 'Sauranok''s Guilt Revealed', 19034), +(267663, 26830, 0, 1, 44120, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267664, 26697, 0, 0, 43717, 85, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267665, 26697, 0, 1, 43790, 6, 0, 0, 0, 0, 0, 0, 0, 'Brashtide Attack Boat destroyed', 19034), +(267666, 26537, 0, 0, 43228, 12, 0, 0, 0, 0, 0, 0, 0, 'Fractured Front stone troggs slain', 19034), +(267667, 30588, 0, 0, 59714, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267668, 30658, 1, 0, 80529, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267669, 30452, 1, 0, 79323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267670, 30585, 0, 0, 59689, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267671, 30585, 1, 1, 80262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267672, 30584, 1, 0, 80260, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267673, 30449, 1, 0, 79325, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267674, 30450, 1, 0, 79324, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267675, 30451, 1, 0, 79326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267676, 30613, 1, 0, 80437, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267712, 30781, 0, 3, 61291, 1, 0, 0, 0, 0, 0, 0, 0, 'Northwestern Smoke Trail examined', 19034), +(267713, 30907, 0, 0, 61007, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Hackiss', 19034), +(267714, 30907, 0, 1, 61004, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Healiss', 19034), +(267715, 30907, 0, 2, 61006, 1, 0, 0, 908, 0, 0, 0, 0, 'Defeat Tankiss', 19034), +(267716, 30801, 0, 0, 61316, 1, 0, 0, 623, 0, 0, 0, 0, 'Read the Tablet of Thunder', 19034), +(267727, 30690, 0, 3, 61333, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267729, 30802, 1, 0, 81890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267735, 30923, 0, 0, 61363, 1, 0, 0, 553, 0, 0, 0, 0, 'Kri''thik Weapons Exploded', 19034), +(267736, 30923, 0, 1, 61364, 1, 0, 0, 553, 0, 0, 0, 0, 'Kri''thik Supplies Exploded', 19034), +(267738, 30799, 1, 1, 82395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267741, 30935, 0, 0, 61382, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Mishi outside of Lei Shen''s Tomb', 19034), +(267743, 30921, 0, 0, 61400, 1, 0, 0, 1032, 1033, 0, 0, 0, 'First Clue', 19034), +(267744, 30921, 0, 1, 61401, 1, 0, 0, 1032, 1033, 0, 0, 0, 'Second Clue', 19034), +(267745, 30921, 0, 2, 61402, 1, 0, 0, 1032, 1033, 0, 0, 0, 'Third Clue', 19034), +(267746, 30921, 0, 3, 61403, 1, 0, 0, 1032, 1033, 0, 0, 0, 'Fourth Clue', 19034), +(267780, 30888, 0, 0, 61373, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267781, 30889, 0, 0, 61426, 8, 0, 0, 520, 0, 0, 0, 0, 'Rearm Shado-Pan Spike Traps', 19034), +(267785, 30890, 0, 0, 61378, 1, 0, 0, 505, 0, 0, 0, 0, 'Deliver Orders to Scout Wei-chin', 19034), +(267786, 30890, 0, 1, 61395, 1, 0, 0, 505, 0, 0, 0, 0, 'Deliver Orders to Scout Long', 19034), +(267787, 30890, 0, 2, 61396, 1, 0, 0, 505, 0, 0, 0, 0, 'Deliver Orders to Scout Ying', 19034), +(267788, 30890, 0, 3, 61397, 1, 0, 0, 505, 0, 0, 0, 0, 'Deliver Orders to Scout Jai-gan', 19034), +(267807, 30942, 0, 0, 62654, 4, 0, 0, 713, 0, 0, 0, 0, 'Amani Skirmishers slain', 19034), +(267808, 30943, 1, 0, 82298, 50, 0, 0, 0, 0, 0, 0, 0, 'Volatile Blooms', 19034), +(267809, 30944, 0, 0, 61381, 5, 0, 0, 520, 608, 0, 0, 0, 'Exhausted Defender Relieved', 19034), +(267810, 30945, 1, 0, 82299, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267822, 30946, 0, 0, 62629, 1, 1, 0, 505, 0, 0, 0, 0, 'Zandalari Prisoner Questioned', 19034), +(267824, 30887, 0, 0, 61374, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267826, 30931, 1, 0, 82332, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267829, 30891, 1, 0, 82342, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267830, 30927, 0, 0, 62298, 10, 0, 0, 1030, 1031, 0, 0, 0, 'Give peace to Fear-Stricken Sentinel', 19034), +(267831, 29562, 0, 0, 55195, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267832, 30480, 0, 2, 60973, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Waterspeaker Gorai to Begin the Ritual', 19034), +(267833, 30956, 0, 0, 61502, 25, 0, 0, 0, 0, 0, 0, 0, 'Sra''thik attacker slain', 19034), +(267834, 30957, 0, 0, 61509, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267835, 30959, 0, 0, 61510, 3, 0, 0, 0, 0, 0, 0, 0, 'Sra''thik War Wagon exploded', 19034), +(267836, 30958, 2, 0, 211752, 10, 0, 0, 569, 0, 0, 0, 0, '', 19034), +(267837, 30952, 0, 0, 61502, 12, 0, 0, 0, 0, 0, 0, 0, 'Sra''thik attacker slain', 19034), +(267838, 30953, 0, 0, 61569, 8, 0, 0, 977, 0, 0, 0, 0, 'Niuzao Sentinel healed', 19034), +(267839, 30954, 1, 0, 82353, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267840, 30929, 0, 0, 61606, 1, 0, 0, 1035, 0, 0, 0, 0, 'Gently pet Ruthers', 19034), +(267841, 30929, 0, 1, 61607, 1, 0, 0, 1035, 0, 0, 0, 0, 'Offer Ruthers an apple', 19034), +(267842, 30929, 0, 2, 61608, 1, 0, 0, 1035, 0, 0, 0, 0, 'Lightly nudge Ruthers', 19034), +(267843, 30929, 0, 3, 61609, 1, 0, 0, 1035, 0, 0, 0, 0, 'Attempt to mount Ruthers', 19034), +(267858, 30922, 1, 0, 82387, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267859, 30963, 1, 0, 82388, 120, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267860, 30964, 1, 0, 82389, 11, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267863, 30799, 1, 2, 82394, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267864, 30480, 0, 1, 61654, 1, 0, 0, 0, 0, 0, 0, 0, 'Dead Inkgill Laid to Rest', 19034), +(267867, 30930, 0, 1, 61664, 1, 0, 0, 1170, 0, 0, 0, 0, 'Suitable Yak Found', 19034), +(267869, 29900, 1, 0, 79875, 1, 0, 0, 578, 0, 0, 0, 0, '', 19034), +(267870, 30925, 0, 0, 61676, 1, 0, 0, 991, 992, 993, 0, 0, 'Find Statuette Head', 19034), +(267871, 30925, 0, 1, 61674, 1, 0, 0, 991, 992, 993, 0, 0, 'Find Statuette Body', 19034), +(267872, 30925, 0, 2, 61673, 1, 0, 0, 991, 992, 993, 0, 0, 'Find Statuette Legs', 19034), +(267873, 30925, 0, 3, 61675, 1, 0, 0, 991, 992, 993, 0, 0, 'Find Statuette Tail', 19034), +(267874, 30932, 2, 0, 211837, 1, 0, 0, 569, 0, 0, 0, 0, 'Find Father''s Bedroll', 19034), +(267875, 30932, 2, 1, 211836, 1, 0, 0, 569, 0, 0, 0, 0, 'Find Father''s Shield', 19034), +(267876, 30932, 3, 2, 61685, 1, 0, 0, 569, 0, 0, 0, 0, 'Find Ha-Cha', 19034), +(267877, 30932, 3, 3, 61683, 1, 0, 0, 505, 0, 0, 0, 0, 'Find Sentinel Yalo', 19034), +(267878, 30893, 0, 0, 61181, 12, 0, 0, 0, 0, 0, 0, 0, 'Krik''thik attackers slain', 19034), +(267879, 30892, 0, 0, 61692, 8, 0, 0, 520, 0, 0, 0, 0, 'Heal Injured Gao-ran Blackguards', 19034), +(267880, 30967, 0, 0, 61481, 6, 0, 0, 659, 0, 0, 0, 0, 'Inkgill Dissenters Escaped', 19034), +(267881, 30969, 1, 0, 82605, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267883, 30894, 1, 0, 82722, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267884, 29548, 0, 0, 66292, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Admiral Rogers on The Skyfire gunship', 19034), +(267885, 30895, 1, 0, 82723, 16, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267886, 30896, 0, 0, 61302, 10, 0, 0, 0, 0, 0, 0, 0, 'Agitated Nettleskins slain', 19034), +(267887, 30982, 0, 0, 61408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267888, 30982, 0, 1, 61463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267889, 30983, 0, 0, 61412, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267890, 30984, 0, 0, 61680, 5, 0, 0, 519, 0, 0, 0, 0, 'Kor''kron Scouts rescued', 19034), +(267891, 30983, 0, 1, 61528, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267895, 30986, 0, 0, 61814, 1, 1, 0, 658, 0, 0, 0, 0, '', 19034), +(267897, 30988, 0, 0, 61798, 1, 0, 0, 0, 0, 0, 0, 0, 'Walk with King Varian Wrynn', 19034), +(267899, 30995, 0, 0, 61788, 5, 0, 0, 0, 0, 0, 0, 0, 'SI:7 Rangers rescued', 19034), +(267900, 30996, 0, 0, 61412, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267901, 30996, 0, 1, 61528, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267902, 30997, 0, 0, 61408, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267903, 30997, 0, 1, 61463, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267904, 30998, 1, 0, 82605, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267905, 30989, 0, 0, 61824, 1, 0, 0, 0, 0, 0, 0, 0, 'Spar with Varian', 19034), +(267906, 30800, 2, 1, 211968, 1, 0, 0, 538, 0, 0, 0, 0, 'Repair the Tablet of Thunder', 19034), +(267909, 30715, 0, 0, 61871, 1, 0, 0, 541, 0, 0, 0, 0, 'Shado-Master Zhiyao Released From his Oath', 19034), +(267910, 30715, 0, 1, 61870, 1, 0, 0, 540, 0, 0, 0, 0, 'Liu of the Thousand Blows Released From his Oath', 19034), +(267911, 30715, 0, 2, 61872, 1, 0, 0, 539, 0, 0, 0, 0, 'Shiya Boldblade Released From her Oath', 19034), +(267912, 30897, 1, 0, 82783, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267913, 30750, 0, 0, 61886, 12, 0, 0, 0, 0, 0, 0, 0, 'Osul Veteran Archers or Fire-Warrior slain', 19034), +(267914, 30751, 1, 0, 82799, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267915, 31013, 0, 0, 62089, 1, 0, 0, 0, 0, 0, 0, 0, 'Walk with Garrosh Hellscream', 19034), +(267916, 31014, 0, 0, 62209, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete Hellscream''s trial', 19034), +(267917, 30991, 0, 0, 60455, 50, 0, 0, 642, 0, 0, 0, 0, '', 19034), +(267918, 30991, 0, 1, 60483, 4, 0, 0, 642, 0, 0, 0, 0, '', 19034), +(267919, 31002, 0, 0, 62077, 20, 0, 0, 0, 0, 0, 0, 0, 'Dreadspinner Eggs destroyed', 19034), +(267920, 31018, 0, 0, 62073, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267921, 31018, 0, 1, 62074, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267922, 31018, 0, 2, 62075, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267923, 31018, 0, 3, 62076, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267925, 31018, 0, 4, 63606, 1, 0, 0, 550, 0, 0, 0, 0, 'Xaril the Poisoned Mind awakened', 19034), +(267926, 31001, 3, 0, 62166, 1, 0, 0, 505, 906, 0, 0, 0, 'Find Marksman Lann', 19034), +(267929, 31020, 0, 0, 62023, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267930, 31021, 0, 0, 63204, 9, 0, 0, 0, 0, 0, 0, 0, 'Living Amber fed to Korven the Prime', 19034), +(267931, 31022, 0, 0, 63286, 1, 0, 0, 582, 0, 0, 0, 0, 'Sonar Tower examined', 19034), +(267934, 31023, 1, 0, 82867, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267936, 31024, 1, 0, 82869, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267937, 31026, 0, 0, 62008, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267938, 30973, 0, 0, 61355, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267939, 30992, 0, 0, 62165, 1, 1, 0, 0, 0, 0, 0, 0, 'Battle for The Ox Gate completed', 19034), +(267964, 30752, 0, 0, 62220, 1, 0, 0, 505, 0, 0, 0, 0, 'Gain access to the Monastery', 19034), +(267972, 30955, 0, 0, 62264, 6, 0, 0, 535, 536, 537, 0, 0, 'Gather Food for Niuzao', 19034), +(267973, 30977, 0, 0, 62128, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267976, 31032, 0, 0, 62283, 10, 0, 0, 554, 0, 0, 0, 0, 'Burn Kor''thik Fleetwing corpses', 19034), +(267977, 30971, 1, 0, 83024, 120, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267978, 30978, 0, 0, 62300, 50, 0, 0, 661, 0, 0, 0, 0, 'Kor''thik Swarmers shot down', 19034), +(267979, 30978, 0, 1, 62269, 1, 1, 0, 661, 0, 0, 0, 0, 'Voress''thalik shot down', 19034), +(267980, 31003, 0, 0, 62301, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(267981, 25143, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Primal Strike', 19034), +(267982, 24527, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Primal Strike', 19034), +(267983, 30898, 0, 0, 61960, 50, 0, 0, 778, 0, 0, 0, 0, '', 19034), +(267984, 26969, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Primal Strike', 19034), +(267985, 24760, 0, 0, 44175, 3, 0, 0, 0, 0, 0, 0, 0, 'Practice Primal Strike', 19034), +(267986, 31038, 0, 0, 62782, 1, 0, 0, 547, 0, 0, 0, 0, 'Challenge Snow Blossom', 19034), +(267987, 31004, 0, 0, 62357, 1, 0, 0, 653, 0, 0, 0, 0, 'Klaxxi Tuning Fork used on Amber', 19034), +(267989, 31039, 0, 0, 62293, 12, 0, 0, 532, 533, 534, 0, 0, 'Shan''ze Serpentbinders or Beastmasters slain', 19034), +(267990, 31040, 0, 0, 62268, 30, 0, 0, 532, 533, 534, 0, 0, 'Darkwoods Pixies or Darkwoods Charmers slain', 19034), +(267991, 31041, 1, 0, 83129, 8, 0, 0, 532, 533, 534, 0, 0, '', 19034), +(267992, 30900, 0, 0, 62324, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(267993, 31005, 1, 0, 83075, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(267994, 30970, 0, 0, 61299, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268004, 31058, 0, 2, 62465, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268009, 30926, 0, 2, 62562, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Niuzao Catacombs', 19034), +(268010, 30926, 0, 0, 62534, 1, 0, 0, 0, 0, 0, 0, 0, 'Investigate the Niuzao Catacombs', 19034), +(268011, 30928, 0, 0, 62306, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268013, 31006, 0, 0, 62538, 1, 0, 0, 971, 0, 0, 0, 0, 'Travel to Klaxxi''vess', 19034), +(268015, 31060, 0, 0, 61156, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268016, 31042, 1, 0, 83138, 4, 0, 0, 532, 533, 534, 0, 0, '', 19034), +(268017, 31044, 1, 0, 83153, 20, 0, 0, 532, 533, 534, 0, 0, '', 19034), +(268018, 31045, 0, 0, 62440, 3, 0, 0, 532, 533, 534, 0, 0, '', 19034), +(268019, 31049, 0, 0, 62522, 1, 1, 0, 532, 533, 534, 0, 0, '', 19034), +(268020, 31062, 0, 0, 62559, 1, 1, 0, 532, 533, 534, 0, 0, '', 19034), +(268021, 31043, 1, 0, 83130, 8, 0, 0, 532, 533, 534, 0, 0, '', 19034), +(268022, 30926, 0, 1, 62307, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268023, 31046, 0, 0, 62567, 20, 0, 0, 532, 533, 534, 555, 0, 'Cloudrunner Hatchlings freed', 19034), +(268024, 31047, 0, 0, 62267, 6, 0, 0, 532, 533, 534, 556, 0, 'Wild Cloudriders freed', 19034), +(268025, 31048, 0, 0, 62285, 24, 0, 0, 532, 533, 534, 557, 0, '', 19034), +(268030, 31065, 2, 0, 212538, 1, 0, 0, 0, 0, 0, 0, 0, 'Look through Taoshi''s Spyglass', 19034), +(268031, 31007, 0, 0, 64559, 6, 0, 0, 1253, 0, 0, 0, 0, '', 19034), +(268032, 31008, 1, 0, 83135, 6, 0, 0, 1210, 0, 0, 0, 0, '', 19034), +(268033, 30972, 1, 0, 83136, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268038, 31009, 0, 0, 62665, 1, 0, 0, 833, 941, 0, 0, 0, 'Sonic Relay Activated', 19034), +(268039, 31087, 0, 1, 65328, 1, 0, 0, 0, 0, 0, 0, 0, 'Amberglow Hollow located', 19034), +(268040, 30975, 0, 0, 62680, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268041, 30975, 0, 1, 62686, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268043, 30899, 1, 1, 83023, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268044, 31010, 0, 0, 62752, 1, 0, 0, 973, 0, 0, 0, 0, 'Paragon Wakened', 19034), +(268045, 30979, 0, 0, 62270, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(268046, 31104, 0, 0, 62828, 1, 0, 0, 657, 0, 0, 0, 0, 'Challenge Yalia Sagewhisper', 19034), +(268047, 31015, 2, 0, 212526, 1, 0, 0, 569, 0, 0, 0, 0, '', 19034), +(268048, 31105, 0, 0, 62293, 12, 0, 0, 532, 533, 534, 0, 0, 'Shan''ze Serpentbinders or Beastmasters slain', 19034), +(268049, 31106, 0, 0, 62293, 12, 0, 0, 532, 533, 534, 0, 0, 'Shan''ze Serpentbinders or Beastmasters slain', 19034), +(268050, 31071, 1, 0, 83782, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268051, 31071, 1, 1, 83781, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268052, 31071, 1, 2, 83783, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268053, 30981, 0, 0, 62579, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(268054, 31063, 0, 0, 62580, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(268055, 31064, 0, 0, 62581, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(268056, 31110, 1, 0, 84102, 1000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268060, 31069, 0, 0, 62817, 100, 0, 0, 1453, 1454, 1455, 0, 0, 'Shade Harvested', 19034), +(268065, 31070, 1, 0, 84107, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268070, 31038, 0, 1, 62781, 1, 0, 0, 546, 0, 0, 0, 0, 'Defeat Snow Blossom', 19034), +(268074, 31072, 1, 0, 84111, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268075, 31072, 1, 1, 84112, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268077, 31088, 0, 0, 63206, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268078, 31067, 0, 0, 62843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268079, 31073, 1, 0, 84118, 8, 0, 0, 644, 0, 0, 0, 0, '', 19034), +(268080, 31089, 0, 0, 62540, 1, 0, 0, 1176, 0, 0, 0, 0, 'Awaken Kaz''tik the Manipulator', 19034), +(268081, 31104, 0, 1, 62825, 1, 0, 0, 656, 0, 0, 0, 0, 'Defeat Yalia Sagewhisper', 19034), +(268082, 31107, 1, 1, 86598, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268083, 31108, 1, 0, 86616, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268084, 31074, 0, 0, 62955, 1, 0, 0, 647, 0, 0, 0, 0, 'Find the Mark of the Empress', 19034), +(268085, 31074, 0, 1, 62956, 1, 0, 0, 646, 0, 0, 0, 0, 'Find the Heartroot of Kypari Kor', 19034), +(268087, 31066, 0, 0, 62863, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268093, 31079, 0, 0, 65404, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268095, 31080, 1, 0, 84239, 88, 0, 0, 652, 0, 0, 0, 0, '', 19034), +(268098, 30312, 0, 0, 59183, 6, 0, 0, 520, 0, 0, 0, 0, 'Wounded Defender healed', 19034), +(268099, 31082, 0, 0, 62601, 3, 0, 0, 569, 0, 0, 0, 0, 'Bring Motherseed back to the Motherseed Pit', 19034), +(268100, 31112, 1, 0, 74623, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268102, 31068, 1, 0, 84586, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268103, 31076, 0, 0, 62957, 1, 0, 0, 651, 0, 0, 0, 0, 'Speak with Sapmaster Vu', 19034), +(268104, 31076, 0, 1, 62958, 1, 0, 0, 650, 0, 0, 0, 0, 'Speak with Lya of Ten Songs', 19034), +(268105, 31076, 0, 2, 62959, 1, 0, 0, 649, 0, 0, 0, 0, 'Speak with Big Dan Stormstout', 19034), +(268106, 31077, 0, 1, 65408, 1, 0, 0, 0, 0, 0, 0, 0, 'Meet up with Chen', 19034), +(268107, 31078, 0, 0, 62776, 1, 0, 0, 538, 0, 0, 0, 0, 'Find Han Stormstout', 19034), +(268110, 31113, 0, 0, 62552, 16, 0, 0, 579, 580, 581, 0, 0, 'Gai-Cho Yaungol, Earthtalkers, or Pitchthrowers Slain', 19034), +(268111, 31109, 0, 0, 69085, 40, 0, 0, 1242, 0, 0, 0, 0, 'Shek''zeer Mantid Slain', 19034), +(268112, 31081, 0, 1, 62765, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268113, 31081, 0, 2, 62766, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268115, 31114, 0, 0, 62677, 8, 0, 0, 579, 580, 581, 0, 0, '', 19034), +(268116, 31114, 0, 1, 62844, 1, 1, 0, 579, 580, 581, 0, 0, '', 19034), +(268119, 31116, 0, 0, 63040, 8, 0, 0, 579, 580, 581, 0, 0, 'Spirits Returned to Their Remains', 19034), +(268120, 31117, 0, 0, 62613, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268121, 31118, 1, 0, 84759, 1, 0, 0, 579, 580, 581, 0, 0, '', 19034), +(268122, 30487, 0, 1, 60022, 1, 0, 0, 564, 0, 0, 0, 0, 'Survive the Mountain Pass', 19034), +(268123, 29822, 0, 2, 63059, 1, 0, 0, 0, 0, 0, 0, 0, 'Shrine of the Moon Visited', 19034), +(268124, 29822, 0, 0, 55622, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268128, 31119, 0, 0, 62568, 100, 0, 0, 579, 580, 581, 0, 0, 'Gai-Cho Battlefield Combatants slain', 19034), +(268130, 31120, 0, 0, 62554, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268131, 31085, 0, 0, 63107, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Ruining Fork on Iyyokuk the Lucid', 19034), +(268132, 31085, 0, 1, 63108, 1, 0, 0, 0, 0, 0, 0, 0, 'Protect Iyyokuk the Lucid until he escapes', 19034), +(268134, 31121, 0, 0, 63114, 1, 0, 0, 662, 0, 0, 0, 0, 'Listen to Lorewalker Cho', 19034), +(268135, 31084, 0, 0, 63119, 1, 0, 0, 976, 0, 0, 0, 0, 'Allow Chief Rikkitun to enchant the forked blade', 19034), +(268137, 31127, 0, 0, 63126, 1, 0, 0, 655, 0, 0, 0, 0, 'Challenge Chao the Voice', 19034), +(268138, 31086, 1, 0, 84779, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268139, 31129, 0, 0, 62957, 1, 0, 0, 651, 0, 0, 0, 0, 'Speak with Sapmaster Vu', 19034), +(268140, 31129, 0, 1, 62958, 1, 0, 0, 650, 0, 0, 0, 0, 'Speak with Lya of Ten Songs', 19034), +(268141, 31129, 0, 2, 62959, 1, 0, 0, 649, 0, 0, 0, 0, 'Speak with Big Dan Stormstout', 19034), +(268143, 31127, 0, 1, 63127, 1, 0, 0, 654, 0, 0, 0, 0, 'Defeat Chao the Voice', 19034), +(268144, 31128, 0, 0, 63133, 1, 0, 0, 667, 0, 0, 0, 0, 'Challenge Lao-Chin the Iron Belly', 19034), +(268145, 31128, 0, 1, 63132, 1, 0, 0, 666, 0, 0, 0, 0, 'Defeat Lao-Chin the Iron Belly', 19034), +(268149, 31130, 0, 0, 63140, 1, 0, 0, 1224, 1262, 0, 0, 0, 'Trim the Tree', 19034), +(268150, 31130, 0, 1, 63141, 1, 0, 0, 1225, 1262, 0, 0, 0, 'Paint the Wall', 19034), +(268151, 31130, 0, 2, 63142, 1, 0, 0, 1226, 1262, 0, 0, 0, 'Feed the Birds', 19034), +(268152, 30683, 0, 0, 60769, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268153, 31019, 0, 0, 61970, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268154, 31019, 0, 1, 63179, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268155, 31133, 0, 0, 62756, 17, 0, 0, 0, 0, 0, 0, 0, 'Kor''thik Mantid slain', 19034), +(268158, 31090, 1, 0, 85159, 7, 0, 0, 970, 0, 0, 0, 0, '', 19034), +(268159, 31134, 0, 0, 63235, 1, 0, 0, 665, 0, 0, 0, 0, 'First Stone Monolith Translated', 19034); -- 268159 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(268160, 31134, 0, 1, 63236, 1, 0, 0, 664, 0, 0, 0, 0, 'Second Stone Monolith Translated', 19034), +(268161, 31134, 0, 2, 63237, 1, 0, 0, 663, 0, 0, 0, 0, 'Third Stone Monolith Translated', 19034), +(268162, 31138, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268163, 31138, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268165, 31139, 0, 0, 49871, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268166, 31140, 0, 0, 49874, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268167, 31141, 1, 0, 85160, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268169, 31142, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268170, 31142, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268171, 31144, 0, 0, 50039, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268172, 31146, 1, 0, 85164, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268173, 31147, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268174, 31147, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268176, 31150, 1, 0, 85174, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268177, 31151, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268178, 31151, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268179, 31022, 0, 1, 63287, 1, 0, 0, 0, 0, 0, 0, 0, 'Korven the Prime defended', 19034), +(268180, 31156, 1, 0, 85196, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268181, 31157, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268182, 31157, 0, 0, 44175, 2, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268183, 31158, 0, 0, 38038, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268184, 31152, 0, 0, 63305, 1, 0, 0, 0, 0, 0, 0, 0, 'Lorewalker Cho escorted to Circle of Stone', 19034), +(268185, 31160, 1, 0, 50222, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268186, 31161, 0, 0, 39062, 1, 0, 0, 3071, 0, 0, 0, 0, 'Speak to a Darkspear Jailor', 19034), +(268187, 31161, 0, 1, 38142, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268188, 31162, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268189, 31162, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268195, 31165, 1, 0, 85203, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268196, 31166, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268197, 31166, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268199, 31168, 1, 0, 85205, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268200, 30200, 0, 0, 58475, 8, 0, 0, 0, 0, 0, 0, 0, 'Ashweb Spiders slain', 19034), +(268201, 31169, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268202, 31169, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268203, 31171, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268204, 31171, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268205, 31173, 5, -1, 100787, 1, 0, 0, 0, 0, 0, 0, 0, 'Reach Level 3 to Learn Tiger Palm', 19034), +(268206, 31173, 0, 0, 44175, 1, 0, 0, 0, 0, 0, 0, 0, 'Practice Tiger Palm', 19034), +(268207, 31167, 0, 0, 63344, 1, 0, 0, 607, 0, 0, 0, 0, 'Light the Incense', 19034), +(268208, 31174, 0, 0, 61970, 12, 0, 0, 0, 0, 0, 0, 0, 'Enslaved Amberdiggers or Vos''thik Slavelashers', 19034), +(268209, 31174, 0, 1, 62232, 1, 0, 0, 551, 0, 0, 0, 0, 'Korven the Prime released', 19034), +(268210, 31175, 0, 0, 63359, 1, 0, 0, 552, 0, 0, 0, 0, 'Skeer the Bloodseeker awakened', 19034), +(268211, 31176, 1, 0, 85211, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268212, 31177, 1, 0, 85212, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268213, 31179, 0, 0, 63465, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268214, 30724, 0, 0, 61512, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Kite-Master Len to Take a Kite to the Wall', 19034), +(268217, 31178, 1, 0, 85229, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268219, 30968, 0, 0, 62541, 1, 0, 0, 658, 0, 0, 0, 0, 'Defeat the Sha of Hatred', 19034), +(268221, 30457, 0, 0, 59083, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268223, 30935, 0, 1, 61380, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Shin Whispercloud to access Zouchin Province', 19034), +(268224, 31179, 0, 1, 63466, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268225, 31011, 0, 0, 62299, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268226, 30204, 0, 0, 58568, 50, 0, 0, 562, 0, 0, 0, 0, '', 19034), +(268227, 30513, 0, 0, 63751, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Farmhand Ko', 19034), +(268228, 30480, 0, 0, 61530, 1, 0, 0, 0, 0, 0, 0, 0, 'Ritual Complete', 19034), +(268229, 30206, 1, 0, 85278, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268232, 31011, 0, 1, 63516, 5, 0, 0, 675, 0, 0, 0, 0, '', 19034), +(268233, 31011, 0, 2, 62362, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268234, 29879, 1, 1, 75202, 5, 0, 0, 1264, 0, 0, 0, 0, '', 19034), +(268235, 30512, 0, 0, 63754, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Farmhand Bo', 19034), +(268237, 31194, 0, 0, 63536, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268238, 30149, 1, 0, 74641, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268240, 30994, 0, 0, 61454, 1, 0, 0, 505, 0, 0, 0, 0, 'Talk with Suna Silentstrike to Take a Kite to Lao-Chin', 19034), +(268241, 31181, 0, 0, 64086, 10, 1, 0, 742, 0, 0, 0, 0, 'Crab Pots Baited', 19034), +(268242, 31182, 0, 0, 63376, 8, 0, 0, 0, 0, 0, 0, 0, 'Coldwhisker Otter fed', 19034), +(268243, 30993, 0, 0, 61819, 1, 0, 0, 505, 0, 0, 0, 0, 'Tell Ban You are Ready to Leave', 19034), +(268244, 30993, 0, 1, 63603, 1, 0, 0, 660, 0, 0, 0, 0, 'Ride Ban''s Balloon to the Shado-Pan Monastery', 19034), +(268245, 31207, 0, 0, 64894, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete "The Arena of Annihilation"', 19034), +(268246, 31208, 1, 0, 85571, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268251, 31209, 1, 0, 85572, 150, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268252, 31210, 1, 0, 85573, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268253, 31211, 3, 2, 62151, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Xaril the Poisoned Mind', 19034), +(268258, 31216, 3, 2, 62151, 1, 0, 0, 1228, 0, 0, 0, 0, 'Speak to Xaril the Poisoned Mind', 19034), +(268270, 31220, 0, 0, 64462, 1, 0, 0, 822, 0, 0, 0, 0, 'Challenge Hawkmaster Nurong', 19034), +(268271, 31220, 0, 1, 64463, 1, 0, 0, 823, 0, 0, 0, 0, 'Defeat Hawkmaster Nurong', 19034), +(268272, 31221, 0, 0, 64495, 1, 0, 0, 828, 0, 0, 0, 0, 'Challenge Tenwu of the Red Smoke', 19034), +(268273, 31221, 0, 1, 64496, 1, 0, 0, 829, 0, 0, 0, 0, 'Defeat Tenwu of the Red Smoke', 19034), +(268284, 31196, 0, 0, 63677, 15, 0, 0, 899, 900, 901, 1130, 0, 'Lesser Sra''thik mantid slain', 19034), +(268285, 31197, 0, 0, 63684, 4, 0, 0, 899, 900, 901, 1130, 0, 'Greater Sra''thik mantid slain', 19034), +(268286, 31203, 0, 0, 63693, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268287, 31204, 0, 0, 63694, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268288, 31198, 0, 0, 63698, 1, 0, 0, 720, 899, 900, 901, 1130, 'Southern idol', 19034), +(268289, 31198, 0, 1, 63699, 1, 0, 0, 719, 899, 900, 901, 1130, 'Western idol', 19034), +(268290, 31198, 0, 2, 63700, 1, 0, 0, 718, 899, 900, 901, 1130, 'Central idol', 19034), +(268291, 31198, 0, 3, 63701, 1, 0, 0, 717, 899, 900, 901, 1130, 'Eastern idol', 19034), +(268292, 31199, 0, 0, 63702, 1, 0, 0, 724, 899, 900, 901, 1130, 'Large Southern Siege Weapon destroyed', 19034), +(268293, 31199, 0, 1, 63703, 1, 0, 0, 723, 899, 900, 901, 1130, 'Small Southern Siege Weapon destroyed', 19034), +(268294, 31199, 0, 2, 63704, 1, 0, 0, 722, 899, 900, 901, 1130, 'Large Northern Siege Weapon destroyed', 19034), +(268295, 31199, 0, 3, 63705, 1, 0, 0, 721, 899, 900, 901, 1130, 'Small Northern Siege Weapon destroyed', 19034), +(268296, 31200, 0, 0, 63706, 1, 0, 0, 553, 899, 900, 901, 1130, 'Amber Vault bombed', 19034), +(268297, 31200, 0, 2, 63708, 1, 0, 0, 553, 899, 900, 901, 1130, 'Nutriment Cell bombed', 19034), +(268298, 31200, 0, 5, 63711, 1, 0, 0, 553, 899, 900, 901, 1130, 'Egg Chamber bombed', 19034), +(268299, 31200, 0, 7, 63713, 1, 0, 0, 553, 899, 900, 901, 1130, 'Torture Cell bombed', 19034), +(268300, 31200, 0, 8, 63714, 1, 0, 0, 553, 899, 900, 901, 1130, 'Slaughtering Pit bombed', 19034), +(268309, 31228, 0, 2, 65855, 1, 0, 0, 1166, 0, 0, 0, 0, 'Speak with Mishi in Zouchin Village', 19034), +(268342, 30942, 0, 1, 63733, 4, 0, 0, 715, 0, 0, 0, 0, 'Gurubashi Hexxer slain', 19034), +(268343, 30942, 0, 2, 63735, 3, 0, 0, 714, 0, 0, 0, 0, 'Drakkari Frostweavers slain', 19034), +(268349, 31230, 3, 0, 59160, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Master Windfur', 19034), +(268350, 31230, 3, 1, 55809, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Peiji Goldendraft', 19034), +(268351, 31230, 3, 2, 59173, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Kai Wanderbrew', 19034), +(268358, 31231, 0, 1, 61981, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268361, 31232, 1, 0, 85634, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268362, 31235, 0, 0, 62077, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268364, 31233, 1, 0, 85664, 6, 0, 0, 1113, 0, 0, 0, 0, '', 19034), +(268378, 31234, 1, 0, 85635, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268393, 31238, 1, 0, 85665, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268398, 31251, 1, 0, 80245, 160, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268406, 31254, 1, 1, 85688, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268409, 31255, 1, 1, 85694, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268411, 31256, 0, 0, 59611, 3, 0, 0, 567, 0, 0, 0, 0, 'Yaks rounded up', 19034), +(268416, 31237, 0, 0, 63783, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268417, 31260, 1, 0, 85774, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268418, 30191, 1, 0, 85778, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268420, 31241, 1, 0, 85784, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268421, 31211, 0, 0, 63613, 200, 0, 0, 0, 0, 0, 0, 0, 'Mantid slain', 19034), +(268422, 31216, 0, 0, 63613, 200, 0, 0, 0, 0, 0, 0, 0, 'Mantid slain', 19034), +(268423, 31262, 1, 0, 85854, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268429, 31267, 0, 0, 61970, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268431, 31268, 1, 0, 85885, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268433, 31269, 0, 0, 63179, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268435, 31270, 0, 0, 62162, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268437, 31271, 0, 0, 63257, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268439, 31272, 0, 0, 63869, 6, 0, 0, 0, 0, 0, 0, 0, 'Infected wildlife slain', 19034), +(268446, 31265, 0, 0, 63349, 1, 0, 0, 0, 0, 0, 0, 0, 'Drink the Potion of Mazu''s Breath', 19034), +(268447, 31281, 0, 0, 64216, 5, 0, 0, 0, 0, 0, 0, 0, 'Make Sliced Peaches', 19034), +(268448, 31185, 0, 0, 63879, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Dog to the Silt Vents', 19034), +(268449, 31185, 0, 1, 63880, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Dog to the Wreck of the Mist-Hopper', 19034), +(268450, 31185, 0, 2, 63881, 1, 0, 0, 0, 0, 0, 0, 0, 'Bring Dog to the Whale Corpse', 19034), +(268451, 31184, 1, 0, 85886, 1, 0, 0, 1144, 0, 0, 0, 0, '', 19034), +(268452, 31266, 0, 0, 63888, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268453, 31277, 0, 0, 63911, 1, 0, 0, 734, 0, 0, 0, 0, 'Join the Battle at Niuzao Temple', 19034), +(268454, 31277, 0, 1, 63920, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat the Mogu Invasion', 19034), +(268455, 31091, 0, 1, 64013, 1, 0, 0, 1260, 0, 0, 0, 0, 'Escort Kaz''tik the Manipulator to the Undisturbed Dirt', 19034), +(268456, 31239, 0, 0, 56289, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268458, 31186, 0, 0, 63995, 10, 0, 0, 1066, 0, 0, 0, 0, 'Dog Fed', 19034), +(268459, 31187, 0, 0, 64006, 8, 0, 0, 0, 0, 0, 0, 0, 'Full Crab Pots Sent to Surface', 19034), +(268460, 31188, 1, 0, 85999, 200, 0, 0, 1252, 0, 0, 0, 0, '', 19034), +(268461, 31091, 0, 0, 62542, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Kaz''tik''s greatest weapon', 19034), +(268462, 31285, 0, 0, 63517, 1, 0, 0, 538, 0, 0, 0, 0, 'Survive a ride on the Spring Drifter', 19034), +(268471, 31286, 1, 0, 85981, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268472, 31287, 0, 0, 63494, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268476, 31288, 4, -1, 677, 20, 0, 0, 0, 0, 0, 0, 0, 'Mogu Archaeology Fragments obtained', 19034), +(268478, 31291, 0, 0, 64198, 1, 0, 0, 0, 0, 0, 0, 0, 'Artifact of Pandaria Solved', 19034), +(268484, 31281, 1, 1, 86057, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268486, 31302, 0, 0, 64234, 5, 0, 0, 0, 0, 0, 0, 0, 'Make Rice Pudding', 19034), +(268487, 31302, 1, 1, 86069, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268489, 30070, 0, 0, 66276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268490, 31303, 0, 0, 64269, 12, 0, 0, 777, 0, 0, 0, 0, 'Sha Fissures Sealed', 19034), +(268493, 31306, 2, 0, 211597, 1, 1, 0, 538, 0, 0, 0, 0, '', 19034), +(268494, 31306, 2, 1, 211601, 1, 1, 0, 538, 0, 0, 0, 0, '', 19034), +(268495, 31306, 2, 2, 211602, 1, 1, 0, 538, 0, 0, 0, 0, '', 19034), +(268496, 31189, 3, 1, 64259, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Master Angler Ju Lien', 19034), +(268497, 31309, 0, 0, 64320, 1, 0, 0, 792, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268498, 31189, 0, 0, 64270, 1, 0, 0, 0, 0, 0, 0, 0, 'Assist Master Angler Ju Lien', 19034), +(268503, 30243, 0, 0, 63972, 80, 0, 0, 808, 0, 0, 0, 0, '', 19034), +(268505, 31279, 1, 0, 86392, 1, 0, 0, 0, 0, 0, 0, 0, 'Note the Sungshin Ironpaw', 19034), +(268512, 31311, 1, 0, 74833, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268514, 31313, 0, 2, 64312, 1, 0, 0, 795, 0, 0, 0, 0, 'Speak to Grainsorter Pei', 19034), +(268515, 31313, 0, 1, 64315, 1, 0, 0, 794, 0, 0, 0, 0, 'Speak to Stonecarver Mac', 19034), +(268516, 31313, 0, 3, 64313, 1, 0, 0, 796, 0, 0, 0, 0, 'Speak to Mama Min', 19034), +(268517, 31313, 0, 0, 64327, 1, 0, 0, 793, 0, 0, 0, 0, 'Speak to Old Man Whitewhiskers', 19034), +(268518, 31314, 0, 0, 64328, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the cave entrance', 19034), +(268521, 31316, 11, 0, 64330, 1, 1, 0, 982, 0, 0, 0, 0, 'Defeat Julia Stevens', 19034), +(268525, 31190, 0, 0, 64222, 20, 0, 0, 1251, 1256, 0, 0, 0, 'Bow Hits', 19034), +(268526, 31190, 0, 1, 64228, 20, 0, 0, 798, 1251, 0, 0, 0, 'Port Side Hits', 19034), +(268527, 31190, 0, 2, 64229, 20, 0, 0, 798, 1251, 0, 0, 0, 'Starboard Side Hits', 19034), +(268528, 31190, 0, 3, 64230, 20, 0, 0, 798, 1251, 0, 0, 0, 'Stern Hits', 19034), +(268529, 30266, 0, 0, 63973, 30, 0, 0, 811, 0, 0, 0, 0, '', 19034), +(268532, 31314, 0, 1, 64329, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Old Man Thistle''s Treasure', 19034), +(268533, 31319, 0, 0, 64491, 1, 0, 0, 825, 0, 0, 0, 0, 'Admiral Taylor Recovered', 19034), +(268534, 31320, 1, 0, 81407, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268535, 31321, 1, 0, 81415, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268536, 30504, 0, 1, 64362, 1, 0, 0, 800, 0, 0, 0, 0, 'Shademaster Kiryn Rescued', 19034), +(268537, 30504, 0, 2, 64363, 1, 0, 0, 801, 0, 0, 0, 0, 'Shokia Rescued', 19034), +(268538, 30504, 0, 3, 64364, 1, 0, 0, 802, 0, 0, 0, 0, 'Rivett Clutchpop Rescued', 19034), +(268539, 31322, 1, 0, 75037, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268540, 31323, 1, 0, 75038, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268541, 31324, 1, 0, 86431, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268542, 31327, 0, 0, 59479, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268544, 31332, 1, 0, 74660, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268545, 31333, 1, 0, 74854, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268546, 31334, 1, 0, 74866, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268547, 31335, 1, 0, 85583, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268548, 31336, 1, 0, 74851, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268550, 31338, 1, 0, 86446, 1, 0, 0, 810, 0, 0, 0, 0, '', 19034), +(268551, 31339, 1, 0, 86446, 1, 0, 0, 809, 0, 0, 0, 0, '', 19034), +(268552, 31340, 3, 0, 64391, 1, 0, 0, 1150, 0, 0, 0, 0, 'Sheepie found', 19034), +(268553, 31341, 0, 0, 64389, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268554, 31342, 0, 0, 56719, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268556, 31355, 0, 0, 56448, 1, 1, 0, 0, 0, 0, 0, 0, 'Wise Mari assisted', 19034), +(268557, 31355, 0, 1, 56732, 1, 1, 0, 0, 0, 0, 0, 0, 'Liu Flameheart assisted', 19034), +(268558, 31355, 0, 2, 56843, 1, 1, 0, 0, 0, 0, 0, 0, 'Lorewalker Stonestep assisted', 19034), +(268559, 31356, 0, 0, 56439, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268560, 31357, 1, 0, 86476, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268561, 31357, 1, 1, 86477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268562, 31357, 1, 2, 86478, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268563, 31357, 1, 3, 86479, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268564, 31092, 0, 1, 64485, 6, 0, 0, 831, 0, 0, 0, 0, 'Succulent Turtle Filets fed to Kovok', 19034), +(268565, 31359, 0, 0, 63998, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268566, 31359, 0, 1, 64008, 10, 0, 0, 0, 0, 0, 0, 0, 'Muckscale Tribe slain', 19034), +(268567, 31201, 0, 0, 64461, 1, 0, 0, 505, 899, 900, 901, 1130, 'Shado-Pan Trainee at Northern Feeding Pit freed', 19034), +(268568, 31201, 0, 1, 64460, 1, 0, 0, 505, 899, 900, 901, 1130, 'Shado-Pan Trainee at Central Feeding Pit freed', 19034), +(268569, 31201, 0, 2, 64459, 1, 0, 0, 505, 899, 900, 901, 1130, 'Shado-Pan Trainee at Southern Feeding Pit freed', 19034), +(268570, 31360, 0, 0, 61398, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268571, 31362, 0, 0, 59415, 1, 0, 0, 821, 1261, 0, 0, 0, 'Heirloom placed at Cho Family Shrine', 19034), +(268572, 31363, 0, 0, 64553, 1, 0, 0, 824, 0, 0, 0, 0, 'Light the Signal Flame', 19034), +(268573, 31364, 0, 0, 56877, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268574, 31319, 0, 1, 64493, 1, 0, 0, 826, 0, 0, 0, 0, 'Mishka Recovered', 19034), +(268575, 31319, 0, 2, 64494, 1, 0, 0, 827, 0, 0, 0, 0, 'Sully Recovered', 19034), +(268576, 31366, 0, 0, 62205, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268577, 31365, 0, 0, 64520, 12, 0, 0, 520, 0, 0, 0, 0, 'Shado-Pan Prisoner freed', 19034), +(268580, 31398, 1, 0, 86533, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268581, 31439, 0, 0, 64645, 1, 0, 0, 1139, 0, 0, 0, 0, 'Awaken Hisek the Swarmkeeper', 19034), +(268582, 31441, 0, 0, 64583, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat the traitor in the Duskroot Fen', 19034), +(268583, 31440, 2, 0, 214101, 1, 0, 0, 835, 0, 0, 0, 0, '', 19034), +(268584, 31440, 2, 1, 214105, 1, 0, 0, 836, 0, 0, 0, 0, '', 19034), +(268585, 31440, 2, 2, 214106, 1, 0, 0, 837, 0, 0, 0, 0, '', 19034), +(268586, 31440, 2, 3, 214107, 1, 0, 0, 838, 0, 0, 0, 0, '', 19034), +(268587, 31442, 2, 0, 214279, 1, 0, 0, 840, 0, 0, 0, 0, '', 19034), +(268588, 31442, 2, 1, 214278, 1, 0, 0, 841, 0, 0, 0, 0, '', 19034), +(268589, 31442, 2, 2, 214280, 1, 0, 0, 842, 0, 0, 0, 0, '', 19034), +(268590, 31442, 2, 3, 214277, 1, 0, 0, 843, 0, 0, 0, 0, '', 19034), +(268591, 31447, 0, 0, 59080, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268592, 31448, 0, 0, 59080, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268593, 31450, 0, 0, 64594, 1, 0, 0, 834, 0, 0, 0, 0, 'Choose your faction', 19034), +(268594, 31454, 0, 0, 64649, 1, 0, 0, 1067, 0, 0, 0, 0, 'Drink Shared with Wrathion', 19034), +(268595, 31458, 0, 0, 64622, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268597, 31458, 1, 1, 87269, 1, 0, 0, 927, 0, 0, 0, 0, 'Kypari Ik Beacon deactivated', 19034), +(268598, 31395, 0, 0, 64528, 1, 0, 0, 839, 0, 0, 0, 0, 'Speak to Xuen', 19034), +(268600, 31395, 0, 1, 64656, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the First Test', 19034), +(268601, 31395, 0, 2, 64684, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the Second Test', 19034), +(268602, 31395, 0, 3, 64742, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the Third Test', 19034), +(268603, 31394, 0, 0, 64528, 1, 0, 0, 839, 0, 0, 0, 0, 'Speak to Xuen', 19034), +(268604, 31394, 0, 1, 64656, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the First Test', 19034), +(268605, 31394, 0, 2, 64684, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the Second Test', 19034), +(268606, 31394, 0, 3, 64744, 1, 0, 0, 0, 0, 0, 0, 0, 'Pass the Third Test', 19034), +(268607, 31467, 5, -1, 104298, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268609, 31468, 6, -1, 1359, 9000, 0, 0, 0, 0, 0, 0, 0, 'Reach Honored with the Black Prince', 19034), +(268610, 31469, 5, -1, 104298, 0, 0, 0, 0, 0, 0, 0, 0, 'Learn the recipe for Charbroiled Tiger Steak', 19034), +(268611, 31469, 1, 0, 74642, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268612, 31470, 1, 0, 74841, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268614, 31471, 5, -1, 104301, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268615, 31472, 1, 0, 74856, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268617, 31474, 5, -1, 104304, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268618, 31475, 1, 0, 74857, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268620, 31476, 5, -1, 104307, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268621, 31477, 5, -1, 104310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268622, 31478, 1, 0, 74839, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268624, 31479, 1, 0, 74845, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268626, 31480, 5, -1, 124052, 0, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268627, 31482, 0, 0, 66586, 1, 0, 0, 0, 0, 0, 0, 0, 'Travelled to Mason''s Folly', 19034), +(268628, 31483, 0, 0, 64681, 1, 0, 0, 0, 0, 0, 0, 0, 'Await Your Naval Fleet', 19034), +(268629, 31473, 1, 0, 87208, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268630, 31473, 1, 1, 87209, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268631, 31481, 1, 0, 87210, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268632, 31485, 0, 0, 64216, 5, 0, 0, 0, 0, 0, 0, 0, 'Cook 5 Soft-Boiled Eggs', 19034), +(268633, 31485, 1, 1, 86057, 5, 0, 0, 0, 0, 0, 0, 0, 'Give 5 Soft-Boiled Eggs to the Guide to the Ways', 19034), +(268634, 31486, 1, 0, 86392, 1, 0, 0, 0, 0, 0, 0, 0, 'Note the Sungshin Ironpaw', 19034), +(268636, 31488, 1, 0, 87261, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268637, 31489, 1, 0, 87262, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268638, 31490, 0, 0, 64964, 50, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusaders slain', 19034), +(268639, 31465, 1, 0, 87263, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268641, 31494, 0, 0, 64849, 8, 0, 0, 1014, 0, 0, 0, 0, 'Kunchong Hatchling released', 19034), +(268642, 31493, 1, 0, 87267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268643, 31495, 0, 0, 64964, 50, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusaders slain', 19034), +(268644, 31496, 2, 0, 215762, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268645, 31497, 1, 0, 87268, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268646, 31502, 1, 1, 87401, 24, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268647, 31503, 0, 0, 64890, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268648, 31504, 2, 0, 214341, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268649, 31513, 1, 0, 87282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268650, 31514, 0, 0, 64835, 1, 0, 0, 0, 0, 0, 0, 0, 'Blades of the Anointed thrust into Whitemane''s corpse', 19034), +(268651, 31515, 1, 0, 87389, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268652, 31516, 0, 0, 64840, 1, 0, 0, 0, 0, 0, 0, 0, 'Blades of the Anointed thrust into Whitemane''s corpse', 19034), +(268653, 31517, 0, 0, 64757, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268654, 31518, 0, 0, 64848, 1, 0, 0, 844, 0, 0, 0, 0, 'Speak to Anduin', 19034), +(268655, 31512, 0, 0, 64848, 1, 0, 0, 844, 0, 0, 0, 0, 'Speak to Anduin at the Gate of the August Celestials', 19034), +(268656, 31511, 0, 0, 64853, 1, 0, 0, 847, 0, 0, 0, 0, 'Speak with Dezco at the Gate of the August Celestials', 19034), +(268657, 31487, 0, 0, 64717, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268658, 31487, 0, 1, 64720, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268659, 30639, 0, 0, 64647, 1, 0, 0, 505, 0, 0, 0, 0, 'Catch up with He Softfoot', 19034), +(268660, 30639, 0, 1, 64663, 1, 0, 0, 0, 0, 0, 0, 0, 'Uncover the mogu plan in the Hall of Statues', 19034), +(268661, 30242, 0, 0, 64895, 1, 0, 0, 0, 0, 0, 0, 0, 'Live through the Survival Ring for 60 seconds', 19034), +(268663, 30261, 0, 1, 58704, 1, 0, 0, 930, 0, 0, 0, 0, 'Speak to Kelari Featherfoot', 19034), +(268666, 31521, 0, 0, 64930, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Black Pepper Ribs and Shrimp', 19034), +(268667, 31521, 0, 1, 64931, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Sea Mist Rice Noodles', 19034), +(268668, 31522, 0, 0, 66953, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Shado-Pan Monastery Challenge Mode', 19034), +(268669, 31523, 0, 0, 66959, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Mogu''shan Palace Challenge Mode', 19034), +(268670, 31524, 0, 0, 66954, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Gate of the Setting Sun Challenge Mode', 19034), +(268672, 31526, 0, 0, 66956, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Scarlet Monastery Challenge Mode', 19034), +(268673, 31527, 0, 0, 66957, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Scarlet Halls Challenge Mode', 19034), +(268674, 31528, 0, 0, 66958, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Scholomance Challenge Mode', 19034), +(268675, 31529, 0, 0, 59514, 12, 0, 0, 0, 0, 0, 0, 0, 'Springtail vermin', 19034), +(268678, 31521, 0, 2, 64932, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Mogu Fish Stew', 19034), +(268679, 31521, 0, 3, 64933, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Steamed Crab', 19034), +(268680, 31521, 0, 4, 64934, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Chun Tian Spring Rolls', 19034), +(268681, 31521, 0, 5, 64935, 1, 0, 0, 0, 0, 0, 0, 0, 'Cook Mad Brewer''s Breakfast', 19034), +(268683, 31531, 0, 0, 59528, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268684, 31532, 0, 0, 64937, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268685, 31535, 1, 1, 87557, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268687, 31534, 1, 0, 87554, 1, 0, 0, 852, 0, 0, 0, 0, '', 19034), +(268688, 31534, 1, 1, 87555, 1, 0, 0, 853, 0, 0, 0, 0, '', 19034), +(268689, 31534, 1, 2, 87556, 1, 0, 0, 854, 0, 0, 0, 0, '', 19034), +(268690, 31534, 1, 3, 87553, 1, 0, 0, 855, 0, 0, 0, 0, '', 19034), +(268691, 31536, 1, 1, 87658, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268692, 31537, 0, 0, 64941, 1, 1, 0, 848, 0, 0, 0, 0, 'Jogu the Drunk tasted', 19034), +(268693, 31537, 0, 1, 64943, 1, 1, 0, 849, 0, 0, 0, 0, 'Bobo Ironpaw tasted', 19034), +(268694, 31537, 0, 2, 64942, 1, 1, 0, 850, 0, 0, 0, 0, 'Farmer Yoon tasted', 19034), +(268695, 31537, 0, 3, 64944, 1, 1, 0, 851, 0, 0, 0, 0, 'Nana Mudclaw tasted', 19034), +(268696, 31538, 0, 0, 64945, 1, 1, 0, 907, 0, 0, 0, 0, 'Chen Stormstout tasted', 19034), +(268700, 31539, 1, 0, 87811, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268709, 31549, 0, 0, 65020, 1, 0, 0, 858, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268710, 30280, 0, 0, 64965, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268712, 31553, 0, 0, 65041, 1, 0, 0, 860, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268714, 31111, 0, 0, 64971, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268715, 31111, 0, 1, 64973, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268716, 31505, 0, 0, 64979, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268721, 31506, 1, 0, 87813, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268730, 31568, 0, 0, 65179, 1, 0, 0, 866, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268731, 31572, 0, 0, 65180, 1, 0, 0, 868, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268732, 31574, 0, 0, 65184, 1, 0, 0, 869, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268733, 31577, 0, 0, 65193, 1, 0, 0, 879, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268735, 31580, 0, 0, 65198, 1, 0, 0, 885, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268736, 31583, 0, 0, 65199, 1, 0, 0, 886, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268737, 31586, 0, 0, 65200, 1, 0, 0, 890, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268738, 31507, 0, 0, 64982, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268739, 31589, 0, 0, 65212, 1, 0, 0, 891, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268740, 31592, 0, 0, 65214, 1, 0, 0, 893, 0, 0, 0, 0, 'Battle Pets Healed', 19034), +(268745, 31508, 1, 1, 87874, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268764, 31509, 0, 0, 65242, 15, 0, 0, 940, 0, 0, 0, 0, 'Dreadspore Bulbs destroyed', 19034), +(268765, 31510, 0, 0, 64995, 1, 0, 0, 895, 0, 0, 0, 0, '', 19034), +(268772, 31603, 1, 0, 87903, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268775, 31606, 0, 0, 65253, 1, 0, 0, 0, 0, 0, 0, 0, 'Paragon Wakened', 19034), +(268776, 30827, 0, 3, 61015, 1, 0, 0, 0, 0, 0, 0, 0, 'Ritual completed', 19034), +(268779, 30277, 0, 3, 65286, 1, 0, 0, 0, 0, 0, 0, 0, 'Deactivate Spirit Wall', 19034), +(268780, 30277, 1, 0, 87790, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268788, 31611, 0, 0, 63528, 1, 0, 0, 0, 0, 0, 0, 0, 'Brewmoon Festival Protected', 19034), +(268789, 31613, 0, 0, 61156, 1, 0, 0, 0, 0, 0, 0, 0, 'Greenstone Village Defended', 19034), +(268790, 31087, 0, 2, 65478, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268794, 30933, 0, 0, 61694, 1, 0, 0, 505, 0, 0, 0, 0, 'Search for Sentinel Ku-Yao', 19034), +(268799, 31591, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268800, 31308, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268802, 30261, 0, 0, 64897, 1, 0, 0, 0, 0, 0, 0, 0, 'Serpent''s Spine Roll Course finished', 19034), +(268803, 31576, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268804, 31552, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268805, 31585, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268806, 31588, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268807, 31573, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268808, 31579, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268809, 31571, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268810, 31548, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268811, 31582, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268812, 31556, 0, 0, 65355, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Pet Battle', 19034), +(268813, 31578, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268814, 31555, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268815, 31593, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268816, 31587, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268817, 31590, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268818, 31575, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268819, 31581, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268820, 31550, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268821, 31570, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268822, 31551, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268823, 31584, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268824, 31569, 0, 0, 65356, 1, 0, 0, 0, 0, 0, 0, 0, 'Catch a Pet', 19034), +(268848, 31079, 0, 2, 63007, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268850, 31077, 0, 0, 62964, 1, 0, 0, 0, 0, 0, 0, 0, 'Eulogize Evie', 19034), +(268854, 31271, 0, 1, 63176, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268857, 31660, 0, 0, 62582, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268859, 31480, 1, 1, 75026, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268860, 31467, 1, 1, 74642, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268861, 31477, 1, 1, 74654, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268862, 31474, 1, 1, 74644, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268863, 31476, 1, 1, 74651, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268864, 31471, 1, 1, 74643, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268869, 31002, 0, 1, 61981, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268870, 31664, 0, 0, 65441, 1, 0, 0, 0, 0, 0, 0, 0, 'Read Nat''s Journal', 19034), +(268871, 31492, 0, 0, 66698, 1, 0, 0, 538, 0, 0, 0, 0, 'The Strong Brazier Lit', 19034), +(268874, 31669, 0, 0, 65479, 1, 0, 0, 961, 0, 0, 0, 0, 'Plant Green Cabbage Seeds', 19034), +(268875, 31670, 0, 0, 65480, 1, 0, 0, 962, 0, 0, 0, 0, 'Plant Juicycrunch Carrot Seeds', 19034), +(268876, 31671, 0, 0, 65481, 1, 0, 0, 963, 0, 0, 0, 0, 'Plant Scallion Seeds', 19034), +(268877, 31672, 0, 0, 65482, 1, 0, 0, 964, 0, 0, 0, 0, 'Plant Mogu Pumpkin Seeds', 19034), +(268878, 31673, 0, 0, 65483, 1, 0, 0, 965, 0, 0, 0, 0, 'Plant Red Blossom Leek Seeds', 19034), +(268879, 31674, 0, 0, 65484, 1, 0, 0, 966, 0, 0, 0, 0, 'Plant Pink Turnip Seeds', 19034), +(268880, 31675, 0, 0, 65485, 1, 0, 0, 967, 0, 0, 0, 0, 'Plant White Turnip Seeds', 19034), +(268881, 31211, 0, 1, 63625, 3, 0, 0, 0, 0, 0, 0, 0, 'Kunchong slain', 19034), +(268882, 31216, 0, 1, 63625, 3, 0, 0, 0, 0, 0, 0, 0, 'Kunchong or Dread Behemoths slain', 19034), +(268884, 31676, 0, 1, 65452, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268885, 29908, 0, 1, 65504, 18, 0, 0, 0, 0, 0, 0, 0, 'Virmen Pesterer slain', 19034), +(268886, 31087, 2, 0, 213250, 1, 0, 0, 538, 0, 0, 0, 0, 'Use the Resonating Crystal on the Silent Beacon', 19034), +(268891, 31680, 0, 0, 63206, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268892, 31681, 1, 0, 85159, 7, 0, 0, 970, 0, 0, 0, 0, '', 19034), +(268893, 31682, 0, 0, 62540, 1, 0, 0, 736, 0, 0, 0, 0, 'Awaken Kaz''tik the Manipulator', 19034), +(268894, 30631, 0, 1, 64029, 1, 0, 0, 1205, 0, 0, 0, 0, 'Speak to Elder Lin', 19034), +(268896, 30649, 0, 1, 63996, 1, 0, 0, 1209, 0, 0, 0, 0, 'Speak to Elder Liao', 19034), +(268906, 31688, 2, 1, 214734, 8, 0, 0, 569, 0, 0, 0, 0, 'Sik''thik Cages searched', 19034), +(268907, 31687, 0, 0, 61354, 12, 0, 0, 0, 0, 0, 0, 0, 'Sik''thik mantid slain', 19034), +(268908, 31688, 0, 0, 65586, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Restless Leng', 19034), +(268909, 31689, 0, 1, 62813, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268910, 31690, 1, 0, 79343, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268911, 31691, 1, 0, 79340, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268912, 31692, 1, 0, 79341, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268913, 31693, 11, 0, 64330, 1, 1, 0, 982, 0, 0, 0, 0, 'Defeat Julia Stevens', 19034), +(268914, 31694, 3, 0, 66201, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268916, 30127, 0, 2, 65626, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268917, 30349, 0, 2, 65626, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268918, 31697, 0, 0, 61960, 50, 0, 0, 778, 0, 0, 0, 0, '', 19034), +(268921, 31712, 0, 0, 65621, 13, 0, 0, 0, 0, 0, 0, 0, 'Oona Hozen slain', 19034), +(268922, 31713, 1, 0, 88855, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268923, 31715, 0, 0, 65628, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268924, 31701, 0, 0, 63538, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268925, 31702, 0, 0, 65612, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268926, 31703, 0, 0, 65613, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268927, 31699, 0, 0, 65635, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268928, 31698, 0, 0, 63537, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268929, 31705, 0, 0, 65616, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268930, 31711, 0, 0, 65614, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(268931, 31706, 0, 0, 65622, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268932, 31717, 0, 0, 58506, 1, 1, 0, 0, 0, 0, 0, 0, 'Ace Longpaw defeated', 19034), +(268933, 31718, 0, 0, 58508, 1, 1, 0, 0, 0, 0, 0, 0, 'Big Bao defeated', 19034), +(268934, 31719, 0, 0, 58509, 1, 1, 0, 0, 0, 0, 0, 0, 'Ningna Darkwheel defeated', 19034), +(268935, 31720, 0, 0, 58510, 1, 1, 0, 0, 0, 0, 0, 0, 'Suchi the Sweet defeated', 19034), +(268936, 31721, 0, 0, 58511, 1, 1, 0, 0, 0, 0, 0, 0, 'Qua-Ro Whitebrow defeated', 19034), +(268937, 31714, 1, 0, 88894, 10, 0, 0, 1191, 0, 0, 0, 0, '', 19034), +(268938, 31708, 1, 0, 88895, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268939, 31707, 0, 0, 65647, 5, 0, 0, 1018, 0, 0, 0, 0, 'Sri-La Villagers freed', 19034), +(268942, 31710, 1, 0, 88907, 100, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268943, 31709, 0, 0, 65663, 1, 0, 0, 569, 0, 0, 0, 0, 'Northwestern Sha Disturbance measured', 19034), +(268944, 31709, 0, 1, 65666, 1, 0, 0, 569, 0, 0, 0, 0, 'Northeastern Sha Disturbance measured', 19034), +(268945, 31709, 0, 2, 65667, 1, 0, 0, 569, 0, 0, 0, 0, 'Southern Sha Disturbance measured', 19034), +(268948, 31724, 11, 0, 65648, 1, 1, 0, 987, 0, 0, 0, 0, 'Defeat Old MacDonald', 19034), +(268949, 31704, 1, 0, 89052, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268950, 31725, 11, 0, 65651, 1, 1, 0, 988, 0, 0, 0, 0, 'Defeat Lindsay', 19034), +(268951, 31726, 11, 0, 65655, 1, 1, 0, 989, 0, 0, 0, 0, 'Defeat Eric Davidson', 19034), +(268952, 31716, 1, 0, 89053, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268953, 31728, 11, 0, 65656, 1, 1, 0, 990, 0, 0, 0, 0, 'Defeat Bill Buckler', 19034), +(268954, 31729, 11, 0, 63194, 1, 1, 0, 994, 0, 0, 0, 0, 'Defeat Steven Lisbane', 19034), +(268955, 31700, 1, 0, 89054, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268975, 31368, 3, 0, 65716, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Mishi', 19034), +(268976, 31367, 3, 0, 65716, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Mishi', 19034), +(268979, 31780, 11, 0, 65648, 1, 1, 0, 1001, 0, 0, 0, 0, 'Defeat Old MacDonald', 19034), +(268980, 31781, 11, 0, 65651, 1, 1, 0, 988, 0, 0, 0, 0, 'Defeat Lindsay', 19034), +(268981, 31756, 0, 0, 65775, 1, 0, 0, 1005, 0, 0, 0, 0, 'Eastern Stormcaller destroyed', 19034), +(268982, 31756, 0, 1, 65776, 1, 0, 0, 1006, 0, 0, 0, 0, 'Northern Stormcaller destroyed', 19034), +(268983, 31756, 0, 2, 65777, 1, 0, 0, 1007, 0, 0, 0, 0, 'Southern Stormcaller destroyed', 19034), +(268984, 31756, 0, 3, 65778, 1, 0, 0, 1008, 0, 0, 0, 0, 'Western Stormcaller destroyed', 19034), +(268985, 31782, 0, 0, 65772, 1, 0, 0, 0, 0, 0, 0, 0, 'Witnessed Klaxxi Ritual', 19034), +(268988, 31762, 0, 0, 65824, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268990, 30513, 0, 1, 63535, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Elder Shiao', 19034), +(268991, 30512, 0, 1, 63542, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Elder Tsulan', 19034), +(268996, 31784, 1, 0, 89155, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(268997, 31776, 0, 0, 65901, 1, 1, 0, 1145, 1146, 1147, 1148, 0, 'Master Engineer Cogswing and Gyro-Mechanic Lavenderp slain', 19034), +(268998, 31228, 0, 0, 61541, 1, 1, 0, 1015, 0, 0, 0, 0, '', 19034), +(269000, 31785, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269001, 31777, 0, 0, 65843, 12, 0, 0, 0, 0, 0, 0, 0, 'Strongarm Gyrocopter shot down', 19034), +(269005, 31786, 1, 0, 89169, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269006, 13975, 1, 0, 46714, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269007, 31776, 0, 1, 65880, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269008, 31776, 0, 2, 65881, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269013, 31787, 1, 0, 89170, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269014, 31788, 1, 0, 89171, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269015, 31789, 1, 0, 89172, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269016, 31790, 1, 0, 89173, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269017, 31791, 1, 0, 89174, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269018, 31792, 1, 0, 89175, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269019, 31793, 1, 0, 89176, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269020, 31794, 1, 0, 85477, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269021, 31795, 1, 0, 85557, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269022, 31796, 1, 0, 85558, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269023, 31797, 1, 0, 89178, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269024, 31798, 1, 0, 89179, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269025, 31799, 1, 0, 89180, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269026, 31800, 1, 0, 89181, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269027, 31801, 1, 0, 89182, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269028, 31802, 1, 0, 89183, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269029, 31803, 1, 0, 89184, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269030, 31804, 1, 0, 89185, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269031, 31805, 1, 0, 89209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269035, 31775, 0, 0, 65841, 15, 0, 0, 0, 0, 0, 0, 0, 'Strongarm troop slain', 19034), +(269036, 31778, 0, 0, 65974, 12, 0, 0, 1020, 1449, 1450, 0, 0, 'Indentured Pandaren freed', 19034), +(269040, 30117, 1, 0, 81393, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269044, 31809, 1, 0, 89317, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269045, 31810, 0, 0, 58594, 1, 0, 0, 0, 0, 0, 0, 0, 'Join the Order of the Cloud Serpent', 19034), +(269046, 31811, 0, 0, 58594, 1, 0, 0, 0, 0, 0, 0, 0, 'Join the Order of the Cloud Serpent', 19034), +(269047, 30059, 0, 1, 65984, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269048, 31812, 11, 0, 66126, 1, 1, 0, 1025, 0, 0, 0, 0, 'Defeat Zunta', 19034), +(269049, 31813, 11, 0, 66135, 1, 1, 0, 1026, 0, 0, 0, 0, 'Defeat Dagra the Fierce', 19034), +(269050, 31814, 11, 0, 66136, 1, 1, 0, 1027, 0, 0, 0, 0, 'Defeat Analynn', 19034), +(269051, 31815, 11, 0, 66137, 1, 1, 0, 1028, 0, 0, 0, 0, 'Defeat Zonya the Sadist', 19034), +(269053, 31817, 11, 0, 66372, 1, 1, 0, 1056, 0, 0, 0, 0, 'Defeat Merda Stronghoof', 19034), +(269054, 31818, 11, 0, 66126, 1, 1, 0, 1025, 0, 0, 0, 0, 'Defeat Zunta', 19034), +(269055, 31819, 11, 0, 66135, 1, 1, 0, 1026, 0, 0, 0, 0, 'Defeat Dagra the Fierce', 19034), +(269059, 31821, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269060, 31738, 0, 0, 59979, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269061, 31822, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269062, 31823, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269063, 31824, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269064, 31825, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269065, 31826, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269066, 31739, 0, 0, 64354, 6, 0, 0, 0, 0, 0, 0, 0, 'Applebloom Cider', 19034); -- 269066 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(269067, 31827, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269068, 31828, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269069, 31830, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269070, 31831, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269071, 31832, 0, 0, 65876, 1, 0, 0, 0, 0, 0, 0, 0, 'Level 3 Pet', 19034), +(269073, 31765, 0, 0, 66200, 80, 0, 0, 1105, 1106, 1107, 0, 0, 'Thunder Hold troops slain', 19034), +(269074, 31765, 0, 1, 66203, 9, 0, 0, 1105, 1106, 1107, 0, 0, 'Thunder Hold cannons destroyed', 19034), +(269075, 31740, 0, 0, 66213, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269076, 31833, 0, 0, 65960, 1, 0, 0, 1040, 0, 0, 0, 0, 'Master Woo''s Training Completed', 19034), +(269077, 31834, 0, 0, 66138, 1, 0, 0, 1039, 0, 0, 0, 0, 'Master Cheng''s Training Completed', 19034), +(269078, 31835, 0, 0, 65899, 1, 0, 0, 1041, 0, 0, 0, 0, 'Master Kistane''s Training Completed', 19034), +(269079, 31836, 0, 0, 66073, 1, 0, 0, 1042, 0, 0, 0, 0, 'Master Yoon''s Training Completed', 19034), +(269080, 31837, 0, 0, 66180, 1, 0, 0, 1043, 0, 0, 0, 0, 'Master Cheng''s Training Completed', 19034), +(269081, 31838, 0, 0, 66149, 1, 0, 0, 1044, 0, 0, 0, 0, 'Master Tsang''s Training Completed', 19034), +(269082, 31839, 0, 0, 65977, 1, 0, 0, 1045, 0, 0, 0, 0, 'Master Hsu''s Training Completed', 19034), +(269083, 31840, 0, 0, 66138, 1, 0, 0, 1039, 0, 0, 0, 0, 'Master Cheng''s Training Completed', 19034), +(269084, 31841, 0, 0, 65960, 1, 0, 0, 1040, 0, 0, 0, 0, 'Master Woo''s Training Completed', 19034), +(269085, 31842, 0, 0, 65899, 1, 0, 0, 1041, 0, 0, 0, 0, 'Master Kistane''s Training Completed', 19034), +(269086, 31843, 0, 0, 66073, 1, 0, 0, 1042, 0, 0, 0, 0, 'Master Yoon''s Training Completed', 19034), +(269087, 31844, 0, 0, 66180, 1, 0, 0, 1043, 0, 0, 0, 0, 'Master Cheng''s Training Completed', 19034), +(269088, 31845, 0, 0, 66149, 1, 0, 0, 1044, 0, 0, 0, 0, 'Master Tsang''s Training Completed', 19034), +(269089, 31846, 0, 0, 65977, 1, 0, 0, 1045, 0, 0, 0, 0, 'Master Hsu''s Training Completed', 19034), +(269095, 30069, 0, 1, 66282, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269096, 30069, 0, 0, 66290, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269097, 31734, 0, 0, 66339, 5, 0, 0, 1177, 0, 0, 0, 0, 'Horde War Wagon destroyed', 19034), +(269098, 31743, 0, 0, 66303, 1, 0, 0, 1160, 0, 0, 0, 0, 'Twinspire munitions stockpile bombed', 19034), +(269099, 31743, 0, 1, 66304, 1, 0, 0, 1157, 0, 0, 0, 0, 'Twinspire Demolishers bombed', 19034), +(269100, 31743, 0, 2, 66302, 1, 0, 0, 1158, 0, 0, 0, 0, 'Xhu''daggab bombed', 19034), +(269101, 31743, 0, 3, 66301, 1, 0, 0, 1159, 0, 0, 0, 0, 'Wild Imps bombed', 19034), +(269102, 31767, 0, 0, 66285, 15, 0, 0, 0, 0, 0, 0, 0, 'Thunder Hold troops slain', 19034), +(269103, 31768, 0, 0, 66308, 10, 0, 0, 1049, 0, 0, 0, 0, 'Thunder Hold Munitions destroyed', 19034), +(269104, 31850, 11, 0, 65655, 1, 1, 0, 989, 0, 0, 0, 0, 'Defeat Eric Davidson', 19034), +(269105, 31851, 11, 0, 65656, 1, 1, 0, 990, 0, 0, 0, 0, 'Defeat Bill Buckler', 19034), +(269106, 31852, 11, 0, 63194, 1, 1, 0, 994, 0, 0, 0, 0, 'Defeat Steven Lisbane', 19034), +(269107, 29555, 1, 3, 89603, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269110, 31854, 11, 0, 66136, 1, 1, 0, 1027, 0, 0, 0, 0, 'Defeat Analynn', 19034), +(269118, 31862, 11, 0, 66137, 1, 1, 0, 1028, 0, 0, 0, 0, 'Defeat Zonya the Sadist', 19034), +(269119, 31742, 0, 0, 66274, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269120, 31742, 0, 1, 66275, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269121, 31741, 0, 0, 66267, 15, 0, 0, 0, 0, 0, 0, 0, 'Twinspire Horde slain', 19034), +(269123, 31870, 11, 1, 66422, 1, 0, 0, 1070, 0, 0, 0, 0, 'Defeat Cassandra Kaboom', 19034), +(269124, 31871, 11, 0, 66352, 1, 1, 0, 1053, 0, 0, 0, 0, 'Defeat Traitor Gluk', 19034), +(269125, 31744, 0, 0, 66366, 8, 0, 0, 1054, 0, 0, 0, 0, 'Captive Pandaren Cub freed', 19034), +(269126, 31872, 11, 0, 66372, 1, 1, 0, 1056, 0, 0, 0, 0, 'Defeat Merda Stronghoof', 19034), +(269129, 31735, 0, 0, 66383, 1, 0, 0, 538, 0, 0, 0, 0, 'First Barricade Destroyed', 19034), +(269130, 31735, 0, 1, 66384, 1, 0, 0, 538, 0, 0, 0, 0, 'Second Barricade Destroyed', 19034), +(269131, 31735, 0, 2, 66396, 1, 1, 0, 0, 0, 0, 0, 0, 'Ga''trul Confronted', 19034), +(269135, 31732, 0, 0, 66398, 60, 0, 0, 1081, 0, 0, 0, 0, 'Garrosh''ar Horde slain', 19034), +(269136, 31732, 0, 1, 66397, 8, 0, 0, 1081, 0, 0, 0, 0, '', 19034), +(269137, 31732, 0, 2, 66400, 1, 0, 0, 1081, 0, 0, 0, 0, 'Bladefist Reaper sunk', 19034), +(269138, 31732, 0, 3, 66401, 1, 0, 0, 1081, 0, 0, 0, 0, 'Stygian Scar sunk', 19034), +(269141, 31737, 0, 0, 66423, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269142, 31737, 0, 1, 66424, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269143, 31771, 0, 0, 66425, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269144, 31771, 0, 1, 66426, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269145, 31889, 11, 5, 66352, 1, 0, 0, 1053, 0, 0, 0, 0, 'Defeat Traitor Gluk', 19034), +(269147, 31889, 11, 2, 66436, 1, 0, 0, 1071, 0, 0, 0, 0, 'Defeat Grazzle the Great', 19034), +(269148, 31889, 11, 4, 66452, 1, 0, 0, 1073, 0, 0, 0, 0, 'Defeat Kela Grimtotem', 19034), +(269149, 31889, 11, 3, 66442, 1, 0, 0, 1072, 0, 0, 0, 0, 'Defeat Zoltan', 19034), +(269150, 31889, 11, 0, 66412, 1, 1, 0, 1069, 0, 0, 0, 0, 'Defeat Elena Flutterfly', 19034), +(269151, 31891, 11, 5, 66352, 1, 0, 0, 1053, 0, 0, 0, 0, 'Defeat Traitor Gluk', 19034), +(269152, 31891, 11, 2, 66436, 1, 0, 0, 1071, 0, 0, 0, 0, 'Defeat Grazzle the Great', 19034), +(269153, 31891, 11, 4, 66452, 1, 0, 0, 1073, 0, 0, 0, 0, 'Defeat Kela Grimtotem', 19034), +(269154, 31891, 11, 3, 66442, 1, 0, 0, 1072, 0, 0, 0, 0, 'Defeat Zoltan', 19034), +(269155, 31891, 11, 0, 66412, 1, 1, 0, 1069, 0, 0, 0, 0, 'Defeat Elena Flutterfly', 19034), +(269167, 31897, 11, 0, 66466, 1, 1, 0, 1074, 0, 0, 0, 0, 'Defeat Stone Cold Trixxy', 19034), +(269175, 31736, 0, 0, 65910, 1, 0, 0, 0, 0, 0, 0, 0, 'Leader of Paw''don Village found', 19034), +(269176, 31902, 11, 5, 66478, 1, 0, 0, 1076, 0, 0, 0, 0, 'Defeat David Kosse', 19034), +(269177, 31902, 11, 6, 66512, 1, 0, 0, 1077, 0, 0, 0, 0, 'Defeat Deiza Plaguehorn', 19034), +(269178, 31902, 11, 7, 66515, 1, 0, 0, 1078, 0, 0, 0, 0, 'Defeat Kortas Darkhammer', 19034), +(269179, 31902, 11, 8, 66518, 1, 0, 0, 1079, 0, 0, 0, 0, 'Defeat Everessa', 19034), +(269180, 31902, 11, 9, 66520, 1, 0, 0, 1080, 0, 0, 0, 0, 'Defeat Durin Darkhammer', 19034), +(269181, 31903, 11, 5, 66478, 1, 0, 0, 1076, 0, 0, 0, 0, 'Defeat David Kosse', 19034), +(269182, 31903, 11, 6, 66512, 1, 0, 0, 1077, 0, 0, 0, 0, 'Defeat Deiza Plaguehorn', 19034), +(269183, 31903, 11, 7, 66515, 1, 0, 0, 1078, 0, 0, 0, 0, 'Defeat Kortas Darkhammer', 19034), +(269184, 31903, 11, 8, 66518, 1, 0, 0, 1079, 0, 0, 0, 0, 'Defeat Everessa', 19034), +(269185, 31903, 11, 9, 66520, 1, 0, 0, 1080, 0, 0, 0, 0, 'Defeat Durin Darkhammer', 19034), +(269186, 31904, 11, 1, 66422, 1, 0, 0, 1070, 0, 0, 0, 0, 'Defeat Cassandra Kaboom', 19034), +(269191, 31905, 11, 0, 66436, 1, 0, 0, 1071, 0, 0, 0, 0, 'Defeat Grazzle the Great', 19034), +(269192, 31906, 11, 1, 0, 1, 0, 0, 1073, 0, 0, 0, 0, 'Defeat Kela Grimtotem', 19034), +(269193, 31907, 11, 0, 0, 1, 0, 0, 1072, 0, 0, 0, 0, 'Defeat Zoltan', 19034), +(269194, 31908, 11, 1, 0, 1, 0, 0, 1069, 0, 0, 0, 0, 'Defeat Elena Flutterfly', 19034), +(269195, 31909, 11, 1, 66466, 1, 0, 0, 1074, 0, 0, 0, 0, 'Defeat Stone Cold Trixxy', 19034), +(269196, 31910, 11, 1, 66478, 1, 0, 0, 1076, 0, 0, 0, 0, 'Defeat David Kosse', 19034), +(269197, 31911, 11, 0, 66512, 1, 0, 0, 1077, 0, 0, 0, 0, 'Defeat Deiza Plaguehorn', 19034), +(269198, 31912, 11, 1, 66515, 1, 0, 0, 1078, 0, 0, 0, 0, 'Defeat Kortas Darkhammer', 19034), +(269199, 31913, 11, 0, 66518, 1, 0, 0, 1079, 0, 0, 0, 0, 'Defeat Everessa', 19034), +(269200, 31914, 11, 1, 66520, 1, 0, 0, 1080, 0, 0, 0, 0, 'Defeat Durin Darkhammer', 19034), +(269201, 31915, 11, 0, 66522, 1, 0, 0, 1082, 0, 0, 0, 0, 'Defeat Lydia Accoste', 19034), +(269202, 31916, 11, 0, 66522, 1, 0, 0, 1082, 0, 0, 0, 0, 'Defeat Lydia Accoste', 19034), +(269203, 31769, 0, 0, 66554, 1, 0, 0, 1085, 1200, 0, 0, 0, 'Destroy the first barricade', 19034), +(269204, 31769, 0, 1, 66555, 1, 0, 0, 1087, 1201, 0, 0, 0, 'Destroy the second barricade', 19034), +(269205, 31769, 0, 2, 66556, 1, 0, 0, 1089, 1202, 0, 0, 0, 'Destroy the third barricade', 19034), +(269206, 31769, 0, 3, 66283, 1, 0, 0, 0, 0, 0, 0, 0, 'Find Captain Doren', 19034), +(269207, 31482, 0, 1, 64664, 1, 0, 0, 0, 0, 0, 0, 0, 'Spoke with Wrathion', 19034), +(269208, 31919, 11, 0, 66550, 1, 0, 0, 1093, 0, 0, 0, 0, 'Defeat Nicki Tinytech', 19034), +(269209, 31919, 11, 1, 66551, 1, 0, 0, 1094, 0, 0, 0, 0, 'Defeat Ras''an', 19034), +(269210, 31919, 11, 2, 66552, 1, 0, 0, 1095, 0, 0, 0, 0, 'Defeat Narrok', 19034), +(269211, 31919, 11, 3, 66553, 1, 0, 0, 1096, 0, 0, 0, 0, 'Defeat Morulu the Elder', 19034), +(269213, 31920, 11, 1, 66557, 1, 0, 0, 1097, 0, 0, 0, 0, 'Defeat Bloodknight Antari', 19034), +(269214, 31921, 11, 0, 66550, 1, 0, 0, 1093, 0, 0, 0, 0, 'Defeat Nicki Tinytech', 19034), +(269215, 31921, 11, 1, 66551, 1, 0, 0, 1094, 0, 0, 0, 0, 'Defeat Ras''an', 19034), +(269216, 31921, 11, 2, 66552, 1, 0, 0, 1095, 0, 0, 0, 0, 'Defeat Narrok', 19034), +(269217, 31921, 11, 3, 66553, 1, 0, 0, 1096, 0, 0, 0, 0, 'Defeat Morulu the Elder', 19034), +(269218, 31922, 11, 0, 66550, 1, 0, 0, 1093, 0, 0, 0, 0, 'Defeat Nicki Tinytech', 19034), +(269219, 31923, 11, 1, 66551, 1, 0, 0, 1094, 0, 0, 0, 0, 'Defeat Ras''an', 19034), +(269220, 31924, 11, 0, 66552, 1, 0, 0, 1095, 0, 0, 0, 0, 'Defeat Narrok', 19034), +(269221, 31925, 11, 1, 66553, 1, 0, 0, 1096, 0, 0, 0, 0, 'Defeat Morulu The Elder', 19034), +(269222, 31926, 11, 0, 66557, 1, 0, 0, 1097, 0, 0, 0, 0, 'Defeat Bloodknight Antari', 19034), +(269223, 31779, 0, 0, 66052, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269224, 31770, 0, 0, 66220, 1, 0, 0, 1098, 0, 0, 0, 0, 'Speak with Mayor Honeydew', 19034), +(269228, 31772, 0, 0, 66873, 6, 0, 0, 1137, 0, 0, 0, 0, 'Barrel of Honeybrew', 19034), +(269229, 31773, 0, 0, 66668, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269231, 31766, 0, 0, 66646, 1, 0, 0, 1104, 0, 0, 0, 0, 'Rappel into Honeydew Glade', 19034), +(269232, 31927, 11, 4, 66635, 1, 0, 0, 1108, 0, 0, 0, 0, 'Defeat Beegle Blastfuse', 19034), +(269233, 31927, 11, 5, 66636, 1, 0, 0, 1109, 0, 0, 0, 0, 'Defeat Nearly Headless Jacob', 19034), +(269234, 31927, 11, 6, 66638, 1, 0, 0, 1110, 0, 0, 0, 0, 'Defeat Okrut Dragonwaste', 19034), +(269235, 31927, 11, 7, 66639, 1, 0, 0, 1111, 0, 0, 0, 0, 'Defeat Gutretch', 19034), +(269236, 31928, 11, 0, 66675, 1, 0, 0, 1112, 0, 0, 0, 0, 'Defeat Major Payne', 19034), +(269237, 31929, 11, 4, 66635, 1, 0, 0, 1108, 0, 0, 0, 0, 'Defeat Beegle Blastfuse', 19034), +(269238, 31929, 11, 5, 66636, 1, 0, 0, 1109, 0, 0, 0, 0, 'Defeat Nearly Headless Jacob', 19034), +(269239, 31929, 11, 6, 66638, 1, 0, 0, 1110, 0, 0, 0, 0, 'Defeat Okrut Dragonwaste', 19034), +(269240, 31929, 11, 7, 66639, 1, 0, 0, 1111, 0, 0, 0, 0, 'Defeat Gutretch', 19034), +(269241, 31930, 11, 0, 66730, 1, 0, 0, 1123, 0, 0, 0, 0, 'Defeat Hyuna of the Shrines', 19034), +(269242, 31930, 11, 2, 66734, 1, 0, 0, 1125, 0, 0, 0, 0, 'Defeat Farmer Nishi', 19034), +(269243, 31930, 11, 1, 66733, 1, 0, 0, 1124, 0, 0, 0, 0, 'Defeat Mo''ruk', 19034), +(269244, 31930, 11, 3, 66738, 1, 0, 0, 1126, 0, 0, 0, 0, 'Defeat Courageous Yon', 19034), +(269245, 31931, 11, 1, 66635, 1, 0, 0, 1108, 0, 0, 0, 0, 'Defeat Beegle Blastfuse', 19034), +(269246, 31932, 11, 1, 66636, 1, 0, 0, 1109, 0, 0, 0, 0, 'Defeat Nearly Headless Jacob', 19034), +(269247, 31933, 11, 0, 66638, 1, 0, 0, 1110, 0, 0, 0, 0, 'Defeat Okrut Dragonwaste', 19034), +(269248, 31934, 11, 1, 66639, 1, 0, 0, 1111, 0, 0, 0, 0, 'Defeat Gutretch', 19034), +(269249, 31935, 11, 0, 66675, 1, 0, 0, 1112, 0, 0, 0, 0, 'Defeat Major Payne', 19034), +(269254, 31941, 0, 0, 66735, 1, 0, 0, 1114, 0, 0, 0, 0, 'Plant Jade Squash Seeds', 19034), +(269255, 31942, 0, 0, 66736, 1, 0, 0, 1115, 0, 0, 0, 0, 'Plant Striped Melon Seeds', 19034), +(269256, 31943, 0, 0, 66737, 1, 0, 0, 1116, 0, 0, 0, 0, 'Plant Witchberry Seeds', 19034), +(269257, 31944, 0, 0, 66732, 1, 0, 0, 1120, 0, 0, 0, 0, 'Final Test Complete', 19034), +(269258, 31609, 0, 0, 66783, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269259, 31609, 0, 1, 66784, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269260, 31609, 0, 2, 66785, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269261, 31609, 0, 3, 66788, 25, 0, 0, 0, 0, 0, 0, 0, 'Mantid subjugate slain', 19034), +(269264, 31945, 0, 0, 65481, 1, 0, 0, 963, 0, 0, 0, 0, 'Plant Scallion Seeds', 19034), +(269265, 31945, 0, 2, 66906, 1, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Scallions', 19034), +(269266, 31951, 11, 1, 66741, 1, 0, 0, 1128, 0, 0, 0, 0, 'Defear Aki the Chosen', 19034), +(269267, 31952, 11, 0, 66730, 1, 0, 0, 1123, 0, 0, 0, 0, 'Defeat Hyuna of the Shrines', 19034), +(269268, 31952, 11, 2, 66734, 1, 0, 0, 1125, 0, 0, 0, 0, 'Defeat Farmer Nishi', 19034), +(269269, 31952, 11, 1, 66733, 1, 0, 0, 1124, 0, 0, 0, 0, 'Defeat Mo''ruk', 19034), +(269270, 31952, 11, 3, 66738, 1, 0, 0, 1126, 0, 0, 0, 0, 'Defeat Courageous Yon', 19034), +(269272, 31953, 11, 0, 66730, 1, 0, 0, 1123, 0, 0, 0, 0, 'Defeat Hyuna of the Shrines', 19034), +(269273, 31946, 0, 0, 65480, 2, 0, 0, 962, 0, 0, 0, 0, 'Plant Juicycrunch Carrot Seed', 19034), +(269274, 31946, 0, 2, 66907, 2, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Juicycrunch Carrots', 19034), +(269275, 31954, 11, 1, 66733, 1, 0, 0, 1124, 0, 0, 0, 0, 'Defeat Mo''ruk', 19034), +(269276, 31955, 11, 0, 66734, 1, 0, 0, 1125, 0, 0, 0, 0, 'Defeat Farmer Nishi', 19034), +(269277, 31956, 11, 1, 66738, 1, 0, 0, 1126, 0, 0, 0, 0, 'Defeat Courageous Yon', 19034), +(269278, 31957, 11, 1, 66739, 1, 0, 0, 1127, 0, 0, 0, 0, 'Defeat Wastewalker Shu', 19034), +(269279, 31958, 11, 1, 66741, 1, 0, 0, 1128, 0, 0, 0, 0, 'Defeat Aki the Chosen', 19034), +(269280, 31947, 0, 0, 65479, 3, 0, 0, 961, 0, 0, 0, 0, 'Plant Green Cabbage Seeds', 19034), +(269281, 31947, 0, 2, 66908, 3, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Green Cabbages', 19034), +(269283, 31948, 1, 0, 89903, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269284, 31949, 0, 0, 66737, 3, 0, 0, 1116, 0, 0, 0, 0, 'Plant Witchberry Seeds', 19034), +(269285, 31949, 0, 2, 66909, 3, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Witchberries', 19034), +(269288, 31959, 0, 0, 66776, 1, 1, 0, 505, 0, 0, 0, 0, 'Report to Malik the Unscathed', 19034), +(269292, 30527, 0, 2, 66910, 4, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Striped Melons', 19034), +(269293, 31612, 0, 0, 66800, 1, 0, 0, 1131, 0, 0, 0, 0, 'Walk with Kil''ruk', 19034), +(269294, 31966, 11, 0, 66819, 1, 0, 0, 1132, 0, 0, 0, 0, 'Defeat Brok', 19034), +(269295, 31966, 11, 1, 66815, 1, 0, 0, 1133, 0, 0, 0, 0, 'Defeat Bordin Steadyfist', 19034), +(269296, 31966, 11, 2, 66822, 1, 0, 0, 1134, 0, 0, 0, 0, 'Defeat Goz Banefury', 19034), +(269298, 31967, 11, 0, 66819, 1, 0, 0, 1132, 0, 0, 0, 0, 'Defeat Brok', 19034), +(269299, 31967, 11, 1, 66815, 1, 0, 0, 1133, 0, 0, 0, 0, 'Defeat Bordin Steadyfist', 19034), +(269300, 31967, 11, 2, 66822, 1, 0, 0, 1134, 0, 0, 0, 0, 'Defeat Goz Banefury', 19034), +(269303, 31970, 11, 1, 66824, 1, 0, 0, 1135, 0, 0, 0, 0, 'Defeat Obalis', 19034), +(269304, 31971, 11, 1, 66824, 1, 0, 0, 1135, 0, 0, 0, 0, 'Defeat Obalis', 19034), +(269305, 31972, 11, 0, 66819, 1, 0, 0, 1132, 0, 0, 0, 0, 'Defeat Brok', 19034), +(269308, 31973, 11, 1, 66815, 1, 0, 0, 1133, 0, 0, 0, 0, 'Defeat Bordin Steadyfist', 19034), +(269309, 31974, 11, 0, 66822, 1, 0, 0, 1134, 0, 0, 0, 0, 'Defeat Goz Banefury', 19034), +(269318, 31978, 0, 0, 66873, 6, 0, 0, 1137, 0, 0, 0, 0, 'Barrel of Honeybrew', 19034), +(269326, 31496, 2, 2, 215761, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269327, 31496, 2, 3, 215703, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269328, 31496, 2, 4, 215700, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269330, 31945, 1, 1, 74843, 5, 0, 0, 0, 0, 0, 0, 0, 'Scallions', 19034), +(269331, 31946, 1, 1, 74841, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269332, 31947, 1, 1, 74840, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269333, 31949, 1, 1, 74846, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269334, 30527, 1, 0, 74848, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269340, 31952, 11, 4, 66918, 1, 0, 0, 1140, 0, 0, 0, 0, 'Defeat Seeker Zusshi', 19034), +(269341, 31952, 11, 8, 66739, 1, 0, 0, 1127, 0, 0, 0, 0, 'Defeat Wastewalker Shu', 19034), +(269342, 31930, 11, 4, 66918, 1, 0, 0, 1140, 0, 0, 0, 0, 'Defeat Seeker Zusshi', 19034), +(269343, 31930, 11, 8, 66739, 1, 0, 0, 1127, 0, 0, 0, 0, 'Defeat Wastewalker Shu', 19034), +(269344, 31991, 11, 0, 66918, 1, 0, 0, 1140, 0, 0, 0, 0, 'Defeat Seeker Zusshi', 19034), +(269345, 31998, 0, 0, 66951, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Temple of the Jade Serpent Challenge Mode', 19034), +(269347, 32000, 0, 0, 66952, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Stormstout Brewery Challenge Mode', 19034), +(269348, 32001, 0, 0, 66953, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Shado-Pan Monastery Challenge Mode', 19034), +(269349, 32002, 0, 0, 66959, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the Mogu''shan Palace Challenge Mode', 19034), +(269355, 31387, 6, -1, 1269, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269356, 31389, 6, -1, 1269, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269357, 32010, 6, -1, 1269, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269358, 32011, 6, -1, 1269, 21000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269362, 31808, 3, 1, 63765, 1, 0, 0, 1156, 0, 0, 0, 0, 'Locate Kovok near the Clutches of Shek''zeer', 19034), +(269363, 31733, 0, 0, 67061, 1, 0, 0, 1162, 0, 0, 0, 0, 'Equip a Skyfire Parachute', 19034), +(269364, 32016, 4, -1, 738, 90, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269365, 32017, 4, -1, 738, 90, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269366, 31745, 0, 0, 67070, 1, 0, 0, 1165, 0, 0, 0, 0, 'Return to Paw''don Village', 19034), +(269368, 31228, 0, 1, 64642, 12, 0, 0, 0, 0, 0, 0, 0, 'Zandalari forces slain', 19034), +(269369, 31254, 3, 0, 62738, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with the Highroad Grummle', 19034), +(269370, 31254, 3, 2, 63367, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Brewmaster Boof', 19034), +(269371, 31255, 3, 0, 62738, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with the Highroad Grummle', 19034), +(269372, 31255, 3, 2, 63367, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Brewmaster Boof', 19034), +(269376, 32038, 0, 0, 58489, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269377, 32045, 0, 0, 67128, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269378, 32045, 0, 1, 67125, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269379, 32045, 0, 2, 67099, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269386, 31444, 1, 0, 86544, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269387, 31443, 1, 0, 86542, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269388, 31446, 1, 0, 86545, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269434, 31315, 1, 0, 86421, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269435, 30033, 0, 1, 57849, 1, 0, 0, 0, 0, 0, 0, 0, 'Loot and Equip a Trainee''s Hand Fan', 19034), +(269436, 31808, 0, 0, 67034, 200, 0, 0, 0, 0, 0, 0, 0, 'Mantid slain', 19034), +(269438, 30382, 1, 0, 79265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269451, 32115, 0, 3, 68074, 14, 0, 0, 0, 0, 0, 0, 0, 'Troubled Slave Spirits released', 19034), +(269458, 32119, 0, 3, 68272, 1, 0, 0, 0, 0, 0, 0, 0, 'Anomaly dispersed', 19034), +(269461, 32120, 1, 3, 92704, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269463, 32121, 0, 3, 68061, 3, 0, 0, 0, 0, 0, 0, 0, 'Spirit Trap destroyed', 19034), +(269466, 32122, 0, 0, 68169, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269476, 32175, 11, 0, 67370, 1, 0, 0, 1416, 0, 0, 0, 0, 'Defeat Jeremy Feasel', 19034), +(269504, 32142, 0, 0, 67357, 10, 0, 0, 0, 0, 0, 0, 0, 'Domination Orc slain', 19034), +(269506, 32146, 0, 0, 67399, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269507, 32145, 0, 0, 67435, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269508, 32145, 0, 1, 67429, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269509, 32145, 0, 2, 67427, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269511, 32144, 2, 0, 216150, 8, 0, 0, 1679, 0, 0, 0, 0, 'Horde Supply Crates Destroyed', 19034), +(269512, 32143, 0, 0, 67544, 1, 0, 0, 538, 0, 0, 0, 0, 'Eliminate the Beachhead Demolishers', 19034), +(269513, 32161, 1, 0, 91814, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269514, 32161, 1, 1, 91815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269515, 32162, 1, 0, 91816, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269516, 32163, 1, 0, 91817, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269517, 32131, 1, 0, 91823, 20, 0, 0, 1275, 0, 0, 0, 0, '', 19034), +(269518, 32181, 1, 0, 91834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269519, 32182, 1, 0, 91835, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269520, 32183, 1, 0, 91836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269521, 32184, 1, 0, 91834, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269522, 32185, 1, 0, 91835, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269523, 32186, 1, 0, 91836, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269524, 32130, 1, 0, 92474, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269525, 32132, 0, 0, 67423, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269526, 32143, 0, 2, 67546, 1, 0, 0, 538, 0, 0, 0, 0, 'Eliminate the Horde Wolves', 19034), +(269528, 32164, 1, 0, 91814, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269529, 32164, 1, 1, 91815, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269530, 32165, 1, 0, 91816, 25, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269531, 32166, 1, 0, 91817, 30, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269533, 32148, 0, 0, 67602, 12, 0, 0, 0, 0, 0, 0, 0, 'Dominance Shaman or Raider slain', 19034), +(269536, 32139, 0, 0, 67909, 9, 0, 0, 1298, 0, 0, 0, 0, 'Domination Point Lumber collected', 19034), +(269537, 32137, 1, 0, 91846, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269540, 32141, 1, 0, 91848, 7, 0, 0, 1384, 0, 0, 0, 0, '', 19034), +(269541, 32197, 1, 1, 91874, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269543, 32199, 1, 0, 91869, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269544, 32143, 0, 1, 67547, 1, 0, 0, 538, 0, 0, 0, 0, 'Destroy the Horde Bomb Stockpile', 19034), +(269546, 32192, 0, 0, 67605, 6, 0, 0, 0, 0, 0, 0, 0, 'Blood Elves saved', 19034), +(269551, 32191, 0, 0, 67574, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269552, 32123, 0, 0, 67354, 10, 0, 0, 0, 0, 0, 0, 0, 'Alliance slain', 19034), +(269553, 32127, 0, 0, 67626, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269554, 32127, 0, 1, 67627, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269555, 32134, 0, 0, 67545, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269556, 32134, 0, 1, 67541, 2, 0, 0, 0, 0, 0, 0, 0, 'Dwarven Mortar Tubes destroyed', 19034), +(269557, 32153, 0, 0, 67646, 1, 1, 0, 0, 0, 0, 0, 0, 'Horde Hero slain', 19034), +(269558, 32135, 0, 0, 67636, 1, 1, 0, 0, 0, 0, 0, 0, 'Alliance Hero slain', 19034), +(269559, 32133, 0, 3, 67744, 1, 0, 0, 538, 0, 0, 0, 0, 'Sentry Ward placed in Town Hall', 19034), +(269560, 32133, 0, 4, 67742, 1, 0, 0, 538, 0, 0, 0, 0, 'Sentry Ward placed on Docks', 19034), +(269561, 32133, 0, 5, 67743, 1, 0, 0, 538, 0, 0, 0, 0, 'Sentry Ward placed in Barracks, 2nd Floor', 19034), +(269562, 32126, 0, 0, 67639, 8, 0, 0, 569, 1299, 0, 0, 0, 'Alliance Supply Drops destroyed', 19034), +(269564, 32235, 0, 0, 67359, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269565, 32236, 0, 0, 67641, 5, 0, 0, 1383, 0, 0, 0, 0, 'Agitated Shale Spiders sprayed', 19034), +(269566, 32237, 0, 0, 67741, 8, 0, 0, 0, 0, 0, 0, 0, 'Faulty Valve tightened', 19034), +(269567, 32238, 0, 1, 68011, 9, 0, 0, 1300, 0, 0, 0, 0, 'Shieldwall Mecha-Pounder exploded', 19034), +(269568, 32194, 1, 0, 93189, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269572, 32128, 0, 0, 67505, 1, 0, 0, 0, 0, 0, 0, 0, 'Valor''s Edge ammunition destroyed', 19034), +(269573, 32128, 0, 1, 67566, 1, 0, 0, 0, 0, 0, 0, 0, 'The Defiant ammunition destroyed', 19034), +(269574, 32152, 1, 1, 92493, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269575, 32149, 1, 0, 91907, 12, 0, 0, 1282, 0, 0, 0, 0, '', 19034), +(269576, 32150, 0, 0, 67756, 8, 0, 0, 0, 0, 0, 0, 0, 'Domination Point Supplies destroyed', 19034), +(269578, 32151, 1, 0, 93022, 20, 0, 0, 1275, 0, 0, 0, 0, 'Animatable Stone', 19034), +(269581, 32243, 1, 0, 93190, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269582, 32244, 1, 0, 92072, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269583, 32257, 0, 0, 63852, 1, 0, 0, 1553, 0, 0, 0, 0, 'Investigate the Mercurial Guardian', 19034), +(269594, 32309, 2, 0, 212212, 1, 0, 0, 505, 0, 0, 0, 0, 'Read Part 1 of Legacy of the Masters', 19034), +(269595, 32310, 2, 0, 212212, 1, 0, 0, 505, 0, 0, 0, 0, 'Read Part 1 of Legacy of the Masters', 19034), +(269607, 32214, 0, 0, 67689, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269608, 32316, 0, 0, 68006, 6, 0, 0, 520, 0, 0, 0, 0, 'Sha-Touched Footman saved', 19034), +(269611, 32221, 0, 0, 67971, 10, 0, 0, 0, 0, 0, 0, 0, 'Shieldwall forces slain', 19034), +(269612, 32317, 1, 0, 92494, 1, 0, 0, 1301, 0, 0, 0, 0, 'Obtain the Hellfire Fragment', 19034), +(269613, 32317, 1, 1, 92495, 1, 0, 0, 1302, 0, 0, 0, 0, 'Obtain the Netherstorm Fragment', 19034), +(269614, 32317, 0, 4, 68782, 1, 0, 0, 0, 0, 0, 0, 0, 'Watch the Netherstorm Memory', 19034), +(269615, 32317, 1, 2, 92496, 1, 0, 0, 1303, 0, 0, 0, 0, 'Obtain the Blade''s Edge Fragment', 19034), +(269616, 32222, 0, 0, 68012, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269617, 32318, 1, 0, 92499, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269618, 32152, 0, 2, 67671, 1, 0, 0, 0, 0, 0, 0, 0, 'Domination Point Demolisher destroyed', 19034), +(269619, 32223, 0, 0, 68028, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269620, 32250, 0, 0, 67900, 25, 0, 0, 0, 0, 0, 0, 0, 'Alliance slain', 19034), +(269621, 32250, 0, 1, 67927, 1, 0, 0, 505, 0, 0, 0, 0, 'Blood Guard Gro''tash found', 19034), +(269622, 32250, 0, 2, 67926, 1, 0, 0, 505, 0, 0, 0, 0, 'Grizzle Gearslip found', 19034), +(269624, 32319, 1, 0, 92510, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269629, 32324, 0, 0, 68053, 1, 0, 0, 0, 0, 0, 0, 0, 'Head to the Entrance of the Black Temple', 19034), +(269630, 32320, 0, 0, 68342, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort Thrall', 19034), +(269631, 32325, 0, 0, 68054, 1, 0, 0, 1349, 0, 0, 0, 0, 'Uncover the Council''s objective', 19034), +(269633, 32327, 0, 1, 68076, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the Cenarion Enclave', 19034), +(269634, 32327, 0, 0, 68988, 1, 0, 0, 0, 0, 0, 0, 0, 'Locate the Divine Bell', 19034), +(269635, 32319, 0, 1, 68083, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Vol''jin''s Hearthstone', 19034), +(269638, 32321, 3, 0, 68004, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Anduin Wrynn', 19034), +(269639, 32321, 0, 1, 68150, 1, 0, 0, 0, 0, 0, 0, 0, 'Escort Anduin Wrynn', 19034), +(269640, 32334, 0, 0, 68130, 1, 1, 0, 908, 0, 0, 0, 0, 'Challenger defeated', 19034), +(269641, 32335, 0, 0, 68538, 1, 0, 0, 505, 0, 0, 0, 0, 'Listen to the Monkey King''s Story', 19034), +(269642, 32332, 1, 0, 92539, 1, 0, 0, 1315, 0, 0, 0, 0, '', 19034), +(269643, 32333, 1, 0, 92557, 1, 0, 0, 1319, 0, 0, 0, 0, '', 19034), +(269644, 32154, 0, 1, 68784, 1, 0, 0, 1392, 1395, 1396, 1397, 0, 'Northeastern Fuel Tank destroyed', 19034), +(269645, 32156, 1, 0, 93009, 7, 0, 0, 1391, 1460, 0, 0, 0, '', 19034), +(269646, 32157, 0, 0, 67873, 10, 0, 0, 0, 0, 0, 0, 0, 'Bilgewater Goblins slain', 19034), +(269647, 32158, 0, 0, 67371, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269650, 32331, 0, 0, 68106, 1, 0, 0, 1336, 0, 0, 0, 0, 'Use the Portal to The Purple Parlor', 19034), +(269653, 32342, 1, 3, 92708, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269654, 32343, 1, 0, 92736, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269655, 32344, 0, 3, 68272, 1, 0, 0, 0, 0, 0, 0, 0, 'Anomaly dispersed', 19034), +(269656, 32345, 0, 3, 68074, 14, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269659, 32346, 0, 3, 68073, 12, 0, 0, 0, 0, 0, 0, 0, 'Spiritbound Mogu slain', 19034), +(269664, 32352, 0, 0, 68284, 6, 0, 0, 520, 0, 0, 0, 0, 'Sha-Touched Grunts saved', 19034), +(269674, 32356, 0, 0, 56223, 1, 0, 0, 0, 0, 0, 0, 0, 'See the scouts off', 19034), +(269676, 30173, 1, 0, 81418, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269677, 32357, 0, 0, 56223, 1, 0, 0, 0, 0, 0, 0, 0, 'See the scouts off', 19034), +(269678, 32330, 0, 1, 68086, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Archmage Aethas Sunreaver', 19034), +(269685, 32361, 0, 0, 56223, 1, 0, 0, 0, 0, 0, 0, 0, 'See the scouts off', 19034), +(269686, 32362, 0, 0, 68108, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Jaina Proudmoore', 19034), +(269687, 32122, 0, 1, 68170, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269688, 32348, 0, 0, 67304, 12, 0, 0, 0, 0, 0, 0, 0, 'Lion''s Landing Military slain', 19034), +(269690, 32343, 1, 1, 92735, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269693, 32373, 0, 0, 68316, 1, 0, 0, 1067, 0, 0, 0, 0, 'Speak to Wrathion', 19034), +(269694, 32374, 6, -1, 1359, 21000, 0, 0, 0, 0, 0, 0, 0, 'Earn Revered Reputation with the Black Prince', 19034), +(269699, 32368, 0, 1, 68362, 1, 0, 0, 569, 0, 0, 0, 0, 'Drink the Memory Wine', 19034), +(269700, 32368, 0, 0, 68357, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness Shan Kien''s Past', 19034), +(269701, 32372, 0, 0, 68041, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269702, 32372, 0, 1, 68044, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269703, 32372, 0, 2, 68048, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269704, 32377, 1, 0, 92766, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269705, 32384, 0, 0, 68378, 1, 0, 0, 0, 0, 0, 0, 0, 'Shan Kien weakened', 19034), +(269706, 32371, 0, 2, 68390, 1, 0, 0, 0, 0, 0, 0, 0, 'Use Kor''kron Disguise', 19034), +(269707, 32371, 2, 0, 216625, 1, 0, 0, 569, 0, 0, 0, 0, 'Drink Memory Wine', 19034), +(269708, 32247, 0, 0, 68332, 25, 0, 0, 0, 0, 0, 0, 0, 'Horde slain', 19034), +(269709, 32371, 0, 1, 68357, 1, 0, 0, 0, 0, 0, 0, 0, 'Witness Shan Kien''s past', 19034), +(269710, 32247, 0, 1, 68331, 1, 0, 0, 505, 0, 0, 0, 0, 'Marshal Troteman found', 19034), +(269711, 32247, 0, 2, 68312, 1, 0, 0, 505, 0, 0, 0, 0, 'Hilda Hornswaggle found', 19034), +(269717, 32388, 0, 0, 67461, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269718, 32330, 0, 2, 68085, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Grand Magister Rommath', 19034), +(269719, 32330, 0, 0, 68259, 1, 0, 0, 1350, 0, 0, 0, 0, 'Contain the Experiment', 19034), +(269720, 32378, 0, 0, 68410, 10, 0, 0, 0, 0, 0, 0, 0, 'Korune Mogu slain', 19034), +(269721, 32379, 1, 0, 92801, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269722, 32379, 1, 1, 92802, 1, 0, 0, 1351, 0, 0, 0, 0, '', 19034), +(269723, 32379, 1, 2, 92803, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269724, 32383, 0, 0, 68484, 1, 0, 0, 1354, 0, 0, 0, 0, 'Large Tent bugged', 19034), +(269725, 32383, 0, 1, 68487, 1, 0, 0, 1355, 0, 0, 0, 0, 'Small Tents bugged', 19034), +(269726, 32383, 0, 2, 68488, 1, 0, 0, 1356, 0, 0, 0, 0, 'Supplies Bugged', 19034), +(269727, 32397, 0, 0, 68489, 1, 0, 0, 1357, 0, 0, 0, 0, 'Garrosh distracted', 19034), +(269728, 32397, 1, 1, 92804, 1, 0, 0, 1362, 0, 0, 0, 0, 'Weathered Journal', 19034), +(269729, 32392, 0, 0, 68472, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269730, 32399, 0, 0, 68225, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Blademaster Ishi', 19034), +(269731, 32401, 0, 0, 68936, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269732, 32394, 0, 0, 68504, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269734, 32321, 0, 2, 68005, 1, 1, 0, 1364, 0, 0, 0, 0, 'Release the Monkey King', 19034), +(269736, 32380, 0, 0, 68524, 1, 0, 0, 1371, 0, 0, 0, 0, 'Agent Townsley located', 19034), +(269739, 32381, 0, 0, 68527, 1, 0, 0, 1367, 1368, 1369, 1370, 0, 'Pink Marmot delivered', 19034), +(269740, 32381, 0, 1, 68528, 1, 0, 0, 1367, 1368, 1369, 1370, 0, 'Rusty Dagger delivered', 19034), +(269741, 32381, 0, 2, 68529, 1, 0, 0, 1367, 1368, 1369, 1370, 0, 'Mogu Melon Twist delivered', 19034), +(269745, 32336, 1, 0, 92561, 1, 0, 0, 1415, 0, 0, 0, 0, '', 19034), +(269746, 32337, 3, 1, 68554, 1, 0, 0, 505, 0, 0, 0, 0, 'Find the Royal Finder', 19034), +(269747, 32338, 1, 0, 92562, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269749, 32426, 0, 0, 68530, 1, 0, 0, 1372, 0, 0, 0, 0, 'Professor Kilt located', 19034), +(269750, 32337, 1, 0, 92560, 1, 0, 0, 1398, 0, 0, 0, 0, '', 19034), +(269751, 32427, 0, 0, 68316, 1, 0, 0, 1067, 0, 0, 0, 0, 'Speak to Wrathion', 19034), +(269752, 32347, 0, 0, 68126, 10, 0, 0, 0, 0, 0, 0, 0, 'Reliquary slain', 19034), +(269753, 32428, 11, 0, 68463, 1, 1, 0, 1373, 0, 0, 0, 0, 'Defeat Burning Pandaren Spirit', 19034), +(269754, 32429, 6, -1, 1359, 21000, 0, 0, 0, 0, 0, 0, 0, 'Earn Revered Reputation with the Black Prince', 19034), +(269755, 32430, 0, 0, 67801, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269756, 32428, 11, 1, 68465, 1, 0, 0, 1374, 0, 0, 0, 0, 'Defeat Thundering Pandaren Spirit', 19034), +(269757, 32428, 11, 2, 68464, 1, 0, 0, 1375, 0, 0, 0, 0, 'Defeat Whispering Pandaren Spirit', 19034), +(269758, 32428, 11, 3, 68462, 1, 0, 0, 1376, 0, 0, 0, 0, 'Defeat Flowing Pandaren Spirit', 19034), +(269759, 32394, 0, 1, 68505, 1, 0, 0, 1378, 0, 0, 0, 0, 'Recover the Divine Bell', 19034), +(269760, 32434, 11, 0, 68463, 1, 1, 0, 1373, 0, 0, 0, 0, 'Defeat Burning Pandaren Spirit', 19034), +(269764, 32408, 0, 0, 68049, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269765, 32412, 0, 0, 68632, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269766, 32412, 0, 1, 68635, 1, 0, 0, 0, 0, 0, 0, 0, 'Escape from Dalaran', 19034), +(269769, 32236, 0, 1, 68653, 12, 0, 0, 0, 0, 0, 0, 0, 'Shale Shards eradicated', 19034), +(269770, 32439, 11, 0, 68462, 1, 1, 0, 1376, 0, 0, 0, 0, 'Defeat Flowing Pandaren Spirit', 19034), +(269772, 32440, 11, 0, 68464, 1, 1, 0, 1375, 0, 0, 0, 0, 'Defeat Whispering Pandaren Spirit', 19034), +(269773, 32441, 11, 0, 68465, 1, 1, 0, 1374, 0, 0, 0, 0, 'Defeat Thundering Pandaren Spirit', 19034), +(269785, 32402, 0, 0, 68703, 1, 0, 0, 1434, 0, 0, 0, 0, 'Obtain ride to Dalaran', 19034), +(269786, 32403, 0, 0, 68695, 9, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver Citizen evacuated', 19034), +(269787, 32404, 0, 0, 68042, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269788, 32404, 0, 1, 68043, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269790, 32409, 0, 0, 68047, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269791, 32409, 0, 1, 68707, 10, 0, 0, 0, 0, 0, 0, 0, 'Stormwind troops slain', 19034), +(269792, 32411, 0, 0, 68711, 1, 0, 0, 520, 0, 0, 0, 0, 'Rescue Uda the Beast', 19034), +(269793, 32411, 0, 1, 68714, 1, 0, 0, 520, 0, 0, 0, 0, 'Rescue High Arcanist Savor', 19034), +(269794, 32411, 0, 2, 68715, 1, 0, 0, 520, 0, 0, 0, 0, 'Rescue Magister Hathorel', 19034), +(269795, 32411, 0, 3, 68716, 1, 0, 0, 520, 0, 0, 0, 0, 'Rescue Magister Surdiel', 19034), +(269796, 32411, 0, 4, 68717, 1, 0, 0, 520, 0, 0, 0, 0, 'Rescue Magistrix Vesara', 19034), +(269798, 32416, 0, 0, 68677, 1, 0, 0, 1429, 0, 0, 0, 0, 'Take the portal from Darnassus to Dalaran', 19034), +(269799, 32417, 0, 0, 68647, 12, 0, 0, 0, 0, 0, 0, 0, 'Sunreavers slain in Dalaran Sewers', 19034), +(269800, 32418, 0, 0, 68752, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269801, 32418, 0, 2, 68754, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269802, 32418, 0, 1, 68753, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269803, 32418, 0, 3, 68755, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269804, 32419, 0, 0, 68050, 16, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver slain in Sunreaver''s Sanctuary', 19034), +(269805, 32420, 0, 0, 68751, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269806, 32421, 0, 0, 68762, 5, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver Dragonhawk subdued', 19034), +(269808, 32382, 0, 0, 68742, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Connelly in Kun-Lai Summit', 19034), +(269809, 32193, 0, 0, 68743, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Brann Bronzebeard', 19034), +(269810, 32315, 0, 0, 68744, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Anduin at the Shrine of Seven Stars', 19034), +(269811, 32370, 0, 0, 68745, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Connelly at the Grummle Bazaar', 19034), +(269812, 32393, 0, 0, 68746, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Sarannha Skyglaive at the Ruins of Korune', 19034), +(269813, 32355, 0, 0, 68747, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Anduin at the Tomb of Conquerors', 19034), +(269814, 32400, 0, 0, 68748, 1, 0, 0, 1388, 0, 0, 0, 0, 'Find Anduin at Emperor''s Reach', 19034), +(269815, 32256, 0, 0, 68719, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Garrosh at the Shrine of Two Moons', 19034), +(269816, 32284, 0, 0, 68720, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Chen Stormstout at Binan Village', 19034), +(269817, 32190, 0, 0, 68721, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Lor''themar Theron at Mogujia', 19034), +(269818, 32376, 0, 0, 68722, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Your "Friend From Silvermoon"', 19034), +(269819, 32351, 0, 0, 68723, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Baine Bloodhoof at the Shrine of Two Moons', 19034), +(269820, 32363, 0, 0, 68724, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Baine Bloodhoof at Garrosh''ar Advance', 19034), +(269821, 32391, 0, 0, 68725, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Ishi at the Ruins of Korune', 19034), +(269822, 32398, 0, 0, 68726, 1, 0, 0, 1389, 0, 0, 0, 0, 'Find Malkorok at Emperor''s Reach', 19034), +(269823, 32446, 1, 0, 93179, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269828, 32317, 0, 5, 68783, 1, 0, 0, 0, 0, 0, 0, 0, 'Watch the Blade''s Edge Memory', 19034), +(269829, 32317, 1, 3, 92497, 1, 0, 0, 1304, 0, 0, 0, 0, 'Obtain the Shadowmoon Fragment', 19034), +(269830, 32317, 0, 6, 68780, 1, 0, 0, 0, 0, 0, 0, 0, 'Watch the Shadowmoon Memory', 19034), +(269831, 32154, 0, 2, 68785, 1, 0, 0, 1393, 1395, 1396, 1397, 0, 'Northern Fuel Tank destroyed', 19034), +(269832, 32154, 0, 3, 68786, 1, 0, 0, 1394, 1395, 1396, 1397, 0, 'Northwestern Fuel Tank destroyed', 19034), +(269833, 32399, 0, 1, 68873, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Anduin Wrynn', 19034), +(269834, 32448, 1, 0, 93212, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269839, 32257, 1, 2, 92425, 1, 1, 0, 0, 0, 0, 0, 0, 'Ancient Korune Tablet obtained', 19034), +(269840, 32330, 3, 3, 68430, 1, 0, 0, 505, 0, 0, 0, 0, 'Locate the Arcanis Mechanica', 19034), +(269842, 32333, 2, 1, 216427, 1, 0, 0, 538, 0, 0, 0, 0, 'Ring the Bell of Fellowship', 19034), +(269843, 32333, 0, 2, 68128, 1, 1, 0, 0, 0, 0, 0, 0, 'Defeat the Challenger', 19034), +(269845, 32401, 0, 1, 68873, 1, 0, 0, 0, 0, 0, 0, 0, 'Destroy the Divine Bell', 19034), +(269847, 32455, 0, 0, 68928, 1, 0, 0, 0, 0, 0, 0, 0, 'Use the Alliance Flare Gun', 19034), +(269848, 32389, 0, 0, 68931, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in the Temple of Kotmogu', 19034), +(269849, 32389, 0, 1, 68932, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in the Silvershard Mines', 19034), +(269850, 32431, 0, 0, 68931, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle at the Temple of Kotmogu', 19034), +(269851, 32431, 0, 1, 68932, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in the Silvershard Mines', 19034), +(269855, 32339, 0, 1, 68935, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269856, 32339, 0, 2, 68933, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269857, 32339, 0, 3, 68934, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269860, 32380, 0, 1, 68952, 1, 0, 0, 0, 0, 0, 0, 0, 'Bizmo''s Brawlpub Located', 19034), +(269864, 32460, 0, 0, 68962, 1, 0, 0, 1459, 0, 0, 0, 0, 'Track the Thieves of the Bell', 19034), +(269867, 32410, 0, 0, 68728, 6, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver Dragonhawk freed', 19034), +(269873, 32326, 0, 0, 69046, 1, 0, 0, 1430, 0, 0, 0, 0, 'Take the portal to Darnassus', 19034), +(269875, 32390, 0, 0, 69053, 1, 0, 0, 1067, 0, 0, 0, 0, 'Speak with Wrathion', 19034), +(269877, 32432, 0, 0, 69053, 1, 0, 0, 1067, 0, 0, 0, 0, 'Speak with Wrathion', 19034), +(269900, 32474, 0, 0, 69145, 1, 0, 0, 0, 0, 0, 0, 0, '3000 Valor Earned', 19034), +(269901, 32476, 0, 0, 69145, 1, 0, 0, 0, 0, 0, 0, 0, '3000 Valor Earned', 19034), +(269919, 32217, 0, 0, 69160, 6, 0, 0, 1461, 0, 0, 0, 0, 'Zandalari Offerings destroyed', 19034), +(269922, 32282, 0, 0, 69183, 5, 0, 0, 0, 0, 0, 0, 0, 'Raptor slain', 19034), +(269923, 32207, 0, 0, 69154, 10, 0, 0, 0, 0, 0, 0, 0, 'Beast Pens trolls slain', 19034), +(269924, 32485, 0, 0, 69186, 6, 0, 0, 0, 0, 0, 0, 0, 'Empower Kirin Tor Perimeter Wards', 19034), +(269925, 32269, 2, 0, 217169, 6, 0, 0, 1531, 0, 0, 0, 0, 'Destroy Kirin Tor Perimeter Wards', 19034), +(269928, 32200, 0, 0, 69068, 12, 0, 0, 0, 0, 0, 0, 0, 'Trolls slain in Za''Tual', 19034), +(269929, 32275, 0, 0, 69065, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269930, 32275, 0, 1, 69171, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269931, 32275, 0, 2, 69225, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269933, 32227, 0, 0, 69128, 12, 0, 0, 520, 0, 0, 0, 0, 'Hatchling Skyscreamers frightened', 19034), +(269934, 32298, 0, 0, 69214, 5, 0, 0, 1474, 1475, 1476, 1479, 0, 'Saur Fetish used', 19034), +(269940, 32215, 0, 1, 69253, 1, 0, 0, 1470, 0, 0, 0, 0, 'Cha''lat''s Altar destroyed', 19034), +(269941, 32215, 0, 2, 69260, 1, 0, 0, 1471, 0, 0, 0, 0, 'Tec''uat''s Altar destroyed', 19034), +(269942, 32215, 0, 3, 69262, 1, 0, 0, 1472, 0, 0, 0, 0, 'Pa''chek''s Altar destroyed', 19034), +(269943, 32282, 0, 1, 58071, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269944, 32297, 0, 0, 69276, 1, 0, 0, 1473, 0, 0, 0, 0, 'Binding ritual disrupted', 19034), +(269945, 32292, 1, 0, 93731, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269946, 32252, 0, 0, 69136, 2, 1, 0, 0, 0, 0, 0, 0, 'Harbingers of the Loa slain', 19034), +(269947, 32283, 0, 0, 69302, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269948, 32216, 0, 0, 69263, 1, 0, 0, 0, 0, 0, 0, 0, 'Tormented Skyscreamer freed', 19034), +(269949, 32494, 1, 0, 93733, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269950, 32494, 1, 1, 93734, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269951, 32206, 0, 0, 69294, 8, 0, 0, 0, 0, 0, 0, 0, 'Conqueror''s Terrace Zandalari slain', 19034), +(269952, 32233, 1, 0, 93736, 7, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269953, 32208, 0, 0, 69316, 1, 0, 0, 538, 0, 0, 0, 0, 'Western Lightning Drill destroyed', 19034), +(269954, 32208, 0, 1, 69319, 1, 0, 0, 538, 0, 0, 0, 0, 'Central Lightning Drill destroyed', 19034), +(269955, 32208, 0, 2, 69320, 1, 0, 0, 538, 0, 0, 0, 0, 'Eastern Lightning Drill destroyed', 19034), +(269956, 32219, 0, 0, 69240, 8, 0, 0, 1489, 1514, 0, 0, 0, 'Grave Guardians destroyed', 19034), +(269957, 32493, 0, 0, 69434, 5, 0, 0, 0, 0, 0, 0, 0, 'Zandalari Spirits captured', 19034), +(269958, 32232, 0, 0, 69336, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269959, 32218, 0, 0, 69337, 8, 0, 0, 1483, 1486, 0, 0, 0, 'Mummified Remains burned', 19034), +(269960, 32224, 0, 0, 69237, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269961, 32201, 0, 0, 69236, 10, 0, 0, 0, 0, 0, 0, 0, 'Shan''ze mogu slain at the Court of Bones', 19034), +(269962, 32209, 0, 0, 69357, 1, 0, 0, 538, 0, 0, 0, 0, 'Scout Elearis rescued', 19034), +(269963, 32209, 0, 1, 69356, 1, 0, 0, 538, 0, 0, 0, 0, 'Scout Merior rescued', 19034), +(269964, 32209, 0, 2, 69355, 1, 0, 0, 538, 0, 0, 0, 0, 'Scout Alaine rescued', 19034), +(269965, 32204, 0, 0, 69362, 10, 0, 0, 0, 0, 0, 0, 0, 'Skumblade saurok slain', 19034), +(269966, 32489, 0, 0, 69234, 75, 0, 0, 0, 0, 0, 0, 0, 'Ihgaluk Roach crushed', 19034), +(269967, 32255, 0, 0, 69287, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Disabled Construct', 19034), +(269968, 32255, 0, 1, 69288, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Buried Construct', 19034), +(269969, 32255, 0, 2, 69290, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Distressed Construct', 19034), +(269970, 32255, 0, 3, 69289, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Malfunctioning Construct', 19034), +(269971, 32254, 0, 0, 69293, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magister Arlan', 19034), +(269972, 32254, 0, 1, 69309, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magister Sarien', 19034), +(269973, 32254, 0, 2, 69310, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magistrix Vesara', 19034), +(269974, 32274, 0, 0, 69338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269975, 32274, 0, 1, 69229, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 269975 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(269976, 32274, 0, 2, 69226, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269977, 32299, 0, 0, 69261, 75, 0, 0, 1477, 1478, 0, 0, 0, 'Filth dispersed', 19034), +(269978, 32491, 0, 0, 69247, 3, 0, 0, 0, 0, 0, 0, 0, 'Fetid Meat Pile destroyed', 19034), +(269979, 32495, 0, 0, 69250, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(269980, 32226, 0, 0, 69241, 1, 1, 0, 1487, 0, 0, 0, 0, '', 19034), +(269981, 32225, 0, 0, 69369, 1, 0, 0, 1488, 0, 0, 0, 0, 'Shan''ze Thundercallers'' ritual stopped', 19034), +(269985, 32505, 1, 0, 93792, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269986, 32505, 1, 1, 93795, 1, 0, 0, 1492, 0, 0, 0, 0, '', 19034), +(269987, 32505, 1, 2, 93793, 1, 0, 0, 1491, 0, 0, 0, 0, '', 19034), +(269988, 32505, 1, 3, 93794, 1, 0, 0, 1490, 0, 0, 0, 0, '', 19034), +(269989, 32505, 1, 4, 93796, 1, 0, 0, 1482, 0, 0, 0, 0, '', 19034), +(269990, 32234, 1, 0, 93735, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(269995, 32220, 0, 0, 69426, 6, 0, 0, 1484, 1485, 1549, 1550, 0, 'Scouts rescued', 19034), +(270000, 32507, 0, 0, 69362, 1, 0, 0, 0, 0, 0, 0, 0, 'Skumblade saurok slain', 19034), +(270003, 32209, 0, 3, 69326, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270004, 32208, 0, 3, 69326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270005, 32292, 0, 1, 69461, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270006, 32265, 0, 0, 69543, 1, 0, 0, 1493, 1494, 0, 0, 0, 'Charged Moganite returned to Dawnseeker Promontory', 19034), +(270013, 32268, 0, 0, 69560, 1, 0, 0, 1495, 0, 0, 0, 0, 'Bomb placed on Alliance Ship', 19034), +(270021, 32268, 0, 1, 69605, 1, 0, 0, 538, 0, 0, 0, 0, 'Bomb placed on Supply Shipment', 19034), +(270022, 32268, 0, 2, 69607, 1, 0, 0, 538, 0, 0, 0, 0, 'Bomb placed on Construct Ritual', 19034), +(270025, 32517, 0, 0, 69900, 1, 0, 0, 0, 0, 0, 0, 0, 'Stop the Ancient Stone Conqueror ritual', 19034), +(270026, 32293, 0, 0, 69666, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270027, 32520, 0, 0, 69665, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270028, 32521, 0, 0, 69663, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270029, 32522, 0, 0, 70176, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270030, 32525, 0, 0, 69337, 8, 0, 0, 1483, 1486, 0, 0, 0, 'Mummified Remains burned', 19034), +(270031, 32526, 0, 0, 69426, 6, 0, 0, 1484, 1485, 1549, 1550, 0, 'Scouts rescued', 19034), +(270032, 32527, 0, 0, 69236, 10, 0, 0, 0, 0, 0, 0, 0, 'Shan''ze mogu slain at the Court of Bones', 19034), +(270033, 32528, 0, 0, 69241, 1, 1, 0, 1487, 0, 0, 0, 0, '', 19034), +(270034, 32529, 0, 0, 69369, 1, 0, 0, 1488, 0, 0, 0, 0, 'Shan''ze Thundercallers'' ritual stopped', 19034), +(270035, 32530, 0, 0, 69250, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270036, 32531, 0, 0, 69900, 1, 0, 0, 0, 0, 0, 0, 0, 'Disrupt the Ancient Stone Conqueror ritual', 19034), +(270037, 32532, 0, 0, 69237, 15, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270038, 32533, 0, 0, 69240, 8, 0, 0, 1489, 1514, 0, 0, 0, 'Grave Guardians destroyed', 19034), +(270040, 32535, 0, 0, 69362, 10, 0, 0, 0, 0, 0, 0, 0, 'Skumblade saurok slain', 19034), +(270041, 32536, 0, 0, 69682, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magister Yalis', 19034), +(270042, 32536, 0, 1, 69684, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magister Lyanis', 19034), +(270043, 32536, 0, 2, 69686, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Magistrix Sanal', 19034), +(270044, 32537, 0, 0, 69693, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Disabled Construct', 19034), +(270045, 32537, 0, 1, 69688, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Buried Construct', 19034), +(270046, 32537, 0, 2, 69695, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Distressed Construct', 19034), +(270047, 32537, 0, 3, 69697, 1, 0, 0, 538, 0, 0, 0, 0, 'Recover Malfunctioning Construct', 19034), +(270048, 32538, 0, 1, 69253, 1, 0, 0, 1511, 0, 0, 0, 0, 'Cha''lat''s Altar destroyed', 19034), +(270049, 32538, 0, 2, 69260, 1, 0, 0, 1512, 0, 0, 0, 0, 'Tec''uat''s Altar destroyed', 19034), +(270050, 32538, 0, 3, 69262, 1, 0, 0, 1513, 0, 0, 0, 0, 'Pa''chek''s Altar destroyed', 19034), +(270051, 32539, 0, 0, 69160, 6, 0, 0, 1461, 0, 0, 0, 0, 'Zandalari Offerings destroyed', 19034), +(270052, 32540, 0, 0, 69136, 2, 1, 0, 0, 0, 0, 0, 0, 'Harbingers of the Loa slain', 19034), +(270053, 32541, 0, 0, 69128, 12, 0, 0, 520, 0, 0, 0, 0, 'Hatchling Skyscreamers frightened', 19034), +(270054, 32542, 0, 0, 69065, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270055, 32542, 0, 1, 69171, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270056, 32542, 0, 2, 69225, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270057, 32543, 0, 0, 69068, 12, 0, 0, 0, 0, 0, 0, 0, 'Trolls slain in Za''Tual', 19034), +(270058, 32544, 0, 0, 69263, 1, 0, 0, 0, 0, 0, 0, 0, 'Tormented Skyscreamer freed', 19034), +(270059, 32545, 0, 0, 69338, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270060, 32545, 0, 1, 69229, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270061, 32545, 0, 2, 69226, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270062, 32546, 0, 0, 69261, 75, 0, 0, 1477, 1478, 0, 0, 0, 'Filth dispersed', 19034), +(270063, 32547, 0, 0, 69234, 75, 0, 0, 0, 0, 0, 0, 0, 'Ihgaluk Roach crushed', 19034), +(270064, 32548, 0, 0, 69247, 3, 0, 0, 0, 0, 0, 0, 0, 'Fetid Meat Pile destroyed', 19034), +(270065, 32549, 0, 0, 69362, 1, 0, 0, 0, 0, 0, 0, 0, 'Skumblade saurok slain', 19034), +(270066, 32550, 0, 0, 69154, 10, 0, 0, 0, 0, 0, 0, 0, 'Beast Pens trolls slain', 19034), +(270067, 32551, 0, 0, 69183, 5, 0, 0, 0, 0, 0, 0, 0, 'Raptor slain', 19034), +(270068, 32551, 0, 1, 58071, 10, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270069, 32552, 0, 0, 69302, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270070, 32553, 0, 0, 69276, 1, 0, 0, 1473, 0, 0, 0, 0, 'Binding ritual disrupted', 19034), +(270071, 32554, 0, 0, 69214, 5, 0, 0, 1474, 1475, 1476, 1479, 0, 'Saur Fetish used', 19034), +(270072, 32555, 0, 0, 69434, 5, 0, 0, 0, 0, 0, 0, 0, 'Zandalari Spirits captured', 19034), +(270073, 32556, 1, 0, 93735, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270074, 32557, 1, 0, 93736, 7, 0, 0, 1535, 1536, 0, 0, 0, '', 19034), +(270075, 32558, 1, 0, 93733, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270076, 32558, 1, 1, 93734, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270077, 32559, 0, 0, 69336, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270078, 32560, 0, 0, 69294, 8, 0, 0, 0, 0, 0, 0, 0, 'Conqueror''s Terrace Zandalari slain', 19034), +(270079, 32561, 0, 0, 69665, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270082, 32523, 0, 0, 67985, 1, 0, 0, 1501, 0, 0, 0, 0, 'Find Scout Captain Elsia at the Beast Pens', 19034), +(270083, 32567, 0, 0, 67998, 1, 0, 0, 1502, 0, 0, 0, 0, 'Find Scout Captain Daelin at the Beast Pens', 19034), +(270084, 32576, 0, 0, 69665, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270085, 32577, 0, 0, 70176, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270086, 32578, 0, 0, 69666, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270087, 32579, 0, 0, 69665, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270088, 32580, 0, 0, 69663, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270089, 32581, 0, 0, 70176, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270090, 32586, 0, 0, 69316, 1, 0, 0, 538, 0, 0, 0, 0, 'Western Lightning Drill destroyed', 19034), +(270091, 32586, 0, 1, 69319, 1, 0, 0, 538, 0, 0, 0, 0, 'Central Lightning Drill destroyed', 19034), +(270092, 32586, 0, 2, 69320, 1, 0, 0, 538, 0, 0, 0, 0, 'Eastern Lightning Drill destroyed', 19034), +(270093, 32586, 0, 3, 69326, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270094, 32587, 0, 1, 69461, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270095, 32587, 1, 0, 93731, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270096, 32588, 0, 0, 69751, 1, 0, 0, 538, 0, 0, 0, 0, 'Agent Reginald rescued', 19034), +(270097, 32588, 0, 1, 69752, 1, 0, 0, 538, 0, 0, 0, 0, 'Agent Grisel rescued', 19034), +(270098, 32588, 0, 2, 69754, 1, 0, 0, 538, 0, 0, 0, 0, 'Agent Crowley rescued', 19034), +(270099, 32588, 0, 3, 69326, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270100, 32285, 0, 0, 67473, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270101, 32572, 0, 0, 67473, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270102, 32228, 0, 0, 69406, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270103, 32574, 0, 0, 69406, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270106, 32589, 1, 0, 94116, 1, 1, 0, 1509, 1510, 0, 0, 0, '', 19034), +(270107, 32212, 0, 0, 69478, 1, 0, 0, 1539, 0, 0, 0, 0, 'Speak to Lor''themar Theron', 19034), +(270108, 32212, 0, 1, 69775, 1, 0, 0, 1564, 0, 0, 0, 0, 'Complete the Assault on Zeb''tula', 19034), +(270110, 32583, 0, 0, 69665, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270113, 32599, 1, 0, 94153, 1, 0, 0, 1520, 0, 0, 0, 0, 'Charged Staff of Antonidas retrieved', 19034), +(270118, 32604, 12, 0, 1129, 1, 1, 0, 0, 0, 0, 0, 0, 'Defeat Ka''wi the Gorger', 19034), +(270127, 32604, 12, 9, 1192, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Kafi', 19034), +(270128, 32604, 12, 10, 1193, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Dos-Ryga', 19034), +(270129, 32604, 12, 11, 1194, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Nitun', 19034), +(270131, 32603, 12, 4, 1129, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Ka''wi the Gorger', 19034), +(270132, 32603, 12, 5, 1187, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Gorespine', 19034), +(270133, 32603, 12, 6, 1188, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat No-No', 19034), +(270134, 32603, 12, 7, 1189, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Greyhoof', 19034), +(270135, 32603, 12, 8, 1190, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Lucky Yi', 19034), +(270136, 32603, 12, 9, 1191, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Ti''un the Wanderer', 19034), +(270137, 32603, 12, 10, 1192, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Kafi', 19034), +(270138, 32603, 12, 11, 1193, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Dos-Ryga', 19034), +(270139, 32603, 12, 12, 1194, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Nitun', 19034), +(270140, 32603, 12, 13, 1195, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Skitterer Xi''a', 19034), +(270141, 32599, 0, 1, 69902, 1, 0, 0, 1519, 0, 0, 0, 0, 'Staff of Antonidas charged', 19034), +(270142, 32605, 0, 0, 69913, 9, 0, 0, 0, 0, 0, 0, 0, 'Use Mogu Weapon on Skumblade corpse', 19034), +(270143, 32606, 0, 0, 69913, 9, 0, 0, 0, 0, 0, 0, 0, 'Use Mogu Weapon on Skumblade corpse', 19034), +(270146, 32563, 0, 0, 69663, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270147, 32565, 0, 0, 69663, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270148, 32613, 1, 0, 94288, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270149, 32614, 1, 0, 94288, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270150, 32615, 1, 0, 94288, 99, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270151, 32616, 1, 0, 94288, 999, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270152, 32617, 1, 0, 94288, 9999, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270156, 32279, 0, 0, 69534, 1, 0, 0, 1539, 0, 0, 0, 0, 'Capture the Foot of Lei Shen', 19034), +(270157, 32302, 0, 0, 67934, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270158, 32591, 1, 0, 94593, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270159, 32593, 0, 0, 70093, 1, 0, 0, 0, 0, 0, 0, 0, 'Unlock the Thunder Forge', 19034), +(270160, 32593, 0, 1, 70094, 1, 0, 0, 1529, 0, 0, 0, 0, 'Complete Wrathion''s Task', 19034), +(270161, 32266, 0, 0, 67937, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270162, 32596, 1, 0, 94594, 12, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270163, 32287, 0, 0, 69431, 7, 0, 0, 0, 0, 0, 0, 0, 'Diremoor Shan''ze mogu slain', 19034), +(270164, 32573, 0, 0, 69431, 7, 0, 0, 0, 0, 0, 0, 0, 'Diremoor Shan''ze mogu slain', 19034), +(270166, 32571, 1, 0, 94605, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270167, 32506, 1, 0, 94605, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270168, 32230, 0, 0, 69405, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270169, 32575, 0, 0, 69405, 1, 0, 0, 658, 0, 0, 0, 0, '', 19034), +(270170, 32277, 0, 0, 70112, 1, 0, 0, 1518, 0, 0, 0, 0, 'Speak to Lor''themar Theron to begin your mission', 19034), +(270171, 32277, 0, 1, 69923, 1, 0, 0, 0, 0, 0, 0, 0, 'Assault the Lightning Vein Mines', 19034), +(270172, 32279, 0, 1, 67990, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Lor''themar Theron', 19034), +(270173, 32627, 0, 0, 69543, 1, 0, 0, 1493, 1521, 0, 0, 0, 'Charged Moganite returned to Violet Rise', 19034), +(270174, 32628, 0, 0, 69560, 1, 0, 0, 1495, 0, 0, 0, 0, 'Bomb placed on Sunreaver Ship', 19034), +(270175, 32628, 0, 1, 69605, 1, 0, 0, 538, 0, 0, 0, 0, 'Bomb placed on Bridge', 19034), +(270176, 32628, 0, 2, 69607, 1, 0, 0, 538, 0, 0, 0, 0, 'Bomb placed on Scrying Crystals', 19034), +(270177, 32634, 2, 0, 217758, 6, 0, 0, 1530, 0, 0, 0, 0, 'Destroy Sunreaver Perimeter Wards', 19034), +(270178, 32638, 0, 0, 67675, 9, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270179, 32639, 0, 0, 67930, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270185, 32640, 0, 0, 69471, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Spirit Champion', 19034), +(270186, 32640, 0, 1, 69339, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Lightning Champion', 19034), +(270187, 32640, 0, 2, 69347, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Primal Champion', 19034), +(270188, 32641, 0, 0, 69471, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Spirit Champion', 19034), +(270189, 32641, 0, 1, 69339, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Lightning Champion', 19034), +(270190, 32641, 0, 2, 69347, 1, 0, 0, 0, 0, 0, 0, 0, 'Summon and Defeat a Primal Champion', 19034), +(270191, 32597, 1, 0, 94867, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270192, 32635, 2, 0, 218731, 1, 0, 0, 538, 0, 0, 0, 0, 'Ships Tactical Mana Bomb disarmed', 19034), +(270193, 32635, 2, 1, 218732, 1, 0, 0, 538, 0, 0, 0, 0, 'Supplies Tactical Mana Bomb disarmed', 19034), +(270194, 32635, 2, 2, 218733, 1, 0, 0, 538, 0, 0, 0, 0, 'Construct Ritual Tactical Mana Bomb disarmed', 19034), +(270195, 32642, 0, 0, 65483, 8, 0, 0, 965, 0, 0, 0, 0, 'Plant Red Blossom Leek Seeds', 19034), +(270198, 32300, 2, 0, 218734, 1, 0, 0, 538, 0, 0, 0, 0, 'Ships Tactical Mana Bomb disarmed', 19034), +(270199, 32300, 2, 1, 218735, 1, 0, 0, 538, 0, 0, 0, 0, 'Crystal Tactical Mana Bomb disarmed', 19034), +(270200, 32300, 2, 2, 218736, 1, 0, 0, 538, 0, 0, 0, 0, 'Bridge Tactical Mana Bomb disarmed', 19034), +(270201, 32643, 0, 0, 70180, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Red Blossom Leeks', 19034), +(270202, 32643, 1, 1, 74844, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270203, 32644, 0, 0, 69599, 1, 0, 0, 1538, 0, 0, 0, 0, 'Speak to Jaina Proudmoore', 19034), +(270204, 32644, 0, 1, 70345, 1, 0, 0, 1538, 0, 0, 0, 0, 'Complete the Assault on Shaol''mara', 19034), +(270205, 32645, 0, 0, 66737, 8, 0, 0, 1116, 0, 0, 0, 0, 'Plant Witchberry Seeds', 19034), +(270206, 32646, 0, 0, 66909, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Witchberries', 19034), +(270207, 32646, 1, 1, 74846, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270208, 32647, 0, 0, 65485, 8, 0, 0, 967, 0, 0, 0, 0, 'Plant White Turnip Seeds', 19034), +(270209, 32648, 0, 0, 70190, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe White Turnips', 19034), +(270210, 32648, 1, 1, 74850, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270211, 32649, 0, 0, 65479, 8, 0, 0, 961, 0, 0, 0, 0, 'Plant Green Cabbage Seeds', 19034), +(270212, 32650, 0, 0, 66908, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Green Cabbages', 19034), +(270213, 32650, 1, 1, 74840, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270214, 32652, 0, 0, 70112, 1, 0, 0, 1532, 0, 0, 0, 0, 'Speak to Jaina Proudmoore to begin your mission', 19034), +(270215, 32652, 0, 1, 69923, 1, 0, 0, 0, 0, 0, 0, 0, 'Assault the Lightning Vein Mines', 19034), +(270216, 32653, 0, 0, 66736, 8, 0, 0, 1115, 0, 0, 0, 0, 'Plant Striped Melon Seeds', 19034), +(270217, 32656, 0, 1, 67992, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Lady Jaina Proudmoore', 19034), +(270218, 32656, 0, 0, 69534, 1, 0, 0, 1538, 0, 0, 0, 0, 'Capture the Foot of Lei Shen', 19034), +(270219, 32657, 0, 0, 66910, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Striped Melons', 19034), +(270220, 32657, 1, 1, 74848, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270221, 32658, 0, 0, 65482, 8, 0, 0, 964, 0, 0, 0, 0, 'Plant Mogu Pumpkin Seeds', 19034), +(270222, 32659, 0, 0, 70192, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Mogu Pumpkins', 19034), +(270223, 32659, 1, 1, 74842, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270224, 32262, 0, 0, 70217, 5, 0, 0, 0, 0, 0, 0, 0, 'Free Sunreaver Captives', 19034), +(270225, 32636, 0, 0, 70220, 5, 0, 0, 0, 0, 0, 0, 0, 'Free Kirin Tor Captives', 19034), +(270228, 32288, 0, 0, 69292, 6, 0, 0, 0, 0, 0, 0, 0, 'Empower Sunreaver Perimeter Wards', 19034), +(270229, 32303, 0, 0, 67935, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270230, 32632, 0, 0, 67933, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270231, 32213, 0, 0, 70269, 10, 0, 0, 0, 0, 0, 0, 0, 'Kirin Tor agents slain', 19034), +(270232, 32301, 0, 0, 70268, 10, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver agents slain', 19034), +(270233, 32637, 0, 0, 70272, 7, 0, 0, 0, 0, 0, 0, 0, 'Sunreaver Mana Collectors destroyed', 19034), +(270234, 32305, 0, 0, 70273, 7, 0, 0, 0, 0, 0, 0, 0, 'Kirin Tor Mana Foci destroyed', 19034), +(270236, 32276, 0, 0, 70281, 1, 0, 0, 1526, 0, 0, 0, 0, 'Speak to Lor''themar Theron to begin your mission', 19034), +(270237, 32276, 0, 1, 69755, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure the lower city', 19034), +(270238, 32654, 0, 0, 70282, 1, 0, 0, 1525, 0, 0, 0, 0, 'Speak to Lady Jaina Proudmoore to begin your mission', 19034), +(270239, 32654, 0, 1, 69755, 1, 0, 0, 0, 0, 0, 0, 0, 'Secure the lower city', 19034), +(270240, 32633, 1, 0, 95094, 1, 0, 0, 1560, 0, 0, 0, 0, '', 19034), +(270241, 32278, 0, 0, 70211, 1, 0, 0, 1527, 0, 0, 0, 0, 'Infiltrate Stormsea Landing', 19034), +(270242, 32592, 6, -1, 1359, 42000, 0, 0, 0, 0, 0, 0, 0, 'Earn Exalted Reputation with the Black Prince', 19034), +(270243, 32264, 1, 0, 95340, 1, 0, 0, 1561, 0, 0, 0, 0, '', 19034), +(270244, 32655, 0, 0, 70211, 1, 0, 0, 1527, 0, 0, 0, 0, 'Infiltrate Stormsea Landing', 19034), +(270245, 32681, 0, 0, 70364, 1, 0, 0, 0, 0, 0, 0, 0, 'Isle of Thunder discovered', 19034), +(270246, 32680, 0, 0, 70365, 1, 0, 0, 0, 0, 0, 0, 0, 'Isle of Thunder discovered', 19034), +(270247, 32682, 0, 0, 70454, 1, 0, 0, 850, 0, 0, 0, 0, 'Ask Farmer Yoon to join the Tillers council', 19034), +(270248, 32683, 0, 0, 70512, 1, 0, 0, 0, 0, 0, 0, 0, 'Fashion a Ghostly Skeleton Key', 19034), +(270249, 32683, 1, 1, 82960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270250, 32607, 0, 0, 69272, 1, 0, 0, 1543, 1544, 0, 0, 0, 'Warship Captain slain', 19034), +(270251, 32607, 1, 1, 95371, 1, 0, 0, 1568, 0, 0, 0, 0, '', 19034), +(270252, 32676, 0, 0, 69272, 1, 0, 0, 1543, 1544, 0, 0, 0, 'Warship Captain slain', 19034), +(270253, 32676, 1, 1, 95371, 1, 0, 0, 1567, 0, 0, 0, 0, '', 19034), +(270256, 32685, 1, 0, 74866, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270258, 32608, 1, 0, 95372, 1, 0, 0, 1546, 1547, 0, 0, 0, '', 19034), +(270259, 32677, 1, 0, 95372, 1, 0, 0, 1546, 1547, 0, 0, 0, '', 19034), +(270260, 32686, 1, 0, 95383, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270261, 32687, 1, 0, 95384, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270262, 32688, 1, 0, 95385, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270263, 32689, 1, 0, 95386, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270264, 32690, 1, 0, 95387, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270265, 32691, 1, 0, 95388, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270266, 32692, 1, 0, 95389, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270267, 32693, 1, 0, 95390, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270268, 32710, 0, 0, 70429, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270269, 32711, 0, 0, 70243, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270270, 32712, 0, 0, 69843, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270271, 32713, 0, 0, 70430, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270276, 32718, 4, -1, 738, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270277, 32719, 4, -1, 738, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270278, 32716, 0, 0, 70238, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270279, 32714, 0, 0, 70276, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270280, 32716, 0, 1, 70249, 2, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270282, 32715, 0, 0, 70440, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270283, 32591, 1, 1, 72095, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270286, 32594, 0, 0, 70456, 1, 0, 0, 0, 0, 0, 0, 0, 'Unlock the Foot of Lei Shen', 19034), +(270287, 32414, 3, 0, 67848, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Seamus Goldenkicks', 19034), +(270288, 32594, 1, 1, 95433, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270289, 32296, 0, 0, 70316, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak to Taoshi in Bleak Hollow', 19034), +(270290, 32296, 0, 1, 70321, 1, 0, 0, 1555, 0, 0, 0, 0, 'Raid the Thunder King''s Citadel', 19034), +(270295, 32724, 0, 1, 69461, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270296, 32724, 1, 0, 93731, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(270297, 32595, 0, 0, 70466, 1, 0, 0, 0, 0, 0, 0, 0, 'Travelled to Mason''s Folly', 19034), +(270298, 32595, 0, 1, 70467, 1, 0, 0, 0, 0, 0, 0, 0, 'Spoke with Wrathion', 19034), +(270299, 32423, 3, 0, 68687, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Vereesa Windrunner', 19034), +(270301, 32707, 1, 0, 94221, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270302, 32680, 0, 1, 70358, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Elsia', 19034), +(270303, 32681, 0, 1, 70360, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Vereesa', 19034), +(270304, 32726, 0, 0, 70512, 1, 0, 0, 0, 0, 0, 0, 0, 'Fashion a Ghostly Skeleton Key', 19034), +(270305, 32726, 1, 1, 82960, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270306, 32708, 0, 0, 70514, 1, 0, 0, 0, 0, 0, 0, 0, 'Echo of Kros summoned', 19034), +(270307, 32708, 0, 1, 69341, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270432, 32805, 0, 0, 70924, 1, 0, 0, 1588, 0, 0, 0, 0, 'Speak with Yu''lon', 19034), +(270433, 32805, 0, 1, 70926, 1, 0, 0, 1639, 0, 0, 0, 0, 'Speak with Chi-Ji', 19034), +(270434, 32805, 0, 2, 70927, 1, 0, 0, 1640, 0, 0, 0, 0, 'Speak with Xuen', 19034), +(270435, 32805, 0, 3, 70928, 1, 0, 0, 1631, 0, 0, 0, 0, 'Speak with Niuzao', 19034), +(270436, 32805, 0, 4, 70931, 1, 0, 0, 1590, 1601, 1606, 1607, 0, 'Complete one of the Celestial''s Challenges', 19034), +(270442, 32806, 0, 0, 70544, 1, 0, 0, 1587, 0, 0, 0, 0, '"Blood in the Snow" scenario complete', 19034), +(270444, 32807, 0, 0, 71123, 1, 0, 0, 1587, 0, 0, 0, 0, '"The Dark Heart of Pandaria" scenario complete', 19034), +(270457, 32808, 0, 0, 71026, 1, 0, 0, 1589, 0, 0, 0, 0, 'Locate Amber and Sully in Durotar near Skull Rock', 19034), +(270483, 32819, 1, 1, 97530, 15, 0, 0, 1651, 0, 0, 0, 0, '', 19034), +(270484, 32819, 1, 2, 97543, 15, 0, 0, 1649, 0, 0, 0, 0, '', 19034), +(270485, 32819, 1, 3, 97544, 15, 0, 0, 1650, 0, 0, 0, 0, '', 19034), +(270486, 32819, 1, 4, 97545, 15, 0, 0, 1648, 0, 0, 0, 0, '', 19034), +(270488, 32816, 0, 0, 70981, 1, 0, 0, 1641, 0, 0, 0, 0, 'First Anchor', 19034), +(270489, 32816, 0, 1, 71162, 1, 0, 0, 1642, 0, 0, 0, 0, 'Second Anchor', 19034), +(270490, 32816, 0, 2, 71171, 1, 0, 0, 1643, 0, 0, 0, 0, 'Third Anchor', 19034), +(270491, 32816, 0, 3, 71194, 1, 0, 0, 1644, 0, 0, 0, 0, 'Fourth Anchor', 19034), +(270492, 32816, 0, 4, 71196, 1, 0, 0, 1645, 0, 0, 0, 0, 'Final Anchor', 19034), +(270494, 32837, 0, 0, 71565, 1, 0, 0, 1653, 1654, 1682, 0, 0, 'Grandpa Grumplefloot defeated', 19034), +(270495, 32839, 0, 0, 71573, 1, 0, 0, 1655, 1656, 1683, 0, 0, 'Argh defeated', 19034), +(270496, 32841, 0, 0, 71567, 1, 0, 0, 1657, 1658, 1684, 0, 0, 'Master Boom Boom defeated', 19034), +(270497, 32843, 0, 0, 71568, 1, 0, 0, 1659, 1660, 1685, 0, 0, 'Razorgrin defeated', 19034), +(270498, 32845, 0, 0, 71569, 1, 0, 0, 1661, 1662, 1686, 0, 0, 'Splat defeated', 19034), +(270499, 32847, 0, 0, 71570, 1, 0, 0, 1663, 1664, 1687, 0, 0, 'Mecha-Bruce defeated', 19034), +(270500, 32849, 0, 0, 70649, 1, 0, 0, 1665, 1666, 1688, 1689, 0, 'Dippy and Doopy defeated', 19034), +(270501, 32851, 0, 0, 71571, 1, 0, 0, 1667, 1668, 1690, 0, 0, 'Blingtron 3000 defeated', 19034), +(270502, 32853, 0, 0, 70621, 1, 0, 0, 1669, 1670, 1691, 0, 0, 'Mingus Diggs defeated', 19034), +(270503, 32855, 0, 0, 71574, 1, 0, 0, 1671, 1672, 1692, 0, 0, 'Blind Hero defeated', 19034), +(270504, 32857, 0, 0, 71572, 1, 0, 0, 1673, 1674, 1693, 0, 0, 'Ro-Shambo defeated', 19034), +(270505, 32859, 0, 0, 71566, 1, 0, 0, 1675, 1676, 1694, 0, 0, 'Ty''thar defeated', 19034), +(270509, 32836, 1, 0, 97978, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270510, 32838, 1, 0, 97979, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270511, 32840, 1, 0, 97980, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270512, 32842, 1, 0, 97981, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270513, 32844, 1, 0, 97982, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270514, 32846, 1, 0, 97983, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270515, 32848, 1, 0, 97984, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270516, 32850, 1, 0, 97985, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270517, 32852, 1, 0, 97986, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270518, 32854, 1, 0, 97987, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270519, 32856, 1, 0, 97988, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270520, 32858, 1, 0, 97990, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270521, 32861, 0, 0, 71299, 1, 0, 0, 0, 0, 0, 0, 0, 'Travel to Mason''s Folly', 19034), +(270522, 32861, 0, 1, 71300, 1, 0, 0, 1647, 0, 0, 0, 0, 'Speak with Wrathion', 19034), +(270525, 32862, 1, 1, 97530, 150, 0, 0, 1651, 0, 0, 0, 0, '', 19034), +(270526, 32862, 1, 3, 97544, 150, 0, 0, 1650, 0, 0, 0, 0, '', 19034), +(270527, 32862, 1, 4, 97545, 150, 0, 0, 1648, 0, 0, 0, 0, '', 19034), +(270528, 32862, 1, 2, 97543, 150, 0, 0, 1649, 0, 0, 0, 0, '', 19034), +(270529, 32863, 13, 4, 0, 10, 0, 0, 0, 0, 0, 0, 0, 'Win PvP Pet Battles', 19034), +(270546, 32868, 12, 6, 1189, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Greyhoof', 19034), +(270547, 32868, 12, 7, 1190, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Lucky Yi', 19034), +(270552, 32868, 12, 12, 1195, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Skitterer Xi''a', 19034), +(270554, 32869, 12, 4, 1187, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Gorespine', 19034), +(270555, 32869, 12, 5, 1188, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat No-No', 19034), +(270558, 32869, 12, 8, 1191, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Ti''un the Wanderer', 19034), +(270566, 32872, 1, 1, 97530, 150, 0, 0, 1651, 0, 0, 0, 0, '', 19034), +(270567, 32872, 1, 3, 97544, 150, 0, 0, 1650, 0, 0, 0, 0, '', 19034), +(270568, 32872, 1, 4, 97545, 150, 0, 0, 1648, 0, 0, 0, 0, '', 19034), +(270569, 32872, 1, 2, 97543, 150, 0, 0, 1649, 0, 0, 0, 0, '', 19034), +(270584, 32808, 0, 1, 71403, 1, 0, 0, 1638, 0, 0, 0, 0, 'Secure transport to Kalimdor', 19034), +(270615, 32900, 0, 0, 71496, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete Heroic Scenario', 19034), +(270618, 32901, 0, 0, 71496, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete Heroic Scenario', 19034), +(270677, 32936, 0, 0, 15133, 13375, 0, 0, 1327, 0, 0, 0, 0, 'Defeat Deer', 19034), +(270690, 32942, 0, 0, 65481, 8, 0, 0, 963, 0, 0, 0, 0, 'Plant Scallion Seeds', 19034), +(270691, 32943, 0, 0, 66906, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Scallions', 19034), +(270692, 32943, 1, 1, 74843, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270693, 32944, 0, 0, 65480, 8, 0, 0, 962, 0, 0, 0, 0, 'Plant Juicycrunch Carrot Seeds', 19034), +(270694, 32945, 0, 0, 66907, 8, 0, 0, 0, 0, 0, 0, 0, 'Harvest Ripe Juicycrunch Carrots', 19034), +(270695, 32945, 1, 1, 74841, 40, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270827, 31939, 1, 1, 76115, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270840, 33098, 4, -1, 777, 5000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270847, 33105, 0, 0, 71865, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270848, 33024, 1, 0, 103651, 20, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270849, 33107, 0, 0, 72726, 1, 1, 0, 1734, 0, 0, 0, 0, 'Read the scroll and defeat the Ghost of Lin Da-Gu', 19034), +(270850, 32974, 0, 0, 72751, 1, 0, 0, 0, 0, 0, 0, 0, 'First clue found', 19034), +(270851, 32975, 0, 0, 72754, 1, 0, 0, 0, 0, 0, 0, 0, 'Next clue found', 19034), +(270852, 32976, 0, 0, 72755, 1, 0, 0, 0, 0, 0, 0, 0, 'Treasure found', 19034), +(270889, 33022, 0, 0, 72900, 20, 0, 0, 0, 0, 0, 0, 0, 'Sacks of Grain placed in wagon', 19034), +(270891, 33026, 1, 0, 101776, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270899, 33027, 0, 0, 72984, 1, 0, 0, 0, 0, 0, 0, 0, 'Find the Secret Ingredient', 19034), +(270915, 33104, 0, 0, 72723, 1, 0, 0, 505, 0, 0, 0, 0, 'Meet Wrathion at the Seat of Knowledge', 19034), +(270916, 33104, 0, 1, 61962, 1, 0, 0, 1746, 0, 0, 0, 0, 'Share Your Story', 19034), +(270917, 33133, 4, -1, 738, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270918, 33134, 4, -1, 738, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270923, 33137, 0, 0, 73159, 1, 0, 0, 1758, 0, 0, 0, 0, 'Celestial Tournament won', 19034), +(270947, 33020, 0, 0, 56439, 1, 1, 0, 0, 0, 0, 0, 0, 'Defeat the Sha of Doubt', 19034), +(270949, 33027, 0, 1, 73365, 1, 0, 0, 1744, 0, 0, 0, 0, 'Queue for your first noodle stand shift through Sungshin Ironpaw', 19034), +(270950, 33024, 0, 1, 73389, 1, 0, 0, 0, 0, 0, 0, 0, 'Create a Noodle Cart Kit', 19034), +(270951, 33026, 0, 1, 73390, 1, 0, 0, 0, 0, 0, 0, 0, 'Create a Deluxe Noodle Cart Kit', 19034), +(270961, 33146, 0, 0, 73416, 1, 0, 0, 1744, 0, 0, 0, 0, 'Queue for your next shift through Sungshin Ironpaw', 19034), +(270962, 33146, 0, 1, 73417, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete a shift at the Halfhill noodle stand', 19034), +(270963, 33100, 0, 0, 71955, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Yu''lon in combat', 19034), +(270964, 33100, 0, 1, 71952, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Chi-Ji in combat', 19034), +(270965, 33100, 0, 2, 71953, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Xuen in combat', 19034), +(270966, 33100, 0, 3, 71954, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeat Niuzao in combat', 19034), +(270981, 33211, 0, 0, 73570, 1, 0, 0, 505, 0, 0, 0, 0, 'Answered Evelyna''s question', 19034), +(270987, 33161, 0, 0, 73577, 1, 0, 0, 0, 0, 0, 0, 0, 'Cavern of Lost Spirits', 19034), +(270988, 33161, 0, 1, 73576, 1, 0, 0, 0, 0, 0, 0, 0, 'Croaking Hollow', 19034), +(270989, 33161, 0, 2, 73579, 1, 0, 0, 0, 0, 0, 0, 0, 'Firewalker Ruins', 19034), +(270990, 33161, 0, 3, 73578, 1, 0, 0, 0, 0, 0, 0, 0, 'Misty Strand', 19034), +(270991, 33161, 0, 4, 73574, 1, 0, 0, 0, 0, 0, 0, 0, 'Old Pi''jiu', 19034), +(270992, 33161, 0, 5, 73575, 1, 0, 0, 0, 0, 0, 0, 0, 'Red Stone Run', 19034), +(270994, 33222, 11, 0, 73626, 1, 1, 0, 1753, 0, 0, 0, 0, 'Defeat Little Tommy Newcomer', 19034), +(270997, 33228, 4, -1, 777, 1000, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(270998, 33228, 3, 0, 73305, 1, 0, 0, 505, 0, 0, 0, 0, 'Meet Mistweaver Ai', 19034), +(270999, 33228, 3, 1, 73306, 1, 0, 0, 505, 0, 0, 0, 0, 'Meet Mistweaver Ku', 19034), +(271002, 33234, 1, 0, 104264, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271003, 33235, 1, 0, 104265, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271004, 33236, 1, 0, 104266, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271006, 33238, 1, 0, 104267, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271007, 33239, 1, 0, 104257, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271017, 33248, 0, 0, 72319, 1, 0, 0, 1757, 0, 0, 0, 0, 'Speak with Trial Master Rotun to enter Proving Grounds', 19034), +(271018, 33249, 0, 0, 72319, 1, 0, 0, 1757, 0, 0, 0, 0, 'Speak with Trial Master Rotun to enter Proving Grounds', 19034), +(271019, 33250, 1, 0, 104286, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271058, 33266, 0, 0, 73404, 1, 0, 0, 0, 0, 0, 0, 0, 'Kuruna located', 19034), +(271075, 33323, 0, 0, 73404, 1, 0, 0, 0, 0, 0, 0, 0, 'Kuruna located', 19034), +(271090, 33332, 1, 2, 103977, 1, 0, 0, 1780, 0, 0, 0, 0, '', 19034), +(271093, 33333, 0, 2, 73982, 1, 0, 0, 0, 0, 0, 0, 0, 'Hidden Treasure found', 19034), +(271096, 33334, 0, 2, 73983, 5, 0, 0, 0, 0, 0, 0, 0, 'Rare creatures vanquished', 19034), +(271099, 33335, 3, 2, 73303, 1, 0, 0, 505, 0, 0, 0, 0, 'Speak with Emperor Shaohao', 19034), +(271102, 33336, 1, 0, 105715, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271108, 33337, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271117, 33338, 1, 0, 105715, 50, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271121, 33340, 0, 2, 73991, 1, 0, 0, 0, 0, 0, 0, 0, 'Timeless Nutriment', 19034), +(271122, 33341, 2, 2, 222776, 1, 0, 0, 0, 0, 0, 0, 0, 'Celestial blessing requested', 19034), +(271123, 33342, 6, -1, 1492, 9000, 0, 0, 0, 0, 0, 0, 0, 'Reach Honored with Shaohao.', 19034), +(271124, 33343, 0, 2, 73666, 1, 0, 0, 1781, 1787, 0, 0, 0, '', 19034), +(271133, 33349, 0, 2, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271134, 33350, 0, 0, 73984, 1, 0, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271151, 33349, 0, 0, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271155, 33354, 1, 0, 105891, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271162, 33358, 0, 0, 73416, 1, 0, 0, 1744, 0, 0, 0, 0, 'Queue for your next shift through Sungshin Ironpaw', 19034), +(271163, 33358, 0, 1, 74052, 1, 0, 0, 0, 0, 0, 0, 0, 'Complete the bonus objective during the scenario: Noodle Time', 19034), +(271164, 33350, 0, 1, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271165, 33350, 0, 2, 74004, 1, 0, 0, 0, 0, 0, 0, 0, 'End Marker', 19034), +(271167, 33374, 0, 2, 74093, 20, 0, 0, 0, 0, 0, 0, 0, 'Elite creatures vanquished', 19034), +(271168, 33375, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271169, 33376, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271170, 33377, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271171, 33378, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271172, 33379, 0, 0, 74094, 1, 0, 0, 0, 0, 0, 0, 0, 'Vision of Time used', 19034), +(271183, 33350, 0, 3, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271196, 33398, 0, 2, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271197, 33398, 0, 0, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271203, 33349, 0, 1, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271204, 33398, 0, 1, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271251, 33416, 0, 2, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271252, 33416, 0, 1, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271253, 33416, 0, 0, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271259, 33416, 0, 3, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271260, 33416, 0, 4, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Finish in 12 bell tolls', 19034), +(271261, 33398, 0, 3, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271262, 33398, 0, 4, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Finish in 15 bell tolls', 19034), +(271263, 33349, 0, 3, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271264, 33349, 0, 4, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Finish in 15', 19034), +(271289, 33422, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271290, 33422, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271291, 33422, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271292, 33422, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271293, 33422, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271299, 33424, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271300, 33424, 0, 0, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271301, 33424, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271302, 33424, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271303, 33425, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271304, 33425, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271305, 33425, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271306, 33425, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271307, 33425, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271311, 33429, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271312, 33429, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271313, 33429, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271314, 33429, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271315, 33429, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271323, 33431, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271324, 33431, 0, 1, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271325, 33431, 0, 0, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271326, 33431, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271327, 33431, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271328, 33432, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271329, 33432, 0, 1, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271330, 33432, 0, 0, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271331, 33432, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271332, 33432, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271367, 33455, 0, 4, 74536, 1, 0, 0, 0, 0, 0, 0, 0, 'Go through the Arch', 19034), +(271368, 33455, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271369, 33455, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271373, 33455, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271374, 33455, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271431, 33485, 0, 4, 74536, 1, 0, 0, 0, 0, 0, 0, 0, 'Be at the arche when the race starts', 19034), +(271432, 33485, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271433, 33485, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271434, 33485, 0, 5, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271435, 33485, 0, 6, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271436, 33485, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271437, 33485, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271447, 33492, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271448, 33492, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271449, 33492, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271450, 33492, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271451, 33492, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271455, 33485, 0, 7, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271456, 33485, 0, 8, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271457, 33485, 0, 9, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271458, 33485, 0, 10, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271459, 33485, 0, 11, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271469, 33513, 0, 0, 74435, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271470, 33513, 0, 1, 74347, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271471, 33513, 0, 2, 74412, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271472, 33514, 0, 0, 74434, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(271535, 33561, 0, 4, 74536, 1, 0, 0, 0, 0, 0, 0, 0, 'Be at the arche when the race starts', 19034), +(271536, 33561, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271537, 33561, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271538, 33561, 0, 5, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271539, 33561, 0, 6, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271541, 33561, 0, 7, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271542, 33561, 0, 8, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271543, 33561, 0, 9, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271544, 33561, 0, 10, 74031, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Purple Marker', 19034), +(271545, 33561, 0, 11, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271546, 33561, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271620, 33609, 0, 4, 74333, 1, 0, 0, 0, 0, 0, 0, 0, 'Run Through Arch', 19034), +(271621, 33609, 0, 0, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271622, 33609, 0, 2, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271623, 33609, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271639, 24460, 0, 2, 56526, 1, 2, 0, 0, 0, 0, 0, 0, '', 19034), +(271654, 33634, 0, 0, 24470, 1, 0, 0, 0, 0, 0, 0, 0, '[DNT] Log Description', 19034), +(271878, 33755, 0, 4, 74536, 1, 0, 0, 0, 0, 0, 0, 0, 'Be at the arche when the race starts', 19034), +(271879, 33755, 0, 1, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271880, 33755, 0, 0, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271882, 33755, 0, 6, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271883, 33755, 0, 7, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271884, 33755, 0, 8, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271886, 33755, 0, 10, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271887, 33755, 0, 11, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271888, 33755, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(271889, 33756, 0, 4, 74536, 1, 0, 0, 0, 0, 0, 0, 0, 'Be at the arche when the race starts', 19034), +(271893, 33756, 0, 7, 73984, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Blue Marker', 19034), +(271894, 33756, 0, 8, 73988, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Green Marker', 19034), +(271895, 33756, 0, 10, 74030, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit Red Marker', 19034), +(271896, 33756, 0, 11, 74004, 1, 2, 0, 0, 0, 0, 0, 0, 'Hit End Marker', 19034), +(271897, 33756, 0, 3, 74299, 1, 2, 0, 0, 0, 0, 0, 0, 'Trial Passed?', 19034), +(272147, 33906, 0, 0, 15133, 13375, 0, 0, 1327, 0, 0, 0, 0, 'Defeat Deer', 19034), +(272423, 30759, 2, 0, 223458, 1, 0, 0, 538, 0, 0, 0, 0, 'Sotelo''s Plunger used', 19034), +(272585, 34359, 0, 0, 78173, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(272918, 34672, 0, 0, 75155, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(272919, 34673, 0, 0, 75155, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273076, 34807, 0, 0, 80080, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273829, 35460, 0, 0, 76189, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034); -- 273829 +INSERT INTO `quest_objectives` (`ID`, `QuestID`, `Type`, `StorageIndex`, `ObjectID`, `Amount`, `Flags`, `UnkFloat`, `VisualEffect1`, `VisualEffect2`, `VisualEffect3`, `VisualEffect4`, `VisualEffect5`, `Description`, `VerifiedBuild`) VALUES +(273832, 35463, 0, 0, 76886, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273833, 35462, 0, 0, 82298, 3, 0, 0, 0, 0, 0, 0, 0, 'Iron Demolishers destroyed', 19034), +(273844, 35486, 1, 0, 113399, 1, 0, 0, 2465, 0, 0, 0, 0, '', 19034), +(273845, 35486, 1, 1, 113400, 1, 0, 0, 2468, 0, 0, 0, 0, '', 19034), +(273846, 35486, 1, 2, 113401, 1, 0, 0, 2469, 0, 0, 0, 0, '', 19034), +(273848, 35488, 0, 0, 78345, 8, 0, 0, 0, 0, 0, 0, 0, 'Dreadmaul ogres slain', 19034), +(273852, 35495, 0, 0, 82451, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(273854, 35500, 0, 0, 82458, 1, 0, 0, 2101, 0, 0, 0, 0, '', 19034), +(273880, 35492, 2, 0, 232526, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted at Nethergarde entrance', 19034), +(273881, 35492, 2, 1, 232531, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted in the center of Nethergarde', 19034), +(273882, 35492, 2, 2, 232532, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted outside of the main keep', 19034), +(273887, 35494, 1, 0, 113395, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273888, 35494, 1, 1, 113396, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273889, 35494, 1, 2, 113397, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(273892, 35592, 14, 0, 36969, 1, 0, 0, 0, 0, 0, 0, 0, 'Win Two Battlegrounds', 19034), +(273893, 35496, 2, 0, 232625, 3, 0, 0, 0, 0, 0, 0, 0, 'Poisoned cooking pot', 19034), +(273896, 35604, 14, 0, 37014, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Alterac Valley', 19034), +(273897, 35604, 14, 1, 37016, 1, 0, 0, 0, 0, 0, 0, 0, 'Win A Battle in Arathi Basin', 19034), +(273898, 35604, 14, 2, 36996, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Deepwind Gorge', 19034), +(273899, 35604, 14, 3, 36998, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Eye of the Storm', 19034), +(273900, 35604, 14, 4, 37000, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Isle of Conquest', 19034), +(273901, 35604, 14, 5, 37002, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Silvershard Mines', 19034), +(273902, 35604, 14, 6, 37004, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Strand of the Ancients', 19034), +(273903, 35604, 14, 7, 37006, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Temple of Kotmogu', 19034), +(273904, 35604, 14, 8, 37008, 1, 0, 0, 0, 0, 0, 0, 0, 'Win the Battle for Gilneas', 19034), +(273905, 35604, 14, 9, 37010, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Twin Peaks', 19034), +(273906, 35604, 14, 10, 37012, 1, 0, 0, 0, 0, 0, 0, 0, 'Win a Battle in Warsong Gulch', 19034), +(273911, 35464, 0, 0, 82774, 3, 0, 0, 0, 0, 0, 0, 0, 'Stop the Executions', 19034), +(274031, 35744, 0, 0, 82774, 3, 0, 0, 0, 0, 0, 0, 0, 'Stop the Executions', 19034), +(274032, 35745, 0, 0, 76189, 8, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274033, 35746, 0, 0, 82298, 3, 0, 0, 0, 0, 0, 0, 0, 'Iron Demolishers destroyed', 19034), +(274034, 35748, 0, 0, 76886, 5, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274036, 35750, 1, 0, 113399, 1, 0, 0, 2465, 0, 0, 0, 0, '', 19034), +(274037, 35750, 1, 1, 113400, 1, 0, 0, 2468, 0, 0, 0, 0, '', 19034), +(274038, 35750, 1, 2, 113401, 1, 0, 0, 2469, 0, 0, 0, 0, '', 19034), +(274039, 35751, 2, 0, 233201, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted at Nethergarde entrance', 19034), +(274040, 35751, 2, 1, 233202, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted in the center of Nethergarde', 19034), +(274041, 35751, 2, 2, 233203, 1, 0, 0, 2099, 0, 0, 0, 0, 'Flag planted outside of the main keep', 19034), +(274049, 35760, 0, 0, 82451, 1, 1, 0, 0, 0, 0, 0, 0, '', 19034), +(274050, 35761, 1, 0, 113439, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274051, 35761, 1, 1, 113437, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274052, 35761, 1, 2, 113436, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274053, 35762, 0, 0, 78345, 8, 0, 0, 0, 0, 0, 0, 0, 'Dreadmaul ogres slain', 19034), +(274054, 35763, 0, 0, 82918, 1, 0, 0, 2101, 0, 0, 0, 0, '', 19034), +(274055, 35764, 2, 0, 232625, 3, 0, 0, 0, 0, 0, 0, 0, 'Poisoned cooking pot', 19034), +(274309, 9583, 1, 0, 2589, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(274666, 36379, 2, 0, 234576, 1, 0, 0, 2099, 0, 0, 0, 0, 'Use the telescope', 19034), +(274669, 36382, 2, 0, 234619, 1, 0, 0, 2099, 0, 0, 0, 0, 'Use the telescope', 19034), +(274798, 36471, 11, 0, 85519, 1, 0, 0, 1416, 0, 0, 0, 0, 'Defeat Christoph VonFeasel', 19034), +(274819, 36481, 0, 0, 85559, 15, 0, 0, 0, 0, 0, 0, 0, 'Rings collected', 19034), +(275342, 36872, 0, 0, 1922, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(275421, 13842, 0, 1, 44414, 1, 2, 0, 0, 0, 0, 0, 0, '', 19034), +(275977, 37201, 11, 0, 83837, 1, 0, 0, 2834, 0, 0, 0, 0, 'Defeat Cymre Brightblade', 19034), +(275979, 37203, 11, 0, 87124, 1, 0, 0, 2835, 0, 0, 0, 0, 'Defeat Ashlei', 19034), +(275982, 37205, 11, 0, 87122, 1, 0, 0, 2836, 0, 0, 0, 0, 'Defeat Gargra', 19034), +(275984, 37206, 11, 0, 87110, 1, 0, 0, 2837, 0, 0, 0, 0, 'Defeat Tarr the Terrible', 19034), +(275985, 37207, 11, 0, 87123, 1, 0, 0, 2838, 0, 0, 0, 0, 'Defeat Vesharr', 19034), +(275986, 37208, 11, 0, 87125, 1, 0, 0, 2839, 0, 0, 0, 0, 'Defeat Taralune', 19034), +(276135, 27635, 3, 0, 46185, 1, 0, 0, 2889, 0, 0, 0, 0, 'Decontamination Process started', 19034), +(276209, 37439, 0, 0, 15468, 1, 0, 0, 0, 0, 0, 0, 0, 'Arcane Torrent unleashed', 19034), +(276210, 37440, 1, 0, 20482, 6, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276219, 37442, 2, 0, 180516, 1, 0, 0, 2099, 0, 0, 0, 0, 'Shrine of Dath''Remar Read', 19034), +(276220, 37443, 1, 0, 20470, 1, 0, 0, 3203, 0, 0, 0, 0, '', 19034), +(276221, 37443, 1, 1, 20471, 1, 0, 0, 3204, 0, 0, 0, 0, '', 19034), +(276222, 37443, 1, 2, 20472, 1, 0, 0, 3202, 0, 0, 0, 0, '', 19034), +(276226, 37444, 0, 0, 16534, 6, 0, 0, 0, 0, 0, 0, 0, 'Nestlewood Owlkin inoculated', 19034), +(276227, 37444, 1, 1, 22962, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276228, 37445, 1, 0, 22978, 4, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276229, 37446, 0, 0, 10556, 4, 0, 0, 0, 0, 0, 0, 0, 'Peons Awoken', 19034), +(276230, 37446, 1, 1, 16114, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276238, 218, 0, 3, 946, 3, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276325, 29680, 3, 0, 57710, 1, 28, 0, 2099, 0, 0, 0, 0, '', 19034), +(276326, 29775, 3, 0, 59497, 1, 28, 0, 2099, 0, 0, 0, 0, '', 19034), +(276327, 29800, 3, 0, 57741, 1, 28, 0, 2099, 0, 0, 0, 0, '', 19034), +(276387, 26364, 3, 1, 42849, 1, 4, 0, 505, 0, 0, 0, 0, 'Talk to High Tinker Mekkatorque', 19034), +(276417, 37541, 1, 0, 119316, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276418, 37540, 1, 0, 119310, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276419, 37543, 1, 0, 119323, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276426, 37547, 1, 0, 120207, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276427, 37548, 1, 0, 120210, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276428, 37549, 1, 0, 120208, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276429, 37550, 1, 0, 120211, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276430, 37551, 1, 0, 120206, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276431, 37552, 1, 0, 120209, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276432, 37553, 1, 0, 120277, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276433, 37554, 1, 0, 120278, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276434, 37555, 1, 0, 120279, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276435, 37557, 1, 0, 120280, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276436, 37558, 1, 0, 120282, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276437, 37559, 1, 0, 120281, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276438, 37560, 1, 0, 120283, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276439, 37561, 1, 0, 120285, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276440, 37562, 1, 0, 120284, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276467, 37567, 3, 0, 34244, 1, 0, 0, 0, 0, 0, 0, 0, '', 19034), +(276517, 37597, 3, 0, 89138, 1, 0, 0, 2099, 0, 0, 0, 0, '', 19034), +(276692, 27674, 0, 0, 46293, 1, 0, 0, 2099, 0, 0, 0, 0, 'Speak to Torben Zapblast', 19034), +(276783, 36498, 3, 0, 82270, 1, 28, 0, 0, 0, 0, 0, 0, '', 19034), +(276785, 36499, 3, 0, 82851, 1, 28, 0, 0, 0, 0, 0, 0, '', 19034); -- 276785 diff --git a/sql/updates/world/2014_12_19_01_world.sql b/sql/updates/world/2014_12_19_01_world.sql new file mode 100644 index 00000000000..4285454ca95 --- /dev/null +++ b/sql/updates/world/2014_12_19_01_world.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `spell_bonus_data`; +DELETE FROM `command` WHERE `name`='reload spell_bonus_data'; diff --git a/src/server/bnetserver/Packets/AuthenticationPackets.h b/src/server/bnetserver/Packets/AuthenticationPackets.h index bcaa0e72011..fd5838720ab 100644 --- a/src/server/bnetserver/Packets/AuthenticationPackets.h +++ b/src/server/bnetserver/Packets/AuthenticationPackets.h @@ -60,7 +60,7 @@ namespace Battlenet std::string Locale; std::vector<Component> Components; std::string Login; - uint8 Region; + uint8 Region = 0; std::string GameAccountName; }; @@ -98,7 +98,7 @@ namespace Battlenet std::string Locale; std::vector<Component> Components; std::string Login; - uint64 Compatibility; + uint64 Compatibility = 0; }; class ResponseFailure @@ -138,8 +138,8 @@ namespace Battlenet { public: LogonResponse() : ServerPacket(PacketHeader(SMSG_LOGON_RESPONSE, AUTHENTICATION)), - PingTimeout(120000), FirstName(""), LastName(""), AccountId(0), Region(2), Flags(0), - GameAccountRegion(2), GameAccountName(""), FailedLogins(0) + PingTimeout(120000), AccountId(0), Region(2), Flags(0), + GameAccountRegion(2), GameAccountFlags(0), FailedLogins(0) { } diff --git a/src/server/bnetserver/Packets/BitStream.h b/src/server/bnetserver/Packets/BitStream.h index 54c61ab3bbf..ef2c85a63c8 100644 --- a/src/server/bnetserver/Packets/BitStream.h +++ b/src/server/bnetserver/Packets/BitStream.h @@ -217,6 +217,7 @@ namespace Battlenet uint8* GetBuffer() { return _buffer.data(); } uint8 const* GetBuffer() const { return _buffer.data(); } + uint32 GetReadPos() const { return _readPos; } size_t GetSize() const { return ((_writePos + 7) & ~7) / 8; } // These methods are meant to only be used when their corresponding actions in the client ignore the value completely 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/bnetserver/Packets/CachePackets.h b/src/server/bnetserver/Packets/CachePackets.h index a65ab2651c8..57ccd448081 100644 --- a/src/server/bnetserver/Packets/CachePackets.h +++ b/src/server/bnetserver/Packets/CachePackets.h @@ -54,8 +54,8 @@ namespace Battlenet std::string Channel; std::string ItemName; std::string Locale; - uint32 Index; - int32 ReferenceTime; + uint32 Index = 0; + int32 ReferenceTime = 0; }; class GetStreamItemsResponse final : public ServerPacket @@ -70,7 +70,7 @@ namespace Battlenet void Write() override; std::string ToString() const override; - uint32 Index; + uint32 Index = 0; std::vector<ModuleInfo*> Modules; }; } diff --git a/src/server/bnetserver/Packets/ConnectionPackets.h b/src/server/bnetserver/Packets/ConnectionPackets.h index 8572cd5d854..238b2bff760 100644 --- a/src/server/bnetserver/Packets/ConnectionPackets.h +++ b/src/server/bnetserver/Packets/ConnectionPackets.h @@ -63,6 +63,8 @@ namespace Battlenet void Read() override { } std::string ToString() const override; void CallHandler(Session* session) override; + uint8* GetRemainingData() { return _stream.GetBuffer() + (((_stream.GetReadPos() + 7) & ~7) / 8); } + size_t GetRemainingSize() { return _stream.GetSize() - (((_stream.GetReadPos() + 7) & ~7) / 8); } }; class LogoutRequest final : public ClientPacket @@ -89,8 +91,8 @@ namespace Battlenet void Read() override; std::string ToString() const override; - uint16 Timeout; - uint32 Tick; + uint16 Timeout = 0; + uint32 Tick = 0; }; class ConnectionClosing final : public ClientPacket diff --git a/src/server/bnetserver/Packets/FriendsPackets.cpp b/src/server/bnetserver/Packets/FriendsPackets.cpp index 2659ec6204f..8b5d92389af 100644 --- a/src/server/bnetserver/Packets/FriendsPackets.cpp +++ b/src/server/bnetserver/Packets/FriendsPackets.cpp @@ -20,8 +20,8 @@ void Battlenet::Friends::GetFriendsOfFriend::Read() { - uint8 unk = _stream.Read<uint8>(2); - uint32 unk1 = _stream.Read<uint32>(32); + _stream.Read<uint8>(2); + _stream.Read<uint32>(32); } std::string Battlenet::Friends::GetFriendsOfFriend::ToString() const diff --git a/src/server/bnetserver/Packets/FriendsPackets.h b/src/server/bnetserver/Packets/FriendsPackets.h index ea4d6d2ea92..12935ddc4da 100644 --- a/src/server/bnetserver/Packets/FriendsPackets.h +++ b/src/server/bnetserver/Packets/FriendsPackets.h @@ -78,7 +78,7 @@ namespace Battlenet std::string ToString() const override; void CallHandler(Session* session) override; - uint32 SocialNetworkId; + uint32 SocialNetworkId = 0; }; class RealIdFriendInvite final : public ClientPacket diff --git a/src/server/bnetserver/Packets/WoWRealmPackets.h b/src/server/bnetserver/Packets/WoWRealmPackets.h index b411c63100a..dc958db501b 100644 --- a/src/server/bnetserver/Packets/WoWRealmPackets.h +++ b/src/server/bnetserver/Packets/WoWRealmPackets.h @@ -78,7 +78,7 @@ namespace Battlenet std::string ToString() const override; void CallHandler(Session* session) override; - uint32 ClientSeed; + uint32 ClientSeed = 0; RealmId Realm; }; diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp index 0a5a2de499a..fd6784152e8 100644 --- a/src/server/bnetserver/Server/Session.cpp +++ b/src/server/bnetserver/Server/Session.cpp @@ -393,9 +393,10 @@ void Battlenet::Session::HandlePing(Connection::Ping const& /*ping*/) AsyncWrite(new Connection::Pong()); } -void Battlenet::Session::HandleEnableEncryption(Connection::EnableEncryption const& /*enableEncryption*/) +void Battlenet::Session::HandleEnableEncryption(Connection::EnableEncryption& enableEncryption) { _crypt.Init(&K); + _crypt.DecryptRecv(enableEncryption.GetRemainingData(), enableEncryption.GetRemainingSize()); } void Battlenet::Session::HandleLogoutRequest(Connection::LogoutRequest const& /*logoutRequest*/) diff --git a/src/server/bnetserver/Server/Session.h b/src/server/bnetserver/Server/Session.h index ded5170ae32..4a1feb7c8a8 100644 --- a/src/server/bnetserver/Server/Session.h +++ b/src/server/bnetserver/Server/Session.h @@ -69,7 +69,7 @@ namespace Battlenet // Connection void HandlePing(Connection::Ping const& ping); - void HandleEnableEncryption(Connection::EnableEncryption const& enableEncryption); + void HandleEnableEncryption(Connection::EnableEncryption& enableEncryption); void HandleLogoutRequest(Connection::LogoutRequest const& logoutRequest); void HandleConnectionClosing(Connection::ConnectionClosing const& connectionClosing); diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index e808f91db55..b6d15a9632c 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -181,7 +181,7 @@ void PetAI::UpdateAI(uint32 diff) } } - if (spellInfo->HasEffect(SPELL_EFFECT_JUMP_DEST)) + if (spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_JUMP_DEST)) { if (!spellUsed) delete spell; diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 33772c2c165..a9d428a0489 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -62,16 +62,16 @@ void UnitAI::DoMeleeAttackIfReady() } } -bool UnitAI::DoSpellAttackIfReady(uint32 spell) +bool UnitAI::DoSpellAttackIfReady(uint32 spellId) { if (me->HasUnitState(UNIT_STATE_CASTING) || !me->isAttackReady()) return true; - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell)) + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId)) { if (me->IsWithinCombatRange(me->GetVictim(), spellInfo->GetMaxRange(false))) { - me->CastSpell(me->GetVictim(), spell, false); + me->CastSpell(me->GetVictim(), spellInfo, TRIGGERED_NONE); me->resetAttackTimer(); return true; } @@ -90,40 +90,6 @@ void UnitAI::SelectTargetList(std::list<Unit*>& targetList, uint32 num, SelectAg SelectTargetList(targetList, DefaultTargetSelector(me, dist, playerOnly, aura), num, targetType); } -float UnitAI::DoGetSpellMaxRange(uint32 spellId, bool positive) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - return spellInfo ? spellInfo->GetMaxRange(positive) : 0; -} - -void UnitAI::DoAddAuraToAllHostilePlayers(uint32 spellid) -{ - if (me->IsInCombat()) - { - ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (unit->GetTypeId() == TYPEID_PLAYER) - me->AddAura(spellid, unit); - } - } -} - -void UnitAI::DoCastToAllHostilePlayers(uint32 spellid, bool triggered) -{ - if (me->IsInCombat()) - { - ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (unit->GetTypeId() == TYPEID_PLAYER) - me->CastSpell(unit, spellid, triggered); - } - } -} - void UnitAI::DoCast(uint32 spellId) { Unit* target = NULL; @@ -227,9 +193,12 @@ void UnitAI::FillAISpellInfo() UPDATE_TARGET(AITARGET_SELF) else { - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - uint32 targetType = spellInfo->Effects[j].TargetA.GetTarget(); + if (!effect) + continue; + + uint32 targetType = effect->TargetA.GetTarget(); if (targetType == TARGET_UNIT_TARGET_ENEMY || targetType == TARGET_DEST_TARGET_ENEMY) @@ -237,7 +206,7 @@ void UnitAI::FillAISpellInfo() else if (targetType == TARGET_UNIT_DEST_AREA_ENEMY) UPDATE_TARGET(AITARGET_ENEMY) - if (spellInfo->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA) + if (effect->Effect == SPELL_EFFECT_APPLY_AURA) { if (targetType == TARGET_UNIT_TARGET_ENEMY) UPDATE_TARGET(AITARGET_DEBUFF) @@ -282,7 +251,7 @@ void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/) } SpellTargetSelector::SpellTargetSelector(Unit* caster, uint32 spellId) : - _caster(caster), _spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(sSpellMgr->GetSpellInfo(spellId), caster)) + _caster(caster), _spellInfo(sSpellMgr->GetSpellInfo(spellId)) { ASSERT(_spellInfo); } diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 5d67c9546aa..79ba8cbdbbc 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -238,17 +238,13 @@ class UnitAI void AttackStartCaster(Unit* victim, float dist); - void DoAddAuraToAllHostilePlayers(uint32 spellid); void DoCast(uint32 spellId); void DoCast(Unit* victim, uint32 spellId, bool triggered = false); - void DoCastToAllHostilePlayers(uint32 spellid, bool triggered = false); void DoCastVictim(uint32 spellId, bool triggered = false); void DoCastAOE(uint32 spellId, bool triggered = false); - float DoGetSpellMaxRange(uint32 spellId, bool positive = false); - void DoMeleeAttackIfReady(); - bool DoSpellAttackIfReady(uint32 spell); + bool DoSpellAttackIfReady(uint32 spellId); static AISpellInfoType* AISpellInfo; static void FillAISpellInfo(); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 5bf3c41df41..6d8e5d67ebb 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -282,9 +282,9 @@ struct ScriptedAI : public CreatureAI { switch (_difficulty) { - case DUNGEON_DIFFICULTY_NORMAL: + case DIFFICULTY_NORMAL: return normal5; - case DUNGEON_DIFFICULTY_HEROIC: + case DIFFICULTY_HEROIC: return heroic10; default: break; @@ -298,9 +298,9 @@ struct ScriptedAI : public CreatureAI { switch (_difficulty) { - case RAID_DIFFICULTY_10MAN_NORMAL: + case DIFFICULTY_10_N: return normal10; - case RAID_DIFFICULTY_25MAN_NORMAL: + case DIFFICULTY_25_N: return normal25; default: break; @@ -314,13 +314,13 @@ struct ScriptedAI : public CreatureAI { switch (_difficulty) { - case RAID_DIFFICULTY_10MAN_NORMAL: + case DIFFICULTY_10_N: return normal10; - case RAID_DIFFICULTY_25MAN_NORMAL: + case DIFFICULTY_25_N: return normal25; - case RAID_DIFFICULTY_10MAN_HEROIC: + case DIFFICULTY_10_HC: return heroic10; - case RAID_DIFFICULTY_25MAN_HEROIC: + case DIFFICULTY_25_HC: return heroic25; default: break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index cc7864f1f4e..d1a590e24b1 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -823,13 +823,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(e.action.cast.spell); - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[j].IsEffect(SPELL_EFFECT_KILL_CREDIT) || spellInfo->Effects[j].IsEffect(SPELL_EFFECT_KILL_CREDIT2)) + if (effect && (effect->IsEffect(SPELL_EFFECT_KILL_CREDIT) || effect->IsEffect(SPELL_EFFECT_KILL_CREDIT2))) { - if (spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER) TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u Effect: SPELL_EFFECT_KILL_CREDIT: (SpellId: %u targetA: %u - targetB: %u) has invalid target for this Action", - e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.cast.spell, spellInfo->Effects[j].TargetA.GetTarget(), spellInfo->Effects[j].TargetB.GetTarget()); + e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.cast.spell, effect->TargetA.GetTarget(), effect->TargetB.GetTarget()); } } break; @@ -1277,19 +1277,22 @@ void SmartAIMgr::LoadHelperStores() if (!spellInfo) continue; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[j].IsEffect(SPELL_EFFECT_SUMMON)) - SummonCreatureSpellStore.insert(std::make_pair(uint32(spellInfo->Effects[j].MiscValue), std::make_pair(i, SpellEffIndex(j)))); + if (!effect) + continue; + + if (effect->IsEffect(SPELL_EFFECT_SUMMON)) + SummonCreatureSpellStore.insert(std::make_pair(uint32(effect->MiscValue), std::make_pair(i, SpellEffIndex(effect->EffectIndex)))); - else if (spellInfo->Effects[j].IsEffect(SPELL_EFFECT_SUMMON_OBJECT_WILD)) - SummonGameObjectSpellStore.insert(std::make_pair(uint32(spellInfo->Effects[j].MiscValue), std::make_pair(i, SpellEffIndex(j)))); + else if (effect->IsEffect(SPELL_EFFECT_SUMMON_OBJECT_WILD)) + SummonGameObjectSpellStore.insert(std::make_pair(uint32(effect->MiscValue), std::make_pair(i, SpellEffIndex(effect->EffectIndex)))); - else if (spellInfo->Effects[j].IsEffect(SPELL_EFFECT_KILL_CREDIT) || spellInfo->Effects[j].IsEffect(SPELL_EFFECT_KILL_CREDIT2)) - KillCreditSpellStore.insert(std::make_pair(uint32(spellInfo->Effects[j].MiscValue), std::make_pair(i, SpellEffIndex(j)))); + else if (effect->IsEffect(SPELL_EFFECT_KILL_CREDIT) || effect->IsEffect(SPELL_EFFECT_KILL_CREDIT2)) + KillCreditSpellStore.insert(std::make_pair(uint32(effect->MiscValue), std::make_pair(i, SpellEffIndex(effect->EffectIndex)))); - else if (spellInfo->Effects[j].IsEffect(SPELL_EFFECT_CREATE_ITEM)) - CreateItemSpellStore.insert(std::make_pair(uint32(spellInfo->Effects[j].ItemType), std::make_pair(i, SpellEffIndex(j)))); + else if (effect->IsEffect(SPELL_EFFECT_CREATE_ITEM)) + CreateItemSpellStore.insert(std::make_pair(uint32(effect->ItemType), std::make_pair(i, SpellEffIndex(effect->EffectIndex)))); } } diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 55f19d1612e..8b2365079c7 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -456,7 +456,7 @@ void AccountMgr::LoadRBAC() while (result->NextRow()); TC_LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading default permissions"); - result = LoginDatabase.Query("SELECT secId, permissionId FROM rbac_default_permissions ORDER BY secId ASC"); + result = LoginDatabase.PQuery("SELECT secId, permissionId FROM rbac_default_permissions WHERE (realmId = %u OR realmId = -1) ORDER BY secId ASC", realmHandle.Index); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 default permission definitions. DB table `rbac_default_permissions` is empty."); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 650bd998028..bb347113e60 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -595,7 +595,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_RELOAD_SMART_SCRIPTS = 689, RBAC_PERM_COMMAND_RELOAD_SPELL_REQUIRED = 690, RBAC_PERM_COMMAND_RELOAD_SPELL_AREA = 691, - RBAC_PERM_COMMAND_RELOAD_SPELL_BONUS_DATA = 692, + // REUSE RBAC_PERM_COMMAND_RELOAD_SPELL_GROUP = 693, RBAC_PERM_COMMAND_RELOAD_SPELL_LEARN_SPELL = 694, RBAC_PERM_COMMAND_RELOAD_SPELL_LOOT_TEMPLATE = 695, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8fe96be26fb..35fb5ec4d76 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -138,13 +138,14 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) criteria->ID, criteria->type, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id); return false; } - if (aura.effect_idx >= 3) + SpellEffectInfo const* effect = spellEntry->GetEffect(DIFFICULTY_NONE, aura.effect_idx); + if (!effect) { TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has wrong spell effect index in value2 (%u), ignored.", criteria->ID, criteria->type, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.effect_idx); return false; } - if (!spellEntry->Effects[aura.effect_idx].ApplyAuraName) + if (!effect->ApplyAuraName) { TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has non-aura spell effect (ID: %u Effect: %u), ignores.", criteria->ID, criteria->type, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id, aura.effect_idx); @@ -2533,7 +2534,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac if (!achievIdForDungeon[j][2]) break; // for } - else if (referencePlayer->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL) + else if (referencePlayer->GetDungeonDifficulty() == DIFFICULTY_NORMAL) { // dungeon in normal mode accepted if (!achievIdForDungeon[j][1]) @@ -2882,6 +2883,7 @@ bool AchievementMgr<T>::AdditionalRequirementsSatisfied(AchievementCriteriaEntry case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE: // 41 if (!unit || unit->GetZoneId() != reqValue) return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW: // 46 if (!unit || unit->GetHealthPct() >= reqValue) return false; @@ -3227,7 +3229,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() uint32 dataType = fields[1].GetUInt8(); std::string scriptName = fields[4].GetString(); uint32 scriptId = 0; - if (scriptName.length()) // not empty + if (!scriptName.empty()) { if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 7f9359053a1..49bd25e6252 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: @@ -507,7 +511,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) StartingEventOpenDoors(); - SendWarningToAll(StartMessageIds[BG_STARTING_EVENT_FOURTH]); + SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_FOURTH], CHAT_MSG_RAID_BOSS_EMOTE); SetStatus(STATUS_IN_PROGRESS); SetStartDelayTime(StartDelayTimes[BG_STARTING_EVENT_FOURTH]); @@ -1688,32 +1692,6 @@ void Battleground::PSendMessageToAll(uint32 entry, ChatMsg type, Player const* s va_end(ap); } -void Battleground::SendWarningToAll(uint32 entry, ...) -{ - if (!entry) - return; - - std::map<uint32, WorldPacket> 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()) - { - char const* format = sObjectMgr->GetTrinityString(entry, player->GetSession()->GetSessionDbLocaleIndex()); - - char str[1024]; - va_list ap; - va_start(ap, 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); - } - - player->SendDirectMessage(&localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()]); - } -} - void Battleground::SendMessage2ToAll(uint32 entry, ChatMsg type, Player const* source, uint32 arg1, uint32 arg2) { Trinity::Battleground2ChatBuilder bg_builder(type, entry, source, arg1, arg2); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 5bd18977c3d..05873f5f2fc 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -365,7 +365,6 @@ class Battleground virtual void EndBattleground(uint32 winner); void BlockMovement(Player* player); - void SendWarningToAll(uint32 entry, ...); void SendMessageToAll(uint32 entry, ChatMsg type, Player const* source = NULL); void PSendMessageToAll(uint32 entry, ChatMsg type, Player const* source, ...); diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index ced77d06514..ee5b14a7f1c 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -894,7 +894,7 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid data->WriteBit(guid[3]); data->WriteBit(0); // unk data->WriteBit(guid[5]); - data->WriteBit(0); // unk + data->WriteBit(1); // hide battleground list window data->FlushBits(); diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 65f07b625e1..a316c8630dc 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,50 @@ 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) + list._Members.reserve(_playersStore.size()); + 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 +559,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 +609,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 +669,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 +837,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 +984,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..097eea5bb09 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/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 85510ab0545..cd1e3d5be95 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -41,8 +41,8 @@ float ThreatCalcHelper::calcThreat(Unit* hatedUnit, Unit* /*hatingUnit*/, float threat *= threatEntry->pctMod; // Energize is not affected by Mods - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++) - if (threatSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE || threatSpell->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_ENERGIZE) + for (SpellEffectInfo const* effect : threatSpell->GetEffectsForDifficulty(hatedUnit->GetMap()->GetDifficulty())) + if (effect && (effect->Effect == SPELL_EFFECT_ENERGIZE || effect->ApplyAuraName == SPELL_AURA_PERIODIC_ENERGIZE)) return threat; if (Player* modOwner = hatedUnit->GetSpellModOwner()) diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 6e4878ce4c5..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; } @@ -1131,6 +1231,9 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond) std::list<uint32> sharedMasks; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { + SpellEffectInfo const* effect = spellInfo->GetEffect(DIFFICULTY_NONE, i); + if (!effect) + continue; // check if effect is already a part of some shared mask bool found = false; for (std::list<uint32>::iterator itr = sharedMasks.begin(); itr != sharedMasks.end(); ++itr) @@ -1146,10 +1249,13 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond) // build new shared mask with found effect uint32 sharedMask = (1<<i); - ConditionList* cmp = spellInfo->Effects[i].ImplicitTargetConditions; + ConditionList* cmp = effect->ImplicitTargetConditions; for (uint8 effIndex = i+1; effIndex < MAX_SPELL_EFFECTS; ++effIndex) { - if (spellInfo->Effects[effIndex].ImplicitTargetConditions == cmp) + SpellEffectInfo const* inner = spellInfo->GetEffect(DIFFICULTY_NONE, effIndex); + if (!inner) + continue; + if (inner->ImplicitTargetConditions == cmp) sharedMask |= 1<<effIndex; } sharedMasks.push_back(sharedMask); @@ -1168,8 +1274,12 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond) if (firstEffIndex >= MAX_SPELL_EFFECTS) return false; + SpellEffectInfo const* effect = spellInfo->GetEffect(DIFFICULTY_NONE, firstEffIndex); + if (!effect) + continue; + // get shared data - ConditionList* sharedList = spellInfo->Effects[firstEffIndex].ImplicitTargetConditions; + ConditionList* sharedList = effect->ImplicitTargetConditions; // there's already data entry for that sharedMask if (sharedList) @@ -1177,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; } } @@ -1190,9 +1300,13 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond) bool assigned = false; for (uint8 i = firstEffIndex; i < MAX_SPELL_EFFECTS; ++i) { + SpellEffectInfo const* eff = spellInfo->GetEffect(DIFFICULTY_NONE, firstEffIndex); + if (!eff) + continue; + if ((1<<i) & commonMask) { - spellInfo->Effects[i].ImplicitTargetConditions = sharedList; + const_cast<SpellEffectInfo*>(eff)->ImplicitTargetConditions = sharedList; assigned = true; } } @@ -1211,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; } @@ -1221,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; } @@ -1229,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; @@ -1238,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; } @@ -1246,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; @@ -1255,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; } @@ -1263,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; @@ -1272,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; } @@ -1280,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; @@ -1289,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; } @@ -1297,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; @@ -1306,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; } @@ -1314,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; @@ -1323,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; } @@ -1331,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; @@ -1340,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; } @@ -1348,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; @@ -1357,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; } @@ -1365,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; @@ -1374,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; } @@ -1382,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; @@ -1391,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; } @@ -1399,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; @@ -1408,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; } @@ -1416,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; @@ -1426,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; } @@ -1440,10 +1554,14 @@ 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); + if (!effect) continue; - switch (spellInfo->Effects[i].TargetA.GetSelectionCategory()) + switch (effect->TargetA.GetSelectionCategory()) { case TARGET_SELECT_CATEGORY_NEARBY: case TARGET_SELECT_CATEGORY_CONE: @@ -1453,7 +1571,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) break; } - switch (spellInfo->Effects[i].TargetB.GetSelectionCategory()) + switch (effect->TargetB.GetSelectionCategory()) { case TARGET_SELECT_CATEGORY_NEARBY: case TARGET_SELECT_CATEGORY_CONE: @@ -1464,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) @@ -1475,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; @@ -1486,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; @@ -1542,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; @@ -1568,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; } @@ -1584,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: @@ -1602,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; @@ -1618,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: @@ -1633,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: @@ -1654,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: @@ -1680,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: @@ -1700,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: @@ -1731,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: @@ -1788,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: @@ -1868,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) @@ -1877,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; } } @@ -1891,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) @@ -1900,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; } } @@ -1914,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; @@ -1928,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; @@ -1981,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: @@ -2065,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; @@ -2074,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; @@ -2083,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; @@ -2092,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/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index a7cf8478704..65c5ec6873a 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -134,11 +134,11 @@ void LoadDisables() break; case MAP_INSTANCE: case MAP_RAID: - if (flags & DUNGEON_STATUSFLAG_HEROIC && !GetMapDifficultyData(entry, DUNGEON_DIFFICULTY_HEROIC)) + if (flags & DUNGEON_STATUSFLAG_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_HEROIC)) flags -= DUNGEON_STATUSFLAG_HEROIC; - if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !GetMapDifficultyData(entry, RAID_DIFFICULTY_10MAN_HEROIC)) + if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_10_HC)) flags -= RAID_STATUSFLAG_10MAN_HEROIC; - if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !GetMapDifficultyData(entry, RAID_DIFFICULTY_25MAN_HEROIC)) + if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_25_HC)) flags -= RAID_STATUSFLAG_25MAN_HEROIC; if (!flags) isFlagInvalid = true; @@ -354,13 +354,13 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags GetDownscaledMapDifficultyData(entry, targetDifficulty); switch (targetDifficulty) { - case DUNGEON_DIFFICULTY_NORMAL: + case DIFFICULTY_NORMAL: return (disabledModes & DUNGEON_STATUSFLAG_NORMAL) != 0; - case DUNGEON_DIFFICULTY_HEROIC: + case DIFFICULTY_HEROIC: return (disabledModes & DUNGEON_STATUSFLAG_HEROIC) != 0; - case RAID_DIFFICULTY_10MAN_HEROIC: + case DIFFICULTY_10_HC: return (disabledModes & RAID_STATUSFLAG_10MAN_HEROIC) != 0; - case RAID_DIFFICULTY_25MAN_HEROIC: + case DIFFICULTY_25_HC: return (disabledModes & RAID_STATUSFLAG_25MAN_HEROIC) != 0; } } diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 7a29f7f5894..ae488a5f449 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -39,6 +39,7 @@ DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore(Spell DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore(SpellClassOptionsEntryfmt); DB2Storage<SpellMiscEntry> sSpellMiscStore(SpellMiscEntryfmt); DB2Storage<SpellPowerEntry> sSpellPowerStore(SpellPowerEntryfmt); +SpellPowerBySpellIDMap sSpellPowerBySpellIDStore; DB2Storage<SpellReagentsEntry> sSpellReagentsStore(SpellReagentsEntryfmt); DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore(SpellRuneCostEntryfmt); DB2Storage<SpellTotemsEntry> sSpellTotemsStore(SpellTotemsEntryfmt); @@ -52,6 +53,7 @@ TaxiMask sAllianceTaxiNodesMask; TaxiMask sDeathKnightTaxiNodesMask; TaxiPathSetBySource sTaxiPathSetBySource; TaxiPathNodesByPath sTaxiPathNodesByPath; +PhaseGroupContainer sPhasesByGroup; typedef std::list<std::string> DB2StoreProblemList; @@ -142,10 +144,19 @@ void LoadDB2Stores(std::string const& dataPath) LoadDB2(availableDb2Locales, bad_db2_files, sTaxiNodesStore, db2Path, "TaxiNodes.db2"); LoadDB2(availableDb2Locales, bad_db2_files, sTaxiPathStore, db2Path, "TaxiPath.db2"); LoadDB2(availableDb2Locales, bad_db2_files, sTaxiPathNodeStore, db2Path, "TaxiPathNode.db2"); + + for (uint32 i = 0; i < sSpellPowerStore.GetNumRows(); ++i) + if (SpellPowerEntry const* power = sSpellPowerStore.LookupEntry(i)) + sSpellPowerBySpellIDStore[power->SpellID] = power; + + for (uint32 i = 0; i < sPhaseGroupStore.GetNumRows(); ++i) + if (PhaseGroupEntry const* group = sPhaseGroupStore.LookupEntry(i)) + if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) + sPhasesByGroup[group->PhaseGroupID].insert(phase->ID); 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)) @@ -277,3 +288,8 @@ uint32 GetItemDisplayID(uint32 appearanceID) return itr->second; return 0; } + +std::set<uint32> const& GetPhasesForGroup(uint32 group) +{ + return sPhasesByGroup[group]; +} diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 29fe93ce2b1..6521ea930a8 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -39,6 +39,7 @@ extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore; extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore; extern DB2Storage<SpellMiscEntry> sSpellMiscStore; extern DB2Storage<SpellPowerEntry> sSpellPowerStore; +extern SpellPowerBySpellIDMap sSpellPowerBySpellIDStore; extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore; extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore; extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore; @@ -59,4 +60,6 @@ DB2StorageBase const* GetDB2Storage(uint32 type); uint32 GetItemDisplayID(uint32 appearanceID); +std::set<uint32> const& GetPhasesForGroup(uint32 group); + #endif diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index de5436860a6..8e91ec8396f 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 @@ -94,7 +95,7 @@ struct ItemSparseEntry { uint32 ID; // 0 uint32 Quality; // 1 - uint32 Flags[3]; // 2-4 + uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4 float Unk1; // 5 float Unk2; // 6 uint32 BuyCount; // 7 @@ -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; @@ -423,6 +354,8 @@ struct TaxiPathNodeEntry typedef std::map<uint32, uint32> ItemDisplayIDMap; +typedef std::map<uint32, SpellPowerEntry const*> SpellPowerBySpellIDMap; + struct TaxiPathBySourceAndDestination { TaxiPathBySourceAndDestination() : ID(0), price(0) { } @@ -448,4 +381,5 @@ typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; #define TaxiMaskSize 114 typedef uint8 TaxiMask[TaxiMaskSize]; -#endif
\ No newline at end of file +typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; +#endif 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/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index d4831127183..fa1ca29f4ef 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -51,11 +51,11 @@ enum LevelLimit enum BattlegroundBracketId // bracketId for level ranges { BG_BRACKET_ID_FIRST = 0, - BG_BRACKET_ID_LAST = 15 -}; + BG_BRACKET_ID_LAST = 10, -// must be max value in PvPDificulty slot+1 -#define MAX_BATTLEGROUND_BRACKETS 16 + // must be max value in PvPDificulty slot + 1 + MAX_BATTLEGROUND_BRACKETS +}; enum AreaTeams { @@ -337,16 +337,26 @@ enum AreaFlags enum Difficulty { - REGULAR_DIFFICULTY = 0, - - DUNGEON_DIFFICULTY_NORMAL = 0, - DUNGEON_DIFFICULTY_HEROIC = 1, - DUNGEON_DIFFICULTY_EPIC = 2, - - RAID_DIFFICULTY_10MAN_NORMAL = 0, - RAID_DIFFICULTY_25MAN_NORMAL = 1, - RAID_DIFFICULTY_10MAN_HEROIC = 2, - RAID_DIFFICULTY_25MAN_HEROIC = 3 + DIFFICULTY_NONE = 0, + DIFFICULTY_NORMAL = 1, + DIFFICULTY_HEROIC = 2, + DIFFICULTY_10_N = 3, + DIFFICULTY_25_N = 4, + DIFFICULTY_10_HC = 5, + DIFFICULTY_25_HC = 6, + DIFFICULTY_LFR = 7, + DIFFICULTY_CHALLENGE = 8, + DIFFICULTY_40 = 9, + DIFFICULTY_HC_SCENARIO = 11, + DIFFICULTY_N_SCENARIO = 12, + DIFFICULTY_NORMAL2 = 14, + DIFFICULTY_HEROIC2 = 15, + DIFFICULTY_MYTHIC = 16, + DIFFICULTY_LFR2 = 17, + DIFFICULTY_EVENT = 18, + DIFFICULTY_EVENT2 = 19, + DIFFICULTY_EVENT_SCENARIO = 20, + DIFFICULTY_MAX = 21, }; #define RAID_DIFFICULTY_MASK_25MAN 1 // since 25man difficulties are 1 and 3, we can check them like that @@ -357,18 +367,18 @@ enum Difficulty enum SpawnMask { - SPAWNMASK_CONTINENT = (1 << REGULAR_DIFFICULTY), // any maps without spawn modes + SPAWNMASK_CONTINENT = (1 << DIFFICULTY_NONE), // any maps without spawn modes - SPAWNMASK_DUNGEON_NORMAL = (1 << DUNGEON_DIFFICULTY_NORMAL), - SPAWNMASK_DUNGEON_HEROIC = (1 << DUNGEON_DIFFICULTY_HEROIC), + SPAWNMASK_DUNGEON_NORMAL = (1 << DIFFICULTY_NORMAL), + SPAWNMASK_DUNGEON_HEROIC = (1 << DIFFICULTY_HEROIC), SPAWNMASK_DUNGEON_ALL = (SPAWNMASK_DUNGEON_NORMAL | SPAWNMASK_DUNGEON_HEROIC), - SPAWNMASK_RAID_10MAN_NORMAL = (1 << RAID_DIFFICULTY_10MAN_NORMAL), - SPAWNMASK_RAID_25MAN_NORMAL = (1 << RAID_DIFFICULTY_25MAN_NORMAL), + SPAWNMASK_RAID_10MAN_NORMAL = (1 << DIFFICULTY_10_N), + SPAWNMASK_RAID_25MAN_NORMAL = (1 << DIFFICULTY_25_N), SPAWNMASK_RAID_NORMAL_ALL = (SPAWNMASK_RAID_10MAN_NORMAL | SPAWNMASK_RAID_25MAN_NORMAL), - SPAWNMASK_RAID_10MAN_HEROIC = (1 << RAID_DIFFICULTY_10MAN_HEROIC), - SPAWNMASK_RAID_25MAN_HEROIC = (1 << RAID_DIFFICULTY_25MAN_HEROIC), + SPAWNMASK_RAID_10MAN_HEROIC = (1 << DIFFICULTY_10_HC), + SPAWNMASK_RAID_25MAN_HEROIC = (1 << DIFFICULTY_25_HC), SPAWNMASK_RAID_HEROIC_ALL = (SPAWNMASK_RAID_10MAN_HEROIC | SPAWNMASK_RAID_25MAN_HEROIC), SPAWNMASK_RAID_ALL = (SPAWNMASK_RAID_NORMAL_ALL | SPAWNMASK_RAID_HEROIC_ALL) diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 5defb7e527c..2af63e0b6bf 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -20,6 +20,7 @@ #include "Containers.h" #include "Log.h" #include "SharedDefines.h" +#include "SpellInfo.h" #include "SpellMgr.h" #include "TransportMgr.h" #include "DBCfmt.h" @@ -101,25 +102,25 @@ DBCStorage <FactionEntry> sFactionStore(FactionEntryfmt); DBCStorage <FactionTemplateEntry> sFactionTemplateStore(FactionTemplateEntryfmt); DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); +DBCStorage <GameTablesEntry> sGameTablesStore(GameTablesFmt); DBCStorage <GemPropertiesEntry> sGemPropertiesStore(GemPropertiesEntryfmt); DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt); DBCStorage <GlyphSlotEntry> sGlyphSlotStore(GlyphSlotfmt); -DBCStorage <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); -DBCStorage <GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); -DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); -DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); -DBCStorage <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); -DBCStorage <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); -DBCStorage <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); -DBCStorage <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt); -DBCStorage <GtOCTRegenHPEntry> sGtOCTRegenHPStore(GtOCTRegenHPfmt); -//DBCStorage <GtOCTRegenMPEntry> sGtOCTRegenMPStore(GtOCTRegenMPfmt); -- not used currently -DBCStorage <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); -DBCStorage <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); -DBCStorage <GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); -DBCStorage <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); -DBCStorage <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); +GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); +GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); +GameTable <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); +GameTable <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); +GameTable <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); +GameTable <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); +GameTable <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); +GameTable <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt); +GameTable <GtOCTRegenHPEntry> sGtOCTRegenHPStore(GtOCTRegenHPfmt); +GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); +GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); +GameTable <GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); +GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); +GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); DBCStorage <GuildPerkSpellsEntry> sGuildPerkSpellsStore(GuildPerkSpellsfmt); DBCStorage <ImportPriceArmorEntry> sImportPriceArmorStore(ImportPriceArmorfmt); @@ -191,8 +192,13 @@ DBCStorage <SpecializationSpellsEntry> sSpecializationSpellsStore(Specialization DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt); DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); +DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScalingfmt); + SpellCategoryStore sSpellsByCategoryStore; PetFamilySpellsStore sPetFamilySpellsStore; +SpellsPerClassStore sSpellsPerClassStore; +ClassBySkillIdStore sClassBySkillIdStore; +SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; DBCStorage <SpellScalingEntry> sSpellScalingStore(SpellScalingEntryfmt); @@ -216,6 +222,8 @@ DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore(StableSlotPricesfmt); DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt); DBCStorage <TalentEntry> sTalentStore(TalentEntryfmt); TalentBySpellIDMap sTalentBySpellIDMap; +SpecializationSpellsMap sSpecializationSpellsMap; +SpecializationOverrideSpellsMap sSpecializationOverrideSpellMap; DBCStorage <TotemCategoryEntry> sTotemCategoryStore(TotemCategoryEntryfmt); DBCStorage <TransportAnimationEntry> sTransportAnimationStore(TransportAnimationfmt); @@ -229,8 +237,6 @@ DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore(WorldMapOverlayEntryfmt) DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt); DBCStorage <PhaseEntry> sPhaseStore(PhaseEntryfmt); -PhaseGroupContainer sPhasesByGroup; - typedef std::list<std::string> StoreProblemList; uint32 DBCFileCount = 0; @@ -289,6 +295,51 @@ inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCSt delete sql; } +template<class T> +inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable<T>& storage, std::string const& dbcPath, std::string const& filename) +{ + // compatibility format and C++ structure sizes + ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); + + ++DBCFileCount; + std::string dbcFilename = dbcPath + filename; + + if (storage.Load(dbcFilename.c_str())) + { + bool found = false; + // Find table definition in GameTables.dbc + for (uint32 i = 0; i < sGameTablesStore.GetNumRows(); ++i) + { + GameTablesEntry const* gt = sGameTablesStore.LookupEntry(i); + if (!gt) + continue; + + if (tableName == gt->Name) + { + found = true; + storage.SetGameTableEntry(gt); + break; + } + } + + ASSERT(found, "Game table %s definition not found in GameTables.dbc", tableName.c_str()); + } + else + { + // sort problematic dbc to (1) non compatible and (2) non-existed + if (FILE* f = fopen(dbcFilename.c_str(), "rb")) + { + std::ostringstream stream; + stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten."; + std::string buf = stream.str(); + errors.push_back(buf); + fclose(f); + } + else + errors.push_back(dbcFilename); + } +} + void LoadDBCStores(const std::string& dataPath) { uint32 oldMSTime = getMSTime(); @@ -398,24 +449,10 @@ void LoadDBCStores(const std::string& dataPath) } } + LoadDBC(availableDbcLocales, bad_dbc_files, sGameTablesStore, dbcPath, "GameTables.dbc");//19243 LoadDBC(availableDbcLocales, bad_dbc_files, sGemPropertiesStore, dbcPath, "GemProperties.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sGlyphPropertiesStore, dbcPath, "GlyphProperties.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sGlyphSlotStore, dbcPath, "GlyphSlot.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtBarberShopCostBaseStore, dbcPath, "gtBarberShopCostBase.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtCombatRatingsStore, dbcPath, "gtCombatRatings.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToMeleeCritBaseStore, dbcPath, "gtChanceToMeleeCritBase.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToMeleeCritStore, dbcPath, "gtChanceToMeleeCrit.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToSpellCritBaseStore, dbcPath, "gtChanceToSpellCritBase.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToSpellCritStore, dbcPath, "gtChanceToSpellCrit.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtNPCManaCostScalerStore, dbcPath, "gtNPCManaCostScaler.dbc"); - LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTClassCombatRatingScalarStore, dbcPath, "gtOCTClassCombatRatingScalar.dbc");//15595 - //LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTRegenHPStore, dbcPath, "gtOCTRegenHP.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTHpPerStaminaStore, dbcPath, "gtOCTHpPerStamina.dbc");//15595 - //LoadDBC(dbcCount, availableDbcLocales, bad_dbc_files, sGtOCTRegenMPStore, dbcPath, "gtOCTRegenMP.dbc"); -- not used currently - LoadDBC(availableDbcLocales, bad_dbc_files, sGtRegenMPPerSptStore, dbcPath, "gtRegenMPPerSpt.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtSpellScalingStore, dbcPath, "gtSpellScaling.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTBaseHPByClassStore, dbcPath, "gtOCTBaseHPByClass.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTBaseMPByClassStore, dbcPath, "gtOCTBaseMPByClass.dbc");//15595 LoadDBC(availableDbcLocales, bad_dbc_files, sGuildPerkSpellsStore, dbcPath, "GuildPerkSpells.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sImportPriceArmorStore, dbcPath, "ImportPriceArmor.dbc"); // 19116 @@ -478,11 +515,6 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sPhaseStore, dbcPath, "Phase.dbc"); // 19116 - for (uint32 i = 0; i < sPhaseGroupStore.GetNumRows(); ++i) - if (PhaseGroupEntry const* group = sPhaseGroupStore.LookupEntry(i)) - if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) - sPhasesByGroup[group->PhaseGroupID].insert(phase->ID); - LoadDBC(availableDbcLocales, bad_dbc_files, sPowerDisplayStore, dbcPath, "PowerDisplay.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sPvPDifficultyStore, dbcPath, "PvpDifficulty.dbc");//19116 @@ -517,7 +549,10 @@ void LoadDBCStores(const std::string& dataPath) SpecializationSpellsEntry const* specSpells = sSpecializationSpellsStore.LookupEntry(i); if (!specSpells) continue; - sSpecializationSpellsBySpecStore[specSpells->SpecID].insert(specSpells); + sSpecializationSpellsBySpecStore[specSpells->SpecID].push_back(specSpells); + + if (specSpells->OverridesSpellID) + sSpecializationOverrideSpellMap[specSpells->SpecID][specSpells->OverridesSpellID] = specSpells->SpellID; } LoadDBC(availableDbcLocales, bad_dbc_files, sSpellStore, dbcPath, "Spell.dbc"/*, &CustomSpellEntryfmt, &CustomSpellEntryIndex*/); LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoriesStore, dbcPath, "SpellCategories.dbc");//15595 @@ -543,6 +578,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCastTimesStore, dbcPath, "SpellCastTimes.dbc");//15595 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellDurationStore, dbcPath, "SpellDuration.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellFocusObjectStore, dbcPath, "SpellFocusObject.dbc");//19116 + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellEffectScalingStore, dbcPath, "SpellEffectScaling.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellItemEnchantmentStore, dbcPath, "SpellItemEnchantment.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellItemEnchantmentConditionStore, dbcPath, "SpellItemEnchantmentCondition.dbc");//19116 LoadDBC(availableDbcLocales, bad_dbc_files, sSpellRadiusStore, dbcPath, "SpellRadius.dbc");//19116 @@ -552,41 +588,67 @@ void LoadDBCStores(const std::string& dataPath) //LoadDBC(availableDbcLocales, bad_dbc_files, sStableSlotPricesStore, dbcPath, "StableSlotPrices.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sSummonPropertiesStore, dbcPath, "SummonProperties.dbc");//15595 - // Must be done when sSkillLineAbilityStore, sSpellStore, sSpellLevelsStore and sCreatureFamilyStore are all loaded - /* TODO: Requires spells attributes from SpellMisc.db2 is loaded after dbc + for (uint32 j = 0; j < sSpellEffectScalingStore.GetNumRows(); j++) + { + SpellEffectScalingEntry const* spellEffectScaling = sSpellEffectScalingStore.LookupEntry(j); + if (!spellEffectScaling) + continue; + + sSpellEffectScallingByEffectId.insert(std::make_pair(spellEffectScaling->SpellEffectID, j)); + } + std::map<std::string, uint32> classIdByName; + for (uint32 j = 0; j < sChrClassesStore.GetNumRows(); j++) + { + ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(j); + if (!classEntry) + continue; + + classIdByName.insert(std::make_pair(std::string(classEntry->Name_lang), j)); + } + + for (uint32 j = 0; j < sSkillLineStore.GetNumRows(); j++) + { + SkillLineEntry const* skillEntry = sSkillLineStore.LookupEntry(j); + if (!skillEntry) + continue; + + if (skillEntry->CategoryID!= SKILL_CATEGORY_CLASS) + continue; + + std::map<std::string, uint32> ::const_iterator iter = classIdByName.find(std::string(skillEntry->DisplayName_lang)); + if (iter == classIdByName.end()) + continue; + + sClassBySkillIdStore.insert(std::make_pair(j, iter->second)); + } + for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) { - SkillLineAbilityEntry const* skillLine = sSkillLineAbilityStore.LookupEntry(j); - if (!skillLine) + SkillLineAbilityEntry const* skillAbility = sSkillLineAbilityStore.LookupEntry(j); + if (!skillAbility) continue; - SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillLine->SpellID); + if (skillAbility->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) + continue; + + SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillAbility->SpellID); if (!spellInfo) continue; - SpellLevelsEntry const* levels = sSpellLevelsStore.LookupEntry(spellInfo->SpellLevelsID); - if (spellInfo->SpellLevelsID && (!levels || levels->spellLevel)) + SpellLevelsEntry const* spellLevels = sSpellLevelsStore.LookupEntry(spellInfo->LevelsID); + if (!spellLevels || !spellLevels->SpellLevel) continue; - if (spellInfo && spellInfo->Attributes & SPELL_ATTR0_PASSIVE) - { - for (uint32 i = 1; i < sCreatureFamilyStore.GetNumRows(); ++i) - { - CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(i); - if (!cFamily) - continue; + uint32 classId = GetClassBySkillId(skillAbility->SkillLine); - if (skillLine->SkillLine != cFamily->SkillLine[0] && skillLine->SkillLine != cFamily->SkillLine[1]) - continue; + if (!classId) + continue; - if (skillLine->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) - continue; + if (sSpellsPerClassStore.find(classId) == sSpellsPerClassStore.end()) + sSpellsPerClassStore.insert(make_pair(classId, std::list<SkillLineAbilityEntry const*>())); - sPetFamilySpellsStore[i].insert(spellInfo->ID); - } - } + sSpellsPerClassStore[classId].push_back(skillAbility); } - */ LoadDBC(availableDbcLocales, bad_dbc_files, sTalentStore, dbcPath, "Talent.dbc");//15595 @@ -664,6 +726,20 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sWorldMapOverlayStore, dbcPath, "WorldMapOverlay.dbc");//15595 LoadDBC(availableDbcLocales, bad_dbc_files, sWorldSafeLocsStore, dbcPath, "WorldSafeLocs.dbc"); // 19116 + LoadGameTable(bad_dbc_files, "BarberShopCostBase", sGtBarberShopCostBaseStore, dbcPath, "gtBarberShopCostBase.dbc");//15595 + LoadGameTable(bad_dbc_files, "CombatRatings", sGtCombatRatingsStore, dbcPath, "gtCombatRatings.dbc");//15595 + LoadGameTable(bad_dbc_files, "ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, dbcPath, "gtChanceToMeleeCritBase.dbc");//15595 + LoadGameTable(bad_dbc_files, "ChanceToMeleeCrit", sGtChanceToMeleeCritStore, dbcPath, "gtChanceToMeleeCrit.dbc");//15595 + LoadGameTable(bad_dbc_files, "ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, dbcPath, "gtChanceToSpellCritBase.dbc");//15595 + LoadGameTable(bad_dbc_files, "ChanceToSpellCrit", sGtChanceToSpellCritStore, dbcPath, "gtChanceToSpellCrit.dbc");//15595 + LoadGameTable(bad_dbc_files, "NPCManaCostScaler", sGtNPCManaCostScalerStore, dbcPath, "gtNPCManaCostScaler.dbc"); + LoadGameTable(bad_dbc_files, "OCTClassCombatRatingScalar", sGtOCTClassCombatRatingScalarStore, dbcPath, "gtOCTClassCombatRatingScalar.dbc");//15595 + LoadGameTable(bad_dbc_files, "OCTHPPerStamina", sGtOCTHpPerStaminaStore, dbcPath, "gtOCTHpPerStamina.dbc");//15595 + LoadGameTable(bad_dbc_files, "RegenMPPerSpt", sGtRegenMPPerSptStore, dbcPath, "gtRegenMPPerSpt.dbc");//15595 + LoadGameTable(bad_dbc_files, "SpellScaling", sGtSpellScalingStore, dbcPath, "gtSpellScaling.dbc");//15595 + LoadGameTable(bad_dbc_files, "OCTBaseHPByClass", sGtOCTBaseHPByClassStore, dbcPath, "gtOCTBaseHPByClass.dbc");//15595 + LoadGameTable(bad_dbc_files, "OCTBaseMPByClass", sGtOCTBaseMPByClassStore, dbcPath, "gtOCTBaseMPByClass.dbc");//15595 + // error checks if (bad_dbc_files.size() >= DBCFileCount) { @@ -896,7 +972,7 @@ MapDifficulty const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &di MapDifficulty const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); if (!mapDiff) { - if (tmpDiff > RAID_DIFFICULTY_25MAN_NORMAL) // heroic, downscale to normal + if (tmpDiff > DIFFICULTY_25_N) // heroic, downscale to normal tmpDiff -= 2; else tmpDiff -= 1; // any non-normal mode for raids like tbc (only one mode) @@ -1178,7 +1254,81 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u return NULL; } -std::set<uint32> const& GetPhasesForGroup(uint32 group) +uint32 GetClassBySkillId(uint32 skillId) +{ + ClassBySkillIdStore::const_iterator iter = sClassBySkillIdStore.find(skillId); + if (iter != sClassBySkillIdStore.end()) + return iter->second; + return 0; +} + +uint32 GetSkillIdByClass(uint32 classId) +{ + for (ClassBySkillIdStore::const_iterator iter = sClassBySkillIdStore.begin(); iter != sClassBySkillIdStore.end(); iter++) + if (iter->second == classId) + return iter->first; + return 0; +} + +std::list<uint32> GetSpellsForLevels(uint32 classId, uint32 raceMask, uint32 specializationId, uint32 minLevel, uint32 maxLevel) +{ + std::list<uint32> spellList; + + if (classId != 0) + { + SpellsPerClassStore::const_iterator classIter = sSpellsPerClassStore.find(classId); + if (classIter != sSpellsPerClassStore.end()) + { + const std::list<SkillLineAbilityEntry const*>& learnSpellList = classIter->second; + for (std::list<SkillLineAbilityEntry const*>::const_iterator iter = learnSpellList.begin(); iter != learnSpellList.end(); iter++) + { + SkillLineAbilityEntry const* skillLine = *iter; + if (!skillLine) + continue; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(skillLine->SpellID); + if (!spellInfo) + continue; + + if (skillLine->RaceMask && !(skillLine->RaceMask & raceMask)) + continue; + + if (spellInfo->SpellLevel <= minLevel || spellInfo->SpellLevel > maxLevel) + continue; + + spellList.push_back(spellInfo->Id); + } + } + } + + if (!specializationId) + return spellList; + + SpecializationSpellsBySpecStore::const_iterator specIter = sSpecializationSpellsBySpecStore.find(specializationId); + if (specIter != sSpecializationSpellsBySpecStore.end()) + { + SpecializationSpellsBySpecEntry learnSpellList = specIter->second; + for (int i = 0; i < learnSpellList.size(); i++) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learnSpellList[i]->SpellID); + if (!spellInfo) + { + TC_LOG_ERROR("spells", "GetSpellsForLevels: spell %u not found in spellstore", learnSpellList[i]->SpellID); + continue; + } + if (spellInfo->SpellLevel <= minLevel || spellInfo->SpellLevel > maxLevel) + continue; + + spellList.push_back(spellInfo->Id); + } + } + return spellList; +} + +uint32 GetTalentSpellCost(uint32 spellId) { - return sPhasesByGroup[group]; + TalentBySpellIDMap::const_iterator itr = sTalentBySpellIDMap.find(spellId); + if (itr == sTalentBySpellIDMap.end()) + return 0; + return 1; } diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index e9a9b3c692f..20e8e1fc423 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -26,11 +26,14 @@ #include <list> +typedef std::map<uint32, uint32> SpecializationOverrideSpellsList; +typedef std::map<uint32, SpecializationOverrideSpellsList> SpecializationOverrideSpellsMap; + typedef std::list<uint32> SimpleFactionsList; SimpleFactionsList const* GetFactionTeamList(uint32 faction); char const* GetPetName(uint32 petfamily, uint32 dbclang); - +uint32 GetTalentSpellCost(uint32 spellId); TalentEntry const* GetTalentBySpellID(uint32 spellID); int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found @@ -66,6 +69,9 @@ bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredT void Zone2MapCoordinates(float &x, float &y, uint32 zone); void Map2ZoneCoordinates(float &x, float &y, uint32 zone); +uint32 GetClassBySkillId(uint32 skillId); +uint32 GetSkillIdByClass(uint32 classId); +std::list<uint32> GetSpellsForLevels(uint32 classId, uint32 raceMask, uint32 specializationId, uint32 minLevel, uint32 maxLevel); typedef std::map<uint32/*pair32(map, diff)*/, MapDifficulty> MapDifficultyMap; MapDifficulty const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty); @@ -83,17 +89,47 @@ LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); uint32 GetDefaultMapLight(uint32 mapId); -std::set<uint32> const& GetPhasesForGroup(uint32 group); - typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoMap; typedef std::pair<SkillRaceClassInfoMap::iterator, SkillRaceClassInfoMap::iterator> SkillRaceClassInfoBounds; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); -typedef std::set<SpecializationSpellsEntry const*> SpecializationSpellsBySpecEntry; +typedef std::vector<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; +typedef std::map<uint32, std::vector<uint32> > SpecializationSpellsMap; +extern SpecializationSpellsMap sSpecializationSpellsMap; +extern SpecializationOverrideSpellsMap sSpecializationOverrideSpellMap; + +template<class T> +class GameTable +{ +public: + GameTable(char const* format) : _storage(format), _gtEntry(nullptr) { } + + void SetGameTableEntry(GameTablesEntry const* gtEntry) { _gtEntry = gtEntry; } + + T const* EvaluateTable(uint32 row, uint32 column) const + { + ASSERT(row < _gtEntry->NumRows); + ASSERT(column < _gtEntry->NumColumns); + + return _storage.LookupEntry(_gtEntry->NumRows * column + row); + } + + char const* GetFormat() const { return _storage.GetFormat(); } + uint32 GetFieldCount() const { return _storage.GetFieldCount(); } + bool Load(char const* fileName) { return _storage.Load(fileName, nullptr); } + + uint32 GetTableRowCount() const { return _gtEntry->NumRows; } + uint32 GetTableColumnCount() const { return _gtEntry->NumColumns; } + +private: + DBCStorage<T> _storage; + GameTablesEntry const* _gtEntry; +}; + extern DBCStorage <AchievementEntry> sAchievementStore; extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore; extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions @@ -134,20 +170,19 @@ extern DBCStorage <GemPropertiesEntry> sGemPropertiesStore; extern DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore; extern DBCStorage <GlyphSlotEntry> sGlyphSlotStore; -extern DBCStorage <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; -extern DBCStorage <GtCombatRatingsEntry> sGtCombatRatingsStore; -extern DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; -extern DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; -extern DBCStorage <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; -extern DBCStorage <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; -extern DBCStorage <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; -extern DBCStorage <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore; -//extern DBCStorage <GtOCTRegenMPEntry> sGtOCTRegenMPStore; -- not used currently -extern DBCStorage <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore; -extern DBCStorage <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; -extern DBCStorage <GtSpellScalingEntry> sGtSpellScalingStore; -extern DBCStorage <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; -extern DBCStorage <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; +extern GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; +extern GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore; +extern GameTable <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; +extern GameTable <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; +extern GameTable <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; +extern GameTable <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; +extern GameTable <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; +extern GameTable <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore; +extern GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore; +extern GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; +extern GameTable <GtSpellScalingEntry> sGtSpellScalingStore; +extern GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; +extern GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; extern DBCStorage <GuildPerkSpellsEntry> sGuildPerkSpellsStore; extern DBCStorage <ImportPriceArmorEntry> sImportPriceArmorStore; extern DBCStorage <ImportPriceQualityEntry> sImportPriceQualityStore; @@ -200,6 +235,7 @@ extern DBCStorage <SkillLineEntry> sSkillLineStore; extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore; extern DBCStorage <SkillTiersEntry> sSkillTiersStore; extern DBCStorage <SoundEntriesEntry> sSoundEntriesStore; +extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; extern DBCStorage <SpecializationSpellsEntry> sSpecializationSpellsStore; extern SpecializationSpellsBySpecStore sSpecializationSpellsBySpecStore; extern DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore; @@ -215,6 +251,7 @@ extern DBCStorage <SpellRangeEntry> sSpellRangeStore; extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore; extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; extern DBCStorage <SpellEntry> sSpellStore; +extern DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore; extern DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore; extern DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore; extern DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 3bf632001b0..2f16ce9a0e5 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -647,7 +647,7 @@ struct BarberShopStyleEntry struct BattlemasterListEntry { uint32 ID; // 0 - uint32 MapID[16]; // 1-16 mapid + int32 MapID[16]; // 1-16 mapid uint32 InstanceType; // 17 map type (3 - BG, 4 - arena) //uint32 GroupsAllowed; // 18 (0 or 1) char* Name_lang; // 19 @@ -812,7 +812,7 @@ struct CreatureDisplayInfoEntry //uint32 ObjectEffectPackageID; // 16 //uint32 AnimReplacementSetID; // 17 //uint32 Flags; // 18 - //uint32 Gender; // 19 + int32 Gender; // 19 //uint32 StateSpellVisualKitID; // 20 }; @@ -1102,6 +1102,14 @@ struct GameObjectDisplayInfoEntry //float OverrideNameScale; // 20 }; +struct GameTablesEntry +{ + //uint32 Index; // 0 - not a real field, not counted for columns + char const* Name; // 1 + uint32 NumRows; // 2 + uint32 NumColumns; // 3 +}; + struct GemPropertiesEntry { uint32 ID; // 0 @@ -1128,11 +1136,6 @@ struct GlyphSlotEntry //uint32 Tooltip; // 2 }; -// All Gt* DBC store data for 100 levels, some by 100 per class/race -#define GT_MAX_LEVEL 100 -// gtOCTClassCombatRatingScalar.dbc stores data for 32 ratings, look at MAX_COMBAT_RATING for real used amount -#define GT_MAX_RATING 32 - struct GtBarberShopCostBaseEntry { //uint32 level; @@ -1364,7 +1367,7 @@ struct ItemRandomPropertiesEntry { uint32 ID; // 0 //char* Name; // 1 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 + uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 char* Name_lang; // 7 }; @@ -1800,8 +1803,18 @@ struct SpellEffectEntry float BonusCoefficientFromAP; // 30 }; -#define MAX_SPELL_EFFECTS 3 -#define MAX_EFFECT_MASK 7 +#define MAX_SPELL_EFFECTS 32 +#define MAX_EFFECT_MASK 0xFFFFFFFF + +// SpellEffectScaling.dbc +struct SpellEffectScalingEntry +{ + uint32 ID; // 0 + float Coefficient; // 1 + float Variance; // 2 + float ResourceCoefficient; // 3 + uint32 SpellEffectID; // 4 +}; // SpellAuraOptions.dbc struct SpellAuraOptionsEntry @@ -1865,6 +1878,9 @@ typedef std::set<uint32> SpellCategorySet; typedef std::map<uint32, SpellCategorySet > SpellCategoryStore; typedef std::set<uint32> PetFamilySpellsSet; typedef std::map<uint32, PetFamilySpellsSet > PetFamilySpellsStore; +typedef std::unordered_map<uint32, std::list<SkillLineAbilityEntry const*> > SpellsPerClassStore; +typedef std::unordered_map<uint32, uint32> ClassBySkillIdStore; +typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId; struct SpellCastTimesEntry { @@ -2371,6 +2387,4 @@ struct MapDifficulty }; typedef std::map<uint32, uint32> TalentSpellPosMap; - -typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; #endif diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 867e64ef92e..c92d3babb25 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"; @@ -59,6 +59,7 @@ char const EmotesTextEntryfmt[] = "nxixxxxxxxxxxxxxxxx"; char const FactionEntryfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplateEntryfmt[] = "niiiiiiiiiiiii"; char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; +char const GameTablesFmt[] = "dsii"; char const GemPropertiesEntryfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; char const GlyphSlotfmt[] = "nix"; @@ -129,12 +130,13 @@ char const SpellCastTimefmt[] = "nixx"; char const SpellCategoriesEntryfmt[] = "diiiiiiiix"; char const SpellCategoryfmt[] = "nixxxx"; char const SpellDurationfmt[] = "niii"; -char const SpellEffectEntryfmt[] = "niifiiiffiiiiiifiifiiiiifiiiiif"; +char const SpellEffectEntryfmt[] = "iiifiiiffiiiiiifiifiiiiifiiiiif"; const std::string CustomSpellEffectEntryfmt = "ppppppppppppppappppppppppp"; const std::string CustomSpellEffectEntryIndex = "Id"; char const SpellEntryfmt[] = "nsxxxiiiiiiiiiiiiiiiiiii"; const std::string CustomSpellEntryfmt = "ppppppppppppppapaaaaaaaaapaaaaaapapppaapppaaapa"; const std::string CustomSpellEntryIndex = "Id"; +char const SpellEffectScalingfmt[] = "nfffi"; char const SpellFocusObjectfmt[] = "nx"; char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiiifff"; char const SpellItemEnchantmentConditionfmt[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 863324f278c..7099d38d428 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1406,7 +1406,7 @@ void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId) } // Update achievements - if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC) + if (dungeon->difficulty == DIFFICULTY_HEROIC) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1); LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->getLevel()); @@ -1594,7 +1594,7 @@ LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid) lockStatus = LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION; else if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, dungeon->map, player)) lockStatus = LFG_LOCKSTATUS_RAID_LOCKED; - else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && player->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) + else if (dungeon->difficulty > DIFFICULTY_NORMAL && player->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) lockStatus = LFG_LOCKSTATUS_RAID_LOCKED; else if (dungeon->minlevel > level) lockStatus = LFG_LOCKSTATUS_TOO_LOW_LEVEL; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index dea8d996c53..4fbd60202c3 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -268,7 +268,7 @@ struct LfgPlayerBoot struct LFGDungeonData { LFGDungeonData(): id(0), name(""), map(0), type(0), expansion(0), group(0), minlevel(0), - maxlevel(0), difficulty(REGULAR_DIFFICULTY), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), + maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), requiredItemLevel(0) { } LFGDungeonData(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->Name_lang), map(dbc->MapID), diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7fb3822c888..7dbb87bcbf3 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" @@ -283,7 +284,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) } // for instances heroic to normal, other cases attempt to retrieve previous difficulty - if (diff >= RAID_DIFFICULTY_10MAN_HEROIC && GetMap()->IsRaid()) + if (diff >= DIFFICULTY_10_HC && GetMap()->IsRaid()) diff -= 2; // to normal raid difficulty cases else --diff; @@ -297,10 +298,10 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) m_creatureInfo = cinfo; // map mode related always // equal to player Race field, but creature does not have race - SetByteValue(UNIT_FIELD_BYTES_0, 0, 0); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, 0); // known valid are: CLASS_WARRIOR, CLASS_PALADIN, CLASS_ROGUE, CLASS_MAGE - SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class)); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, uint8(cinfo->unit_class)); // Cancel load if no model defined if (!(cinfo->GetFirstValidModelId())) @@ -319,7 +320,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) SetDisplayId(displayID); SetNativeDisplayId(displayID); - SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender); // Load creature equipment if (!data || data->equipmentId == 0) @@ -804,7 +805,7 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 /*phaseMask* { SetDisplayId(displayID); SetNativeDisplayId(displayID); - SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender); } LastUsedScriptID = GetCreatureTemplate()->ScriptID; @@ -1559,7 +1560,7 @@ void Creature::Respawn(bool force) { SetDisplayId(displayID); SetNativeDisplayId(displayID); - SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender); } GetMotionMaster()->InitDefault(); @@ -1619,11 +1620,11 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) const // This check must be done instead of 'if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))' for not break // the check of mechanic immunity on DB (tested) because GetCreatureTemplate()->MechanicImmuneMask and m_spellImmune[IMMUNITY_MECHANIC] don't have same data. bool immunedToAllEffects = true; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if (!spellInfo->Effects[i].IsEffect()) + if (!effect || !effect->IsEffect()) continue; - if (!IsImmunedToSpellEffect(spellInfo, i)) + if (!IsImmunedToSpellEffect(spellInfo, effect->EffectIndex)) { immunedToAllEffects = false; break; @@ -1637,10 +1638,13 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) const bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { - if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Effects[index].Mechanic - 1))) + SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficulty()); + if (!effect) + return true; + if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (effect->Mechanic - 1))) return true; - if (GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL && spellInfo->Effects[index].Effect == SPELL_EFFECT_HEAL) + if (GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL && effect->Effect == SPELL_EFFECT_HEAL) return true; return Unit::IsImmunedToSpellEffect(spellInfo, index); @@ -1680,13 +1684,13 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* victim) } bool bcontinue = true; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; j++) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if ((spellInfo->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) || - (spellInfo->Effects[j].Effect == SPELL_EFFECT_INSTAKILL) || - (spellInfo->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE) || - (spellInfo->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH) - ) + if (effect && ((effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE) || + (effect->Effect == SPELL_EFFECT_INSTAKILL) || + (effect->Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE) || + (effect->Effect == SPELL_EFFECT_HEALTH_LEECH) + )) { bcontinue = false; break; @@ -1728,9 +1732,9 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim) } bool bcontinue = true; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; j++) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if ((spellInfo->Effects[j].Effect == SPELL_EFFECT_HEAL)) + if (effect && (effect->Effect == SPELL_EFFECT_HEAL)) { bcontinue = false; break; @@ -1826,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); } @@ -2212,12 +2216,7 @@ void Creature::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs continue; uint32 unSpellId = m_spells[i]; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(unSpellId); - if (!spellInfo) - { - ASSERT(spellInfo); - continue; - } + SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(unSpellId); // Not send cooldown for this spells if (spellInfo->IsCooldownStartedOnEvent()) @@ -2573,7 +2572,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 9acde98a7a8..e9212b50933 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -88,9 +88,9 @@ struct CreatureTemplate std::string SubName; std::string IconName; uint32 GossipMenuId; - uint8 minlevel; - uint8 maxlevel; - uint32 expansion; + int16 minlevel; + int16 maxlevel; + int32 expansion; uint32 expansionUnknown; // either 0 or 3, sent to the client / wdb uint32 faction; uint32 npcflag; @@ -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[3]; + 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/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 2b13c859255..382bf45052b 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1809,9 +1809,9 @@ void GameObject::CastSpell(Unit* target, uint32 spellId, bool triggered /*= true return; bool self = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_CASTER) + if (effect && effect->TargetA.GetTarget() == TARGET_UNIT_CASTER) { self = true; break; @@ -2150,7 +2150,7 @@ void GameObject::SetTransportState(GOState state, uint32 stopFrame /*= 0*/) } else { - ASSERT(state < GO_STATE_TRANSPORT_STOPPED + MAX_GO_STATE_TRANSPORT_STOP_FRAMES); + ASSERT(state < GOState(GO_STATE_TRANSPORT_STOPPED + MAX_GO_STATE_TRANSPORT_STOP_FRAMES)); ASSERT(stopFrame < m_goValue.Transport.StopFrames->size()); m_goValue.Transport.PathProgress = getMSTime() + m_goValue.Transport.StopFrames->at(stopFrame); SetGoState(GOState(GO_STATE_TRANSPORT_STOPPED + stopFrame)); diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index f5813ae0781..ea9e24dff94 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -127,36 +127,42 @@ uint32 GenerateEnchSuffixFactor(uint32 item_id) if (!itemProto->RandomSuffix) return 0; - RandomPropertiesPointsEntry const* randomProperty = sRandomPropertiesPointsStore.LookupEntry(itemProto->ItemLevel); - if (!randomProperty) - return 0; + return GetRandomPropertyPoints(itemProto->ItemLevel, itemProto->Quality, itemProto->InventoryType, itemProto->SubClass); +} + +uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass) +{ + uint32 propIndex; - uint32 suffixFactor; - switch (itemProto->InventoryType) + switch (inventoryType) { - // Items of that type don`t have points - case INVTYPE_NON_EQUIP: - case INVTYPE_BAG: - case INVTYPE_TABARD: - case INVTYPE_AMMO: - case INVTYPE_QUIVER: - case INVTYPE_RELIC: - return 0; - // Select point coefficient case INVTYPE_HEAD: case INVTYPE_BODY: case INVTYPE_CHEST: case INVTYPE_LEGS: + case INVTYPE_RANGED: case INVTYPE_2HWEAPON: case INVTYPE_ROBE: - suffixFactor = 0; + case INVTYPE_THROWN: + propIndex = 0; + break; + case INVTYPE_RANGEDRIGHT: + if (subClass == ITEM_SUBCLASS_WEAPON_WAND) + propIndex = 3; + else + propIndex = 0; + break; + case INVTYPE_WEAPON: + case INVTYPE_WEAPONMAINHAND: + case INVTYPE_WEAPONOFFHAND: + propIndex = 3; break; case INVTYPE_SHOULDERS: case INVTYPE_WAIST: case INVTYPE_FEET: case INVTYPE_HANDS: case INVTYPE_TRINKET: - suffixFactor = 1; + propIndex = 1; break; case INVTYPE_NECK: case INVTYPE_WRISTS: @@ -164,36 +170,29 @@ uint32 GenerateEnchSuffixFactor(uint32 item_id) case INVTYPE_SHIELD: case INVTYPE_CLOAK: case INVTYPE_HOLDABLE: - suffixFactor = 2; - break; - case INVTYPE_WEAPON: - case INVTYPE_WEAPONMAINHAND: - case INVTYPE_WEAPONOFFHAND: - suffixFactor = 3; - break; - case INVTYPE_RANGED: - case INVTYPE_THROWN: - case INVTYPE_RANGEDRIGHT: - suffixFactor = 4; + propIndex = 2; break; + case INVTYPE_RELIC: + propIndex = 4; default: return 0; } - // Select rare/epic modifier - switch (itemProto->Quality) + + RandomPropertiesPointsEntry const* randPropPointsEntry = sRandomPropertiesPointsStore.LookupEntry(itemLevel); + if (!randPropPointsEntry) + return 0; + + switch (quality) { case ITEM_QUALITY_UNCOMMON: - return randomProperty->UncommonPropertiesPoints[suffixFactor]; + return randPropPointsEntry->UncommonPropertiesPoints[propIndex]; case ITEM_QUALITY_RARE: - return randomProperty->RarePropertiesPoints[suffixFactor]; + case ITEM_QUALITY_HEIRLOOM: + return randPropPointsEntry->RarePropertiesPoints[propIndex]; case ITEM_QUALITY_EPIC: - return randomProperty->EpicPropertiesPoints[suffixFactor]; case ITEM_QUALITY_LEGENDARY: - case ITEM_QUALITY_ARTIFACT: - return 0; // not have random properties - default: - break; + return randPropPointsEntry->EpicPropertiesPoints[propIndex]; } + return 0; } - diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.h b/src/server/game/Entities/Item/ItemEnchantmentMgr.h index a263ec0dae4..73d3d97bb0b 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.h +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.h @@ -24,5 +24,6 @@ void LoadRandomEnchantmentsTable(); uint32 GetItemEnchantMod(int32 entry); uint32 GenerateEnchSuffixFactor(uint32 item_id); +uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subclass); #endif diff --git a/src/server/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h index e28e8a21678..3846f7dd642 100644 --- a/src/server/game/Entities/Item/ItemPrototype.h +++ b/src/server/game/Entities/Item/ItemPrototype.h @@ -598,7 +598,7 @@ struct ItemEffect { uint32 SpellID; uint32 Trigger; - uint32 Charges; + int32 Charges; int32 Cooldown; uint32 Category; int32 CategoryCooldown; @@ -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..40a8ed046fb 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -943,7 +943,14 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const case TYPEID_AREATRIGGER: flags = AreaTriggerUpdateFieldFlags; break; + case TYPEID_SCENEOBJECT: + flags = SceneObjectUpdateFieldFlags; + break; + case TYPEID_CONVERSATION: + flags = ConversationUpdateFieldFlags; + break; case TYPEID_OBJECT: + ASSERT(false); break; } @@ -981,6 +988,9 @@ uint32 Object::GetDynamicUpdateFieldData(Player const* target, uint32*& flags) c visibleFlag |= UF_FLAG_PARTY_MEMBER; break; } + case TYPEID_CONVERSATION: + flags = ConversationDynamicUpdateFieldFlags; + break; default: flags = nullptr; break; @@ -1001,7 +1011,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 +2369,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/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index f59c82d44f5..327b83ba6d4 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -231,13 +231,13 @@ ObjectGuid const ObjectGuid::Empty = ObjectGuid(); ObjectGuid const ObjectGuid::TradeItem = ObjectGuid::Create<HighGuid::Uniq>(uint64(10)); template<HighGuid type> -ObjectGuid ObjectGuid::Create(LowType counter) +ObjectGuid ObjectGuid::Create(LowType /*counter*/) { static_assert(type == HighGuid::Count, "This guid type cannot be constructed using Create(LowType counter)."); } template<HighGuid type> -ObjectGuid ObjectGuid::Create(uint16 mapId, uint32 entry, LowType counter) +ObjectGuid ObjectGuid::Create(uint16 /*mapId*/, uint32 /*entry*/, LowType /*counter*/) { static_assert(type == HighGuid::Count, "This guid type cannot be constructed using Create(uint16 mapId, uint32 entry, LowType counter)."); } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index 74f6b62e398..c6a9a0b1132 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -45,7 +45,7 @@ void UpdateData::AddUpdateBlock(const ByteBuffer &block) bool UpdateData::BuildPacket(WorldPacket* packet) { ASSERT(packet->empty()); // shouldn't happen - packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos(), CONNECTION_TYPE_INSTANCE); + packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); *packet << uint32(m_blockCount); *packet << uint16(m_map); diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 52045f46472..bc08e8b1baf 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -214,18 +214,15 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c { case SUMMON_PET: petlevel = owner->getLevel(); - - SetUInt32Value(UNIT_FIELD_BYTES_0, 0x800); // class = mage - SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); - // this enables popup window (pet dismiss, cancel) + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_MAGE); + SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); // this enables popup window (pet dismiss, cancel) break; case HUNTER_PET: - SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100); // class = warrior, gender = none, power = focus + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_WARRIOR); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, GENDER_NONE); SetSheath(SHEATH_STATE_MELEE); SetByteFlag(UNIT_FIELD_BYTES_2, 2, fields[9].GetBool() ? UNIT_CAN_BE_ABANDONED : UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED); - - SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); - // this enables popup window (pet abandon, cancel) + SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); // this enables popup window (pet abandon, cancel) setPowerType(POWER_FOCUS); break; default: @@ -782,7 +779,9 @@ bool Pet::CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phas if (cinfo->type == CREATURE_TYPE_BEAST) { - SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_WARRIOR); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, GENDER_NONE); + SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, POWER_FOCUS); SetSheath(SHEATH_STATE_MELEE); SetByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ae8f0191137..a3a6c0d21a1 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" @@ -87,6 +87,9 @@ #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) @@ -169,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); } } @@ -196,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); } @@ -785,9 +788,9 @@ Player::Player(WorldSession* session): Unit(true) m_HomebindTimer = 0; m_InstanceValid = true; - m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL; - m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; - m_raidMapDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; + m_dungeonDifficulty = DIFFICULTY_NORMAL; + m_raidDifficulty = DIFFICULTY_10_N; + m_raidMapDifficulty = DIFFICULTY_10_N; m_lastPotionId = 0; _talentMgr = new PlayerTalentInfo(); @@ -982,9 +985,10 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac return false; } - uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Sex << 16); - - SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24))); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, createInfo->Race); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, createInfo->Class); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, createInfo->Sex); + SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, powertype); InitDisplayIds(); if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP) { @@ -1930,18 +1934,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; } @@ -2133,18 +2137,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 @@ -2158,14 +2160,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(); } @@ -2985,11 +2985,39 @@ void Player::GiveLevel(uint8 level) SetByteFlag(PLAYER_FIELD_BYTES, 1, 0x01); } + std::list<uint32> learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetTalentSpec(GetActiveTalentGroup()), oldLevel, level); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) + { + if (!HasSpell(*iter)) + LearnSpell(*iter, true); + } + sScriptMgr->OnPlayerLevelChanged(this, oldLevel); } void Player::InitTalentForLevel() { + uint8 level = getLevel(); + // talents base at level diff (talents = level - 9 but some can be used already) + if (level < 15) + { + // Remove all talent points + if (GetUsedTalentCount() > 0) // Free any used talents + { + ResetTalents(true); + } + } + else + { + if (level < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL) || GetTalentGroupsCount() == 0) + { + SetTalentGroupsCount(1); + SetActiveTalentGroup(0); + } + } + + SetUInt32Value(PLAYER_FIELD_MAX_TALENT_TIERS, CalculateTalentsPoints()); + if (!GetSession()->PlayerLoading()) SendTalentsInfoData(); // update at client } @@ -3164,9 +3192,10 @@ void Player::InitStatsForLevel(bool reapplyMods) void Player::SendKnownSpells() { - WorldPackets::Spell::SendKnownSpells knownSpells; + WorldPackets::Spells::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) @@ -3266,7 +3295,7 @@ void DeleteSpellFromAllPlayers(uint32 spellId) } } -bool Player::AddTalent(uint32 talentId, uint8 spec) +bool Player::AddTalent(uint32 talentId, uint8 spec, bool learning) { TalentEntry const* talentEntry = sTalentStore.LookupEntry(talentId); @@ -3308,15 +3337,28 @@ bool Player::AddTalent(uint32 talentId, uint8 spec) return false; } - TalentGroupInfo* talentGroupInfo = GetTalentGroupInfo(spec); + PlayerTalentMap::iterator itr = GetTalentMap(spec)->find(talentId); + if (itr == GetTalentMap(spec)->end()) + { + //if (GetTalentBySpellID(talentEntry->SpellID)) + { + PlayerSpellState state = learning ? PLAYERSPELL_NEW : PLAYERSPELL_UNCHANGED; + PlayerTalent* newtalent = new PlayerTalent(); - // Check if player already has this talent - if (talentGroupInfo->HasTalent(talentId)) - return false; + newtalent->state = state; + newtalent->spec = spec; - talentGroupInfo->Talents[talentEntry->TierID] = talentId; + (*GetTalentMap(spec))[talentId] = newtalent; - return true; + return true; + } + //else + // TC_LOG_ERROR("spells", "Player::addTalent: Talent %u not found in talent store.", talentId); + } + else + itr->second->state = PLAYERSPELL_UNCHANGED; + + return false; } bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading /*= false*/, bool fromSkill /*= false*/) @@ -3420,9 +3462,9 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent SendSupercededSpell(spellId, next_active_spell_id); else { - WorldPacket data(SMSG_REMOVED_SPELL, 4); - data << uint32(spellId); - GetSession()->SendPacket(&data); + WorldPackets::Spells::SendRemovedSpell removedSpells; + removedSpells.Spells.push_back(spellId); + GetSession()->SendPacket(removedSpells.Write()); } } @@ -3528,9 +3570,11 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent return false; } + uint32 talentCost = GetTalentSpellCost(spellId); + // cast talents with SPELL_EFFECT_LEARN_SPELL (other dependent spells will learned later as not auto-learned) // note: all spells with SPELL_EFFECT_LEARN_SPELL isn't passive - if (!loading && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)) + if (!loading && talentCost > 0 && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)) { // ignore stance requirement for talent learn spell (stance set for spell only for client spell description show) CastSpell(this, spellId, true); @@ -3547,6 +3591,9 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent return false; } + // update used talent points count + SetUsedTalentCount(GetUsedTalentCount() + talentCost); + // update free primary prof.points (if any, can be none in case GM .learn prof. learning) if (uint32 freeProfs = GetFreePrimaryProfessionPoints()) { @@ -3554,38 +3601,62 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent SetFreePrimaryProfessions(freeProfs-1); } + // add dependent skills + uint16 maxskill = GetMaxSkillValueForLevel(); + + SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId); + SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId); - // add dependent skills if this spell is not learned from adding skill already - if (!fromSkill) + if (spellLearnSkill) { - if (SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId)) - { - uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill); - uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill); + uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill); + uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill); - if (skill_value < spellLearnSkill->value) - skill_value = spellLearnSkill->value; + if (skill_value < spellLearnSkill->value) + skill_value = spellLearnSkill->value; - uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : spellLearnSkill->maxvalue; + uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue; - if (skill_max_value < new_skill_max_value) - skill_max_value = new_skill_max_value; + if (skill_max_value < new_skill_max_value) + skill_max_value = new_skill_max_value; - SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value); - } - else + SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value); + } + else + { + // not ranked skills + for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx) { - // not ranked skills - for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx) - { - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine); - if (!pSkill) - continue; + SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine); + if (!pSkill) + continue; + + if (HasSkill(pSkill->ID)) + continue; - ///@todo: confirm if rogues start with lockpicking skill at level 1 but only receive the spell to use it at level 16 - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || (pSkill->ID == SKILL_LOCKPICKING && _spell_idx->second->TrivialSkillLineRankHigh == 0)) - LearnDefaultSkill(pSkill->ID, 0); + SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass()); + if (!rcEntry) + continue; + + if (_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN || + // lockpicking/runeforging special case, not have SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN + ((pSkill->ID == SKILL_LOCKPICKING || pSkill->ID == SKILL_RUNEFORGING) && (_spell_idx->second->TrivialSkillLineRankHigh == 0 || _spell_idx->second->TrivialSkillLineRankHigh == 1))) + { + switch (GetSkillRangeType(rcEntry)) + { + case SKILL_RANGE_LANGUAGE: + SetSkill(pSkill->ID, GetSkillStep(pSkill->ID), 300, 300); + break; + case SKILL_RANGE_LEVEL: + SetSkill(pSkill->ID, GetSkillStep(pSkill->ID), 1, GetMaxSkillValueForLevel()); + break; + case SKILL_RANGE_MONO: + SetSkill(pSkill->ID, GetSkillStep(pSkill->ID), 1, 1); + break; + default: + break; + } } } } @@ -3664,6 +3735,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const bool Player::IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const { + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetActiveTalentSpec())) return spellInfo->Id == chrSpec->MasterySpellID[0] || spellInfo->Id == chrSpec->MasterySpellID[1]; @@ -3682,10 +3754,9 @@ void Player::LearnSpell(uint32 spell_id, bool dependent, bool fromSkill /*= fals // prevent duplicated entires in spell book, also not send if not in world (loading) if (learning && IsInWorld()) { - WorldPacket data(SMSG_LEARNED_SPELL, 8); - data << uint32(spell_id); - data << uint32(0); - GetSession()->SendPacket(&data); + WorldPackets::Spells::LearnedSpells packet; + packet.SpellID.push_back(spell_id); + GetSession()->SendPacket(packet.Write()); } // learn all disabled higher ranks and required spells (recursive) @@ -3848,18 +3919,11 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled, bool learn_low_rank) if (spell_id == 46917 && m_canTitanGrip) SetCanTitanGrip(false); + if (m_canDualWield) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id); - if (spellInfo->IsPassive()) - { - for (int i = 0; i < MAX_SPELL_EFFECTS; i++) - if (spellInfo->Effects[i].Effect == SPELL_EFFECT_DUAL_WIELD) - { - SetCanDualWield(false); - break; - } - } + if (spellInfo && spellInfo->IsPassive() && spellInfo->HasEffect(SPELL_EFFECT_DUAL_WIELD)) + SetCanDualWield(false); } if (sWorld->getBoolConfig(CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN)) @@ -3868,9 +3932,9 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled, bool learn_low_rank) // remove from spell book if not replaced by lesser rank if (!prev_activate) { - WorldPacket data(SMSG_REMOVED_SPELL, 4); - data << uint32(spell_id); - GetSession()->SendPacket(&data); + WorldPackets::Spells::SendRemovedSpell removedSpells; + removedSpells.Spells.push_back(spell_id); + GetSession()->SendPacket(removedSpells.Write()); } } @@ -4055,9 +4119,12 @@ uint32 Player::GetNextResetTalentsCost() const } } -bool Player::ResetTalents(bool no_cost) +bool Player::ResetTalents(bool noCost, bool resetTalents, bool resetSpecialization) { - sScriptMgr->OnPlayerTalentsReset(this, no_cost); + if (!resetTalents && !resetSpecialization) + return false; + + sScriptMgr->OnPlayerTalentsReset(this, noCost); // not need after this call if (HasAtLoginFlag(AT_LOGIN_RESET_TALENTS)) @@ -4065,7 +4132,7 @@ bool Player::ResetTalents(bool no_cost) uint32 cost = 0; - if (!no_cost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST)) + if (!noCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST)) { cost = GetNextResetTalentsCost(); @@ -4078,66 +4145,54 @@ bool Player::ResetTalents(bool no_cost) RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true); - uint8 group = GetActiveTalentGroup(); - uint32 specID = GetActiveTalentSpec(); - - for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) + if (resetTalents) { - TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); + for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) + { + TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); - if (!talentInfo) - continue; + if (!talentInfo) + continue; - // unlearn only talents for character class - // some spell learned by one class as normal spells or know at creation but another class learn it as talent, - // to prevent unexpected lost normal learned spell skip another class talents - if (getClass() != talentInfo->ClassID) - continue; + // unlearn only talents for character class + // some spell learned by one class as normal spells or know at creation but another class learn it as talent, + // to prevent unexpected lost normal learned spell skip another class talents + if (talentInfo->ClassID != getClass()) + continue; - const SpellInfo* _spellEntry = sSpellMgr->GetSpellInfo(talentInfo->SpellID); + SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(talentInfo->SpellID); + if (!spellEntry) + continue; - if (!_spellEntry) - continue; + RemoveSpell(spellEntry->Id, false); - RemoveSpell(talentInfo->SpellID, true); + // search for spells that the talent teaches and unlearn them, 6.x remove? + for (SpellEffectInfo const* effect : spellEntry->GetEffectsForDifficulty(DIFFICULTY_NONE)) + if (effect && effect->TriggerSpell > 0 && effect->Effect == SPELL_EFFECT_LEARN_SPELL) + RemoveSpell(effect->TriggerSpell, true); - // search for spells that the talent teaches and unlearn them - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (_spellEntry->Effects[i].TriggerSpell > 0 && _spellEntry->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL) - RemoveSpell(_spellEntry->Effects[i].TriggerSpell, true); + GetTalentMap(GetActiveTalentGroup())->erase(talentId); + } } - // Remove all specialization specific spells and give default ones which were overriden - auto specSpells = sSpecializationSpellsBySpecStore.find(specID); - if (specSpells != sSpecializationSpellsBySpecStore.end()) + if (resetSpecialization) { - for (auto it = specSpells->second.begin(); it != specSpells->second.end(); ++it) + std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetTalentSpec(GetActiveTalentGroup()), 0, getLevel()); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) { - SpecializationSpellsEntry const* specSpell = *it; - if (HasSpell(specSpell->SpellID)) { - RemoveSpell(specSpell->SpellID, true); - if (specSpell->OverridesSpellID) - LearnSpell(specSpell->OverridesSpellID, false); - } + if (HasSpell(*iter)) + RemoveSpell(*iter, true); } + SetTalentSpec(GetActiveTalentGroup(), 0); + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0); } - // Unlearn masteries - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(specID)) - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (uint32 mastery = chrSpec->MasterySpellID[i]) - RemoveAurasDueToSpell(mastery); - - // Reset talents store - GetTalentGroupInfo(group)->Reset(); - SetTalentSpec(group, 0); - SQLTransaction trans = CharacterDatabase.BeginTransaction(); _SaveTalents(trans); _SaveSpells(trans); CharacterDatabase.CommitTransaction(trans); - if (!no_cost) + if (!noCost) { ModifyMoney(-(int64)cost); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, cost); @@ -4158,6 +4213,35 @@ bool Player::ResetTalents(bool no_cost) return true; } +bool Player::RemoveTalent(uint32 talentId) +{ + TalentEntry const* talent = sTalentStore.LookupEntry(talentId); + if (!talent) + return false; + + uint32 spellId = talent->SpellID; + + SpellInfo const* unlearnSpellProto = sSpellMgr->GetSpellInfo(spellId); + + RemoveSpell(spellId, false); + + // 6.x remove? + for (SpellEffectInfo const* effect : unlearnSpellProto->GetEffectsForDifficulty(DIFFICULTY_NONE)) + if (effect && effect->TriggerSpell > 0 && effect->Effect == SPELL_EFFECT_LEARN_SPELL) + RemoveSpell(effect->TriggerSpell, false); + + GetTalentMap(GetActiveTalentSpec())->erase(talentId); + + // Needs to be executed orthewise the talents will be screwedsx + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + _SaveTalents(trans); + _SaveSpells(trans); + CharacterDatabase.CommitTransaction(trans); + + SendTalentsInfoData(); + return true; +} + Mail* Player::GetMail(uint32 id) { for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) @@ -4224,7 +4308,8 @@ bool Player::HasSpell(uint32 spell) const bool Player::HasTalent(uint32 talentId, uint8 group) { - return GetTalentGroupInfo(group)->HasTalent(talentId); + PlayerTalentMap::const_iterator itr = GetTalentMap(group)->find(talentId); + return (itr != GetTalentMap(group)->end()); } bool Player::HasActiveSpell(uint32 spell) const @@ -4872,7 +4957,7 @@ void Player::CreateCorpse() // prevent existence 2 corpse for player SpawnCorpseBones(); - uint32 _uf, _pb, _pb2, _cfb1, _cfb2; + uint32 _pb, _pb2, _cfb1, _cfb2; Corpse* corpse = new Corpse((m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH) ? CORPSE_RESURRECTABLE_PVP : CORPSE_RESURRECTABLE_PVE); SetPvPDeath(false); @@ -4883,18 +4968,16 @@ void Player::CreateCorpse() return; } - _uf = GetUInt32Value(UNIT_FIELD_BYTES_0); _pb = GetUInt32Value(PLAYER_BYTES); _pb2 = GetUInt32Value(PLAYER_BYTES_2); - uint8 race = (uint8)(_uf); uint8 skin = (uint8)(_pb); uint8 face = (uint8)(_pb >> 8); uint8 hairstyle = (uint8)(_pb >> 16); uint8 haircolor = (uint8)(_pb >> 24); uint8 facialhair = (uint8)(_pb2); - _cfb1 = ((0x00) | (race << 8) | (getGender() << 16) | (skin << 24)); + _cfb1 = ((0x00) | (getRace() << 8) | (getGender() << 16) | (skin << 24)); _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24)); corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1); @@ -5225,8 +5308,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()); @@ -5241,12 +5324,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)) @@ -5279,7 +5360,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); @@ -5385,11 +5466,11 @@ float Player::GetMeleeCritFromAgility() uint8 level = getLevel(); uint32 pclass = getClass(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; + if (level >= sGtChanceToMeleeCritStore.GetTableRowCount()) + level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1; - GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass-1); - GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); + GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.EvaluateTable(pclass - 1, 0); + GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1); if (critBase == NULL || critRatio == NULL) return 0.0f; @@ -5433,11 +5514,11 @@ void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) uint8 level = getLevel(); uint32 pclass = getClass(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; + if (level >= sGtChanceToMeleeCritStore.GetTableRowCount()) + level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1; // Dodge per agility is proportional to crit per agility, which is available from DBC files - GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); + GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1); if (dodgeRatio == NULL || pclass > MAX_CLASSES) return; @@ -5455,11 +5536,11 @@ float Player::GetSpellCritFromIntellect() uint8 level = getLevel(); uint32 pclass = getClass(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; + if (level >= sGtChanceToSpellCritStore.GetTableRowCount()) + level = sGtChanceToSpellCritStore.GetTableRowCount() - 1; - GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1); - GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1); + GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.EvaluateTable(pclass - 1, 0); + GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.EvaluateTable(level - 1, pclass - 1); if (critBase == NULL || critRatio == NULL) return 0.0f; @@ -5471,12 +5552,12 @@ float Player::GetRatingMultiplier(CombatRating cr) const { uint8 level = getLevel(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; + if (level >= sGtCombatRatingsStore.GetTableRowCount()) + level = sGtCombatRatingsStore.GetTableRowCount() - 1; - GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr*GT_MAX_LEVEL+level-1); + GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.EvaluateTable(level - 1, cr); // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1 - GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass()-1)*GT_MAX_RATING+cr+1); + GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.EvaluateTable(cr + 1, getClass() - 1); if (!Rating || !classRating) return 1.0f; // By default use minimum coefficient (not must be called) @@ -5510,11 +5591,10 @@ float Player::OCTRegenMPPerSpirit() uint8 level = getLevel(); uint32 pclass = getClass(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; + if (level >= sGtRegenMPPerSptStore.GetTableRowCount()) + level = sGtRegenMPPerSptStore.GetTableRowCount() - 1; -// GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); - GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); + GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.EvaluateTable(level - 1, pclass - 1); if (moreRatio == NULL) return 0.0f; @@ -6203,20 +6283,20 @@ int16 Player::GetSkillTempBonusValue(uint32 skill) const void Player::SendActionButtons(uint32 state) const { - WorldPackets::Spell::UpdateActionButtons packet; + WorldPackets::Spells::UpdateActionButtons packet; 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) - packet.ActionButtons[button] = uint32(itr->second.packedData); + packet.ActionButtons[button] = uint64(itr->second.packedData); else packet.ActionButtons[button] = 0; } packet.Reason = state; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); TC_LOG_INFO("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup()); } @@ -6346,7 +6426,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); @@ -6355,7 +6435,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); @@ -6364,7 +6444,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); @@ -6375,7 +6455,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); } @@ -8263,7 +8343,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 } // not allow proc extra attack spell at extra attack - if (m_extraAttacks && spellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + if (m_extraAttacks && spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_ADD_EXTRA_ATTACKS)) return; float chance = (float)spellInfo->ProcChance; @@ -9494,6 +9574,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER } break; + // Halls of Refection + case 4820: + if (instance && mapid == 668) + instance->FillInitialWorldStates(data); + else + { + data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED + data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT + } + break; // Zul Aman case 3805: if (instance && mapid == 568) @@ -9528,20 +9618,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) // Wintergrasp case 4197: if (bf && bf->GetTypeId() == BATTLEFIELD_WG) - { bf->FillInitialWorldStates(data); - break; - } - // Halls of Refection - case 4820: - if (instance && mapid == 668) - instance->FillInitialWorldStates(data); - else - { - data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED - data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT - } - break; // No break here, intended. default: data << uint32(0x914) << uint32(0x0); // 7 @@ -15127,7 +15204,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, if (quest->GetRewSpellCast() > 0) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()); - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM)) + if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM)) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) creature->CastSpell(this, quest->GetRewSpellCast(), true); @@ -15138,7 +15215,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, else if (quest->GetRewSpell() > 0) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell()); - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM)) + if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM)) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) creature->CastSpell(this, quest->GetRewSpell(), true); @@ -16744,28 +16821,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 (ObjectGuid::LowType 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()); } @@ -16830,6 +16905,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()) @@ -16919,12 +17005,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) return false; } - // overwrite some data fields - uint32 bytes0 = 0; - bytes0 |= fields[3].GetUInt8(); // race - bytes0 |= fields[4].GetUInt8() << 8; // class - bytes0 |= gender << 16; // gender - SetUInt32Value(UNIT_FIELD_BYTES_0, bytes0); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, fields[3].GetUInt8()); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, fields[4].GetUInt8()); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, gender); // check if race/class combination is valid PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); @@ -16996,10 +17079,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) uint32 dungeonDiff = fields[39].GetUInt8() & 0x0F; if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY) - dungeonDiff = DUNGEON_DIFFICULTY_NORMAL; + dungeonDiff = DIFFICULTY_NORMAL; uint32 raidDiff = (fields[39].GetUInt8() >> 4) & 0x0F; if (raidDiff >= MAX_RAID_DIFFICULTY) - raidDiff = RAID_DIFFICULTY_10MAN_NORMAL; + raidDiff = DIFFICULTY_10_N; SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup @@ -17390,13 +17473,18 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (i >= talentSpecs.size()) break; - uint32 talentSpec = atol(talentSpecs[i]); - if (sChrSpecializationStore.LookupEntry(talentSpec)) - SetTalentSpec(i, talentSpec); - else - SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); + uint32 talentSpec = atoul(talentSpecs[i]); + if (talentSpec) + { + if (sChrSpecializationStore.LookupEntry(talentSpec)) + SetTalentSpec(i, talentSpec); + else + SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); + } } + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, GetActiveTalentSpec()); + _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); @@ -17810,7 +17898,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = ObjectGuid::Create<HighGuid::Item>(fields[11].GetUInt64()); + ObjectGuid bagGuid = fields[11].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[11].GetUInt64()) : ObjectGuid::Empty; uint8 slot = fields[12].GetUInt8(); uint8 err = EQUIP_ERR_OK; @@ -18462,6 +18550,13 @@ void Player::_LoadSpells(PreparedQueryResult result) AddSpell((*result)[0].GetUInt32(), (*result)[1].GetBool(), false, false, (*result)[2].GetBool(), true); while (result->NextRow()); } + + std::list<uint32> learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetActiveTalentSpec(), 0, getLevel()); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) + { + if (!HasSpell(*iter)) + LearnSpell(*iter, true); + } } void Player::_LoadGroup(PreparedQueryResult result) @@ -18710,7 +18805,7 @@ void Player::SendRaidInfo() if (itr->second.perm) { InstanceSave* save = itr->second.save; - bool isHeroic = save->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC || save->GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC; + bool isHeroic = save->GetDifficulty() == DIFFICULTY_10_HC || save->GetDifficulty() == DIFFICULTY_25_HC; uint32 completedEncounters = 0; if (Map* map = sMapMgr->FindMap(save->GetMapId(), save->GetInstanceId())) if (InstanceScript* instanceScript = ((InstanceMap*)map)->GetInstanceScript()) @@ -20173,7 +20268,7 @@ void Player::ResetInstances(uint8 method, bool isRaid) if (method == INSTANCE_RESET_ALL) { // the "reset all instances" method can only reset normal maps - if (entry->IsRaid() || diff == DUNGEON_DIFFICULTY_HEROIC) + if (entry->IsRaid() || diff == DIFFICULTY_HEROIC) { ++itr; continue; @@ -20416,9 +20511,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*/) @@ -20426,9 +20521,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*/) @@ -20436,9 +20531,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) @@ -20449,9 +20544,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*/) @@ -20466,16 +20561,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()) { @@ -20791,15 +20886,18 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) TC_LOG_DEBUG("spells", "Player::AddSpellMod %d", mod->spellId); OpcodeServer opcode = (mod->type == SPELLMOD_FLAT) ? SMSG_SET_FLAT_SPELL_MODIFIER : SMSG_SET_PCT_SPELL_MODIFIER; + WorldPackets::Spells::SetSpellModifier packet(opcode); + int i = 0; - flag96 _mask; - uint32 modTypeCount = 0; // count of mods per one mod->op - WorldPacket data(opcode); - data << uint32(1); // count of different mod->op's in packet - size_t writePos = data.wpos(); - data << uint32(modTypeCount); - data << uint8(mod->op); - for (int eff = 0; eff < 96; ++eff) + flag128 _mask; + + /// @todo Implement sending of bulk modifiers instead of single + packet.Modifiers.resize(1); + WorldPackets::Spells::SpellModifier& spellMod = packet.Modifiers[0]; + + spellMod.ModIndex = mod->op; + + for (int eff = 0; eff < 128; ++eff) { if (eff != 0 && (eff % 32) == 0) _mask[i++] = 0; @@ -20807,19 +20905,24 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) _mask[i] = uint32(1) << (eff - (32 * i)); if (mod->mask & _mask) { - int32 val = 0; + WorldPackets::Spells::SpellModifierData modData; + for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr) if ((*itr)->type == mod->type && (*itr)->mask & _mask) - val += (*itr)->value; - val += apply ? mod->value : -(mod->value); + modData.ModifierValue += (*itr)->value; + + modData.ModifierValue += apply ? mod->value : -(mod->value); + if (mod->type == SPELLMOD_PCT) + modData.ModifierValue = 1.0f + (modData.ModifierValue * 0.01f); - data << uint8(eff); - data << float(val); - ++modTypeCount; + modData.ClassIndex = eff; + + spellMod.ModifierData.push_back(modData); } } - data.put<uint32>(writePos, modTypeCount); - SendDirectMessage(&data); + + SendDirectMessage(packet.Write()); + if (apply) m_spellMods[mod->op].push_back(mod); else @@ -20965,9 +21068,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) @@ -21371,12 +21475,7 @@ void Player::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) if (itr->second->state == PLAYERSPELL_REMOVED) continue; uint32 unSpellId = itr->first; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(unSpellId); - if (!spellInfo) - { - ASSERT(spellInfo); - continue; - } + SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(unSpellId); // Not send cooldown for this spells if (spellInfo->IsCooldownStartedOnEvent()) @@ -22781,6 +22880,10 @@ template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data void Player::UpdateObjectVisibility(bool forced) { + // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map) + if (!IsInWorld()) + return; + if (!forced) AddToNotify(NOTIFY_VISIBILITY_CHANGED); else @@ -22970,67 +23073,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(); - WorldPackets::Spell::SendUnlearnSpells packet; - GetSession()->SendPacket(packet.Write()); + /// SMSG_SEND_UNLEARN_SPELLS + SendDirectMessage(WorldPackets::Spells::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); } @@ -23105,11 +23208,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) @@ -23256,7 +23359,6 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) if (!rcInfo) return; - TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial skill, id = %u", uint32(getClass()), uint32(getRace()), skillId); switch (GetSkillRangeType(rcInfo)) { case SKILL_RANGE_LANGUAGE: @@ -23302,6 +23404,7 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) } } + void Player::LearnQuestRewardedSpells(Quest const* quest) { int32 spell_id = quest->GetRewSpellCast(); @@ -23324,9 +23427,9 @@ void Player::LearnQuestRewardedSpells(Quest const* quest) // check learned spells state bool found = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !HasSpell(spellInfo->Effects[i].TriggerSpell)) + if (effect && effect->Effect == SPELL_EFFECT_LEARN_SPELL && !HasSpell(effect->TriggerSpell)) { found = true; break; @@ -23337,8 +23440,12 @@ void Player::LearnQuestRewardedSpells(Quest const* quest) if (!found) return; + SpellEffectInfo const* effect = spellInfo->GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (!effect) + return; + // prevent learn non first rank unknown profession and second specialization for same profession) - uint32 learned_0 = spellInfo->Effects[0].TriggerSpell; + uint32 learned_0 = effect->TriggerSpell; if (sSpellMgr->GetSpellRank(learned_0) > 1 && !HasSpell(learned_0)) { SpellInfo const* learnedInfo = sSpellMgr->GetSpellInfo(learned_0); @@ -23354,8 +23461,15 @@ void Player::LearnQuestRewardedSpells(Quest const* quest) { uint32 profSpell = itr2->second; + SpellEffectInfo const* effect0 = learnedInfo->GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (!effect0) + continue; + SpellEffectInfo const* effect1 = learnedInfo->GetEffect(DIFFICULTY_NONE, EFFECT_1); + if (!effect1) + continue; + // specialization - if (learnedInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL && learnedInfo->Effects[1].Effect == 0 && profSpell) + if (effect0->Effect == SPELL_EFFECT_TRADE_SKILL && effect1->Effect == 0 && profSpell) { // search other specialization for same prof for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) @@ -23367,8 +23481,16 @@ void Player::LearnQuestRewardedSpells(Quest const* quest) if (!itrInfo) return; + + SpellEffectInfo const* itrEffect0 = itrInfo->GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (!itrEffect0) + continue; + SpellEffectInfo const* itrEffect1 = itrInfo->GetEffect(DIFFICULTY_NONE, EFFECT_1); + if (!itrEffect1) + continue; + // compare only specializations - if (itrInfo->Effects[0].Effect != SPELL_EFFECT_TRADE_SKILL || itrInfo->Effects[1].Effect != 0) + if (itrEffect0->Effect != SPELL_EFFECT_TRADE_SKILL || itrEffect1->Effect != 0) continue; // compare same chain spells @@ -23405,7 +23527,8 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) if (!ability || ability->SkillLine != skillId) continue; - if (!sSpellMgr->GetSpellInfo(ability->SpellID)) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(ability->SpellID); + if (!spellInfo) continue; if (ability->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && ability->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) @@ -23419,6 +23542,10 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) if (ability->ClassMask && !(ability->ClassMask & classMask)) continue; + // check level, skip class spells if not high enough + if (getLevel() < spellInfo->SpellLevel) + continue; + // need unlearn spell if (skillValue < ability->MinSkillLineRank && ability->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE) RemoveSpell(ability->SpellID); @@ -23447,17 +23574,18 @@ void Player::SendAurasForTarget(Unit* target) if (target->HasAuraType(SPELL_AURA_HOVER)) target->SetHover(true, true); - WorldPacket data(SMSG_AURA_UPDATE_ALL); - data << target->GetPackGUID(); - Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras(); + + WorldPackets::Spells::SendAuraUpdate update; + update.Init(true, GetGUID(), visibleAuras->size()); + for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr) { AuraApplication * auraApp = itr->second; - auraApp->BuildUpdatePacket(data, false); + update.BuildUpdatePacket(auraApp, false, getLevel()); // TODO 6.x should be caster's level } - GetSession()->SendPacket(&data); + GetSession()->SendPacket(const_cast<WorldPacket*>(update.Write())); } void Player::SetDailyQuestStatus(uint32 quest_id) @@ -24676,8 +24804,8 @@ uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 n { uint8 level = getLevel(); - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; // max level in this dbc + if (level >= sGtBarberShopCostBaseStore.GetTableRowCount()) + level = sGtBarberShopCostBaseStore.GetTableRowCount() - 1; uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2); uint8 haircolor = GetByteValue(PLAYER_BYTES, 3); @@ -24687,7 +24815,7 @@ uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 n if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->Data == skincolor))) return 0; - GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1); + GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.EvaluateTable(level - 1, 0); if (!bsc) // shouldn't happen return 0xFFFFFFFF; @@ -25416,37 +25544,36 @@ void Player::CompletedAchievement(AchievementEntry const* entry) 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) return false; + uint32 maxTalentTier = GetUInt32Value(PLAYER_FIELD_MAX_TALENT_TIERS); + // prevent learn talent for different class (cheating) - if (getClass() != talentInfo->ClassID) + if (talentInfo->ClassID != getClass()) return false; - // Check player level - // TODO: fix level requirements for deathknights - uint8 levelReq = std::min(15*talentInfo->TierID + 15, sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)); - if (getLevel() < levelReq) + // check if we have enough talent points + if (talentInfo->TierID > maxTalentTier) return false; - // Check if such tier talent hasn't been picked already - TalentGroupInfo* talentGroupInfo = GetTalentGroupInfo(group); - if (talentGroupInfo->Talents[talentInfo->TierID]) - return false; + // Check if player doesnt have any spell in selected collumn + for (uint32 i = 0; i < sTalentStore.GetNumRows(); i++) + { + if (TalentEntry const* talent = sTalentStore.LookupEntry(i)) + { + if (talentInfo->TierID == talent->TierID && HasSpell(talent->SpellID)) + return false; + } + } // spell not set in talent.dbc uint32 spellid = talentInfo->SpellID; if (spellid == 0) { - TC_LOG_ERROR("entities.player", "Talent.dbc have for talent: %u spell id = 0", talentId); + TC_LOG_ERROR("entities.player", "Talent.dbc has no spellInfo for talent: %u (spell id = 0)", talentId); return false; } @@ -25454,54 +25581,64 @@ bool Player::LearnTalent(uint32 talentId) if (HasSpell(spellid)) return false; - // Check talent spec - if (talentInfo->SpecID != GetTalentSpec(group)) + if (!AddTalent(talentId, GetActiveTalentGroup(), true)) return false; - // learn! (other talent ranks will unlearned at learning) LearnSpell(spellid, false); - AddTalent(talentId, group); - TC_LOG_INFO("misc", "TalentID: %u Spell: %u Group: %u\n", talentId, spellid, group); + TC_LOG_INFO("misc", "TalentID: %u Spell: %u Group: %u\n", talentId, spellid, GetActiveTalentGroup()); return true; } void Player::LearnTalentSpecialization(uint32 talentSpec) { + if (GetActiveTalentSpec()) + return; + SetTalentSpec(GetActiveTalentGroup(), talentSpec); - // Replace default spells by specialization spells - auto specSpells = sSpecializationSpellsBySpecStore.find(talentSpec); - if (specSpells != sSpecializationSpellsBySpecStore.end()) + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, talentSpec); + + PlayerTalentMap* talents = GetTalentMap(GetActiveTalentGroup()); + + for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { - for (auto it = specSpells->second.begin(); it != specSpells->second.end(); ++it) - { - SpecializationSpellsEntry const* specSpell = *it; + TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); - // Unlearn spell if it is replaced by new specialization - if (specSpell->OverridesSpellID) - RemoveSpell(specSpell->OverridesSpellID, true); + if (!talentInfo || talentInfo->ClassID != getClass() || talentInfo->SpecID != talentSpec) + continue; - // Learn new spell - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(specSpell->SpellID)) - if (spellInfo->BaseLevel <= getLevel()) - LearnSpell(specSpell->SpellID, false); + for (PlayerTalentMap::iterator itr = talents->begin(); itr != talents->end();) + { + TalentEntry const* talent = sTalentStore.LookupEntry(itr->first); + if (!talent || talent->TierID != talentInfo->TierID) + { + ++itr; + continue; + } + RemoveSpell(talent->SpellID, false); + itr = talents->erase(itr); + + TC_LOG_DEBUG("spells", "Player %s unlearning talent id: %u tier: %u due to specialization change", GetName().c_str(), talent->ID, talent->TierID); } } - if (CanUseMastery()) + SendTalentsInfoData(); + + std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetActiveTalentSpec(), 0, getLevel()); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) { - 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); + if (!HasSpell(*iter)) + LearnSpell(*iter, true); } - + + SaveToDB(); + SendTalentsInfoData(); } + void Player::AddKnownCurrency(uint32 itemId) { if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId)) @@ -25586,28 +25723,44 @@ void Player::SendTalentsInfoData() for (uint8 i = 0; i < groupsCount; ++i) { - TalentGroupInfo* groupInfo = GetTalentGroupInfo(i); WorldPackets::Talent::TalentGroupInfo groupInfoPkt; - groupInfoPkt.SpecID = groupInfo->SpecID; + groupInfoPkt.SpecID = GetTalentSpec(i); - groupInfoPkt.TalentIDs.reserve(MAX_TALENT_TIERS); - for (uint32 x = 0; x < MAX_TALENT_TIERS; ++x) + groupInfoPkt.TalentIDs.reserve(GetTalentMap(i)->size()); + + for (PlayerTalentMap::const_iterator itr = GetTalentMap(i)->begin(); itr != GetTalentMap(i)->end(); ++itr) { - // Do not send empty talents - if (!groupInfo->Talents[x]) - break; + TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->first); + if (!talentInfo) + { + TC_LOG_ERROR("entities.player", "Player %s has unknown talent id: %u", GetName().c_str(), itr->first); + continue; + } + + if (talentInfo->ClassID != getClass()) + continue; + + SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(talentInfo->SpellID); + if (!spellEntry) + { + TC_LOG_ERROR("entities.player", "Player %s has unknown talent spell: %u", GetName().c_str(), talentInfo->SpellID); + continue; + } - groupInfoPkt.TalentIDs.push_back(groupInfo->Talents[x]); + if (!HasTalent(itr->first, i)) + continue; + + groupInfoPkt.TalentIDs.push_back(uint16(itr->first)); } for (uint32 x = 0; x < MAX_GLYPH_SLOT_INDEX; ++x) - groupInfoPkt.GlyphIDs[x] = groupInfo->Glyphs[x]; + groupInfoPkt.GlyphIDs[x] = uint16(GetGlyph(i, x)); packet.Info.TalentGroups.push_back(groupInfoPkt); } - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); } void Player::BuildEnchantmentsInfoData(WorldPacket* data) @@ -25655,122 +25808,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) - { - if ((itr->second.Guid == eqset.Guid) && (itr->first == index)) - { - found = true; - break; - } - } - - if (!found) // something wrong... + // something wrong... + EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.SetID); + if (itr == _equipmentSets.end() || itr->second.Data.Guid != newEqSet.Guid) { - 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; } } @@ -25799,16 +25930,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; } } @@ -25935,7 +26067,7 @@ void Player::_LoadTalents(PreparedQueryResult result) if (result) { do - AddTalent((*result)[0].GetUInt32(), (*result)[1].GetUInt8()); + AddTalent((*result)[0].GetUInt32(), (*result)[1].GetUInt8(), false); while (result->NextRow()); } } @@ -25948,17 +26080,12 @@ void Player::_SaveTalents(SQLTransaction& trans) for (uint8 group = 0; group < MAX_TALENT_GROUPS; ++group) { - TalentGroupInfo* talentGroupInfo = GetTalentGroupInfo(group); - - for (uint32 tier = 0; tier < MAX_TALENT_TIERS; ++tier) + for (PlayerTalentMap::iterator itr = GetTalentMap(group)->begin(); itr != GetTalentMap(group)->end(); ++itr) { - if (!talentGroupInfo->Talents[tier]) - continue; - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT); stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, talentGroupInfo->Talents[tier]); - stmt->setUInt8(2, group); + stmt->setUInt32(1, itr->first); + stmt->setUInt8(2, itr->second->spec); trans->Append(stmt); } } @@ -26057,30 +26184,27 @@ void Player::ActivateTalentGroup(uint8 group) if (getClass() != talentInfo->ClassID) continue; + SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(talentInfo->SpellID); + if (!spellEntry) + continue; + RemoveSpell(talentInfo->SpellID, true); + + // search for spells that the talent teaches and unlearn them + for (SpellEffectInfo const* effect : spellEntry->GetEffectsForDifficulty(DIFFICULTY_NONE)) + if (effect && effect->TriggerSpell > 0 && effect->Effect == SPELL_EFFECT_LEARN_SPELL) + RemoveSpell(effect->TriggerSpell, true); } // Unlearn specialization specific spells - auto specSpells = sSpecializationSpellsBySpecStore.find(GetActiveTalentSpec()); - if (specSpells != sSpecializationSpellsBySpecStore.end()) + std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetActiveTalentSpec(), 0, getLevel()); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) { - for (auto it = specSpells->second.begin(); it != specSpells->second.end(); ++it) - { - SpecializationSpellsEntry const* specSpell = *it; - if (HasSpell(specSpell->SpellID)) { - RemoveSpell(specSpell->SpellID, true); - LearnSpell(specSpell->OverridesSpellID, false); - } - } + if (HasSpell(*iter)) + RemoveSpell(*iter, true); } - // Unlearn mastery spells - ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetActiveTalentSpec()); - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (chrSpec->MasterySpellID[i]) - RemoveSpell(chrSpec->MasterySpellID[i], true); - - // set glyphs + // remove glyphs for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) // remove secondary glyph if (uint32 oldglyph = GetGlyph(GetActiveTalentGroup(), slot)) @@ -26090,6 +26214,15 @@ void Player::ActivateTalentGroup(uint8 group) // Activate new group SetActiveTalentGroup(group); + uint32 spentTalents = 0; + + learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetActiveTalentSpec(), 0, getLevel()); + for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++) + { + if (!HasSpell(*iter)) + LearnSpell(*iter, true); + } + for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); @@ -26101,31 +26234,12 @@ void Player::ActivateTalentGroup(uint8 group) if (getClass() != talentInfo->ClassID) continue; - LearnSpell(talentInfo->SpellID, false); - } + ++spentTalents; - // Replace default spells with specialization specific spells - auto newSpecSpells = sSpecializationSpellsBySpecStore.find(GetActiveTalentSpec()); - if (newSpecSpells != sSpecializationSpellsBySpecStore.end()) - { - for (auto it = newSpecSpells->second.begin(); it != newSpecSpells->second.end(); ++it) - { - SpecializationSpellsEntry const* specSpell = *it; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(specSpell->SpellID); - if (getLevel() >= spellInfo->BaseLevel) { - if (specSpell->OverridesSpellID) - RemoveSpell(specSpell->OverridesSpellID, true); - LearnSpell(specSpell->SpellID, false); - } - } + if (HasTalent(talentInfo->SpellID, group)) + LearnSpell(talentInfo->SpellID, false); } - if (CanUseMastery()) - if (ChrSpecializationEntry const* newChrSpec = sChrSpecializationStore.LookupEntry(GetActiveTalentSpec())) - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (newChrSpec->MasterySpellID[i]) - LearnSpell(newChrSpec->MasterySpellID[i], false); - // set glyphs for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) { @@ -26139,6 +26253,7 @@ void Player::ActivateTalentGroup(uint8 group) SetGlyph(slot, glyph); } + SetUsedTalentCount(spentTalents); InitTalentForLevel(); { @@ -26158,7 +26273,9 @@ void Player::ActivateTalentGroup(uint8 group) SetPower(pw, 0); if (!sChrSpecializationStore.LookupEntry(GetActiveTalentSpec())) + { ResetTalents(true); + } } void Player::ResetTimeSync() @@ -26174,7 +26291,7 @@ void Player::SendTimeSync() WorldPackets::Misc::TimeSyncRequest packet; packet.SequenceIndex = m_timeSyncQueue.back(); - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); // Schedule next sync in 10 sec m_timeSyncTimer = 10000; @@ -26742,7 +26859,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) @@ -26812,7 +26935,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy case SUMMON_PET: // this enables pet details window (Shift+P) pet->GetCharmInfo()->SetPetNumber(pet_number, true); - pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 2048); + pet->SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_MAGE); pet->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); pet->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000); pet->SetFullHealth(); @@ -27192,3 +27315,9 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) data << uint32(newSpell) << uint32(oldSpell); GetSession()->SendPacket(&data); } + +uint32 Player::CalculateTalentsPoints() const +{ + // 1 talent point for every 15 levels + return getLevel() >= 100 ? 7 : uint32(floor(getLevel() / 15.f)); +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1dd993e5b5f..6b9e925e28d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -116,6 +116,12 @@ struct PlayerSpell bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks }; +struct PlayerTalent +{ + PlayerSpellState state : 8; + uint8 spec : 8; +}; + extern uint32 const MasterySpells[MAX_CLASSES]; enum TalentSpecialization // talent tabs @@ -184,6 +190,7 @@ struct PlayerCurrency uint32 weekCount; }; +typedef std::unordered_map<uint32, PlayerTalent*> PlayerTalentMap; typedef std::unordered_map<uint32, PlayerSpell*> PlayerSpellMap; typedef std::list<SpellModifier*> SpellModList; typedef std::unordered_map<uint32, PlayerCurrency> PlayerCurrenciesMap; @@ -329,7 +336,7 @@ enum ReputationSource }; #define ACTION_BUTTON_ACTION(X) (uint64(X) & 0x00000000FFFFFFFF) -#define ACTION_BUTTON_TYPE(X) ((uint64(X) & 0xFFFFFFFF00000000) >> 32) +#define ACTION_BUTTON_TYPE(X) ((uint64(X) & 0xFFFFFFFF00000000) >> 56) #define MAX_ACTION_BUTTON_ACTION_VALUE (0xFFFFFFFF) struct ActionButton @@ -344,7 +351,7 @@ struct ActionButton uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); } void SetActionAndType(uint32 action, ActionButtonType type) { - uint64 newData = uint64(action) | (uint64(type) << 32); + uint64 newData = uint64(action) | (uint64(type) << 56); if (newData != packedData || uState == ACTIONBUTTON_DELETED) { packedData = newData; @@ -747,24 +754,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 +794,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 +888,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, @@ -1212,48 +1230,36 @@ private: bool _isPvP; }; -struct TalentGroupInfo +struct PlayerTalentInfo { - uint32 Talents[MAX_TALENT_TIERS]; - uint32 Glyphs[MAX_GLYPH_SLOT_INDEX]; - uint32 SpecID; - - bool HasTalent(uint32 talentId) + PlayerTalentInfo() : UsedTalentCount(0), ResetTalentsCost(0), ResetTalentsTime(0), ActiveGroup(0), GroupsCount(1) { - for (uint32 i = 0; i < MAX_TALENT_TIERS; ++i) - if (Talents[i] == talentId) - return true; - return false; - } - - uint32 TalentCount() - { - for (uint32 i = 0; i < MAX_TALENT_TIERS; ++i) - if (!Talents[i]) - return i; - return MAX_TALENT_TIERS; - } - - void Reset() - { - for (uint32 i = 0; i < MAX_TALENT_TIERS; ++i) - Talents[i] = 0; + for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) + { + GroupInfo[i].Talents = new PlayerTalentMap(); + memset(GroupInfo[i].Glyphs, 0, MAX_GLYPH_SLOT_INDEX * sizeof(uint32)); + GroupInfo[i].TalentTree = 0; + } } -}; -struct PlayerTalentInfo -{ - PlayerTalentInfo() : ResetTalentsCost(0), ResetTalentsTime(0), ActiveGroup(0), GroupsCount(1) + ~PlayerTalentInfo() { for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) { - memset(GroupInfo[i].Talents, 0, sizeof(uint32)*MAX_TALENT_TIERS); - memset(GroupInfo[i].Glyphs, 0, MAX_GLYPH_SLOT_INDEX * sizeof(uint32)); - GroupInfo[i].SpecID = 0; + for (PlayerTalentMap::const_iterator itr = GroupInfo[i].Talents->begin(); itr != GroupInfo[i].Talents->end(); ++itr) + delete itr->second; + delete GroupInfo[i].Talents; } } - TalentGroupInfo GroupInfo[MAX_TALENT_GROUPS]; + struct TalentGroupInfo + { + PlayerTalentMap* Talents; + uint32 Glyphs[MAX_GLYPH_SLOT_INDEX]; + uint32 TalentTree; + } GroupInfo[MAX_TALENT_GROUPS]; + + uint32 UsedTalentCount; uint32 ResetTalentsCost; time_t ResetTalentsTime; uint8 ActiveGroup; @@ -1314,7 +1320,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 +1753,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; } @@ -1822,25 +1828,35 @@ class Player : public Unit, public GridObject<Player> std::string GetGuildName(); // Talents + uint32 GetUsedTalentCount() const { return _talentMgr->UsedTalentCount; } + void SetUsedTalentCount(uint32 talents) { _talentMgr->UsedTalentCount = talents; } uint32 GetTalentResetCost() const { return _talentMgr->ResetTalentsCost; } void SetTalentResetCost(uint32 cost) { _talentMgr->ResetTalentsCost = cost; } uint32 GetTalentResetTime() const { return _talentMgr->ResetTalentsTime; } void SetTalentResetTime(time_t time_) { _talentMgr->ResetTalentsTime = time_; } - uint8 GetActiveTalentGroup() const { return _talentMgr->ActiveGroup; } - void SetActiveTalentGroup(uint8 group){ _talentMgr->ActiveGroup = group; } + uint8 GetTalentGroupsCount() const { return _talentMgr->GroupsCount; } void SetTalentGroupsCount(uint8 count) { _talentMgr->GroupsCount = count; } - uint32 GetTalentSpec(uint8 group) const { return _talentMgr->GroupInfo[group].SpecID; } - void SetTalentSpec(uint8 group, uint32 talentSpec) const { _talentMgr->GroupInfo[group].SpecID = talentSpec; } - uint32 GetActiveTalentSpec() const { return _talentMgr->GroupInfo[_talentMgr->ActiveGroup].SpecID; } + uint8 GetActiveTalentGroup() const { return _talentMgr->ActiveGroup; } + void SetActiveTalentGroup(uint8 group){ _talentMgr->ActiveGroup = group; } + + uint32 GetTalentSpec(uint8 group) const { return _talentMgr->GroupInfo[group].TalentTree; } + void SetTalentSpec(uint8 group, uint32 talentSpec) const { _talentMgr->GroupInfo[group].TalentTree = talentSpec; } + uint32 GetActiveTalentSpec() const { return _talentMgr->GroupInfo[_talentMgr->ActiveGroup].TalentTree; } + + + bool ResetTalents(bool noCost = false, bool resetTalents = true, bool resetSpecialization = true); + bool RemoveTalent(uint32 talentId); - bool ResetTalents(bool no_cost = false); uint32 GetNextResetTalentsCost() const; void InitTalentForLevel(); void SendTalentsInfoData(); bool LearnTalent(uint32 talentId); - bool AddTalent(uint32 talentId, uint8 spec); + bool AddTalent(uint32 talentId, uint8 spec, bool learning); bool HasTalent(uint32 talentId, uint8 spec); + uint32 CalculateTalentsPoints() const; + + void LearnTalentSpecialization(uint32 talentSpec); // Dual Spec @@ -1854,7 +1870,8 @@ class Player : public Unit, public GridObject<Player> void SetGlyph(uint8 slot, uint32 glyph); uint32 GetGlyph(uint8 group, uint8 slot) const { return _talentMgr->GroupInfo[group].Glyphs[slot]; } - TalentGroupInfo* GetTalentGroupInfo(uint8 group) { return &_talentMgr->GroupInfo[group]; } + PlayerTalentMap const* GetTalentMap(uint8 spec) const { return _talentMgr->GroupInfo[spec].Talents; } + PlayerTalentMap* GetTalentMap(uint8 spec) { return _talentMgr->GroupInfo[spec].Talents; } ActionButtonList const& GetActionButtons() const { return m_actionButtons; } uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS); } @@ -1968,6 +1985,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; } @@ -2089,10 +2107,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(); @@ -2240,12 +2258,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(); @@ -2379,6 +2397,7 @@ class Player : public Unit, public GridObject<Player> void SaveRecallPosition(); void SetHomebind(WorldLocation const& loc, uint32 areaId); + void SendBindPointUpdate(); // Homebind coordinates uint32 m_homebindMapId; @@ -2852,7 +2871,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/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index 54956e591b4..d6aeb5dee9c 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -145,9 +145,10 @@ bool Totem::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) con /// @todo possibly all negative auras immune? if (GetEntry() == 5925) return false; - - switch (spellInfo->Effects[index].ApplyAuraName) + if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficulty(), index)) { + switch (effect->ApplyAuraName) + { case SPELL_AURA_PERIODIC_DAMAGE: case SPELL_AURA_PERIODIC_LEECH: case SPELL_AURA_MOD_FEAR: @@ -155,7 +156,10 @@ bool Totem::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) con return true; default: break; + } } + else + return true; return Creature::IsImmunedToSpellEffect(spellInfo, index); } diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index ea15daed587..5761fac56e2 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -258,7 +258,7 @@ float Player::GetHealthBonusFromStamina() { // Taken from PaperDollFrame.lua - 4.3.4.15595 float ratio = 10.0f; - if (gtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.LookupEntry((getClass() - 1) * GT_MAX_LEVEL + getLevel() - 1)) + if (gtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0)) ratio = hpBase->ratio; float stamina = GetStat(STAT_STAMINA); @@ -537,16 +537,16 @@ void Player::UpdateMastery() if (Aura* aura = GetAura(chrSpec->MasterySpellID[i])) { - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) { - if (!aura->HasEffect(j)) + if (!effect) continue; - float mult = aura->GetSpellInfo()->Effects[j].BonusCoefficient; + float mult = effect->BonusCoefficient; if (G3D::fuzzyEq(mult, 0.0f)) continue; - aura->GetEffect(j)->ChangeAmount(int32(value * aura->GetSpellInfo()->Effects[j].BonusCoefficient)); + aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); } } } @@ -989,8 +989,9 @@ bool Guardian::UpdateStats(Stats stat) AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); if (aurEff) { - SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value - AddPct(mod, spellInfo->Effects[EFFECT_1].CalcValue(owner)); // Ravenous Dead edits the original scale + SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value + if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficulty(), EFFECT_1)) + AddPct(mod, effect->CalcValue(owner)); // Ravenous Dead edits the original scale } // Glyph of the Ghoul aurEff = owner->GetAuraEffect(58686, 0); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 89ded594990..be26299f6fd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -62,6 +62,10 @@ #include "WorldPacket.h" #include "MovementStructures.h" #include "WorldSession.h" +#include "ChatPackets.h" +#include "MovementPackets.h" +#include "CombatPackets.h" +#include "CombatLogPackets.h" #include <cmath> @@ -935,23 +939,6 @@ void Unit::CastSpell(GameObject* go, uint32 spellId, bool triggered, Item* castI CastSpell(targets, spellInfo, NULL, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); } -// Obsolete func need remove, here only for comotability vs another patches -uint32 Unit::SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID); - if (!spellInfo) - return 0; - SpellNonMeleeDamage damageInfo(this, victim, spellInfo->Id, spellInfo->SchoolMask); - damage = SpellDamageBonusDone(victim, spellInfo, damage, SPELL_DIRECT_DAMAGE); - damage = victim->SpellDamageBonusTaken(this, spellInfo, damage, SPELL_DIRECT_DAMAGE); - - CalculateSpellDamageTaken(&damageInfo, damage, spellInfo); - DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); - SendSpellNonMeleeDamageLog(&damageInfo); - DealSpellDamage(&damageInfo, true); - return damageInfo.damage; -} - void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) { if (damage < 0) @@ -1383,8 +1370,8 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) if (Unit* caster = (*dmgShieldItr)->GetCaster()) { - damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE); - damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE); + damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetSpellEffectInfo()); + damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetSpellEffectInfo()); } // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that @@ -1409,10 +1396,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) @@ -1427,10 +1414,10 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s return false; // bleeding effects are not reduced by armor - if (effIndex != MAX_SPELL_EFFECTS) + if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficulty(), effIndex)) { - if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || - spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) + if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || + effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE) if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED)) return false; } @@ -1696,7 +1683,7 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe int32 manaReduction = currentAbsorb; // lower absorb amount by talents - if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster())) + if (float manaMultiplier = absorbAurEff->GetSpellEffectInfo()->CalcValueMultiplier(absorbAurEff->GetCaster())) manaReduction = int32(float(manaReduction) * manaMultiplier); int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction); @@ -2108,24 +2095,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) @@ -2166,12 +2153,12 @@ int32 Unit::GetMechanicResistChance(SpellInfo const* spellInfo) const return 0; int32 resistMech = 0; - for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if (!spellInfo->Effects[eff].IsEffect()) + if (!effect || !effect->IsEffect()) break; - int32 effectMech = spellInfo->GetEffectMechanic(eff); + int32 effectMech = spellInfo->GetEffectMechanic(effect->EffectIndex, GetMap()->GetDifficulty()); if (effectMech) { int32 temp = GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MECHANIC_RESISTANCE, effectMech); @@ -2226,7 +2213,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo // Get effects mechanic and chance for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff) { - int32 effect_mech = spellInfo->GetEffectMechanic(eff); + int32 effect_mech = spellInfo->GetEffectMechanic(eff, GetMap()->GetDifficulty()); if (effect_mech) { int32 temp = victim->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MECHANIC_RESISTANCE, effect_mech); @@ -2990,7 +2977,7 @@ void Unit::DeMorph() SetDisplayId(GetNativeDisplayId()); } -Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8 effMask, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= 0*/) +Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= 0*/) { ASSERT(!casterGUID.IsEmpty() || caster); @@ -3016,18 +3003,22 @@ Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8 return NULL; // update basepoints with new values - effect amount will be recalculated in ModStackAmount - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : foundAura->GetSpellEffectInfos()) { - if (!foundAura->HasEffect(i)) + if (!effect) + continue; + + AuraEffect const* eff = foundAura->GetEffect(effect->EffectIndex); + if (!eff) continue; int bp; if (baseAmount) - bp = *(baseAmount + i); + bp = *(baseAmount + effect->EffectIndex); else - bp = foundAura->GetSpellInfo()->Effects[i].BasePoints; + bp = effect->BasePoints; - int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount)); + int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(effect->EffectIndex)->m_baseAmount)); // todo 6.x review GetBaseAmount and GetCastItemGUID in this case *oldBP = bp; } @@ -3087,7 +3078,7 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) // creates aura application instance and registers it in lists // aura application effects are handled separately to prevent aura list corruption -AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint8 effMask) +AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint32 effMask) { // can't apply aura on unit which is going to be deleted - to not create a memory leak ASSERT(!m_cleanupDone); @@ -3116,7 +3107,7 @@ AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint8 effMask) AddInterruptMask(aurSpellInfo->AuraInterruptFlags); } - if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState()) + if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficulty())) m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp)); aura->_ApplyForTarget(this, caster, aurApp); @@ -3137,7 +3128,7 @@ void Unit::_ApplyAuraEffect(Aura* aura, uint8 effIndex) // handles effects of aura application // should be done after registering aura in lists -void Unit::_ApplyAura(AuraApplication * aurApp, uint8 effMask) +void Unit::_ApplyAura(AuraApplication * aurApp, uint32 effMask) { Aura* aura = aurApp->GetBase(); @@ -3147,7 +3138,7 @@ void Unit::_ApplyAura(AuraApplication * aurApp, uint8 effMask) return; // Update target aura state flag - if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState()) + if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficulty())) ModifyAuraState(aState, true); if (aurApp->GetRemoveMode()) @@ -3202,7 +3193,7 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMo } bool auraStateFound = false; - AuraStateType auraState = aura->GetSpellInfo()->GetAuraState(); + AuraStateType auraState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficulty()); if (auraState) { bool canBreak = false; @@ -3278,12 +3269,12 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) SpellInfo const* spellProto = aura->GetSpellInfo(); // passive spell special case (only non stackable with ranks) - if (spellProto->IsPassiveStackableWithRanks()) + if (spellProto->IsPassiveStackableWithRanks(GetMap()->GetDifficulty())) return; if (!IsHighestExclusiveAura(aura)) { - if (!aura->GetSpellInfo()->IsAffectingArea()) + if (!aura->GetSpellInfo()->IsAffectingArea(GetMap()->GetDifficulty())) { Unit* caster = aura->GetCaster(); if (caster && caster->GetTypeId() == TYPEID_PLAYER) @@ -3343,7 +3334,7 @@ void Unit::RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode) i = m_ownedAuras.begin(); } -void Unit::RemoveOwnedAura(uint32 spellId, ObjectGuid casterGUID, uint8 reqEffMask, AuraRemoveMode removeMode) +void Unit::RemoveOwnedAura(uint32 spellId, ObjectGuid casterGUID, uint32 reqEffMask, AuraRemoveMode removeMode) { for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);) if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)) @@ -3377,7 +3368,7 @@ void Unit::RemoveOwnedAura(Aura* aura, AuraRemoveMode removeMode) ASSERT(false); } -Aura* Unit::GetOwnedAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask, Aura* except) const +Aura* Unit::GetOwnedAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask, Aura* except) const { AuraMapBounds range = m_ownedAuras.equal_range(spellId); for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr) @@ -3406,7 +3397,7 @@ void Unit::RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode) aura->Remove(mode); } -void Unit::RemoveAura(uint32 spellId, ObjectGuid caster, uint8 reqEffMask, AuraRemoveMode removeMode) +void Unit::RemoveAura(uint32 spellId, ObjectGuid caster, uint32 reqEffMask, AuraRemoveMode removeMode) { AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId); for (AuraApplicationMap::iterator iter = range.first; iter != range.second;) @@ -3466,7 +3457,7 @@ void Unit::RemoveAura(Aura* aura, AuraRemoveMode mode) RemoveAura(aurApp, mode); } -void Unit::RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID, uint8 reqEffMask, AuraRemoveMode removeMode) +void Unit::RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID, uint32 reqEffMask, AuraRemoveMode removeMode) { for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);) { @@ -3875,7 +3866,7 @@ void Unit::RemoveAllAurasExceptType(AuraType type) for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();) { Aura const* aura = iter->second->GetBase(); - if (aura->GetSpellInfo()->HasAura(type)) + if (aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type)) ++iter; else _UnapplyAura(iter, AURA_REMOVE_BY_DEFAULT); @@ -3884,7 +3875,7 @@ void Unit::RemoveAllAurasExceptType(AuraType type) for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();) { Aura* aura = iter->second; - if (aura->GetSpellInfo()->HasAura(type)) + if (aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type)) ++iter; else RemoveOwnedAura(iter, AURA_REMOVE_BY_DEFAULT); @@ -3896,7 +3887,7 @@ void Unit::RemoveAllAurasExceptType(AuraType type1, AuraType type2) for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();) { Aura const* aura = iter->second->GetBase(); - if (aura->GetSpellInfo()->HasAura(type1) || aura->GetSpellInfo()->HasAura(type2)) + if (aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type1) || aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type2)) ++iter; else _UnapplyAura(iter, AURA_REMOVE_BY_DEFAULT); @@ -3905,7 +3896,7 @@ void Unit::RemoveAllAurasExceptType(AuraType type1, AuraType type2) for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();) { Aura* aura = iter->second; - if (aura->GetSpellInfo()->HasAura(type1) || aura->GetSpellInfo()->HasAura(type2)) + if (aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type1) || aura->GetSpellInfo()->HasAura(GetMap()->GetDifficulty(), type2)) ++iter; else RemoveOwnedAura(iter, AURA_REMOVE_BY_DEFAULT); @@ -4005,7 +3996,7 @@ AuraEffect* Unit::GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 return GetAuraEffect(SPELL_AURA_DUMMY, name, iconId, effIndex); } -AuraApplication * Unit::GetAuraApplication(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask, AuraApplication * except) const +AuraApplication * Unit::GetAuraApplication(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask, AuraApplication * except) const { AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId); for (; range.first != range.second; ++range.first) @@ -4024,13 +4015,13 @@ AuraApplication * Unit::GetAuraApplication(uint32 spellId, ObjectGuid casterGUID return NULL; } -Aura* Unit::GetAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask) const +Aura* Unit::GetAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask) const { AuraApplication * aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask); return aurApp ? aurApp->GetBase() : NULL; } -AuraApplication * Unit::GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask, AuraApplication* except) const +AuraApplication * Unit::GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask, AuraApplication* except) const { uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId); while (rankSpell) @@ -4042,7 +4033,7 @@ AuraApplication * Unit::GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGu return NULL; } -Aura* Unit::GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask) const +Aura* Unit::GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask) const { AuraApplication * aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask); return aurApp ? aurApp->GetBase() : NULL; @@ -4117,7 +4108,7 @@ uint32 Unit::GetAuraCount(uint32 spellId) const return count; } -bool Unit::HasAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint8 reqEffMask) const +bool Unit::HasAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask) const { if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask)) return true; @@ -4196,9 +4187,9 @@ bool Unit::HasAuraWithMechanic(uint32 mechanicMask) const if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic))) return true; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic) - if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic)) + for (SpellEffectInfo const* effect : iter->second->GetBase()->GetSpellEffectInfos()) + if (effect && effect->Effect && effect->Mechanic) + if (mechanicMask & (1 << effect->Mechanic)) return true; } @@ -4721,22 +4712,20 @@ void Unit::RemoveAllGameObjects() void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log) { - WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16+4+4+4+1+4+4+1+1+4+4+1)); // we guess size - data << log->target->GetPackGUID(); - data << log->attacker->GetPackGUID(); - data << uint32(log->SpellID); - data << uint32(log->damage); // damage amount + WorldPackets::CombatLog::SpellNonMeleeDamageLog packet; + packet.Me = log->target->GetGUID(); + packet.CasterGUID = log->attacker->GetGUID(); + packet.SpellID = log->SpellID; + packet.Damage = log->damage; int32 overkill = log->damage - log->target->GetHealth(); - data << uint32(overkill > 0 ? overkill : 0); // overkill - data << uint8 (log->schoolMask); // damage school - data << uint32(log->absorb); // AbsorbedDamage - data << uint32(log->resist); // resist - data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name - data << uint8 (log->unused); // unused - data << uint32(log->blocked); // blocked - data << uint32(log->HitInfo); - data << uint8 (0); // flag to use extend data - SendMessageToSet(&data, true); + packet.Overkill = (overkill > 0 ? overkill : 0); + packet.SchoolMask = log->schoolMask; + packet.ShieldBlock = log->blocked; + packet.Resisted = log->resist; + packet.Absorbed = log->absorb; + packet.Periodic = false; + packet.Flags = log->HitInfo; + SendMessageToSet(packet.Write(), true); } void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit) @@ -4848,67 +4837,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) @@ -4926,133 +4874,6 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType SendAttackStateUpdate(&dmgInfo); } -bool Unit::HandleAuraProcOnPowerAmount(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 /*procEx*/, uint32 cooldown) -{ - // Get triggered aura spell info - SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo(); - - // Get effect index used for the proc - uint32 effIndex = triggeredByAura->GetEffIndex(); - - // Power amount required to proc the spell - int32 powerAmountRequired = triggeredByAura->GetAmount(); - // Power type required to proc - Powers powerRequired = Powers(auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].MiscValue); - - // Set trigger spell id, target, custom basepoints - uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell; - - Unit* target = NULL; - int32 basepoints0 = 0; - - Item* castItem = !triggeredByAura->GetBase()->GetCastItemGUID().IsEmpty() && GetTypeId() == TYPEID_PLAYER - ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : NULL; - - /* Try handle unknown trigger spells or with invalid power amount or misc value - if (sSpellMgr->GetSpellInfo(trigger_spell_id) == NULL || powerAmountRequired == NULL || powerRequired >= MAX_POWER) - { - switch (auraSpellInfo->SpellFamilyName) - { - case SPELLFAMILY_GENERIC: - { - break; - } - } - }*/ - - // All ok. Check current trigger spell - SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id); - if (triggerEntry == NULL) - { - // Not cast unknown spell - // TC_LOG_ERROR("Unit::HandleAuraProcOnPowerAmount: Spell %u have 0 in EffectTriggered[%d], not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); - return false; - } - - // not allow proc extra attack spell at extra attack - if (m_extraAttacks && triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) - return false; - - if (!powerRequired || !powerAmountRequired) - { - TC_LOG_ERROR("spells", "Unit::HandleAuraProcOnPowerAmount: Spell %u have 0 powerAmountRequired in EffectAmount[%d] or 0 powerRequired in EffectMiscValue, not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex()); - return false; - } - - if (GetPower(powerRequired) != powerAmountRequired) - return false; - - // Custom requirements (not listed in procEx) Warning! damage dealing after this - // Custom triggered spells - switch (auraSpellInfo->SpellFamilyName) - { - case SPELLFAMILY_DRUID: - { - // Eclipse Mastery Driver Passive - if (auraSpellInfo->Id == 79577) - { - uint32 solarEclipseMarker = 67483; - uint32 lunarEclipseMarker = 67484; - - switch (effIndex) - { - case 0: - { - if (HasAura(trigger_spell_id)) - return false; - - // Do not proc if proc spell isnt starfire and starsurge - if (procSpell->Id != 2912 && procSpell->Id != 78674) - return false; - - if (HasAura(solarEclipseMarker)) - { - RemoveAurasDueToSpell(solarEclipseMarker); - CastSpell(this, lunarEclipseMarker, true); - } - break; - } - case 1: - { - if (HasAura(trigger_spell_id)) - return false; - - // Do not proc if proc spell isnt wrath and starsurge - if (procSpell->Id != 5176 && procSpell->Id != 78674) - return false; - - if (HasAura(lunarEclipseMarker)) - { - RemoveAurasDueToSpell(lunarEclipseMarker); - CastSpell(this, solarEclipseMarker, true); - } - - break; - } - } - } - break; - } - } - - if (cooldown && GetTypeId() == TYPEID_PLAYER && ToPlayer()->HasSpellCooldown(trigger_spell_id)) - return false; - - // try detect target manually if not set - if (target == NULL) - target = !(procFlag & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry && triggerEntry->IsPositive() ? this : victim; - - if (basepoints0) - CastCustomSpell(target, trigger_spell_id, &basepoints0, NULL, NULL, true, castItem, triggeredByAura); - else - CastSpell(target, trigger_spell_id, true, castItem, triggeredByAura); - - if (cooldown && GetTypeId() == TYPEID_PLAYER) - ToPlayer()->AddSpellCooldown(trigger_spell_id, 0, time(NULL) + cooldown); - - return true; -} - //victim may be NULL bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown) { @@ -5616,18 +5437,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere triggered_spell_id = 28810; break; } - // Priest T10 Healer 2P Bonus - case 70770: - // Flash Heal - if (procSpell->SpellFamilyFlags[0] & 0x800) - { - triggered_spell_id = 70772; - SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id); - if (!blessHealing) - return false; - basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].ApplyAuraPeriod)); - } - break; + break; } break; } @@ -5745,7 +5555,10 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!triggeredSpell) return false; - basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].ApplyAuraPeriod); + SpellEffectInfo const* effect = triggeredSpell->GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (!effect) + return false; + basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / effect->ApplyAuraPeriod); // Add remaining ticks to damage done basepoints0 += victim->GetRemainingPeriodicAmount(GetGUID(), triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE); } @@ -6129,7 +5942,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!triggeredSpell) return false; - basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].ApplyAuraPeriod); + if (SpellEffectInfo const* effect = triggeredSpell->GetEffect(DIFFICULTY_NONE, EFFECT_0)) + basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / effect->ApplyAuraPeriod); } break; } @@ -6143,9 +5957,12 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!triggeredSpell) return false; - basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].ApplyAuraPeriod); - // Add remaining ticks to healing done - basepoints0 += GetRemainingPeriodicAmount(GetGUID(), triggered_spell_id, SPELL_AURA_PERIODIC_HEAL); + if (SpellEffectInfo const* effect = triggeredSpell->GetEffect(DIFFICULTY_NONE, EFFECT_0)) + { + basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / effect->ApplyAuraPeriod); + // Add remaining ticks to healing done + basepoints0 += GetRemainingPeriodicAmount(GetGUID(), triggered_spell_id, SPELL_AURA_PERIODIC_HEAL); + } } break; } @@ -6187,53 +6004,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere triggered_spell_id = 63685; break; } - // Flametongue Weapon (Passive) - if (dummySpell->SpellFamilyFlags[0] & 0x200000) - { - if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) - return false; - - WeaponAttackType attType = WeaponAttackType(Player::GetAttackBySlot(castItem->GetSlot())); - if ((attType != BASE_ATTACK && attType != OFF_ATTACK) - || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK) - || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)) - return false; - - float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f)); - - float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE) - + victim->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_FIRE)); - - // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84% - ApplyPct(add_spellpower, 3.84f); - - // Enchant on Off-Hand and ready? - if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK) - { - float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f; - - // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed - basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed)); - triggered_spell_id = 10444; - } - - // Enchant on Main-Hand and ready? - else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK) - { - float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f; - - // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed - basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed)); - triggered_spell_id = 10444; - } - - // If not ready, we should return, shouldn't we?! - else - return false; - - CastCustomSpell(victim, triggered_spell_id, &basepoints0, NULL, NULL, true, castItem, triggeredByAura); - return true; - } // Static Shock if (dummySpell->SpellIconID == 3059) { @@ -6255,15 +6025,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case SPELLFAMILY_DEATHKNIGHT: { - // Blood-Caked Blade - if (dummySpell->SpellIconID == 138) - { - if (!target || !target->IsAlive()) - return false; - - triggered_spell_id = dummySpell->Effects[effIndex].TriggerSpell; - break; - } // Dancing Rune Weapon if (dummySpell->Id == 49028) { @@ -6289,24 +6050,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere else return false; } - // Unholy Blight - if (dummySpell->Id == 49194) - { - triggered_spell_id = 50536; - SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id); - if (!unholyBlight) - return false; - - basepoints0 = CalculatePct(int32(damage), triggerAmount); - - //Glyph of Unholy Blight - if (AuraEffect* glyph=GetAuraEffect(63332, 0)) - AddPct(basepoints0, glyph->GetAmount()); - - basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].ApplyAuraPeriod); - basepoints0 += victim->GetRemainingPeriodicAmount(GetGUID(), triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE); - break; - } // Threat of Thassarian if (dummySpell->SpellIconID == 2023) { @@ -6347,26 +6090,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case SPELLFAMILY_PET: { - switch (dummySpell->SpellIconID) - { - // Guard Dog - case 201: - { - if (!victim) - return false; - - triggered_spell_id = 54445; - target = this; - float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount)); - victim->AddThreat(this, addThreat); - break; - } - // Silverback - case 1582: - triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800; - target = this; - break; - } break; } default: @@ -6375,7 +6098,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // if not handled by custom case, get triggered spell from dummySpell proto if (!triggered_spell_id) - triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell; + triggered_spell_id = triggeredByAura->GetSpellEffectInfo()->TriggerSpell; // processed charge only counting case if (!triggered_spell_id) @@ -6405,10 +6128,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return true; } - /* - */ - - // Used in case when access to whole aura is needed // All procs should be handled like this... bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 /*procEx*/, uint32 cooldown, bool * handled) @@ -6459,9 +6178,12 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura // Swift Hand of Justice case 59906: { - int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue()); - CastCustomSpell(this, 59913, &bp0, NULL, NULL, true); - *handled = true; + if (SpellEffectInfo const* effect = triggeredByAura->GetSpellEffectInfo(EFFECT_0)) + { + int32 bp0 = CalculatePct(GetMaxHealth(), effect->CalcValue()); + CastCustomSpell(this, 59913, &bp0, NULL, NULL, true); + *handled = true; + } break; } } @@ -6476,49 +6198,10 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura CastSpell(victim, 68055, true); return true; } - // Glyph of Divinity - else if (dummySpell->Id == 54939) - { - if (!procSpell) - return false; - *handled = true; - // Check if we are the target and prevent mana gain - if (victim && triggeredByAura->GetCasterGUID() == victim->GetGUID()) - return false; - // Lookup base amount mana restore - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++) - { - if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE) - { - // value multiplied by 2 because you should get twice amount - int32 mana = procSpell->Effects[i].CalcValue() * 2; - CastCustomSpell(this, 54986, 0, &mana, NULL, true); - } - } - return true; - } break; } case SPELLFAMILY_MAGE: { - switch (dummySpell->Id) - { - // Empowered Fire - case 31656: - case 31657: - case 31658: - { - *handled = true; - - SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545); - if (!spInfo) - return false; - - int32 bp0 = int32(CalculatePct(GetCreateMana(), spInfo->Effects[0].CalcValue())); - CastCustomSpell(this, 67545, &bp0, NULL, NULL, true, NULL, triggeredByAura->GetEffect(EFFECT_0), GetGUID()); - return true; - } - } break; } case SPELLFAMILY_DEATHKNIGHT: @@ -6603,8 +6286,11 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura // Item - Warrior T10 Protection 4P Bonus case 70844: { - int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue()); - CastCustomSpell(this, 70845, &basepoints0, NULL, NULL, true); + if (SpellEffectInfo const* effect = triggeredByAura->GetSpellEffectInfo(EFFECT_1)) + { + int32 basepoints0 = CalculatePct(GetMaxHealth(), effect->CalcValue()); + CastCustomSpell(this, 70845, &basepoints0, NULL, NULL, true); + } break; } // Recklessness @@ -6635,7 +6321,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg int32 triggerAmount = triggeredByAura->GetAmount(); // Set trigger spell id, target, custom basepoints - uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell; + uint32 trigger_spell_id = triggeredByAura->GetSpellEffectInfo()->TriggerSpell; Unit* target = NULL; int32 basepoints0 = 0; @@ -6655,11 +6341,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case SPELLFAMILY_GENERIC: switch (auraSpellInfo->Id) { - case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket) - // Pct value stored in dummy - basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100; - target = victim; - break; case 57345: // Darkmoon Card: Greatness { float stat = 0.0f; @@ -6760,19 +6441,9 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg } case SPELLFAMILY_HUNTER: { - if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots + /*if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots { - switch (auraSpellInfo->Id) - { - case 53234: // Rank 1 - case 53237: // Rank 2 - case 53238: // Rank 3 - trigger_spell_id = 63468; - break; - default: - TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u miss posibly Piercing Shots", auraSpellInfo->Id); - return false; - } + trigger_spell_id = 63468; // 6.x missing from dbc but it is in the tooltip SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id); if (!TriggerPS) return false; @@ -6780,7 +6451,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].ApplyAuraPeriod); basepoints0 += victim->GetRemainingPeriodicAmount(GetGUID(), trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE); break; - } + }*/ // Item - Hunter T9 4P Bonus if (auraSpellInfo->Id == 67151) { @@ -6903,7 +6574,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg } // not allow proc extra attack spell at extra attack - if (m_extraAttacks && triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + if (m_extraAttacks && triggerEntry->HasEffect(GetMap()->GetDifficulty(), SPELL_EFFECT_ADD_EXTRA_ATTACKS)) return false; // Custom requirements (not listed in procEx) Warning! damage dealing after this @@ -6983,10 +6654,9 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg break; } // Decimation - case 63156: - case 63158: + case 108869: // Can proc only if target has hp below 25% - if (!victim || !victim->HealthBelowPct(auraSpellInfo->Effects[EFFECT_1].CalcValue())) + if (!victim || !victim->HealthBelowPct(triggeredByAura->GetSpellEffectInfo()->CalcValue())) return false; break; // Deathbringer Saurfang - Blood Beast's Blood Link @@ -7120,7 +6790,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg return false; // extra attack should hit same target - if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + if (triggerEntry->HasEffect(GetMap()->GetDifficulty(), SPELL_EFFECT_ADD_EXTRA_ATTACKS)) target = victim; // try detect target manually if not set @@ -7204,7 +6874,7 @@ void Unit::setPowerType(Powers new_powertype) if (getPowerType() == new_powertype) return; - SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype); + SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, new_powertype); if (GetTypeId() == TYPEID_PLAYER) { @@ -7961,14 +7631,14 @@ void Unit::SetMinion(Minion *minion, bool apply) else if (minion->IsTotem()) { // All summoned by totem minions must disappear when it is removed. - if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell())) - for (int i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON) - continue; + if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell())) + for (SpellEffectInfo const* effect : spInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) + { + if (!effect || effect->Effect != SPELL_EFFECT_SUMMON) + continue; - RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue); - } + RemoveAllMinionsByEntry(effect->MiscValue); + } } if (GetTypeId() == TYPEID_PLAYER) @@ -8419,7 +8089,7 @@ void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers po victim->getHostileRefManager().threatAssist(this, float(damage) * 0.5f, spellInfo); } -uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack) const +uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack) const { if (!spellProto || !victim || damagetype == DIRECT_DAMAGE) return pdamage; @@ -8431,7 +8101,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin // For totems get damage bonus from owner if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTotem()) if (Unit* owner = GetOwner()) - return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype); + return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effect, stack); float ApCoeffMod = 1.0f; int32 DoneTotal = 0; @@ -8462,32 +8132,11 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin } // Custom scripted damage - switch (spellProto->SpellFamilyName) + /*switch (spellProto->SpellFamilyName) { case SPELLFAMILY_DEATHKNIGHT: - // Impurity (dummy effect) - if (GetTypeId() == TYPEID_PLAYER) - { - PlayerSpellMap playerSpells = ToPlayer()->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = playerSpells.begin(); itr != playerSpells.end(); ++itr) - { - if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) - continue; - switch (itr->first) - { - case 49220: - case 49633: - case 49635: - case 49636: - case 49638: - if (SpellInfo const* proto = sSpellMgr->GetSpellInfo(itr->first)) - AddPct(ApCoeffMod, proto->Effects[0].CalcValue()); - break; - } - } - } break; - } + }*/ // Done fixed damage bonus auras int32 DoneAdvertisedBenefit = SpellBaseDamageBonusDone(spellProto->GetSchoolMask()); @@ -8497,39 +8146,18 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin DoneAdvertisedBenefit += ((Guardian*)this)->GetBonusDamage(); // Check for table values - float coeff = 0; - SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); - if (bonus) + float coeff = effect->BonusCoefficient; + if (effect->BonusCoefficientFromAP > 0) { - if (damagetype == DOT) - { - coeff = bonus->dot_damage; - if (bonus->ap_dot_bonus > 0) - { - WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; - float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); - APbonus += GetTotalAttackPowerValue(attType); - DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus); - } - } - else - { - coeff = bonus->direct_damage; - if (bonus->ap_bonus > 0) - { - WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; - float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); - APbonus += GetTotalAttackPowerValue(attType); - DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus); - } - } + WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; + float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); + APbonus += GetTotalAttackPowerValue(attType); + DoneTotal += int32(effect->BonusCoefficientFromAP * stack * ApCoeffMod * APbonus); } + // Default calculation if (DoneAdvertisedBenefit) { - if (!bonus || coeff < 0) - coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); - float factorMod = CalculateLevelPenalty(spellProto) * stack; if (Player* modOwner = GetSpellModOwner()) @@ -8627,6 +8255,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage // Health at 25% or less (25% stored at effect 2 of the spell) if (victim->HealthBelowPct(CalculateSpellDamage(this, (*i)->GetSpellInfo(), EFFECT_2))) AddPct(DoneTotalMod, (*i)->GetAmount()); + break; } case 6916: // Death's Embrace heal effect case 6925: @@ -8741,7 +8370,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage return DoneTotalMod; } -uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack) const +uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack) const { if (!spellProto || damagetype == DIRECT_DAMAGE) return pdamage; @@ -8792,17 +8421,11 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask()); // Check for table values - float coeff = 0; - SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); - if (bonus) - coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; + float coeff = effect->BonusCoefficient; // Default calculation if (TakenAdvertisedBenefit) { - if (!bonus || coeff < 0) - coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); - float factorMod = CalculateLevelPenalty(spellProto) * stack; // level penalty still applied on Taken bonus - is it blizzlike? if (Player* modOwner = GetSpellModOwner()) @@ -9130,12 +8753,12 @@ uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* /*spellProto*/, uint32 d return damage; } -uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack) const +uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack) const { // For totems get healing bonus from owner (statue isn't totem in fact) if (GetTypeId() == TYPEID_UNIT && IsTotem()) if (Unit* owner = GetOwner()) - return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack); + return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effect, stack); // No bonus healing for potion spells if (spellProto->SpellFamilyName == SPELLFAMILY_POTION) @@ -9191,27 +8814,14 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask()); // Check for table values - SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); - float coeff = 0; + float coeff = effect->BonusCoefficient; float factorMod = 1.0f; - if (bonus) + if (effect->BonusCoefficientFromAP > 0.0f) { - if (damagetype == DOT) - { - coeff = bonus->dot_damage; - if (bonus->ap_dot_bonus > 0) - DoneTotal += int32(bonus->ap_dot_bonus * stack * GetTotalAttackPowerValue( - (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); - } - else - { - coeff = bonus->direct_damage; - if (bonus->ap_bonus > 0) - DoneTotal += int32(bonus->ap_bonus * stack * GetTotalAttackPowerValue( - (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); - } + DoneTotal += int32(effect->BonusCoefficientFromAP * stack * GetTotalAttackPowerValue( + (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); } - else + else if (coeff <= 0.0f) { // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) @@ -9221,9 +8831,6 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui // Default calculation if (DoneAdvertisedBenefit) { - if (!bonus || coeff < 0) - coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells) - factorMod *= CalculateLevelPenalty(spellProto) * stack; if (Player* modOwner = GetSpellModOwner()) @@ -9236,9 +8843,11 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod); } - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - switch (spellProto->Effects[i].ApplyAuraName) + if (!effect) + continue; + switch (effect->ApplyAuraName) { // Bonus healing does not apply to these spells case SPELL_AURA_PERIODIC_LEECH: @@ -9246,7 +8855,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui DoneTotal = 0; break; } - if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH) + if (effect->Effect == SPELL_EFFECT_HEALTH_LEECH) DoneTotal = 0; } @@ -9331,7 +8940,7 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const return DoneTotalMod; } -uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack) const +uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType /*damagetype*/, SpellEffectInfo const* effect, uint32 stack) const { float TakenTotalMod = 1.0f; @@ -9364,12 +8973,9 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u } // Check for table values - SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); - float coeff = 0; + float coeff = effect->BonusCoefficient; float factorMod = 1.0f; - if (bonus) - coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; - else + if (coeff <= 0.0f) { // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) @@ -9382,9 +8988,6 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u // Default calculation if (TakenAdvertisedBenefit) { - if (!bonus || coeff < 0) - coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells) - factorMod *= CalculateLevelPenalty(spellProto) * int32(stack); if (Player* modOwner = GetSpellModOwner()) { @@ -9401,17 +9004,19 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectingSpell(spellProto)) AddPct(TakenTotalMod, (*i)->GetAmount()); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - switch (spellProto->Effects[i].ApplyAuraName) + if (!effect) + continue; + switch (effect->ApplyAuraName) { // Bonus healing does not apply to these spells - case SPELL_AURA_PERIODIC_LEECH: - case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: - TakenTotal = 0; - break; + case SPELL_AURA_PERIODIC_LEECH: + case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: + TakenTotal = 0; + break; } - if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH) + if (effect->Effect == SPELL_EFFECT_HEALTH_LEECH) TakenTotal = 0; } @@ -9444,7 +9049,7 @@ int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i) { // stat used dependent from misc value (stat index) - Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue); + Stats usedStat = Stats((*i)->GetSpellEffectInfo()->MiscValue); advertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount())); } @@ -9542,13 +9147,13 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) const } bool immuneToAllEffects = true; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { // State/effect immunities applied by aura expect full spell immunity // Ignore effects with mechanic, they are supposed to be checked separately - if (!spellInfo->Effects[i].IsEffect()) + if (!effect || !effect->IsEffect()) continue; - if (!IsImmunedToSpellEffect(spellInfo, i)) + if (!IsImmunedToSpellEffect(spellInfo, effect->EffectIndex)) { immuneToAllEffects = false; break; @@ -9576,20 +9181,24 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) const bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { - if (!spellInfo || !spellInfo->Effects[index].IsEffect()) + if (!spellInfo) + return false; + + SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficulty(), index); + if (!effect || !effect->IsEffect()) return false; if (spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY) return false; // If m_immuneToEffect type contain this effect type, IMMUNE effect. - uint32 effect = spellInfo->Effects[index].Effect; + uint32 eff = effect->Effect; SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT]; for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr) - if (itr->type == effect) + if (itr->type == eff) return true; - if (uint32 mechanic = spellInfo->Effects[index].Mechanic) + if (uint32 mechanic = effect->Mechanic) { SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC]; for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) @@ -9597,7 +9206,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons return true; } - if (uint32 aura = spellInfo->Effects[index].ApplyAuraName) + if (uint32 aura = effect->ApplyAuraName) { SpellImmuneList const& list = m_spellImmune[IMMUNITY_STATE]; for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr) @@ -9663,8 +9272,8 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType { bool normalized = false; if (spellProto) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(GetMap()->GetDifficulty())) + if (effect && effect->Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG) { normalized = true; break; @@ -10269,7 +9878,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo return false; // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit. - if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))) + if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficulty())) : !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficulty())))) return false; // can't attack dead @@ -10390,7 +9999,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co return false; // can't assist invisible - if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea())) + if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficulty()))) return false; // can't assist dead @@ -10768,6 +10377,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) propagateSpeedChange(); + // Spline packets are for creatures and move_update are for players static OpcodeServer const moveTypeToOpcode[MAX_MOVE_TYPE][3] = { {SMSG_SPLINE_MOVE_SET_WALK_SPEED, SMSG_MOVE_SET_WALK_SPEED, SMSG_MOVE_UPDATE_WALK_SPEED }, @@ -10792,11 +10402,28 @@ 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); + if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER) + { + // Send notification to self + WorldPackets::Movement::MoveSetSpeed selfpacket(moveTypeToOpcode[mtype][1]); + selfpacket.MoverGUID = GetGUID(); + selfpacket.SequenceIndex = m_movementCounter++; + selfpacket.Speed = rate; + ToPlayer()->GetSession()->SendPacket(selfpacket.Write()); - Movement::PacketSender(this, moveTypeToOpcode[mtype][0], moveTypeToOpcode[mtype][1], moveTypeToOpcode[mtype][2], &extra).Send(); + // Send notification to other players + WorldPackets::Movement::MoveUpdateSpeed packet(moveTypeToOpcode[mtype][2]); + packet.movementInfo = &m_movementInfo; + packet.Speed = rate; + SendMessageToSet(packet.Write(), false); + } + else + { + WorldPackets::Movement::MoveSplineSetSpeed packet(moveTypeToOpcode[mtype][0]); + packet.MoverGUID = GetGUID(); + packet.Speed = rate; + SendMessageToSet(packet.Write(), true); + } } void Unit::setDeathState(DeathState s) @@ -11138,9 +10765,13 @@ float Unit::ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index } // function uses real base points (typically value - 1) -int32 Unit::CalculateSpellDamage(Unit const* target, SpellInfo const* spellProto, uint8 effect_index, int32 const* basePoints) const +int32 Unit::CalculateSpellDamage(Unit const* target, SpellInfo const* spellProto, uint8 effect_index, int32 const* basePoints /*= nullptr*/, float* variance /*= nullptr*/) const { - return spellProto->Effects[effect_index].CalcValue(this, basePoints, target); + SpellEffectInfo const* effect = spellProto->GetEffect(GetMap()->GetDifficulty(), effect_index); + if (variance) + *variance = 0.0f; + + return effect ? effect->CalcValue(this, basePoints, target, variance) : 0; } int32 Unit::CalcSpellDuration(SpellInfo const* spellProto) @@ -11228,7 +10859,8 @@ int32 Unit::ModSpellDuration(SpellInfo const* spellProto, Unit const* target, in sSpellMgr->IsSpellMemberOfSpellGroup(spellProto->Id, SPELL_GROUP_ELIXIR_BATTLE) || sSpellMgr->IsSpellMemberOfSpellGroup(spellProto->Id, SPELL_GROUP_ELIXIR_GUARDIAN))) { - if (target->HasAura(53042) && target->HasSpell(spellProto->Effects[0].TriggerSpell)) + SpellEffectInfo const* effect = spellProto->GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (target->HasAura(53042) && effect && target->HasSpell(effect->TriggerSpell)) duration *= 2; } } @@ -12236,7 +11868,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); @@ -12476,10 +12108,17 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo(); // only auras that has triggered spell should proc from fully absorbed damage - if (procExtra & PROC_EX_ABSORB && isVictim) - if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell) - active = true; - + if (procExtra & PROC_EX_ABSORB && isVictim && damage) + { + for (SpellEffectInfo const* effect : itr->second->GetBase()->GetSpellEffectInfos()) + { + if (effect && effect->TriggerSpell) + { + active = true; + break; + } + } + } if (!IsTriggeredAtSpellProcEvent(target, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, active, triggerData.spellProcEvent)) continue; @@ -12497,11 +12136,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u bool triggered = !(spellProto->AttributesEx3 & SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED) ? (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (AuraEffect const* aurEff : itr->second->GetBase()->GetAuraEffects()) { - if (itr->second->HasEffect(i)) + if (aurEff) { - AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i); // Skip this auras if (isNonTriggerAura[aurEff->GetAuraType()]) continue; @@ -12510,7 +12148,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u continue; // Some spells must always trigger if (!triggered || isAlwaysTriggeredAura[aurEff->GetAuraType()]) - triggerData.effMask |= 1<<i; + triggerData.effMask |= 1 << aurEff->GetEffIndex(); } } if (triggerData.effMask) @@ -12611,9 +12249,8 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u } case SPELL_AURA_PROC_ON_POWER_AMOUNT: { - TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (HandleAuraProcOnPowerAmount(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - takeCharges = true; + triggeredByAura->HandleProcTriggerSpellOnPowerAmountAuraProc(aurApp, eventInfo); + takeCharges = true; break; } case SPELL_AURA_OBS_MOD_POWER: @@ -12892,10 +12529,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---------- @@ -13153,9 +12790,11 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp bool DirectDamage = false; bool AreaEffect = false; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - switch (spellProto->Effects[i].Effect) + if (!effect) + continue; + switch (effect->Effect) { case SPELL_EFFECT_SCHOOL_DAMAGE: case SPELL_EFFECT_POWER_DRAIN: @@ -13166,7 +12805,7 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp DirectDamage = true; break; case SPELL_EFFECT_APPLY_AURA: - switch (spellProto->Effects[i].ApplyAuraName) + switch (effect->ApplyAuraName) { case SPELL_AURA_PERIODIC_DAMAGE: case SPELL_AURA_PERIODIC_HEAL: @@ -13183,7 +12822,7 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp break; } - if (spellProto->Effects[i].IsTargetingArea()) + if (effect->IsTargetingArea()) AreaEffect = true; } @@ -13210,10 +12849,12 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp CastingTime /= 2; // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH || - (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) + if (!effect) + continue; + if (effect->Effect == SPELL_EFFECT_HEALTH_LEECH || + (effect->Effect == SPELL_EFFECT_APPLY_AURA && effect->ApplyAuraName == SPELL_AURA_PERIODIC_LEECH)) { CastingTime /= 2; break; @@ -13276,7 +12917,7 @@ float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffect if (!spellInfo->IsChanneled() && DotDuration > 0) DotFactor = DotDuration / 15000.0f; - if (uint32 DotTicks = spellInfo->GetMaxTicks()) + if (uint32 DotTicks = spellInfo->GetMaxTicks(GetMap()->GetDifficulty())) DotFactor /= DotTicks; } @@ -13550,7 +13191,8 @@ bool Unit::HandleAuraRaidProcFromChargeWithValue(AuraEffect* triggeredByAura) { if (Unit* caster = triggeredByAura->GetCaster()) { - float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster); + SpellEffectInfo const* effect = triggeredByAura->GetSpellEffectInfo(); + float radius = effect->CalcRadius(caster); if (Unit* target = GetNextRandomRaidMemberOrPet(radius)) { @@ -13602,7 +13244,8 @@ bool Unit::HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura) { if (Unit* caster = triggeredByAura->GetCaster()) { - float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster); + SpellEffectInfo const* effect = triggeredByAura->GetSpellEffectInfo(); + float radius = effect->CalcRadius(caster); if (Unit* target= GetNextRandomRaidMemberOrPet(radius)) { CastSpell(target, spellProto, true, NULL, triggeredByAura, caster_guid); @@ -14302,7 +13945,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) { // to prevent client crash - SetByteValue(UNIT_FIELD_BYTES_0, 1, (uint8)CLASS_MAGE); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, (uint8)CLASS_MAGE); // just to enable stat window if (GetCharmInfo()) @@ -14404,7 +14047,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) { - SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class)); + SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, uint8(cinfo->unit_class)); if (GetCharmInfo()) GetCharmInfo()->SetPetNumber(0, true); else @@ -14621,7 +14264,7 @@ Aura* Unit::AddAura(uint32 spellId, Unit* target) return AddAura(spellInfo, MAX_EFFECT_MASK, target); } -Aura* Unit::AddAura(SpellInfo const* spellInfo, uint8 effMask, Unit* target) +Aura* Unit::AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target) { if (!spellInfo) return NULL; @@ -15374,9 +15017,12 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) { uint8 i = 0; bool valid = false; - while (i < MAX_SPELL_EFFECTS && !valid) + for (SpellEffectInfo const* effect : spellEntry->GetEffectsForDifficulty(GetMap()->GetDifficulty())) { - if (spellEntry->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE) + if (!effect) + continue; + + if (effect->ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE) { valid = true; break; @@ -15395,8 +15041,9 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) else // This can happen during Player::_LoadAuras { int32 bp0[MAX_SPELL_EFFECTS]; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) - bp0[j] = spellEntry->Effects[j].BasePoints; + for (SpellEffectInfo const* effect : spellEntry->GetEffectsForDifficulty(GetMap()->GetDifficulty())) + if (effect) + bp0[effect->EffectIndex] = effect->BasePoints; bp0[i] = seatId; Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, bp0, NULL, origCasterGUID); @@ -15822,64 +15469,24 @@ void Unit::SendTeleportPacket(Position& pos) if (GetTypeId() == TYPEID_UNIT) Relocate(&pos); // Relocate the unit to its new position in order to build the packets correctly. - ObjectGuid guid = GetGUID(); - ObjectGuid transGuid = GetTransGUID(); - - WorldPacket data(SMSG_MOVE_UPDATE_TELEPORT, 38); - WriteMovementInfo(data); + WorldPackets::Movement::MoveUpdateTeleport packet; + packet.movementInfo = &m_movementInfo; if (GetTypeId() == TYPEID_PLAYER) { - WorldPacket data2(MSG_MOVE_TELEPORT, 38); - data2.WriteBit(guid[6]); - data2.WriteBit(guid[0]); - data2.WriteBit(guid[3]); - data2.WriteBit(guid[2]); - data2.WriteBit(0); // unknown - data2.WriteBit(!transGuid.IsEmpty()); - data2.WriteBit(guid[1]); - if (!transGuid.IsEmpty()) - { - data2.WriteBit(transGuid[1]); - data2.WriteBit(transGuid[3]); - data2.WriteBit(transGuid[2]); - data2.WriteBit(transGuid[5]); - data2.WriteBit(transGuid[0]); - data2.WriteBit(transGuid[7]); - data2.WriteBit(transGuid[6]); - data2.WriteBit(transGuid[4]); - } - data2.WriteBit(guid[4]); - data2.WriteBit(guid[7]); - data2.WriteBit(guid[5]); - data2.FlushBits(); + WorldPackets::Movement::MoveTeleport selfPacket; + selfPacket.MoverGUID = GetGUID(); + + ObjectGuid transGuid = GetTransGUID(); if (!transGuid.IsEmpty()) - { - data2.WriteByteSeq(transGuid[6]); - data2.WriteByteSeq(transGuid[5]); - data2.WriteByteSeq(transGuid[1]); - data2.WriteByteSeq(transGuid[7]); - data2.WriteByteSeq(transGuid[0]); - data2.WriteByteSeq(transGuid[2]); - data2.WriteByteSeq(transGuid[4]); - data2.WriteByteSeq(transGuid[3]); - } - - data2 << uint32(0); // counter - data2.WriteByteSeq(guid[1]); - data2.WriteByteSeq(guid[2]); - data2.WriteByteSeq(guid[3]); - data2.WriteByteSeq(guid[5]); - data2 << float(GetPositionX()); - data2.WriteByteSeq(guid[4]); - data2 << float(GetOrientation()); - data2.WriteByteSeq(guid[7]); - data2 << float(GetPositionZMinusOffset()); - data2.WriteByteSeq(guid[0]); - data2.WriteByteSeq(guid[6]); - data2 << float(GetPositionY()); - ToPlayer()->SendDirectMessage(&data2); // Send the MSG_MOVE_TELEPORT packet to self. + selfPacket.TransportGUID.Set(transGuid); + + selfPacket.Pos.Relocate(GetPositionX(), GetPositionY(), GetPositionZMinusOffset()); + selfPacket.Facing = GetOrientation(); + selfPacket.SequenceIndex = m_movementCounter++; + + ToPlayer()->SendDirectMessage(selfPacket.Write()); } // Relocate the player/creature to its old position, so we can broadcast to nearby players correctly @@ -15889,7 +15496,7 @@ void Unit::SendTeleportPacket(Position& pos) Relocate(&oldPos); // Broadcast the packet to everyone except self. - SendMessageToSet(&data, false); + SendMessageToSet(packet.Write(), false); } bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport) @@ -15953,19 +15560,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); } } @@ -15973,20 +15580,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); } } @@ -16001,10 +15608,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 @@ -16282,10 +15889,27 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/) } } - if (disable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_DISABLE).Send(); + static OpcodeServer const gravityOpcodeTable[2][2] = + { + {SMSG_SPLINE_MOVE_GRAVITY_ENABLE, SMSG_MOVE_GRAVITY_ENABLE }, + {SMSG_SPLINE_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_DISABLE } + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(gravityOpcodeTable[disable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_GRAVITY_ENABLE, SMSG_MOVE_GRAVITY_ENABLE).Send(); + { + WorldPackets::Movement::MoveSplineSetFlag packet(gravityOpcodeTable[disable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } return true; } @@ -16316,10 +15940,11 @@ bool Unit::SetSwim(bool enable) else RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING); - if (enable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_START_SWIM, static_cast<OpcodeServer>(NULL_OPCODE)).Send(); - else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_STOP_SWIM, static_cast<OpcodeServer>(NULL_OPCODE)).Send(); + static OpcodeServer const swimOpcodeTable[2] = {SMSG_SPLINE_MOVE_STOP_SWIM, SMSG_SPLINE_MOVE_START_SWIM}; + + WorldPackets::Movement::MoveSplineSetFlag packet(swimOpcodeTable[enable]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); return true; } @@ -16342,10 +15967,27 @@ bool Unit::SetCanFly(bool enable) SetFall(true); } - if (enable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY).Send(); + static OpcodeServer const flyOpcodeTable[2][2] = + { + {SMSG_SPLINE_MOVE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY }, + {SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY } + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(flyOpcodeTable[enable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY).Send(); + { + WorldPackets::Movement::MoveSplineSetFlag packet(flyOpcodeTable[enable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } return true; } @@ -16363,10 +16005,27 @@ bool Unit::SetWaterWalking(bool enable, bool packetOnly /*= false */) RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); } - if (enable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_WATER_WALK, SMSG_MOVE_WATER_WALK).Send(); + static OpcodeServer const waterWalkingOpcodeTable[2][2] = + { + {SMSG_SPLINE_MOVE_SET_LAND_WALK, SMSG_MOVE_LAND_WALK }, + {SMSG_SPLINE_MOVE_SET_WATER_WALK, SMSG_MOVE_WATER_WALK} + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(waterWalkingOpcodeTable[enable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_LAND_WALK, SMSG_MOVE_LAND_WALK).Send(); + { + WorldPackets::Movement::MoveSplineSetFlag packet(waterWalkingOpcodeTable[enable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } return true; } @@ -16384,10 +16043,27 @@ bool Unit::SetFeatherFall(bool enable, bool packetOnly /*= false */) RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW); } - if (enable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_FEATHER_FALL, SMSG_MOVE_FEATHER_FALL).Send(); + static OpcodeServer const featherFallOpcodeTable[2][2] = + { + {SMSG_SPLINE_MOVE_SET_NORMAL_FALL, SMSG_MOVE_NORMAL_FALL }, + {SMSG_SPLINE_MOVE_SET_FEATHER_FALL, SMSG_MOVE_FEATHER_FALL } + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(featherFallOpcodeTable[enable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_NORMAL_FALL, SMSG_MOVE_NORMAL_FALL).Send(); + { + WorldPackets::Movement::MoveSplineSetFlag packet(featherFallOpcodeTable[enable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } return true; } @@ -16420,10 +16096,27 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/) } } - if (enable) - Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_HOVER, SMSG_MOVE_SET_HOVER).Send(); + static OpcodeServer const hoverOpcodeTable[2][2] = + { + {SMSG_SPLINE_MOVE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER }, + {SMSG_SPLINE_MOVE_SET_HOVER, SMSG_MOVE_SET_HOVER } + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(hoverOpcodeTable[enable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } else - Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER).Send(); + { + WorldPackets::Movement::MoveSplineSetFlag packet(hoverOpcodeTable[enable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } return true; } @@ -16557,9 +16250,9 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) // this also applies for transform auras if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm())) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM)) - if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue)) + for (SpellEffectInfo const* effect : transform->GetEffectsForDifficulty(GetMap()->GetDifficulty())) + if (effect && effect->IsAura(SPELL_AURA_TRANSFORM)) + if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(effect->MiscValue)) { cinfo = transformInfo; break; @@ -16693,43 +16386,42 @@ int32 Unit::GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEf bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplications /*= false*/) { - for (uint32 i = 0 ; i < MAX_SPELL_EFFECTS; ++i) + for (AuraEffect* aurEff : aura->GetAuraEffects()) { - if (AuraEffect const* aurEff = aura->GetEffect(i)) + if (!aurEff) + continue; + AuraType const auraType = AuraType(aurEff->GetSpellEffectInfo()->ApplyAuraName); + AuraEffectList const& auras = GetAuraEffectsByType(auraType); + for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end();) { - AuraType const auraType = AuraType(aura->GetSpellInfo()->Effects[i].ApplyAuraName); - AuraEffectList const& auras = GetAuraEffectsByType(auraType); - for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end();) + AuraEffect const* existingAurEff = (*itr); + ++itr; + + if (sSpellMgr->CheckSpellGroupStackRules(aura->GetSpellInfo(), existingAurEff->GetSpellInfo()) + == SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST) { - AuraEffect const* existingAurEff = (*itr); - ++itr; + int32 diff = abs(aurEff->GetAmount()) - abs(existingAurEff->GetAmount()); + if (!diff) + diff = int32(aura->GetEffectMask()) - int32(existingAurEff->GetBase()->GetEffectMask()); - if (sSpellMgr->CheckSpellGroupStackRules(aura->GetSpellInfo(), existingAurEff->GetSpellInfo()) - == SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST) + if (diff > 0) { - int32 diff = abs(aurEff->GetAmount()) - abs(existingAurEff->GetAmount()); - if (!diff) - diff = int32(aura->GetEffectMask()) - int32(existingAurEff->GetBase()->GetEffectMask()); - - if (diff > 0) + Aura const* base = existingAurEff->GetBase(); + // no removing of area auras from the original owner, as that completely cancels them + if (removeOtherAuraApplications && (!base->IsArea() || base->GetOwner() != this)) { - Aura const* base = existingAurEff->GetBase(); - // no removing of area auras from the original owner, as that completely cancels them - if (removeOtherAuraApplications && (!base->IsArea() || base->GetOwner() != this)) + if (AuraApplication* aurApp = existingAurEff->GetBase()->GetApplicationOfTarget(GetGUID())) { - if (AuraApplication* aurApp = existingAurEff->GetBase()->GetApplicationOfTarget(GetGUID())) - { - bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType); - uint32 removedAuras = m_removedAurasCount; - RemoveAura(aurApp); - if (hasMoreThanOneEffect || m_removedAurasCount > removedAuras + 1) - itr = auras.begin(); - } + bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType, GetMap()->GetDifficulty()); + uint32 removedAuras = m_removedAurasCount; + RemoveAura(aurApp); + if (hasMoreThanOneEffect || m_removedAurasCount > removedAuras + 1) + itr = auras.begin(); } } - else if (diff < 0) - return false; } + else if (diff < 0) + return false; } } } @@ -16766,9 +16458,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) @@ -16813,7 +16505,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 b28d26af2c9..2b9b4d932ad 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -123,6 +123,36 @@ enum SpellValueMod SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, + SPELLVALUE_BASE_POINT3, + SPELLVALUE_BASE_POINT4, + SPELLVALUE_BASE_POINT5, + SPELLVALUE_BASE_POINT6, + SPELLVALUE_BASE_POINT7, + SPELLVALUE_BASE_POINT8, + SPELLVALUE_BASE_POINT9, + SPELLVALUE_BASE_POINT10, + SPELLVALUE_BASE_POINT11, + SPELLVALUE_BASE_POINT12, + SPELLVALUE_BASE_POINT13, + SPELLVALUE_BASE_POINT14, + SPELLVALUE_BASE_POINT15, + SPELLVALUE_BASE_POINT16, + SPELLVALUE_BASE_POINT17, + SPELLVALUE_BASE_POINT18, + SPELLVALUE_BASE_POINT19, + SPELLVALUE_BASE_POINT20, + SPELLVALUE_BASE_POINT21, + SPELLVALUE_BASE_POINT22, + SPELLVALUE_BASE_POINT23, + SPELLVALUE_BASE_POINT24, + SPELLVALUE_BASE_POINT25, + SPELLVALUE_BASE_POINT26, + SPELLVALUE_BASE_POINT27, + SPELLVALUE_BASE_POINT28, + SPELLVALUE_BASE_POINT29, + SPELLVALUE_BASE_POINT30, + SPELLVALUE_BASE_POINT31, + SPELLVALUE_BASE_POINT_END, SPELLVALUE_RADIUS_MOD, SPELLVALUE_MAX_TARGETS, SPELLVALUE_AURA_STACK @@ -191,6 +221,13 @@ enum UnitStandFlags UNIT_STAND_FLAGS_ALL = 0xFF }; +enum UnitBytes0Offsets +{ + UNIT_BYTES_0_OFFSET_RACE = 0, + UNIT_BYTES_0_OFFSET_CLASS = 1, + UNIT_BYTES_0_OFFSET_GENDER = 3, +}; + // byte flags value (UNIT_FIELD_BYTES_1, 3) enum UnitBytes1_Flags { @@ -309,7 +346,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 @@ -340,6 +377,7 @@ class AuraEffect; class Creature; class Spell; class SpellInfo; +class SpellEffectInfo; class DynamicObject; class GameObject; class Item; @@ -1373,11 +1411,11 @@ class Unit : public WorldObject uint8 getLevel() const { return uint8(GetUInt32Value(UNIT_FIELD_LEVEL)); } uint8 getLevelForTarget(WorldObject const* /*target*/) const override { return getLevel(); } void SetLevel(uint8 lvl); - uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, 0); } + uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE); } uint32 getRaceMask() const { return 1 << (getRace()-1); } - uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); } + uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS); } uint32 getClassMask() const { return 1 << (getClass()-1); } - uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); } + uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER); } float GetStat(Stats stat) const { return float(GetUInt32Value(UNIT_FIELD_STAT+stat)); } void SetStat(Stats stat, int32 val) { SetStatInt32Value(UNIT_FIELD_STAT+stat, val); } @@ -1406,7 +1444,7 @@ class Unit : public WorldObject int32 ModifyHealth(int32 val); int32 GetHealthGain(int32 dVal); - Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); } + Powers getPowerType() const { return Powers(GetUInt32Value(UNIT_FIELD_DISPLAY_POWER)); } void setPowerType(Powers power); int32 GetPower(Powers power) const; int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } @@ -1583,7 +1621,6 @@ class Unit : public WorldObject int32 HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical = false); void SendEnergizeSpellLog(Unit* victim, uint32 spellID, int32 damage, Powers powertype); void EnergizeBySpell(Unit* victim, uint32 SpellID, int32 Damage, Powers powertype); - uint32 SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage); void CastSpell(SpellCastTargets const& targets, SpellInfo const* spellInfo, CustomSpellValues const* value, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, ObjectGuid originalCaster = ObjectGuid::Empty); void CastSpell(Unit* victim, uint32 spellId, bool triggered, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, ObjectGuid originalCaster = ObjectGuid::Empty); @@ -1597,7 +1634,7 @@ class Unit : public WorldObject void CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* victim = NULL, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, ObjectGuid originalCaster = ObjectGuid::Empty); void CastCustomSpell(uint32 spellId, CustomSpellValues const &value, Unit* victim = NULL, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, ObjectGuid originalCaster = ObjectGuid::Empty); Aura* AddAura(uint32 spellId, Unit* target); - Aura* AddAura(SpellInfo const* spellInfo, uint8 effMask, Unit* target); + Aura* AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target); void SetAuraStack(uint32 spellId, Unit* target, uint32 stack); void SendPlaySpellVisualKit(uint32 id, uint32 unkParam); void BuildCooldownPacket(WorldPacket& data, uint8 flags, uint32 spellId, uint32 cooldown); @@ -1730,11 +1767,11 @@ class Unit : public WorldObject bool InitTamedPet(Pet* pet, uint8 level, uint32 spell_id); // aura apply/remove helpers - you should better not use these - Aura* _TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8 effMask, Unit* caster, int32* baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty); + Aura* _TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty); void _AddAura(UnitAura* aura, Unit* caster); - AuraApplication * _CreateAuraApplication(Aura* aura, uint8 effMask); + AuraApplication * _CreateAuraApplication(Aura* aura, uint32 effMask); void _ApplyAuraEffect(Aura* aura, uint8 effIndex); - void _ApplyAura(AuraApplication * aurApp, uint8 effMask); + void _ApplyAura(AuraApplication * aurApp, uint32 effMask); void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode); void _UnapplyAura(AuraApplication * aurApp, AuraRemoveMode removeMode); void _RemoveNoStackAuraApplicationsDueToAura(Aura* aura); @@ -1747,21 +1784,21 @@ class Unit : public WorldObject AuraMap const& GetOwnedAuras() const { return m_ownedAuras; } void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); - void RemoveOwnedAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); + void RemoveOwnedAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveOwnedAura(Aura* aura, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); - Aura* GetOwnedAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, Aura* except = NULL) const; + Aura* GetOwnedAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, Aura* except = NULL) const; // m_appliedAuras container management AuraApplicationMap & GetAppliedAuras() { return m_appliedAuras; } AuraApplicationMap const& GetAppliedAuras() const { return m_appliedAuras; } void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); - void RemoveAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); + void RemoveAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAura(Aura* aur, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); - void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); + void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit* dispeller, uint8 chargesRemoved = 1); void RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, Unit* stealer); @@ -1796,17 +1833,17 @@ class Unit : public WorldObject AuraEffect* GetAuraEffect(AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID = ObjectGuid::Empty) const; AuraEffect* GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const; - AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraApplication * except = NULL) const; - Aura* GetAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0) const; + AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication * except = NULL) const; + Aura* GetAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; - AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraApplication * except = NULL) const; - Aura* GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0) const; + AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication * except = NULL) const; + Aura* GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; void GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelChargesList& dispelList); bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster = ObjectGuid::Empty) const; uint32 GetAuraCount(uint32 spellId) const; - bool HasAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0) const; + bool HasAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; bool HasAuraType(AuraType auraType) const; bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const; bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const; @@ -1994,14 +2031,14 @@ class Unit : public WorldObject int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const; int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask) const; - uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1) const; + uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; float SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype) const; - uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1) const; + uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const; int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) const; - uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1) const; + uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; float SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const; - uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1) const; + uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; uint32 MeleeDamageBonusDone(Unit* pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const* spellProto = NULL); uint32 MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto = NULL); @@ -2028,7 +2065,7 @@ class Unit : public WorldObject bool IsImmunedToDamage(SpellInfo const* spellInfo) const; virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature - static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); + bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); uint32 CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); uint32 CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const; void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, uint32 const damage, uint32* absorb, uint32* resist, SpellInfo const* spellInfo = NULL); @@ -2040,7 +2077,7 @@ class Unit : public WorldObject void SetSpeed(UnitMoveType mtype, float rate, bool forced = false); float ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index, float value) const; - int32 CalculateSpellDamage(Unit const* target, SpellInfo const* spellProto, uint8 effect_index, int32 const* basePoints = NULL) const; + int32 CalculateSpellDamage(Unit const* target, SpellInfo const* spellProto, uint8 effect_index, int32 const* basePoints = nullptr, float* variance = nullptr) const; int32 CalcSpellDuration(SpellInfo const* spellProto); int32 ModSpellDuration(SpellInfo const* spellProto, Unit const* target, int32 duration, bool positive, uint32 effectMask); void ModSpellCastTime(SpellInfo const* spellProto, int32& castTime, Spell* spell = NULL); @@ -2164,7 +2201,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; @@ -2265,7 +2302,6 @@ class Unit : public WorldObject void DisableSpline(); private: bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent); - bool HandleAuraProcOnPowerAmount(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool * handled); bool HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 90a40aa7990..4da985c7bb6 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 }, @@ -472,8 +482,8 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.SubName = fields[12].GetString(); creatureTemplate.IconName = fields[13].GetString(); creatureTemplate.GossipMenuId = fields[14].GetUInt32(); - creatureTemplate.minlevel = fields[15].GetUInt8(); - creatureTemplate.maxlevel = fields[16].GetUInt8(); + creatureTemplate.minlevel = fields[15].GetInt16(); + creatureTemplate.maxlevel = fields[16].GetInt16(); creatureTemplate.expansion = uint32(fields[17].GetInt16()); creatureTemplate.expansionUnknown = uint32(fields[18].GetUInt16()); creatureTemplate.faction = uint32(fields[19].GetUInt16()); @@ -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(SPELL_AURA_CONTROL_VEHICLE)) + 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) @@ -664,18 +674,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) cInfo->Entry, cInfo->expansion, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->expansion); } - if (cInfo->minlevel > difficultyInfo->minlevel) - { - TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, minlevel %u) has lower `minlevel` in difficulty %u mode (Entry: %u, minlevel %u).", - cInfo->Entry, cInfo->minlevel, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->minlevel); - } - - if (cInfo->maxlevel > difficultyInfo->maxlevel) - { - TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, maxlevel %u) has lower `maxlevel` in difficulty %u mode (Entry: %u, maxlevel %u).", - cInfo->Entry, cInfo->maxlevel, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->maxlevel); - } - if (cInfo->faction != difficultyInfo->faction) { TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, faction %u) has different `faction` in difficulty %u mode (Entry: %u, faction %u).", @@ -973,6 +971,27 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED; } + // -1 is used in the client for auto-updating the levels + // having their expansion set to it to the latest one + if (cInfo->expansion == -1) + { + const_cast<CreatureTemplate*>(cInfo)->minlevel = (MAX_LEVEL + cInfo->minlevel); + const_cast<CreatureTemplate*>(cInfo)->maxlevel = (MAX_LEVEL + cInfo->maxlevel); + const_cast<CreatureTemplate*>(cInfo)->expansion = EXPANSION_WARLORDS_OF_DRAENOR; + } + + if (cInfo->minlevel < 1 || cInfo->minlevel > STRONG_MAX_LEVEL) + { + TC_LOG_ERROR("sql.sql", "Creature (ID: %u): MinLevel %i is not within [1, 255], value has been set to 1.", cInfo->Entry, cInfo->minlevel); + const_cast<CreatureTemplate*>(cInfo)->minlevel = 1; + } + + if (cInfo->maxlevel < 1 || cInfo->maxlevel > STRONG_MAX_LEVEL) + { + TC_LOG_ERROR("sql.sql", "Creature (ID: %u): MaxLevel %i is not within [1, 255], value has been set to 1.", cInfo->Entry, cInfo->maxlevel); + const_cast<CreatureTemplate*>(cInfo)->maxlevel = 1; + } + const_cast<CreatureTemplate*>(cInfo)->ModDamage *= Creature::_GetDamageMod(cInfo->rank); } @@ -1022,17 +1041,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(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))); + if (AdditionalSpellInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_CONTROL_VEHICLE)) + 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 +1242,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 +1262,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 +1277,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) @@ -2301,8 +2327,7 @@ void FillItemDamageFields(float* minDamage, float* maxDamage, float* dps, uint32 return; } - if (!store) - return; + ASSERT(store); ItemDamageEntry const* damageInfo = store->LookupEntry(itemLevel); if (!damageInfo) @@ -2492,7 +2517,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 +2598,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; @@ -2590,7 +2618,7 @@ void ObjectMgr::LoadItemTemplates() continue; ItemTemplate& itemTemplate = itemItr->second; - + ItemEffect effect; effect.SpellID = effectEntry->SpellID; effect.Trigger = effectEntry->Trigger; @@ -3250,7 +3278,6 @@ void ObjectMgr::LoadPlayerInfo() } } - // Load playercreate skills TC_LOG_INFO("server.loading", "Loading Player Create Skill Data..."); { @@ -3325,8 +3352,8 @@ void ObjectMgr::LoadPlayerInfo() } } - // Load playercreate spells - TC_LOG_INFO("server.loading", "Loading Player Create Spell Data..."); + // Load playercreate custom spells + TC_LOG_INFO("server.loading", "Loading Player Create Custom Spell Data..."); { uint32 oldMSTime = getMSTime(); @@ -3334,7 +3361,7 @@ void ObjectMgr::LoadPlayerInfo() if (!result) { - TC_LOG_ERROR("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty."); + TC_LOG_ERROR("server.loading", ">> Loaded 0 player create custom spells. DB table `playercreateinfo_spell_custom` is empty."); } else { @@ -3665,8 +3692,8 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); - GtOCTBaseHPByClassEntry const* hp = sGtOCTBaseHPByClassStore.LookupEntry((class_-1) * GT_MAX_LEVEL + level-1); - GtOCTBaseMPByClassEntry const* mp = sGtOCTBaseMPByClassStore.LookupEntry((class_-1) * GT_MAX_LEVEL + level-1); + GtOCTBaseHPByClassEntry const* hp = sGtOCTBaseHPByClassStore.EvaluateTable(level - 1, class_ - 1); + GtOCTBaseMPByClassEntry const* mp = sGtOCTBaseMPByClassStore.EvaluateTable(level - 1, class_ - 1); if (!hp || !mp) { @@ -4501,12 +4528,12 @@ void ObjectMgr::LoadQuests() if (!spellInfo) continue; - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE) + if (!effect || effect->Effect != SPELL_EFFECT_QUEST_COMPLETE) continue; - uint32 quest_id = spellInfo->Effects[j].MiscValue; + uint32 quest_id = effect->MiscValue; Quest const* quest = GetQuestTemplate(quest_id); @@ -4911,7 +4938,8 @@ void ObjectMgr::LoadSpellScripts() uint8 i = (uint8)((uint32(itr->first) >> 24) & 0x000000FF); //check for correct spellEffect - if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY)) + SpellEffectInfo const* effect = spellInfo->GetEffect(i); + if (effect && (!effect->Effect || (effect->Effect != SPELL_EFFECT_SCRIPT_EFFECT && effect->Effect != SPELL_EFFECT_DUMMY))) TC_LOG_ERROR("sql.sql", "Table `spell_scripts` - spell %u effect %u is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, i); } } @@ -4930,10 +4958,10 @@ void ObjectMgr::LoadEventScripts() // Load all possible script entries from spells for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i)) - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) - if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT) - if (spell->Effects[j].MiscValue) - evt_scripts.insert(spell->Effects[j].MiscValue); + for (SpellEffectInfo const* effect : spell->GetEffectsForDifficulty(DIFFICULTY_NONE)) + if (effect && effect->Effect == SPELL_EFFECT_SEND_EVENT) + if (effect->MiscValue) + evt_scripts.insert(effect->MiscValue); for (size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx) { @@ -5687,35 +5715,32 @@ void ObjectMgr::LoadAreaTriggerScripts() uint32 oldMSTime = getMSTime(); _areaTriggerScriptStore.clear(); // need for reload case - QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts"); + QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts"); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 areatrigger scripts. DB table `areatrigger_scripts` is empty."); return; } - uint32 count = 0; - do { - ++count; - Field* fields = result->Fetch(); - uint32 Trigger_ID = fields[0].GetUInt32(); - const char *scriptName = fields[1].GetCString(); + uint32 triggerId = fields[0].GetUInt32(); + char const* scriptName = fields[1].GetCString(); - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(Trigger_ID); + AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(triggerId); if (!atEntry) { - TC_LOG_ERROR("sql.sql", "Area trigger (ID:%u) does not exist in `AreaTrigger.dbc`.", Trigger_ID); + TC_LOG_ERROR("sql.sql", "AreaTrigger (ID: %u) does not exist in `AreaTrigger.dbc`.", triggerId); continue; } - _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName); - } while (result->NextRow()); + _areaTriggerScriptStore[triggerId] = GetScriptId(scriptName); + } + while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u areatrigger scripts in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " areatrigger scripts in %u ms", _areaTriggerScriptStore.size(), GetMSTimeDiffToNow(oldMSTime)); } uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, uint32 team) @@ -8114,25 +8139,25 @@ void ObjectMgr::AddSpellToTrainer(uint32 ID, uint32 SpellID, uint32 MoneyCost, u // calculate learned spell for profession case when stored cast-spell trainerSpell.ReqAbility[0] = SpellID; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellinfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellinfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL) + if (!effect || effect->Effect != SPELL_EFFECT_LEARN_SPELL) continue; if (trainerSpell.ReqAbility[0] == SpellID) trainerSpell.ReqAbility[0] = 0; // player must be able to cast spell on himself - if (spellinfo->Effects[i].TargetA.GetTarget() != 0 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY - && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER) + if (effect->TargetA.GetTarget() != 0 && effect->TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY + && effect->TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && effect->TargetA.GetTarget() != TARGET_UNIT_CASTER) { TC_LOG_ERROR("sql.sql", "Table `npc_trainer` has spell %u for trainer entry %u with learn effect which has incorrect target type, ignoring learn effect!", SpellID, ID); continue; } - trainerSpell.ReqAbility[i] = spellinfo->Effects[i].TriggerSpell; + trainerSpell.ReqAbility[effect->EffectIndex] = effect->TriggerSpell; - if (trainerSpell.ReqAbility[i]) + if (trainerSpell.ReqAbility[effect->EffectIndex]) { - SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.ReqAbility[i]); + SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.ReqAbility[effect->EffectIndex]); if (learnedSpellInfo && learnedSpellInfo->IsProfession()) data.trainerType = 2; } @@ -8529,31 +8554,32 @@ void ObjectMgr::LoadScriptNames() { uint32 oldMSTime = getMSTime(); - _scriptNamesStore.push_back(""); + _scriptNamesStore.emplace_back(""); + QueryResult result = WorldDatabase.Query( - "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 " - "UNION " - "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM item_script_names WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); + "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 " + "UNION " + "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM item_script_names WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' " + "UNION " + "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); if (!result) { @@ -8561,20 +8587,23 @@ void ObjectMgr::LoadScriptNames() return; } - uint32 count = 1; - do { - _scriptNamesStore.push_back((*result)[0].GetString()); - ++count; + _scriptNamesStore.emplace_back((*result)[0].GetCString()); } while (result->NextRow()); std::sort(_scriptNamesStore.begin(), _scriptNamesStore.end()); - TC_LOG_INFO("server.loading", ">> Loaded %d Script Names in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + +#ifdef SCRIPTS + for (size_t i = 1; i < _scriptNamesStore.size(); ++i) + UnusedScriptNames.push_back(_scriptNamesStore[i]); +#endif + + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " ScriptNames in %u ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime)); } -uint32 ObjectMgr::GetScriptId(const char *name) +uint32 ObjectMgr::GetScriptId(char const* name) { // use binary search to find the script name in the sorted vector // assume "" is the first element diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index bb392caeffb..14f845dcd1b 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; @@ -1277,9 +1286,8 @@ class ObjectMgr bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type, Player* player = NULL, std::set<uint32>* skip_vendors = NULL, uint32 ORnpcflag = 0) const; void LoadScriptNames(); - ScriptNameContainer &GetScriptNames() { return _scriptNamesStore; } - const char * GetScriptName(uint32 id) const { return id < _scriptNamesStore.size() ? _scriptNamesStore[id].c_str() : ""; } - uint32 GetScriptId(const char *name); + char const* GetScriptName(uint32 id) const { return id < _scriptNamesStore.size() ? _scriptNamesStore[id].c_str() : ""; } + uint32 GetScriptId(char const* name); SpellClickInfoMapBounds GetSpellClickInfoMapBounds(uint32 creature_id) const { 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 c4e4b6f21ae..9c4a2a5a2d1 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -54,7 +54,7 @@ Loot* Roll::getLoot() } Group::Group() : m_leaderGuid(), m_leaderName(""), m_groupType(GROUPTYPE_NORMAL), -m_dungeonDifficulty(DUNGEON_DIFFICULTY_NORMAL), m_raidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL), +m_dungeonDifficulty(DIFFICULTY_NORMAL), m_raidDifficulty(DIFFICULTY_10_N), m_bgGroup(NULL), m_bfGroup(NULL), m_lootMethod(FREE_FOR_ALL), m_lootThreshold(ITEM_QUALITY_UNCOMMON), m_looterGuid(), m_masterLooterGuid(), m_subGroupsCounts(NULL), m_guid(), m_counter(0), m_maxEnchantingLevel(0), m_dbStoreId(0) { @@ -111,8 +111,8 @@ bool Group::Create(Player* leader) m_looterGuid = leaderGuid; m_masterLooterGuid.Clear(); - m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL; - m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; + m_dungeonDifficulty = DIFFICULTY_NORMAL; + m_raidDifficulty = DIFFICULTY_10_N; if (!isBGGroup() && !isBFGroup()) { @@ -182,13 +182,13 @@ void Group::LoadGroupFromDB(Field* fields) uint32 diff = fields[13].GetUInt8(); if (diff >= MAX_DUNGEON_DIFFICULTY) - m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL; + m_dungeonDifficulty = DIFFICULTY_NORMAL; else m_dungeonDifficulty = Difficulty(diff); uint32 r_diff = fields[14].GetUInt8(); if (r_diff >= MAX_RAID_DIFFICULTY) - m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; + m_raidDifficulty = DIFFICULTY_10_N; else m_raidDifficulty = Difficulty(r_diff); @@ -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()) { @@ -2008,7 +2008,7 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo) if (method == INSTANCE_RESET_ALL) { // the "reset all instances" method can only reset normal maps - if (entry->IsRaid() || diff == DUNGEON_DIFFICULTY_HEROIC) + if (entry->IsRaid() || diff == DIFFICULTY_HEROIC) { ++itr; continue; 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/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp index 67a00d3dff8..40e2bc1613e 100644 --- a/src/server/game/Guilds/GuildFinderMgr.cpp +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -129,11 +129,11 @@ void GuildFinderMgr::AddMembershipRequest(ObjectGuid const& guildGuid, Membershi // Notify the applicant his submittion has been added if (Player* player = ObjectAccessor::FindPlayer(request.GetPlayerGUID())) - SendMembershipRequestListUpdate(*player); + SendMembershipRequestListUpdate(player); // Notify the guild master and officers the list changed if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid)) - SendApplicantListUpdate(*guild); + SendApplicantListUpdate(guild); } void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(ObjectGuid const& playerId) @@ -159,7 +159,7 @@ void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(ObjectGuid const& pla // Notify the guild master and officers the list changed if (Guild* guild = sGuildMgr->GetGuildByGuid(itr->first)) - SendApplicantListUpdate(*guild); + SendApplicantListUpdate(guild); } } @@ -182,15 +182,15 @@ void GuildFinderMgr::RemoveMembershipRequest(ObjectGuid const& playerId, ObjectG CharacterDatabase.CommitTransaction(trans); - _membershipRequests[guildId].erase(itr); - // Notify the applicant his submittion has been removed if (Player* player = ObjectAccessor::FindPlayer(itr->GetPlayerGUID())) - SendMembershipRequestListUpdate(*player); + SendMembershipRequestListUpdate(player); // Notify the guild master and officers the list changed if (Guild* guild = sGuildMgr->GetGuildByGuid(guildId)) - SendApplicantListUpdate(*guild); + SendApplicantListUpdate(guild); + + _membershipRequests[guildId].erase(itr); } std::list<MembershipRequest> GuildFinderMgr::GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid) @@ -302,7 +302,7 @@ void GuildFinderMgr::DeleteGuild(ObjectGuid const& guildId) // Notify the applicant his submition has been removed if (Player* player = ObjectAccessor::FindPlayer(itr->GetPlayerGUID())) - SendMembershipRequestListUpdate(*player); + SendMembershipRequestListUpdate(player); ++itr; } @@ -312,19 +312,19 @@ void GuildFinderMgr::DeleteGuild(ObjectGuid const& guildId) // Notify the guild master the list changed (even if he's not a GM any more, not sure if needed) if (Guild* guild = sGuildMgr->GetGuildByGuid(guildId)) - SendApplicantListUpdate(*guild); + SendApplicantListUpdate(guild); } -void GuildFinderMgr::SendApplicantListUpdate(Guild& guild) +void GuildFinderMgr::SendApplicantListUpdate(Guild* guild) { WorldPacket data(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, 0); - if (Player* player = ObjectAccessor::FindPlayer(guild.GetLeaderGUID())) + if (Player* player = ObjectAccessor::FindPlayer(guild->GetLeaderGUID())) player->SendDirectMessage(&data); - guild.BroadcastPacketToRank(&data, GR_OFFICER); + guild->BroadcastPacketToRank(&data, GR_OFFICER); } -void GuildFinderMgr::SendMembershipRequestListUpdate(Player& player) +void GuildFinderMgr::SendMembershipRequestListUpdate(Player* player) { WorldPacket data(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, 0); - player.SendDirectMessage(&data); + player->SendDirectMessage(&data); } diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h index 45228957b55..763d9285b31 100644 --- a/src/server/game/Guilds/GuildFinderMgr.h +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -262,8 +262,8 @@ class GuildFinderMgr /// Counts the amount of pending membership requests, given the player's db guid. uint8 CountRequestsFromPlayer(ObjectGuid const& playerId); - void SendApplicantListUpdate(Guild& guild); - void SendMembershipRequestListUpdate(Player& player); + static void SendApplicantListUpdate(Guild* guild); + static void SendMembershipRequestListUpdate(Player* player); static GuildFinderMgr* instance() { 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/BattlefieldHandler.cpp b/src/server/game/Handlers/BattlefieldHandler.cpp index 649e5ff171f..14928e1efdc 100644 --- a/src/server/game/Handlers/BattlefieldHandler.cpp +++ b/src/server/game/Handlers/BattlefieldHandler.cpp @@ -27,7 +27,7 @@ #include "BattlefieldMgr.h" /** - * @fn void WorldSession::SendBfInvitePlayerToWar(uint64 guid, uint32 zoneId, uint32 acceptTime) + * @fn void WorldSession::SendBfInvitePlayerToWar(ObjectGuid guid, uint32 zoneId, uint32 acceptTime) * * @brief This send to player windows for invite player to join the war. * @@ -62,7 +62,7 @@ void WorldSession::SendBfInvitePlayerToWar(ObjectGuid guid, uint32 zoneId, uint3 } /** - * @fn void WorldSession::SendBfInvitePlayerToQueue(uint64 guid) + * @fn void WorldSession::SendBfInvitePlayerToQueue(ObjectGuid guid) * * @brief This send invitation to player to join the queue. * @@ -103,7 +103,7 @@ void WorldSession::SendBfInvitePlayerToQueue(ObjectGuid guid) } /** - * @fn void WorldSession::SendBfQueueInviteResponse(uint64 guid, uint32 zoneId, bool canQueue, bool full) + * @fn void WorldSession::SendBfQueueInviteResponse(ObjectGuid guid, uint32 zoneId, bool canQueue, bool full) * * @brief This send packet for inform player that he join queue. * @@ -157,7 +157,7 @@ void WorldSession::SendBfQueueInviteResponse(ObjectGuid guid, uint32 zoneId, boo } /** - * @fn void WorldSession::SendBfEntered(uint64 guid) + * @fn void WorldSession::SendBfEntered(ObjectGuid guid) * * @brief This is call when player accept to join war. * @@ -196,7 +196,7 @@ void WorldSession::SendBfEntered(ObjectGuid guid) } /** - * @fn void WorldSession::SendBfLeaveMessage(uint64 guid, BFLeaveReason reason) + * @fn void WorldSession::SendBfLeaveMessage(ObjectGuid guid, BFLeaveReason reason) * * @brief This is call when player leave battlefield zone. * 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..81248519994 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -39,261 +39,165 @@ #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; + break; } } - // 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 +226,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 +269,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 +284,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 +316,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 +339,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 +356,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 +366,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 +390,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 +442,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 +458,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 +540,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 +594,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 +653,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/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 097c47a228e..07258fbd976 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -1048,7 +1048,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); - if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) + if (aurApp->GetFlags() & AFLAG_SCALABLE) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { @@ -1150,7 +1150,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); - if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) + if (aurApp->GetFlags() & AFLAG_SCALABLE) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { @@ -1285,7 +1285,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); - if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) + if (aurApp->GetFlags() & AFLAG_SCALABLE) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { @@ -1338,7 +1338,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); - if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) + if (aurApp->GetFlags() & AFLAG_SCALABLE) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { 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 613f1e46d7b..9598ce216fb 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -52,6 +52,7 @@ #include "Group.h" #include "AccountMgr.h" #include "Spell.h" +#include "SpellPackets.h" #include "BattlegroundMgr.h" #include "Battlefield.h" #include "BattlefieldMgr.h" @@ -538,12 +539,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) @@ -1041,17 +1039,17 @@ int32 WorldSession::HandleEnableNagleAlgorithm() return 0; } -void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recvData) +void WorldSession::HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet) { - uint8 button; - uint32 packetData; - recvData >> button >> packetData; - TC_LOG_DEBUG("network", "CMSG_SET_ACTION_BUTTON Button: %u Data: %u", button, packetData); + uint32 action = ACTION_BUTTON_ACTION(packet.Action); + uint32 type = ACTION_BUTTON_TYPE(packet.Action); + + TC_LOG_DEBUG("network", "CMSG_SET_ACTION_BUTTON Button: %u Action: %u Type: %u", packet.Index, action, type); - if (!packetData) - GetPlayer()->removeActionButton(button); + if (!packet.Action) + GetPlayer()->removeActionButton(packet.Index); else - GetPlayer()->addActionButton(button, ACTION_BUTTON_ACTION(packetData), ACTION_BUTTON_TYPE(packetData)); + GetPlayer()->addActionButton(packet.Index, action, type); } void WorldSession::HandleCompleteCinematic(WorldPacket& /*recvData*/) @@ -1867,74 +1865,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..096eaac26fa 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(); @@ -197,41 +197,16 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) +void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet) { - TC_LOG_DEBUG("network", "MSG_MOVE_TELEPORT_ACK"); - - ObjectGuid guid; - uint32 flags, time; - recvPacket >> flags >> time; - - guid[5] = recvPacket.ReadBit(); - guid[0] = recvPacket.ReadBit(); - guid[1] = recvPacket.ReadBit(); - guid[6] = recvPacket.ReadBit(); - guid[3] = recvPacket.ReadBit(); - guid[7] = recvPacket.ReadBit(); - guid[2] = recvPacket.ReadBit(); - guid[4] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(guid[4]); - recvPacket.ReadByteSeq(guid[2]); - recvPacket.ReadByteSeq(guid[7]); - recvPacket.ReadByteSeq(guid[6]); - recvPacket.ReadByteSeq(guid[5]); - recvPacket.ReadByteSeq(guid[1]); - recvPacket.ReadByteSeq(guid[3]); - recvPacket.ReadByteSeq(guid[0]); - - TC_LOG_DEBUG("network", "%s ", guid.ToString().c_str()); - TC_LOG_DEBUG("network", "Flags %u, time %u", flags, time/IN_MILLISECONDS); + TC_LOG_DEBUG("network", "CMSG_MOVE_TELEPORT_ACK: Guid: %s, Sequence: %u, Time: %u", packet.MoverGUID.ToString().c_str(), packet.AckIndex, packet.MoveTime); Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; - if (guid != plMover->GetGUID()) + if (packet.MoverGUID != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); @@ -384,7 +359,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov mover->UpdatePosition(movementInfo.pos); WorldPackets::Movement::ServerPlayerMovement playerMovement; - playerMovement.mover = mover; + playerMovement.movementInfo = &mover->m_movementInfo; mover->SendMessageToSet(const_cast<WorldPacket*>(playerMovement.Write()), _player); if (plrMover) // nothing is charmed, or player charmed 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/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 699d91c4cc9..652b548b3a2 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -312,9 +312,9 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe return; } - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect: spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) + if (effect && (effect->TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || effect->TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || effect->TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)) return; } @@ -752,10 +752,10 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) charmInfo->SetSpellAutocast(spellInfo, state != 0); } -void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) +void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest) { TC_LOG_DEBUG("network", "WORLD: CMSG_PET_CAST_SPELL"); - + /* ObjectGuid guid; uint8 castCount; uint32 spellId; @@ -835,7 +835,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) spell->finish(false); delete spell; - } + }*/ } void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName) diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index f432ff70275..fb8e45f5f42 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -239,88 +239,27 @@ 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"); } @@ -492,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 = -int32(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 f0c1b28117b..278169c2d63 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -28,59 +28,22 @@ #include "WorldSession.h" #include "TalentPackets.h" -void WorldSession::HandleLearnTalentOpcode(WorldPacket& recvData) +void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet) { - /* TODO: 6.x update packet struct (note: LearnTalent no longer has rank argument) - uint32 talentId, requestedRank; - recvData >> talentId >> requestedRank; - - if (_player->LearnTalent(talentId, requestedRank)) - _player->SendTalentsInfoData(false);*/ + bool anythingLearned = false; + for (uint32 talentId : packet.Talents) + { + if (_player->LearnTalent(talentId)) + anythingLearned = true; + } + + if (anythingLearned) + _player->SendTalentsInfoData(); } void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket) { - /* TODO: 6.x update packet struct TC_LOG_DEBUG("network", "CMSG_LEARN_PREVIEW_TALENTS"); - - int32 tabPage; - uint32 talentsCount; - recvPacket >> tabPage; // talent tree - - // prevent cheating (selecting new tree with points already in another) - if (tabPage >= 0) // -1 if player already has specialization - { - if (TalentTabEntry const* talentTabEntry = sTalentTabStore.LookupEntry(_player->GetPrimaryTalentTree(_player->GetActiveSpec()))) - { - if (talentTabEntry->tabpage != uint32(tabPage)) - { - recvPacket.rfinish(); - return; - } - } - } - - recvPacket >> talentsCount; - - uint32 talentId, talentRank; - - // Client has max 21 talents for tree for 3 trees, rounded up : 70 - uint32 const MaxTalentsCount = 70; - - for (uint32 i = 0; i < talentsCount && i < MaxTalentsCount; ++i) - { - recvPacket >> talentId >> talentRank; - - if (!_player->LearnTalent(talentId, talentRank)) - { - recvPacket.rfinish(); - break; - } - } - - _player->SendTalentsInfoData(false); - - recvPacket.rfinish();*/ } void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 05f600e1207..a6bd43f72c6 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -153,7 +153,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) if (pUser->IsInCombat()) { - for (int i = 0; i < proto->Effects.size(); ++i) + for (uint32 i = 0; i < proto->Effects.size(); ++i) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(proto->Effects[i].SpellID)) { @@ -329,60 +329,71 @@ void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket) _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry()); } -void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) +void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest) { - uint32 spellId, glyphIndex; - uint8 castCount, castFlags; - recvPacket >> castCount; - recvPacket >> spellId; - recvPacket >> glyphIndex; - recvPacket >> castFlags; - - TC_LOG_DEBUG("network", "WORLD: got cast spell packet, castCount: %u, spellId: %u, castFlags: %u, data length = %u", castCount, spellId, castFlags, (uint32)recvPacket.size()); + TC_LOG_DEBUG("network", "WORLD: got cast spell packet, castCount: %u, spellId: %u, castFlags: %u", castRequest.CastID, castRequest.SpellID, castRequest.SendCastFlags); // ignore for remote control state (for player case) Unit* mover = _player->m_mover; if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER) { - recvPacket.rfinish(); // prevent spam at ignore packet return; } - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(castRequest.SpellID); if (!spellInfo) { - TC_LOG_ERROR("network", "WORLD: unknown spell id %u", spellId); - recvPacket.rfinish(); // prevent spam at ignore packet + TC_LOG_ERROR("network", "WORLD: unknown spell id %u", castRequest.SpellID); return; } if (spellInfo->IsPassive()) { - recvPacket.rfinish(); // prevent spam at ignore packet return; } Unit* caster = mover; - if (caster->GetTypeId() == TYPEID_UNIT && !caster->ToCreature()->HasSpell(spellId)) + if (caster->GetTypeId() == TYPEID_UNIT && !caster->ToCreature()->HasSpell(castRequest.SpellID)) { // If the vehicle creature does not have the spell but it allows the passenger to cast own spells // change caster to player and let him cast if (!_player->IsOnVehicle(caster) || spellInfo->CheckVehicle(_player) != SPELL_CAST_OK) { - recvPacket.rfinish(); // prevent spam at ignore packet return; } caster = _player; } - if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellId)) + if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(castRequest.SpellID)) { // not have spell in spellbook - recvPacket.rfinish(); // prevent spam at ignore packet return; } + + if (Player* plr = caster->ToPlayer()) + { + uint32 specId = plr->GetActiveTalentSpec(); + if (specId) + { + if (sSpecializationOverrideSpellMap.find(specId) != sSpecializationOverrideSpellMap.end()) + { + if (sSpecializationOverrideSpellMap[specId].find(castRequest.SpellID) != sSpecializationOverrideSpellMap[specId].end()) + { + SpellInfo const* newSpellInfo = sSpellMgr->GetSpellInfo(sSpecializationOverrideSpellMap[specId][castRequest.SpellID]); + if (newSpellInfo) + { + if (newSpellInfo->SpellLevel <= caster->getLevel()) + { + spellInfo = newSpellInfo; + castRequest.SpellID = newSpellInfo->Id; + } + } + } + } + } + } Unit::AuraEffectList swaps = mover->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS); Unit::AuraEffectList const& swaps2 = mover->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_2); @@ -398,7 +409,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo((*itr)->GetAmount())) { spellInfo = newInfo; - spellId = newInfo->Id; + castRequest.SpellID = newInfo->Id; } break; } @@ -410,21 +421,20 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (spellInfo->IsAutoRepeatRangedSpell() && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL) && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo) { - recvPacket.rfinish(); return; } // can't use our own spells when we're in possession of another unit, if (_player->isPossessing()) { - recvPacket.rfinish(); // prevent spam at ignore packet return; } // client provided targets - SpellCastTargets targets; - targets.Read(recvPacket, caster); - HandleClientCastFlags(recvPacket, castFlags, targets); + SpellCastTargets targets(caster, castRequest.TargetFlags, castRequest.UnitGuid, castRequest.ItemGuid, castRequest.SrcTransportGuid, castRequest.DstTransportGuid, castRequest.SrcPos, castRequest.DstPos, castRequest.Pitch, castRequest.Speed, castRequest.Name); + + + //HandleClientCastFlags(recvPacket, castFlags, targets); // auto-selection buff level base at target level (in spellInfo) if (targets.GetUnitTarget()) @@ -437,8 +447,8 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) } Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE, ObjectGuid::Empty, false); - spell->m_cast_count = castCount; // set count of casts - spell->m_glyphIndex = glyphIndex; + spell->m_cast_count = castRequest.CastID; // set count of casts + spell->m_glyphIndex = castRequest.Misc; // 6.x Misc is just a guess spell->prepare(&targets); } @@ -458,6 +468,10 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket) uint32 spellId; recvPacket >> spellId; + ObjectGuid guid; + recvPacket >> guid; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo) return; @@ -485,7 +499,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket) _player->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL); // If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other - if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES)) + if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_TRACK_RESOURCES)) { Unit::AuraEffectList const& auraEffects = _player->GetAuraEffectsByType(SPELL_AURA_TRACK_RESOURCES); if (!auraEffects.empty()) @@ -760,14 +774,14 @@ void WorldSession::HandleRequestCategoryCooldowns(WorldPacket& /*recvPacket*/) void WorldSession::SendSpellCategoryCooldowns() { - WorldPackets::Spell::CategoryCooldown cooldowns; + WorldPackets::Spells::CategoryCooldown cooldowns; Unit::AuraEffectList const& categoryCooldownAuras = _player->GetAuraEffectsByType(SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN); for (AuraEffect* aurEff : categoryCooldownAuras) { uint32 categoryId = aurEff->GetMiscValue(); auto cItr = std::find_if(cooldowns.CategoryCooldowns.begin(), cooldowns.CategoryCooldowns.end(), - [categoryId](WorldPackets::Spell::CategoryCooldown::CategoryCooldownInfo const& cooldown) + [categoryId](WorldPackets::Spells::CategoryCooldown::CategoryCooldownInfo const& cooldown) { return cooldown.Category == categoryId; }); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 9aef1b62f7c..27b362faf90 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -96,7 +96,7 @@ InstanceSave* InstanceSaveManager::AddInstanceSave(uint32 mapId, uint32 instance { // initialize reset time // for normal instances if no creatures are killed the instance will reset in two hours - if (entry->IsRaid() || difficulty > DUNGEON_DIFFICULTY_NORMAL) + if (entry->IsRaid() || difficulty > DIFFICULTY_NORMAL) resetTime = GetResetTimeFor(mapId, difficulty); else { @@ -213,7 +213,7 @@ time_t InstanceSave::GetResetTimeForDB() { // only save the reset time for normal instances const MapEntry* entry = sMapStore.LookupEntry(GetMapId()); - if (!entry || entry->IsRaid() || GetDifficulty() == DUNGEON_DIFFICULTY_HEROIC) + if (!entry || entry->IsRaid() || GetDifficulty() == DIFFICULTY_HEROIC) return 0; else return GetResetTime(); diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index b2c86d5152b..70db53ced8d 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -175,7 +175,7 @@ class InstanceSaveManager uint16 mapid; uint16 instanceId; - InstResetEvent() : type(0), difficulty(DUNGEON_DIFFICULTY_NORMAL), mapid(0), instanceId(0) { } + InstResetEvent() : type(0), difficulty(DIFFICULTY_NORMAL), mapid(0), instanceId(0) { } InstResetEvent(uint8 t, uint32 _mapid, Difficulty d, uint16 _instanceid) : type(t), difficulty(d), mapid(_mapid), instanceId(_instanceid) { } bool operator == (const InstResetEvent& e) const { return e.instanceId == instanceId; } 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/Map.h b/src/server/game/Maps/Map.h index 091fbb95aa5..7b7a0d5558d 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -386,15 +386,15 @@ class Map : public GridRefManager<NGridType> // have meaning only for instanced map (that have set real difficulty) Difficulty GetDifficulty() const { return Difficulty(GetSpawnMode()); } - bool IsRegularDifficulty() const { return GetDifficulty() == REGULAR_DIFFICULTY; } + bool IsRegularDifficulty() const { return GetDifficulty() == DIFFICULTY_NONE; } MapDifficulty const* GetMapDifficulty() const; bool Instanceable() const { return i_mapEntry && i_mapEntry->Instanceable(); } bool IsDungeon() const { return i_mapEntry && i_mapEntry->IsDungeon(); } bool IsNonRaidDungeon() const { return i_mapEntry && i_mapEntry->IsNonRaidDungeon(); } bool IsRaid() const { return i_mapEntry && i_mapEntry->IsRaid(); } - bool IsRaidOrHeroicDungeon() const { return IsRaid() || i_spawnMode > DUNGEON_DIFFICULTY_NORMAL; } - bool IsHeroic() const { return IsRaid() ? i_spawnMode >= RAID_DIFFICULTY_10MAN_HEROIC : i_spawnMode >= DUNGEON_DIFFICULTY_HEROIC; } + bool IsRaidOrHeroicDungeon() const { return IsRaid() || i_spawnMode > DIFFICULTY_NORMAL; } + bool IsHeroic() const { return IsRaid() ? i_spawnMode >= DIFFICULTY_10_HC : i_spawnMode >= DIFFICULTY_HEROIC; } bool Is25ManRaid() const { return IsRaid() && i_spawnMode & RAID_DIFFICULTY_MASK_25MAN; } // since 25man difficulties are 1 and 3, we can check them like that bool IsBattleground() const { return i_mapEntry && i_mapEntry->IsBattleground(); } bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); } diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 8dfa4449e12..48e5161bcf1 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -27,7 +27,7 @@ #include "Group.h" #include "Player.h" -MapInstanced::MapInstanced(uint32 id, time_t expiry) : Map(id, expiry, 0, DUNGEON_DIFFICULTY_NORMAL) +MapInstanced::MapInstanced(uint32 id, time_t expiry) : Map(id, expiry, 0, DIFFICULTY_NORMAL) { // fill with zero memset(&GridMapReference, 0, MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_GRIDS*sizeof(uint16)); @@ -227,7 +227,7 @@ BattlegroundMap* MapInstanced::CreateBattleground(uint32 InstanceId, Battlegroun TC_LOG_DEBUG("maps", "MapInstanced::CreateBattleground: map bg %d for %d created.", InstanceId, GetId()); - BattlegroundMap* map = new BattlegroundMap(GetId(), GetGridExpiry(), InstanceId, this, REGULAR_DIFFICULTY); + BattlegroundMap* map = new BattlegroundMap(GetId(), GetGridExpiry(), InstanceId, this, DIFFICULTY_NONE); ASSERT(map->IsBattlegroundOrArena()); map->SetBG(bg); bg->SetBgMap(map); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index ac9e5918442..92d7335c7de 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -78,7 +78,7 @@ Map* MapManager::CreateBaseMap(uint32 id) map = new MapInstanced(id, i_gridCleanUpDelay); else { - map = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY); + map = new Map(id, i_gridCleanUpDelay, 0, DIFFICULTY_NONE); map->LoadRespawnTimes(); } 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 68c30716ad9..c81ba4f4bbe 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -27,7 +27,36 @@ enum SpellEffIndex { EFFECT_0 = 0, EFFECT_1 = 1, - EFFECT_2 = 2 + EFFECT_2 = 2, + EFFECT_3 = 3, + EFFECT_4 = 4, + EFFECT_5 = 5, + EFFECT_6 = 6, + EFFECT_7 = 7, + EFFECT_8 = 8, + EFFECT_9 = 9, + EFFECT_10 = 10, + EFFECT_11 = 11, + EFFECT_12 = 12, + EFFECT_13 = 13, + EFFECT_14 = 14, + EFFECT_15 = 15, + EFFECT_16 = 16, + EFFECT_17 = 17, + EFFECT_18 = 18, + EFFECT_19 = 19, + EFFECT_20 = 20, + EFFECT_21 = 21, + EFFECT_22 = 22, + EFFECT_23 = 23, + EFFECT_24 = 24, + EFFECT_25 = 25, + EFFECT_26 = 26, + EFFECT_27 = 27, + EFFECT_28 = 28, + EFFECT_29 = 29, + EFFECT_30 = 30, + EFFECT_31 = 31 }; // used in script definitions @@ -58,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) @@ -819,7 +849,7 @@ enum SpellAttr13 #define MAX_TALENT_GROUP 1 #define MIN_TALENT_GROUPS 1 #define MAX_TALENT_GROUPS 2 -#define MAX_GLYPH_SLOT_INDEX 9 +#define MAX_GLYPH_SLOT_INDEX 6 #define MIN_SPECIALIZATION_LEVEL 10 #define MAX_SPECIALIZATIONS 4 @@ -974,7 +1004,7 @@ enum Team TEAM_OTHER = 0 // if ReputationListId > 0 && Flags != FACTION_FLAG_TEAM_HEADER }; -enum SpellEffects +enum SpellEffectName { SPELL_EFFECT_INSTAKILL = 1, SPELL_EFFECT_SCHOOL_DAMAGE = 2, @@ -1158,10 +1188,72 @@ enum SpellEffects SPELL_EFFECT_180 = 180, // Unused (4.3.4) SPELL_EFFECT_181 = 181, // Unused (4.3.4) SPELL_EFFECT_182 = 182, - TOTAL_SPELL_EFFECTS = 183, + SPELL_EFFECT_183 = 183, + SPELL_EFFECT_184 = 184, + SPELL_EFFECT_185 = 185, + SPELL_EFFECT_186 = 186, + SPELL_EFFECT_187 = 187, + SPELL_EFFECT_188 = 188, + SPELL_EFFECT_189 = 189, + SPELL_EFFECT_190 = 190, + SPELL_EFFECT_191 = 191, + SPELL_EFFECT_192 = 192, + SPELL_EFFECT_193 = 193, + SPELL_EFFECT_194 = 194, + SPELL_EFFECT_195 = 195, + SPELL_EFFECT_196 = 196, + SPELL_EFFECT_197 = 197, + SPELL_EFFECT_198 = 198, + SPELL_EFFECT_199 = 199, + SPELL_EFFECT_200 = 200, + SPELL_EFFECT_201 = 201, + SPELL_EFFECT_202 = 202, + SPELL_EFFECT_203 = 203, + SPELL_EFFECT_204 = 204, + SPELL_EFFECT_205 = 205, + SPELL_EFFECT_206 = 206, + SPELL_EFFECT_207 = 207, + SPELL_EFFECT_208 = 208, + SPELL_EFFECT_209 = 209, + SPELL_EFFECT_210 = 210, + SPELL_EFFECT_211 = 211, + SPELL_EFFECT_212 = 212, + SPELL_EFFECT_213 = 213, + SPELL_EFFECT_214 = 214, + SPELL_EFFECT_215 = 215, + SPELL_EFFECT_216 = 216, + SPELL_EFFECT_217 = 217, + SPELL_EFFECT_218 = 218, + SPELL_EFFECT_219 = 219, + SPELL_EFFECT_220 = 220, + SPELL_EFFECT_221 = 221, + SPELL_EFFECT_222 = 222, + SPELL_EFFECT_223 = 223, + SPELL_EFFECT_224 = 224, + SPELL_EFFECT_225 = 225, + SPELL_EFFECT_226 = 226, + SPELL_EFFECT_227 = 227, + SPELL_EFFECT_228 = 228, + SPELL_EFFECT_229 = 229, + SPELL_EFFECT_230 = 230, + SPELL_EFFECT_231 = 231, + SPELL_EFFECT_232 = 232, + SPELL_EFFECT_233 = 233, + SPELL_EFFECT_234 = 234, + SPELL_EFFECT_235 = 235, + SPELL_EFFECT_236 = 236, + SPELL_EFFECT_237 = 237, + SPELL_EFFECT_238 = 238, + SPELL_EFFECT_239 = 239, + SPELL_EFFECT_240 = 240, + SPELL_EFFECT_241 = 241, + SPELL_EFFECT_242 = 242, + SPELL_EFFECT_243 = 243, + SPELL_EFFECT_244 = 244, + TOTAL_SPELL_EFFECTS = 245, }; -enum SpellCastResult // (6.0) +enum SpellCastResult // 19116 { SPELL_FAILED_SUCCESS = 0, SPELL_FAILED_AFFECTING_COMBAT = 1, @@ -1207,203 +1299,224 @@ enum SpellCastResult // (6.0) SPELL_FAILED_GARRISON_OWNED = 41, SPELL_FAILED_GARRISON_MAX_LEVEL = 42, SPELL_FAILED_GARRISON_NOT_UPGRADEABLE = 43, - SPELL_FAILED_HIGHLEVEL = 44, - SPELL_FAILED_HUNGER_SATIATED = 45, - SPELL_FAILED_IMMUNE = 46, - SPELL_FAILED_INCORRECT_AREA = 47, - SPELL_FAILED_INTERRUPTED = 48, - SPELL_FAILED_INTERRUPTED_COMBAT = 49, - SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 50, - SPELL_FAILED_ITEM_GONE = 51, - SPELL_FAILED_ITEM_NOT_FOUND = 52, - SPELL_FAILED_ITEM_NOT_READY = 53, - SPELL_FAILED_LEVEL_REQUIREMENT = 54, - SPELL_FAILED_LINE_OF_SIGHT = 55, - SPELL_FAILED_LOWLEVEL = 56, - SPELL_FAILED_LOW_CASTLEVEL = 57, - SPELL_FAILED_MAINHAND_EMPTY = 58, - SPELL_FAILED_MOVING = 59, - SPELL_FAILED_NEED_AMMO = 60, - SPELL_FAILED_NEED_AMMO_POUCH = 61, - SPELL_FAILED_NEED_EXOTIC_AMMO = 62, - SPELL_FAILED_NEED_MORE_ITEMS = 63, - SPELL_FAILED_NOPATH = 64, - SPELL_FAILED_NOT_BEHIND = 65, - SPELL_FAILED_NOT_FISHABLE = 66, - SPELL_FAILED_NOT_FLYING = 67, - SPELL_FAILED_NOT_HERE = 68, - SPELL_FAILED_NOT_INFRONT = 69, - SPELL_FAILED_NOT_IN_CONTROL = 70, - SPELL_FAILED_NOT_KNOWN = 71, - SPELL_FAILED_NOT_MOUNTED = 72, - SPELL_FAILED_NOT_ON_TAXI = 73, - SPELL_FAILED_NOT_ON_TRANSPORT = 74, - SPELL_FAILED_NOT_READY = 75, - SPELL_FAILED_NOT_SHAPESHIFT = 76, - SPELL_FAILED_NOT_STANDING = 77, - SPELL_FAILED_NOT_TRADEABLE = 78, - SPELL_FAILED_NOT_TRADING = 79, - SPELL_FAILED_NOT_UNSHEATHED = 80, - SPELL_FAILED_NOT_WHILE_GHOST = 81, - SPELL_FAILED_NOT_WHILE_LOOTING = 82, - SPELL_FAILED_NO_AMMO = 83, - SPELL_FAILED_NO_CHARGES_REMAIN = 84, - SPELL_FAILED_NO_CHAMPION = 85, - SPELL_FAILED_NO_COMBO_POINTS = 86, - SPELL_FAILED_NO_DUELING = 87, - SPELL_FAILED_NO_ENDURANCE = 88, - SPELL_FAILED_NO_FISH = 89, - SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 90, - SPELL_FAILED_NO_MOUNTS_ALLOWED = 91, - SPELL_FAILED_NO_PET = 92, - SPELL_FAILED_NO_POWER = 93, - SPELL_FAILED_NOTHING_TO_DISPEL = 94, - SPELL_FAILED_NOTHING_TO_STEAL = 95, - SPELL_FAILED_ONLY_ABOVEWATER = 96, - SPELL_FAILED_ONLY_DAYTIME = 97, - SPELL_FAILED_ONLY_INDOORS = 98, - SPELL_FAILED_ONLY_MOUNTED = 99, - SPELL_FAILED_ONLY_NIGHTTIME = 100, - SPELL_FAILED_ONLY_OUTDOORS = 101, - SPELL_FAILED_ONLY_SHAPESHIFT = 102, - SPELL_FAILED_ONLY_STEALTHED = 103, - SPELL_FAILED_ONLY_UNDERWATER = 104, - SPELL_FAILED_OUT_OF_RANGE = 105, - SPELL_FAILED_PACIFIED = 106, - SPELL_FAILED_POSSESSED = 107, - SPELL_FAILED_REAGENTS = 108, - SPELL_FAILED_REQUIRES_AREA = 109, - SPELL_FAILED_REQUIRES_SPELL_FOCUS = 110, - SPELL_FAILED_ROOTED = 111, - SPELL_FAILED_SILENCED = 112, - SPELL_FAILED_SPELL_IN_PROGRESS = 113, - SPELL_FAILED_SPELL_LEARNED = 114, - SPELL_FAILED_SPELL_UNAVAILABLE = 115, - SPELL_FAILED_STUNNED = 116, - SPELL_FAILED_TARGETS_DEAD = 117, - SPELL_FAILED_TARGET_AFFECTING_COMBAT = 118, - SPELL_FAILED_TARGET_AURASTATE = 119, - SPELL_FAILED_TARGET_DUELING = 120, - SPELL_FAILED_TARGET_ENEMY = 121, - SPELL_FAILED_TARGET_ENRAGED = 122, - SPELL_FAILED_TARGET_FRIENDLY = 123, - SPELL_FAILED_TARGET_IN_COMBAT = 124, - SPELL_FAILED_TARGET_IN_PET_BATTLE = 125, - SPELL_FAILED_TARGET_IS_PLAYER = 126, - SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 127, - SPELL_FAILED_TARGET_NOT_DEAD = 128, - SPELL_FAILED_TARGET_NOT_IN_PARTY = 129, - SPELL_FAILED_TARGET_NOT_LOOTED = 130, - SPELL_FAILED_TARGET_NOT_PLAYER = 131, - SPELL_FAILED_TARGET_NO_POCKETS = 132, - SPELL_FAILED_TARGET_NO_WEAPONS = 133, - SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 134, - SPELL_FAILED_TARGET_UNSKINNABLE = 135, - SPELL_FAILED_THIRST_SATIATED = 136, - SPELL_FAILED_TOO_CLOSE = 137, - SPELL_FAILED_TOO_MANY_OF_ITEM = 138, - SPELL_FAILED_TOTEM_CATEGORY = 139, - SPELL_FAILED_TOTEMS = 140, - SPELL_FAILED_TRY_AGAIN = 141, - SPELL_FAILED_UNIT_NOT_BEHIND = 142, - SPELL_FAILED_UNIT_NOT_INFRONT = 143, - SPELL_FAILED_VISION_OBSCURED = 144, - SPELL_FAILED_WRONG_PET_FOOD = 145, - SPELL_FAILED_NOT_WHILE_FATIGUED = 146, - SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 147, - SPELL_FAILED_NOT_WHILE_TRADING = 148, - SPELL_FAILED_TARGET_NOT_IN_RAID = 149, - SPELL_FAILED_TARGET_FREEFORALL = 150, - SPELL_FAILED_NO_EDIBLE_CORPSES = 151, - SPELL_FAILED_ONLY_BATTLEGROUNDS = 152, - SPELL_FAILED_TARGET_NOT_GHOST = 153, - SPELL_FAILED_TRANSFORM_UNUSABLE = 154, - SPELL_FAILED_WRONG_WEATHER = 155, - SPELL_FAILED_DAMAGE_IMMUNE = 156, - SPELL_FAILED_PREVENTED_BY_MECHANIC = 157, - SPELL_FAILED_PLAY_TIME = 158, - SPELL_FAILED_REPUTATION = 159, - SPELL_FAILED_MIN_SKILL = 160, - SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 161, - SPELL_FAILED_NOT_ON_SHAPESHIFT = 162, - SPELL_FAILED_NOT_ON_STEALTHED = 163, - SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 164, - SPELL_FAILED_NOT_ON_MOUNTED = 165, - SPELL_FAILED_TOO_SHALLOW = 166, - SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 167, - SPELL_FAILED_TARGET_IS_TRIVIAL = 168, - SPELL_FAILED_BM_OR_INVISGOD = 169, - SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 170, - SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 171, - SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 172, - SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 173, - SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 174, - SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 175, - SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 176, - SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 177, - SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 178, - SPELL_FAILED_COLD_RIDING_REQUIREMENT = 179, - SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 180, - SPELL_FAILED_CS_RIDING_REQUIREMENT = 181, - SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 182, - SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 183, - SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 184, - SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 185, - SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 186, - SPELL_FAILED_NOT_IDLE = 187, - SPELL_FAILED_NOT_INACTIVE = 188, - SPELL_FAILED_PARTIAL_PLAYTIME = 189, - SPELL_FAILED_NO_PLAYTIME = 190, - SPELL_FAILED_NOT_IN_BATTLEGROUND = 191, - SPELL_FAILED_NOT_IN_RAID_INSTANCE = 192, - SPELL_FAILED_ONLY_IN_ARENA = 193, - SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 194, - SPELL_FAILED_ON_USE_ENCHANT = 195, - SPELL_FAILED_NOT_ON_GROUND = 196, - SPELL_FAILED_CUSTOM_ERROR = 197, - SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 198, - SPELL_FAILED_TOO_MANY_SOCKETS = 199, - SPELL_FAILED_INVALID_GLYPH = 200, - SPELL_FAILED_UNIQUE_GLYPH = 201, - SPELL_FAILED_GLYPH_SOCKET_LOCKED = 202, - SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 203, - SPELL_FAILED_GLYPH_INVALID_SPEC = 204, - SPELL_FAILED_GLYPH_NO_SPEC = 205, - SPELL_FAILED_NO_VALID_TARGETS = 206, - SPELL_FAILED_ITEM_AT_MAX_CHARGES = 207, - SPELL_FAILED_NOT_IN_BARBERSHOP = 208, - SPELL_FAILED_FISHING_TOO_LOW = 209, - SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 210, - SPELL_FAILED_SUMMON_PENDING = 211, - SPELL_FAILED_MAX_SOCKETS = 212, - SPELL_FAILED_PET_CAN_RENAME = 213, - SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 214, - SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 215, - SPELL_FAILED_NO_ACTIONS = 216, - SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 217, - SPELL_FAILED_WEIGHT_NOT_ENOUGH = 218, - SPELL_FAILED_WEIGHT_TOO_MUCH = 219, - SPELL_FAILED_NO_VACANT_SEAT = 220, - SPELL_FAILED_NO_LIQUID = 221, - SPELL_FAILED_ONLY_NOT_SWIMMING = 222, - SPELL_FAILED_BY_NOT_MOVING = 223, - SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 224, - SPELL_FAILED_NOT_IN_ARENA = 225, - SPELL_FAILED_TARGET_NOT_GROUNDED = 226, - SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 227, - SPELL_FAILED_NOT_IN_LFG_DUNGEON = 228, - SPELL_FAILED_BAD_TARGET_FILTER = 229, - SPELL_FAILED_NOT_ENOUGH_TARGETS = 230, - SPELL_FAILED_NO_SPEC = 231, - SPELL_FAILED_CANT_ADD_BATTLE_PET = 232, - SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 233, - SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 234, - SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 235, - SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 236, - SPELL_FAILED_MAX_LEVEL_TOO_LOW = 237, - SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 238, - SPELL_FAILED_UNKNOWN = 254, // custom value, default case - SPELL_CAST_OK = 255 // custom value, must not be sent to client + SPELL_FAILED_GARRISON_FOLLOWER_ON_MISSION = 44, + SPELL_FAILED_GARRISON_FOLLOWER_IN_BUILDING = 45, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_LEVEL = 46, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_ITEM_LEVEL = 47, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_QUALITY = 48, + SPELL_FAILED_GARRISON_FOLLOWER_NOT_MAX_LEVEL = 49, + SPELL_FAILED_GARRISON_FOLLOWER_HAS_ABILITY = 50, + SPELL_FAILED_GARRISON_FOLLOWER_NO_OVERRIDEABLE_ABILITY = 51, + SPELL_FAILED_HIGHLEVEL = 52, + SPELL_FAILED_HUNGER_SATIATED = 53, + SPELL_FAILED_IMMUNE = 54, + SPELL_FAILED_INCORRECT_AREA = 55, + SPELL_FAILED_INTERRUPTED = 56, + SPELL_FAILED_INTERRUPTED_COMBAT = 57, + SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 58, + SPELL_FAILED_ITEM_GONE = 59, + SPELL_FAILED_ITEM_NOT_FOUND = 60, + SPELL_FAILED_ITEM_NOT_READY = 61, + SPELL_FAILED_LEVEL_REQUIREMENT = 62, + SPELL_FAILED_LINE_OF_SIGHT = 63, + SPELL_FAILED_LOWLEVEL = 64, + SPELL_FAILED_LOW_CASTLEVEL = 65, + SPELL_FAILED_MAINHAND_EMPTY = 66, + SPELL_FAILED_MOVING = 67, + SPELL_FAILED_NEED_AMMO = 68, + SPELL_FAILED_NEED_AMMO_POUCH = 69, + SPELL_FAILED_NEED_EXOTIC_AMMO = 70, + SPELL_FAILED_NEED_MORE_ITEMS = 71, + SPELL_FAILED_NOPATH = 72, + SPELL_FAILED_NOT_BEHIND = 73, + SPELL_FAILED_NOT_FISHABLE = 74, + SPELL_FAILED_NOT_FLYING = 75, + SPELL_FAILED_NOT_HERE = 76, + SPELL_FAILED_NOT_INFRONT = 77, + SPELL_FAILED_NOT_IN_CONTROL = 78, + SPELL_FAILED_NOT_KNOWN = 79, + SPELL_FAILED_NOT_MOUNTED = 80, + SPELL_FAILED_NOT_ON_TAXI = 81, + SPELL_FAILED_NOT_ON_TRANSPORT = 82, + SPELL_FAILED_NOT_READY = 83, + SPELL_FAILED_NOT_SHAPESHIFT = 84, + SPELL_FAILED_NOT_STANDING = 85, + SPELL_FAILED_NOT_TRADEABLE = 86, + SPELL_FAILED_NOT_TRADING = 87, + SPELL_FAILED_NOT_UNSHEATHED = 88, + SPELL_FAILED_NOT_WHILE_GHOST = 89, + SPELL_FAILED_NOT_WHILE_LOOTING = 90, + SPELL_FAILED_NO_AMMO = 91, + SPELL_FAILED_NO_CHARGES_REMAIN = 92, + SPELL_FAILED_NO_CHAMPION = 93, + SPELL_FAILED_NO_COMBO_POINTS = 94, + SPELL_FAILED_NO_DUELING = 95, + SPELL_FAILED_NO_ENDURANCE = 96, + SPELL_FAILED_NO_FISH = 97, + SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 98, + SPELL_FAILED_NO_MOUNTS_ALLOWED = 99, + SPELL_FAILED_NO_PET = 100, + SPELL_FAILED_NO_POWER = 101, + SPELL_FAILED_NOTHING_TO_DISPEL = 102, + SPELL_FAILED_NOTHING_TO_STEAL = 103, + SPELL_FAILED_ONLY_ABOVEWATER = 104, + SPELL_FAILED_ONLY_DAYTIME = 105, + SPELL_FAILED_ONLY_INDOORS = 106, + SPELL_FAILED_ONLY_MOUNTED = 107, + SPELL_FAILED_ONLY_NIGHTTIME = 108, + SPELL_FAILED_ONLY_OUTDOORS = 109, + SPELL_FAILED_ONLY_SHAPESHIFT = 110, + SPELL_FAILED_ONLY_STEALTHED = 111, + SPELL_FAILED_ONLY_UNDERWATER = 112, + SPELL_FAILED_OUT_OF_RANGE = 113, + SPELL_FAILED_PACIFIED = 114, + SPELL_FAILED_POSSESSED = 115, + SPELL_FAILED_REAGENTS = 116, + SPELL_FAILED_REQUIRES_AREA = 117, + SPELL_FAILED_REQUIRES_SPELL_FOCUS = 118, + SPELL_FAILED_ROOTED = 119, + SPELL_FAILED_SILENCED = 120, + SPELL_FAILED_SPELL_IN_PROGRESS = 121, + SPELL_FAILED_SPELL_LEARNED = 122, + SPELL_FAILED_SPELL_UNAVAILABLE = 123, + SPELL_FAILED_STUNNED = 124, + SPELL_FAILED_TARGETS_DEAD = 125, + SPELL_FAILED_TARGET_AFFECTING_COMBAT = 126, + SPELL_FAILED_TARGET_AURASTATE = 127, + SPELL_FAILED_TARGET_DUELING = 128, + SPELL_FAILED_TARGET_ENEMY = 129, + SPELL_FAILED_TARGET_ENRAGED = 130, + SPELL_FAILED_TARGET_FRIENDLY = 131, + SPELL_FAILED_TARGET_IN_COMBAT = 132, + SPELL_FAILED_TARGET_IN_PET_BATTLE = 133, + SPELL_FAILED_TARGET_IS_PLAYER = 134, + SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 135, + SPELL_FAILED_TARGET_NOT_DEAD = 136, + SPELL_FAILED_TARGET_NOT_IN_PARTY = 137, + SPELL_FAILED_TARGET_NOT_LOOTED = 138, + SPELL_FAILED_TARGET_NOT_PLAYER = 139, + SPELL_FAILED_TARGET_NO_POCKETS = 140, + SPELL_FAILED_TARGET_NO_WEAPONS = 141, + SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 142, + SPELL_FAILED_TARGET_UNSKINNABLE = 143, + SPELL_FAILED_THIRST_SATIATED = 144, + SPELL_FAILED_TOO_CLOSE = 145, + SPELL_FAILED_TOO_MANY_OF_ITEM = 146, + SPELL_FAILED_TOTEM_CATEGORY = 147, + SPELL_FAILED_TOTEMS = 148, + SPELL_FAILED_TRY_AGAIN = 149, + SPELL_FAILED_UNIT_NOT_BEHIND = 150, + SPELL_FAILED_UNIT_NOT_INFRONT = 151, + SPELL_FAILED_VISION_OBSCURED = 152, + SPELL_FAILED_WRONG_PET_FOOD = 153, + SPELL_FAILED_NOT_WHILE_FATIGUED = 154, + SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 155, + SPELL_FAILED_NOT_WHILE_TRADING = 156, + SPELL_FAILED_TARGET_NOT_IN_RAID = 157, + SPELL_FAILED_TARGET_FREEFORALL = 158, + SPELL_FAILED_NO_EDIBLE_CORPSES = 159, + SPELL_FAILED_ONLY_BATTLEGROUNDS = 160, + SPELL_FAILED_TARGET_NOT_GHOST = 161, + SPELL_FAILED_TRANSFORM_UNUSABLE = 162, + SPELL_FAILED_WRONG_WEATHER = 163, + SPELL_FAILED_DAMAGE_IMMUNE = 164, + SPELL_FAILED_PREVENTED_BY_MECHANIC = 165, + SPELL_FAILED_PLAY_TIME = 166, + SPELL_FAILED_REPUTATION = 167, + SPELL_FAILED_MIN_SKILL = 168, + SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 169, + SPELL_FAILED_NOT_ON_SHAPESHIFT = 170, + SPELL_FAILED_NOT_ON_STEALTHED = 171, + SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 172, + SPELL_FAILED_NOT_ON_MOUNTED = 173, + SPELL_FAILED_TOO_SHALLOW = 174, + SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 175, + SPELL_FAILED_TARGET_IS_TRIVIAL = 176, + SPELL_FAILED_BM_OR_INVISGOD = 177, + SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 178, + SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 179, + SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 180, + SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 181, + SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 182, + SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 183, + SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 184, + SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 185, + SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 186, + SPELL_FAILED_COLD_RIDING_REQUIREMENT = 187, + SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 188, + SPELL_FAILED_CS_RIDING_REQUIREMENT = 189, + SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 190, + SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 191, + SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 192, + SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 193, + SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 194, + SPELL_FAILED_NOT_IDLE = 195, + SPELL_FAILED_NOT_INACTIVE = 196, + SPELL_FAILED_PARTIAL_PLAYTIME = 197, + SPELL_FAILED_NO_PLAYTIME = 198, + SPELL_FAILED_NOT_IN_BATTLEGROUND = 199, + SPELL_FAILED_NOT_IN_RAID_INSTANCE = 200, + SPELL_FAILED_ONLY_IN_ARENA = 201, + SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 202, + SPELL_FAILED_ON_USE_ENCHANT = 203, + SPELL_FAILED_NOT_ON_GROUND = 204, + SPELL_FAILED_CUSTOM_ERROR = 205, + SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 206, + SPELL_FAILED_TOO_MANY_SOCKETS = 207, + SPELL_FAILED_INVALID_GLYPH = 208, + SPELL_FAILED_UNIQUE_GLYPH = 209, + SPELL_FAILED_GLYPH_SOCKET_LOCKED = 210, + SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 211, + SPELL_FAILED_GLYPH_INVALID_SPEC = 212, + SPELL_FAILED_GLYPH_NO_SPEC = 213, + SPELL_FAILED_NO_VALID_TARGETS = 214, + SPELL_FAILED_ITEM_AT_MAX_CHARGES = 215, + SPELL_FAILED_NOT_IN_BARBERSHOP = 216, + SPELL_FAILED_FISHING_TOO_LOW = 217, + SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 218, + SPELL_FAILED_SUMMON_PENDING = 219, + SPELL_FAILED_MAX_SOCKETS = 220, + SPELL_FAILED_PET_CAN_RENAME = 221, + SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 222, + SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 223, + SPELL_FAILED_NO_ACTIONS = 224, + SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 225, + SPELL_FAILED_WEIGHT_NOT_ENOUGH = 226, + SPELL_FAILED_WEIGHT_TOO_MUCH = 227, + SPELL_FAILED_NO_VACANT_SEAT = 228, + SPELL_FAILED_NO_LIQUID = 229, + SPELL_FAILED_ONLY_NOT_SWIMMING = 230, + SPELL_FAILED_BY_NOT_MOVING = 231, + SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 232, + SPELL_FAILED_NOT_IN_ARENA = 233, + SPELL_FAILED_TARGET_NOT_GROUNDED = 234, + SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 235, + SPELL_FAILED_NOT_IN_LFG_DUNGEON = 236, + SPELL_FAILED_BAD_TARGET_FILTER = 237, + SPELL_FAILED_NOT_ENOUGH_TARGETS = 238, + SPELL_FAILED_NO_SPEC = 239, + SPELL_FAILED_CANT_ADD_BATTLE_PET = 240, + SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 241, + SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 242, + SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 243, + SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 244, + SPELL_FAILED_MAX_LEVEL_TOO_LOW = 245, + SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 246, + SPELL_FAILED_GRANT_PET_LEVEL_FAIL = 247, + SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 248, + SPELL_FAILED_BLUEPRINT_KNOWN = 249, + SPELL_FAILED_FOLLOWER_KNOWN = 250, + SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 251, + SPELL_FAILED_ITEM_NOT_A_WEAPON = 252, + SPELL_FAILED_SAME_ENCHANT_VISUAL = 253, + SPELL_FAILED_TOY_USE_LIMIT_REACHED = 254, + SPELL_FAILED_SHIPMENTS_FULL = 255, + SPELL_FAILED_HAS_MISSION = 256, + SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 257, + SPELL_FAILED_NOT_SOULBOUND = 258, + SPELL_FAILED_RIDING_VEHICLE = 259, + SPELL_FAILED_UNKNOWN = 260, // custom value, default case + SPELL_CAST_OK = 0xFFFF // custom value, must not be sent to client }; enum SpellCustomErrors @@ -4128,8 +4241,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 @@ -4605,7 +4732,7 @@ enum GroupJoinBattlegroundResult ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 8, // You can't do that in a battleground. ERR_BATTLEGROUND_JOIN_XP_GAIN = 9, // wtf, doesn't exist in client... ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 10, // Cannot join the queue unless all members of your party are in the same battleground level range. - ERR_BATTLEGROUND_JOIN_TIMED_OUT = 11, // %s was unavailable to join the queue. (uint64 guid exist in client cache) + ERR_BATTLEGROUND_JOIN_TIMED_OUT = 11, // %s was unavailable to join the queue. (ObjectGuid exist in client cache) //ERR_BATTLEGROUND_JOIN_TIMED_OUT = 12, // same as 11 //ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 13, // same as 7 ERR_LFG_CANT_USE_BATTLEGROUND = 14, // You cannot queue for a battleground or arena while using the dungeon system. 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..720c0b3b244 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; @@ -32,11 +33,8 @@ namespace Movement class MoveSpline; class PacketBuilder { - static void WriteCommonMonsterMovePart(const MoveSpline& mov, WorldPacket& data); public: - - static void WriteMonsterMove(const MoveSpline& mov, WorldPacket& data); - static void WriteStopMovement(Vector3 const& loc, uint32 splineId, ByteBuffer& data); + static void WriteMonsterMove(const MoveSpline& mov, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline); 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/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 89ca3749a05..f39314ba119 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -360,9 +360,6 @@ bool Quest::IsAllowedInRaid(Difficulty difficulty) const uint32 Quest::CalculateHonorGain(uint8 level) const { - if (level > GT_MAX_LEVEL) - level = GT_MAX_LEVEL; - uint32 honor = 0; /*if (GetRewHonorAddition() > 0 || GetRewHonorMultiplier() > 0.0f) 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/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index ac0b5bbf2e6..95ac2d275da 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -34,6 +34,12 @@ #include "WorldPacket.h" #include "WorldSession.h" +// namespace +// { + UnusedScriptContainer UnusedScripts; + UnusedScriptNamesContainer UnusedScriptNames; +// } + // This is the global static registry of scripts. template<class TScript> class ScriptRegistry @@ -89,6 +95,12 @@ class ScriptRegistry { ScriptPointerList[id] = script; sScriptMgr->IncrementScriptCount(); + + #ifdef SCRIPTS + UnusedScriptNamesContainer::iterator itr = std::lower_bound(UnusedScriptNames.begin(), UnusedScriptNames.end(), script->GetName()); + if (itr != UnusedScriptNames.end() && *itr == script->GetName()) + UnusedScriptNames.erase(itr); + #endif } else { @@ -106,8 +118,7 @@ class ScriptRegistry // Avoid calling "delete script;" because we are currently in the script constructor // In a valid scenario this will not happen because every script has a name assigned in the database - // If that happens, it's acceptable to just leak a few bytes - + UnusedScripts.push_back(script); return; } } @@ -189,6 +200,15 @@ void ScriptMgr::Initialize() FillSpellSummary(); AddScripts(); +#ifdef SCRIPTS + for (std::string const& scriptName : UnusedScriptNames) + { + TC_LOG_ERROR("sql.sql", "ScriptName '%s' exists in database, but no core script found!", scriptName.c_str()); + } +#endif + + UnloadUnusedScripts(); + TC_LOG_INFO("server.loading", ">> Loaded %u C++ scripts in %u ms", GetScriptCount(), GetMSTimeDiffToNow(oldMSTime)); } @@ -229,10 +249,19 @@ void ScriptMgr::Unload() #undef SCR_CLEAR + UnloadUnusedScripts(); + delete[] SpellSummary; delete[] UnitAI::AISpellInfo; } +void ScriptMgr::UnloadUnusedScripts() +{ + for (size_t i = 0; i < UnusedScripts.size(); ++i) + delete UnusedScripts[i]; + UnusedScripts.clear(); +} + void ScriptMgr::LoadDatabase() { sScriptSystemMgr->LoadScriptWaypoints(); @@ -256,70 +285,73 @@ void ScriptMgr::FillSpellSummary() if (!pTempSpell) continue; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : pTempSpell->GetEffectsForDifficulty(DIFFICULTY_NONE)) { + if (!effect) + continue; + // Spell targets self. - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SELF-1); // Spell targets a single enemy. - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY) + if (effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY || + effect->TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_ENEMY-1); // Spell targets AoE at enemy. - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) + if (effect->TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || + effect->TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || + effect->TargetA.GetTarget() == TARGET_SRC_CASTER || + effect->TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_ENEMY-1); // Spell targets an enemy. - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) + if (effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY || + effect->TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY || + effect->TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || + effect->TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || + effect->TargetA.GetTarget() == TARGET_SRC_CASTER || + effect->TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_ENEMY-1); // Spell targets a single friend (or self). - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER || + effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY || + effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_FRIEND-1); // Spell targets AoE friends. - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY || + effect->TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY || + effect->TargetA.GetTarget() == TARGET_SRC_CASTER) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_FRIEND-1); // Spell targets any friend (or self). - if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY || - pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER || + effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY || + effect->TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY || + effect->TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY || + effect->TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY || + effect->TargetA.GetTarget() == TARGET_SRC_CASTER) SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_FRIEND-1); // Make sure that this spell includes a damage effect. - if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE || - pTempSpell->Effects[j].Effect == SPELL_EFFECT_INSTAKILL || - pTempSpell->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE || - pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH) + if (effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE || + effect->Effect == SPELL_EFFECT_INSTAKILL || + effect->Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE || + effect->Effect == SPELL_EFFECT_HEALTH_LEECH) SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_DAMAGE-1); // Make sure that this spell includes a healing effect (or an apply aura with a periodic heal). - if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL || - pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MAX_HEALTH || - pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MECHANICAL || - (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && pTempSpell->Effects[j].ApplyAuraName == 8)) + if (effect->Effect == SPELL_EFFECT_HEAL || + effect->Effect == SPELL_EFFECT_HEAL_MAX_HEALTH || + effect->Effect == SPELL_EFFECT_HEAL_MECHANICAL || + (effect->Effect == SPELL_EFFECT_APPLY_AURA && effect->ApplyAuraName == 8)) SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_HEALING-1); // Make sure that this spell applies an aura. - if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA) + if (effect->Effect == SPELL_EFFECT_APPLY_AURA) SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_AURA-1); } } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 5957f3a511a..4431f710976 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -872,6 +872,15 @@ class GroupScript : public ScriptObject // Placed here due to ScriptRegistry::AddScript dependency. #define sScriptMgr ScriptMgr::instance() +// namespace +// { + typedef std::vector<ScriptObject*> UnusedScriptContainer; + typedef std::list<std::string> UnusedScriptNamesContainer; + + extern UnusedScriptContainer UnusedScripts; + extern UnusedScriptNamesContainer UnusedScriptNames; +// } + // Manages registration, loading, and execution of scripts. class ScriptMgr { @@ -900,6 +909,7 @@ class ScriptMgr public: /* Unloading */ void Unload(); + void UnloadUnusedScripts(); public: /* SpellScriptLoader */ diff --git a/src/server/game/Server/Packet.cpp b/src/server/game/Server/Packet.cpp index ee805c18610..10b472bee67 100644 --- a/src/server/game/Server/Packet.cpp +++ b/src/server/game/Server/Packet.cpp @@ -17,164 +17,6 @@ #include "Packet.h" -inline bool IsInstanceOnlyOpcode(uint32 opcode) -{ - // TODO: Use names when known - switch (opcode) - { - case 0x000F: // Client - case 0x0111: // Client - case 0x03E4: // Client - case 0x0549: // Client - case 0x054C: // Client - case 0x055A: // Client - case 0x056C: // Client - case 0x057A: // Client - case 0x057B: // Client - case 0x05CC: // Client - case 0x05EA: // Client - case 0x05EC: // Client - case 0x05F9: // Client - case 0x05FB: // Client - case 0x074C: // Client - case 0x075B: // Client - case 0x076C: // Client - case 0x077B: // Client - case 0x077C: // Client - case 0x07CC: // Client - case 0x07DB: // Client - case 0x07EC: // Client - case 0x07FB: // Client - case 0x07FC: // Client - case 0x0827: // Client - case 0x0935: // Client - case 0x0F0C: // ClientSpell - case 0x0F10: // ClientSpell - case 0x0F1B: // ClientSpell - case 0x0F1C: // ClientSpell - case 0x0F20: // ClientSpell - case 0x0F2C: // ClientSpell - case 0x0F2F: // ClientSpell - case 0x0F3B: // ClientSpell - case 0x0F8B: // ClientSpell - case 0x0F8C: // ClientSpell - case 0x0F90: // ClientSpell - case 0x0F9F: // ClientSpell - case 0x0FA0: // ClientSpell - case SMSG_ATTACKSTOP: // Client - case 0x14C9: // Client - case 0x154A: // Client - case 0x155A: // Client - case 0x155C: // Client - case SMSG_QUESTGIVER_STATUS: // ClientQuest - case 0x156A: // Client - case 0x156B: // Client - case 0x157A: // Client - case 0x157B: // Client - case 0x15DC: // Client - case 0x15EB: // Client - case 0x15FB: // Client - case 0x170C: // ClientSpell - case 0x171C: // ClientSpell - case 0x171F: // ClientSpell - case 0x172C: // ClientSpell - case 0x172F: // ClientSpell - case 0x173C: // ClientSpell - case 0x173F: // ClientSpell - case 0x1740: // ClientSpell - case 0x1790: // ClientSpell - case 0x179B: // ClientSpell - case 0x179F: // ClientSpell - case SMSG_ATTACKSTART: // Client - case 0x1D82: // ClientQuest - case 0x1D83: // ClientQuest - case 0x1D85: // ClientQuest - case 0x1D87: // ClientQuest - case 0x1D93: // ClientQuest - case 0x1D96: // ClientQuest - case 0x1D97: // ClientQuest - case 0x1DA1: // ClientQuest - case 0x1DA2: // ClientQuest - case 0x1DA3: // ClientQuest - case 0x1DA4: // ClientQuest - case 0x1DA5: // ClientQuest - case 0x1DA7: // ClientQuest - case SMSG_QUERY_TIME_RESPONSE: // Client - case 0x1DC2: // ClientQuest - case 0x1DC6: // ClientQuest - case 0x1DC7: // ClientQuest - case 0x1DD2: // ClientQuest - case 0x1DD3: // ClientQuest - case 0x1DD6: // ClientQuest - case 0x1DD7: // ClientQuest - case 0x1DD8: // ClientQuest - case 0x1DE4: // ClientQuest - case 0x1DE5: // ClientQuest - case 0x1DE7: // ClientQuest - case 0x1F02: // ClientQuest - case 0x1F06: // ClientQuest - case 0x1F07: // ClientQuest - case 0x1F0C: // ClientSpell - case 0x1F12: // ClientQuest - case 0x1F13: // ClientQuest - case 0x1F16: // ClientQuest - case 0x1F17: // ClientQuest - case 0x1F18: // ClientQuest - case 0x1F1C: // ClientSpell - case 0x1F1F: // ClientSpell - case 0x1F24: // ClientQuest - case 0x1F25: // ClientQuest - case 0x1F27: // ClientQuest - case 0x1F2C: // ClientSpell - case 0x1F2F: // ClientSpell - case 0x1F3C: // ClientSpell - case 0x1F3F: // ClientSpell - case 0x1F40: // ClientSpell - case 0x1F44: // ClientQuest - case 0x1F48: // ClientQuest - case 0x1F51: // ClientQuest - case 0x1F55: // ClientQuest - case 0x1F57: // ClientQuest - case 0x1F61: // ClientQuest - case 0x1F63: // ClientQuest - case 0x1F64: // ClientQuest - case 0x1F65: // ClientQuest - case 0x1F67: // ClientQuest - case 0x1F85: // ClientQuest - case 0x1F86: // ClientQuest - case 0x1F87: // ClientQuest - case 0x1F90: // ClientSpell - case 0x1F92: // ClientQuest - case 0x1F94: // ClientQuest - case 0x1F96: // ClientQuest - case 0x1F97: // ClientQuest - case 0x1F9B: // ClientSpell - case 0x1F9F: // ClientSpell - case 0x1FA1: // ClientQuest - case 0x1FA2: // ClientQuest - case 0x1FA3: // ClientQuest - case 0x1FA4: // ClientQuest - case 0x1FA5: // ClientQuest - case 0x1FA7: // ClientQuest - case 0x1FC2: // ClientQuest - case 0x1FC6: // ClientQuest - case 0x1FC7: // ClientQuest - case 0x1FD2: // ClientQuest - case 0x1FD3: // ClientQuest - case 0x1FD6: // ClientQuest - case 0x1FD7: // ClientQuest - case 0x1FD8: // ClientQuest - case 0x1FE4: // ClientQuest - case 0x1FE5: // ClientQuest - case 0x1FE7: // ClientQuest - return true; - default: - return false; - } -} - WorldPackets::ServerPacket::ServerPacket(OpcodeServer opcode, size_t initialSize /*= 200*/) : Packet(WorldPacket(opcode, initialSize)) { - if (IsInstanceOnlyOpcode(opcode)) - _connectionIndex = CONNECTION_TYPE_INSTANCE; } 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..dcc9a908539 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -34,13 +34,13 @@ namespace WorldPackets class AuthChallenge final : public ServerPacket { public: - AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 4 + 32 + 1), Challenge(0) { } + AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 4 + 32 + 1) { } WorldPacket const* Write() override; - uint32 Challenge; + uint32 Challenge = 0; uint32 DosChallenge[8]; ///< Encryption seeds - uint8 DosZeroBits; + uint8 DosZeroBits = 0; }; class AuthSession final : public ClientPacket @@ -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 index 8aa4ac51d42..bd1e62eadd6 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -18,14 +18,37 @@ #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(_Channel.length(), 7); _worldPacket.WriteBits(Sender.length(), 6); _worldPacket << SenderGuid; - _worldPacket << SenderBnetAccountID; + _worldPacket << SenderAccountID; _worldPacket << uint32(SenderVirtualRealm); _worldPacket << TargetGuid; _worldPacket << uint32(TargetVirtualRealm); @@ -37,7 +60,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write() _worldPacket << uint8(NewFlags); } - _worldPacket.WriteString(Channel); + _worldPacket.WriteString(_Channel); _worldPacket.WriteString(Sender); return &_worldPacket; @@ -45,12 +68,12 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write() WorldPacket const* WorldPackets::Channel::ChannelNotifyJoined::Write() { - _worldPacket.WriteBits(Channel.length(), 7); + _worldPacket.WriteBits(_Channel.length(), 7); _worldPacket.WriteBits(ChannelWelcomeMsg.length(), 10); - _worldPacket << uint8(ChannelFlags); + _worldPacket << uint8(_ChannelFlags); _worldPacket << int32(ChatChannelID); _worldPacket << uint64(InstanceID); - _worldPacket.WriteString(Channel); + _worldPacket.WriteString(_Channel); _worldPacket.WriteString(ChannelWelcomeMsg); return &_worldPacket; @@ -76,3 +99,9 @@ void WorldPackets::Channel::JoinChannel::Read() 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 index b6c8eb3b928..e3d96c5c453 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -25,6 +25,42 @@ 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: @@ -34,11 +70,11 @@ namespace WorldPackets std::string Sender; ObjectGuid SenderGuid; - ObjectGuid SenderBnetAccountID; + ObjectGuid SenderAccountID; uint8 Type = 0; ///< @see enum ChatNotify uint8 OldFlags = 0; ///< @see enum ChannelMemberFlags uint8 NewFlags = 0; ///< @see enum ChannelMemberFlags - std::string Channel; + std::string _Channel; ///< Channel Name uint32 SenderVirtualRealm = 0; ObjectGuid TargetGuid; uint32 TargetVirtualRealm = 0; @@ -55,8 +91,8 @@ namespace WorldPackets std::string ChannelWelcomeMsg; int32 ChatChannelID = 0; int32 InstanceID = 0; - uint8 ChannelFlags = 0; ///< @see enum ChannelFlags - std::string Channel; + uint8 _ChannelFlags = 0; ///< @see enum ChannelFlags + std::string _Channel; ///< Channel Name }; class ChannelNotifyLeft final : public ServerPacket @@ -66,9 +102,9 @@ namespace WorldPackets WorldPacket const* Write() override; - std::string Channel; + std::string Channel; ///< Channel Name int32 ChatChannelID = 0; - bool Suspended = false; + bool Suspended = false; ///< User Leave - false, On Zone Change - true }; class JoinChannel final : public ClientPacket @@ -84,6 +120,17 @@ namespace WorldPackets 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; + }; } } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 8fae98cf8f2..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; 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..9cdc534528f --- /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 = 0; + uint32 TargetVirtualAddress = 0; + 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 = 0; + }; + + class CTextEmote final : public ClientPacket + { + public: + CTextEmote(WorldPacket&& packet) : ClientPacket(CMSG_TEXT_EMOTE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Target; + int32 EmoteID = 0; + int32 SoundIndex = -1; + }; + + 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 = -1; + int32 EmoteID = 0; + }; + } +} + +#endif // ChatPackets_h__ diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp new file mode 100644 index 00000000000..128cc0d342f --- /dev/null +++ b/src/server/game/Server/Packets/CombatLogPackets.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 "CombatLogPackets.h" +#include "SpellPackets.h" + +WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write() +{ + _worldPacket << Me; + _worldPacket << CasterGUID; + _worldPacket << SpellID; + _worldPacket << Damage; + _worldPacket << Overkill; + _worldPacket << SchoolMask; + _worldPacket << ShieldBlock; + _worldPacket << Resisted; + _worldPacket << Absorbed; + + _worldPacket.WriteBit(Periodic); + _worldPacket.WriteBits(Flags, 9); + _worldPacket.WriteBit(false); // Debug info + _worldPacket.WriteBit(LogData.HasValue); + _worldPacket.FlushBits(); + + if (LogData.HasValue) + _worldPacket << LogData.Value; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h new file mode 100644 index 00000000000..6cca0127ef6 --- /dev/null +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -0,0 +1,52 @@ +/* + * 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 CombatLogPackets_h__ +#define CombatLogPackets_h__ + +#include "Packet.h" +#include "SpellPackets.h" + +namespace WorldPackets +{ + namespace CombatLog + { + class SpellNonMeleeDamageLog final : public ServerPacket + { + public: + SpellNonMeleeDamageLog() : ServerPacket(SMSG_SPELLNONMELEEDAMAGELOG, 60) { } + + WorldPacket const* Write() override; + + int32 Absorbed; + int32 ShieldBlock; + ObjectGuid Me; + int32 SpellID; + int32 Resisted; + bool Periodic; + uint8 SchoolMask; + ObjectGuid CasterGUID; + Optional<Spells::SpellCastLogData> LogData; + int32 Damage; + // Optional<SpellNonMeleeDamageLogDebugInfo> Debug Info; + int32 Flags; + int32 Overkill; + }; + } +} + +#endif // CombatLogPackets_h__ diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index 17c0599d266..7793ef4ae30 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -16,8 +16,127 @@ */ #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 index 2402daf6b22..5b2347e3edb 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -19,6 +19,8 @@ #define CombatPackets_h__ #include "Packet.h" +#include "ObjectGuid.h" +#include "SpellPackets.h" namespace WorldPackets { @@ -39,7 +41,129 @@ namespace WorldPackets public: AttackStop(WorldPacket&& packet) : ClientPacket(CMSG_ATTACKSTOP, std::move(packet)) { } - void Read() override {}; + 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::Spells::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; }; } } 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..72e2a02fbe2 --- /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 = 0; + uint8 ProficiencyClass = 0; + }; + + 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 d223b73e310..154ff134a6a 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -17,6 +17,40 @@ #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; @@ -44,8 +78,40 @@ WorldPacket const* WorldPackets::Misc::UITime::Write() WorldPacket const* WorldPackets::Misc::TutorialFlags::Write() { - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - _worldPacket << TutorialData[i]; + _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 86f2f4c5eb4..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: @@ -54,7 +104,7 @@ namespace WorldPackets uint32 ClientTime = 0; // Client ticks in ms uint32 SequenceIndex = 0; // Same index as in request }; - + class UITime final : public ServerPacket { public: @@ -64,15 +114,45 @@ namespace WorldPackets uint32 Time = 0; }; - + class TutorialFlags : public ServerPacket { public: - TutorialFlags() : ServerPacket(SMSG_TUTORIAL_FLAGS, 32) { } + 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; - uint32 TutorialData[8]; + 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 45d5b86e3fd..0c4d4bcff40 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -16,162 +16,414 @@ */ #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) { - _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; + 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) +{ + 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 = data.ReadBit(); + bool hasFall = data.ReadBit(); - bool hasTransport = _worldPacket.ReadBit(); - bool hasFall = _worldPacket.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; +} + +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; +} - _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::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 removeMovementForcesCount = 0; - _worldPacket << removeMovementForcesCount; + if (movementSpline.SplineFilter.HasValue) + data << movementSpline.SplineFilter.Value; - uint32 int168 = 0; - _worldPacket << int168; + return data; +} - /*for (uint32 i = 0; i < removeMovementForcesCount; ++i) +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline) +{ + data << movementMonsterSpline.ID; + data << movementMonsterSpline.Destination; + data << movementMonsterSpline.Move; + data.WriteBit(movementMonsterSpline.CrzTeleport); + + // 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); + + data.FlushBits(); + + return data; +} + +WorldPacket const* WorldPackets::Movement::MonsterMove::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << Pos; + _worldPacket << SplineData; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveSplineSetSpeed::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << Speed; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveSetSpeed::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << SequenceIndex; + _worldPacket << Speed; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveUpdateSpeed::Write() +{ + _worldPacket << *movementInfo; + _worldPacket << Speed; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveSplineSetFlag::Write() +{ + _worldPacket << MoverGUID; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveSetFlag::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << SequenceIndex; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write() +{ + _worldPacket << *movementInfo; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::TransferPending::Write() +{ + _worldPacket << int32(MapID); + _worldPacket.WriteBit(Ship.HasValue); + _worldPacket.WriteBit(TransferSpellID.HasValue); + if (Ship.HasValue) { - _worldPacket << ObjectGuid; - }*/ + _worldPacket << uint32(Ship.Value.ID); + _worldPacket << int32(Ship.Value.OriginMapID); + } + + if (TransferSpellID.HasValue) + _worldPacket << int32(TransferSpellID.Value); + + _worldPacket.FlushBits(); + + return &_worldPacket; +} +WorldPacket const* WorldPackets::Movement::TransferAborted::Write() +{ + _worldPacket << uint32(MapID); + _worldPacket << uint8(Arg); + _worldPacket.WriteBits(TransfertAbort, 5); _worldPacket.FlushBits(); + return &_worldPacket; +} - _worldPacket.WriteBits(movementInfo.flags, 30); - _worldPacket.WriteBits(movementInfo.flags2, 15); +WorldPacket const* WorldPackets::Movement::NewWorld::Write() +{ + _worldPacket << MapID; + _worldPacket << Pos.PositionXYZOStream(); + _worldPacket << Reason; + return &_worldPacket; +} - _worldPacket.WriteBit(hasTransportData); - _worldPacket.WriteBit(hasFallData); +WorldPacket const* WorldPackets::Movement::MoveTeleport::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << SequenceIndex; + _worldPacket << Pos.PositionXYZOStream(); + _worldPacket << Facing; - _worldPacket.WriteBit(0); // HeightChangeFailed - _worldPacket.WriteBit(0); // RemoteTimeValid + _worldPacket.WriteBit(TransportGUID.HasValue); + _worldPacket.WriteBit(Vehicle.HasValue); + _worldPacket.FlushBits(); - if (hasTransportData) + if (TransportGUID.HasValue) + _worldPacket << TransportGUID.Value; + + if (Vehicle.HasValue) { - _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 << Vehicle.Value.VehicleSeatIndex; + _worldPacket.WriteBit(Vehicle.Value.VehicleExitVoluntary); + _worldPacket.WriteBit(Vehicle.Value.VehicleExitTeleport); + _worldPacket.FlushBits(); + } - _worldPacket.WriteBit(hasTransportPrevTime); - _worldPacket.WriteBit(hasTransportVehicleId); + return &_worldPacket; +} - if (hasTransportPrevTime) - _worldPacket << movementInfo.transport.prevTime; +WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() +{ + _worldPacket << *movementInfo; - if (hasTransportVehicleId) - _worldPacket << movementInfo.transport.vehicleId; + _worldPacket << int32(MovementForces.size()); + for (WorldPackets::Movement::MovementForce const& force : MovementForces) + { + _worldPacket << force.ID; + _worldPacket << force.Direction; + _worldPacket << force.TransportID; + _worldPacket << force.Magnitude; + _worldPacket.WriteBits(force.Type, 2); + _worldPacket.FlushBits(); } - if (hasFallData) - { - _worldPacket << movementInfo.jump.fallTime; - _worldPacket << movementInfo.jump.zspeed; + _worldPacket.WriteBit(WalkSpeed.HasValue); + _worldPacket.WriteBit(RunSpeed.HasValue); + _worldPacket.WriteBit(RunBackSpeed.HasValue); + _worldPacket.WriteBit(SwimSpeed.HasValue); + _worldPacket.WriteBit(SwimBackSpeed.HasValue); + _worldPacket.WriteBit(FlightSpeed.HasValue); + _worldPacket.WriteBit(FlightBackSpeed.HasValue); + _worldPacket.WriteBit(TurnRate.HasValue); + _worldPacket.WriteBit(PitchRate.HasValue); - _worldPacket.FlushBits(); + if (WalkSpeed.HasValue) + _worldPacket << WalkSpeed.Value; - _worldPacket.WriteBit(hasFallDirection); - if (hasFallDirection) - { - _worldPacket << movementInfo.jump.sinAngle; - _worldPacket << movementInfo.jump.cosAngle; - _worldPacket << movementInfo.jump.xyspeed; - } - } + if (RunSpeed.HasValue) + _worldPacket << RunSpeed.Value; - _worldPacket.FlushBits(); + if (RunBackSpeed.HasValue) + _worldPacket << RunBackSpeed.Value; + + if (SwimSpeed.HasValue) + _worldPacket << SwimSpeed.Value; + + if (SwimBackSpeed.HasValue) + _worldPacket << SwimBackSpeed.Value; + + if (FlightSpeed.HasValue) + _worldPacket << FlightSpeed.Value; + + if (FlightBackSpeed.HasValue) + _worldPacket << FlightBackSpeed.Value; + + if (TurnRate.HasValue) + _worldPacket << TurnRate.Value; + + if (PitchRate.HasValue) + _worldPacket << PitchRate.Value; return &_worldPacket; } + +void WorldPackets::Movement::MoveTeleportAck::Read() +{ + _worldPacket >> MoverGUID; + _worldPacket >> AckIndex; + _worldPacket >> MoveTime; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index f018757eada..6d5d10526b3 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,250 @@ namespace WorldPackets class ServerPlayerMovement final : public ServerPacket { public: - ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) {} + ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) { } WorldPacket const* Write() override; - Unit* mover; + MovementInfo* movementInfo = nullptr; + }; + + struct MonsterSplineFilterKey + { + int16 Idx = 0; + int16 Speed = 0; + }; + + struct MonsterSplineFilter + { + std::vector<MonsterSplineFilterKey> FilterKeys; + uint8 FilterFlags = 0; + float BaseSpeed = 0.0f; + int16 StartOffset = 0; + float DistToPrevFilterKey = 0.0f; + int16 AddedToStart = 0; + }; + + 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 = 0; + 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 MoveSplineSetSpeed : public ServerPacket + { + public: + MoveSplineSetSpeed(OpcodeServer opcode) : ServerPacket(opcode, 12) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + float Speed = 1.0f; + }; + + class MoveSetSpeed : public ServerPacket + { + public: + MoveSetSpeed(OpcodeServer opcode) : ServerPacket(opcode) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + uint32 SequenceIndex = 0; ///< Unit movement packet index, incremented each time + float Speed = 1.0f; + }; + + class MoveUpdateSpeed : public ServerPacket + { + public: + MoveUpdateSpeed(OpcodeServer opcode) : ServerPacket(opcode) { } + + WorldPacket const* Write() override; + + MovementInfo* movementInfo = nullptr; + float Speed = 1.0f; + }; + + class MoveSplineSetFlag final : public ServerPacket + { + public: + MoveSplineSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + }; + + class MoveSetFlag final : public ServerPacket + { + public: + MoveSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 12) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + uint32 SequenceIndex = 0; ///< Unit movement packet index, incremented each time + }; + + 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 { } + }; + + struct VehicleTeleport + { + uint8 VehicleSeatIndex = 0; + bool VehicleExitVoluntary = false; + bool VehicleExitTeleport = false; + }; + + class MoveTeleport final : public ServerPacket + { + public: + MoveTeleport() : ServerPacket(SMSG_MOVE_TELEPORT, 12+4+16+16+4) { } + + WorldPacket const* Write() override; + + Position Pos; + Optional<VehicleTeleport> Vehicle; + uint32 SequenceIndex = 0; + ObjectGuid MoverGUID; + Optional<ObjectGuid> TransportGUID; + float Facing = 0.0f; + }; + + struct MovementForce + { + ObjectGuid ID; + G3D::Vector3 Direction; + uint32 TransportID = 0; + float Magnitude = 0; + uint8 Type = 0; + }; + + class MoveUpdateTeleport final : public ServerPacket + { + public: + MoveUpdateTeleport() : ServerPacket(SMSG_MOVE_UPDATE_TELEPORT) { } + + WorldPacket const* Write() override; + + MovementInfo* movementInfo = nullptr; + std::vector<MovementForce> MovementForces; + Optional<float> SwimBackSpeed; + Optional<float> FlightSpeed; + Optional<float> SwimSpeed; + Optional<float> WalkSpeed; + Optional<float> TurnRate; + Optional<float> RunSpeed; + Optional<float> FlightBackSpeed; + Optional<float> RunBackSpeed; + Optional<float> PitchRate; + }; + + class MoveTeleportAck final : public ClientPacket + { + public: + MoveTeleportAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_TELEPORT_ACK, std::move(packet)) { } + + void Read() override; + + ObjectGuid MoverGUID; + int32 AckIndex = 0; + int32 MoveTime = 0; }; } } +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 0d1b861a9b5..335d261651a 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -97,10 +97,10 @@ void WorldPackets::Query::QueryPlayerName::Read() Hint.NativeRealmAddress.HasValue = _worldPacket.ReadBit(); if (Hint.VirtualRealmAddress.HasValue) - _worldPacket >> Hint.VirtualRealmAddress.value; + _worldPacket >> Hint.VirtualRealmAddress.Value; if (Hint.NativeRealmAddress.HasValue) - _worldPacket >> Hint.NativeRealmAddress.value; + _worldPacket >> Hint.NativeRealmAddress.Value; } WorldPacket const* WorldPackets::Query::QueryPlayerNameResponse::Write() @@ -153,3 +153,58 @@ WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write() 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 b7c57e94747..8b6eae8db56 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 { @@ -141,6 +143,63 @@ namespace WorldPackets 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 = 0; + 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 09914b292bb..233c35f7bbd 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -16,8 +16,10 @@ */ #include "SpellPackets.h" +#include "SpellAuraEffects.h" +#include "MovementPackets.h" -WorldPacket const* WorldPackets::Spell::CategoryCooldown::Write() +WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write() { _worldPacket.reserve(4 + 8 * CategoryCooldowns.size()); @@ -32,7 +34,7 @@ WorldPacket const* WorldPackets::Spell::CategoryCooldown::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Spell::SendKnownSpells::Write() +WorldPacket const* WorldPackets::Spells::SendKnownSpells::Write() { _worldPacket.reserve(1 + 4 * KnownSpells.size()); @@ -45,7 +47,7 @@ WorldPacket const* WorldPackets::Spell::SendKnownSpells::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Spell::UpdateActionButtons::Write() +WorldPacket const* WorldPackets::Spells::UpdateActionButtons::Write() { for (uint32 i = 0; i < MAX_ACTION_BUTTONS; ++i) _worldPacket << ActionButtons[i]; @@ -55,7 +57,13 @@ WorldPacket const* WorldPackets::Spell::UpdateActionButtons::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Spell::SendUnlearnSpells::Write() +void WorldPackets::Spells::SetActionButton::Read() +{ + _worldPacket >> Action; + _worldPacket >> Index; +} + +WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write() { _worldPacket << uint32(Spells.size()); for (uint32 spellId : Spells) @@ -64,3 +72,422 @@ WorldPacket const* WorldPackets::Spell::SendUnlearnSpells::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData) +{ + data << spellCastLogData.Health; + data << spellCastLogData.AttackPower; + data << spellCastLogData.SpellPower; + data << int32(spellCastLogData.PowerData.size()); + for (WorldPackets::Spells::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::Spells::SendAuraUpdate::Write() +{ + return &_worldPacket; +} + +void WorldPackets::Spells::SendAuraUpdate::Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count) +{ + _worldPacket.WriteBit(IsFullUpdate); + _worldPacket << Target; + _worldPacket << uint32(Count); +} + +void WorldPackets::Spells::SendAuraUpdate::BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level) +{ + _worldPacket << uint8(aurApp->GetSlot()); + _worldPacket.ResetBitPos(); + _worldPacket.WriteBit(!remove); + + if (remove) + { + _worldPacket.FlushBits(); + return; + } + Aura const* aura = aurApp->GetBase(); + _worldPacket << uint32(aura->GetId()); + + uint8 flags = aurApp->GetFlags(); + if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION)) + flags |= AFLAG_DURATION; + _worldPacket << uint8(flags); + + _worldPacket << uint32(aurApp->GetEffectMask()); + + _worldPacket << uint16(level); + + // send stack amount for aura which could be stacked (never 0 - causes incorrect display) or charges + // stack amount has priority over charges (checked on retail with spell 50262) + _worldPacket << uint8(aura->GetSpellInfo()->StackAmount ? aura->GetStackAmount() : aura->GetCharges()); + + uint32 int72 = 0; + _worldPacket << int72; + + size_t pos = _worldPacket.wpos(); + uint32 count = 0; + _worldPacket << count; + + //for (int72) + // float + + if (flags & AFLAG_SCALABLE) + { + for (AuraEffect const* effect : aura->GetAuraEffects()) + { + if (effect && aurApp->HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target + { + _worldPacket << int32(effect->GetAmount()); + count++; + } + } + } + + _worldPacket.put<uint32>(pos, count); + + _worldPacket.ResetBitPos(); + + _worldPacket.WriteBit(!(flags & AFLAG_NOCASTER)); + _worldPacket.WriteBit(aura->GetDuration()); + _worldPacket.WriteBit(aura->GetMaxDuration()); + + if (!(flags & AFLAG_NOCASTER)) + _worldPacket << aura->GetCasterGUID().WriteAsPacked(); + + if (aura->GetDuration()) + { + _worldPacket << uint32(aura->GetDuration()); + } + + if (aura->GetMaxDuration()) + { + _worldPacket << uint32(aura->GetMaxDuration()); + } +} + +void WorldPackets::Spells::SpellCastRequest::Read() +{ + if (_worldPacket.GetOpcode() == CMSG_PET_CAST_SPELL) + _worldPacket >> PetGuid; + + _worldPacket >> CastID; + _worldPacket >> SpellID; + _worldPacket >> Misc; + + _worldPacket.ResetBitPos(); + + TargetFlags = _worldPacket.ReadBits(21); + bool HasSrcLocation = _worldPacket.ReadBit(); + bool HasDstLocation = _worldPacket.ReadBit(); + bool HasOrientation = _worldPacket.ReadBit(); + uint32 NameLen = _worldPacket.ReadBits(7); + + _worldPacket >> UnitGuid; + _worldPacket >> ItemGuid; + + if (HasSrcLocation) + { + _worldPacket >> SrcTransportGuid; + _worldPacket >> SrcPos.m_positionX; + _worldPacket >> SrcPos.m_positionY; + _worldPacket >> SrcPos.m_positionZ; + } + + if (HasDstLocation) + { + _worldPacket >> DstTransportGuid; + _worldPacket >> DstPos.m_positionX; + _worldPacket >> DstPos.m_positionY; + _worldPacket >> DstPos.m_positionZ; + } + + if (HasOrientation) + _worldPacket >> Orientation; + + Name = _worldPacket.ReadString(NameLen); + + _worldPacket >> Pitch; + _worldPacket >> Speed; + + _worldPacket >> Guid; + + _worldPacket.ResetBitPos(); + + SendCastFlags = _worldPacket.ReadBits(5); + + bool HasMoveUpdate = _worldPacket.ReadBit(); + uint32 SpellWeightCount = _worldPacket.ReadBits(2); + + if (HasMoveUpdate) + { + _worldPacket >> movementInfo; + } + + // SpellWeight + for (uint32 i = 0; i < SpellWeightCount; ++i) + { + _worldPacket.ResetBitPos(); + uint32 Type = _worldPacket.ReadBits(2); + uint32 ID; + _worldPacket >> ID; + uint32 Quantity; + _worldPacket >> Quantity; + } +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation const& targetLocation) +{ + data << targetLocation.Transport; + // data << targetLocation.Location.PositionXYZStream(); + data << targetLocation.Location.m_positionX; + data << targetLocation.Location.m_positionY; + data << targetLocation.Location.m_positionZ; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData) +{ + data.WriteBits(spellTargetData.Flags, 21); + data.WriteBit(spellTargetData.SrcLocation.HasValue); + data.WriteBit(spellTargetData.DstLocation.HasValue); + data.WriteBit(spellTargetData.Orientation.HasValue); + data.WriteBits(spellTargetData.Name.size(), 7); + data.FlushBits(); + + data << spellTargetData.Unit; + data << spellTargetData.Item; + + if (spellTargetData.SrcLocation.HasValue) + data << spellTargetData.SrcLocation.Value; + + if (spellTargetData.DstLocation.HasValue) + data << spellTargetData.DstLocation.Value; + + if (spellTargetData.Orientation.HasValue) + data << spellTargetData.Orientation.Value; + + data.WriteString(spellTargetData.Name); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus) +{ + data.WriteBits(spellMissStatus.Reason, 4); + data.WriteBits(spellMissStatus.ReflectStatus, 4); + // No need to flush bits as we written exactly 8 bits (1 byte) + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellPowerData const& spellPowerData) +{ + data << spellPowerData.Cost; + data << spellPowerData.Type; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& runeData) +{ + data << runeData.Start; + data << runeData.Count; + + data.WriteBits(runeData.Cooldowns.size(), 3); + data.FlushBits(); + + for (uint8 cd : runeData.Cooldowns) + data << cd; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::MissileTrajectoryResult const& missileTrajectory) +{ + data << missileTrajectory.TravelTime; + data << missileTrajectory.Pitch; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellAmmo const& spellAmmo) +{ + data << spellAmmo.DisplayID; + data << spellAmmo.InventoryType; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ProjectileVisualData const& projectileVisual) +{ + data << projectileVisual.ID[0]; + data << projectileVisual.ID[1]; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::CreatureImmunities const& immunities) +{ + data << immunities.School; + data << immunities.Value; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHealPrediction const& spellPred) +{ + data << spellPred.Points; + data << spellPred.Type; + data << spellPred.BeaconGUID; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData const& spellCastData) +{ + data << spellCastData.CasterGUID; + data << spellCastData.CasterUnit; + data << spellCastData.CastID; + data << spellCastData.SpellID; + data << spellCastData.CastFlags; + data << spellCastData.CastTime; + data << uint32(spellCastData.HitTargets.size()); + data << uint32(spellCastData.MissTargets.size()); + data << uint32(spellCastData.MissStatus.size()); + data << spellCastData.Target; + data << uint32(spellCastData.RemainingPower.size()); + data << spellCastData.MissileTrajectory; + data << spellCastData.Ammo; + data << spellCastData.DestLocSpellCastIndex; + data << uint32(spellCastData.TargetPoints.size()); + data << spellCastData.Immunities; + data << spellCastData.Predict; + + for (ObjectGuid const& target : spellCastData.HitTargets) + data << target; + + for (ObjectGuid const& target : spellCastData.MissTargets) + data << target; + + for (WorldPackets::Spells::SpellMissStatus const& status : spellCastData.MissStatus) + data << status; + + for (WorldPackets::Spells::SpellPowerData const& power : spellCastData.RemainingPower) + data << power; + + for (WorldPackets::Spells::TargetLocation const& targetLoc : spellCastData.TargetPoints) + data << targetLoc; + + data.WriteBits(spellCastData.CastFlagsEx, 18); + data.WriteBit(spellCastData.RemainingRunes.HasValue); + data.WriteBit(spellCastData.ProjectileVisual.HasValue); + data.FlushBits(); + + if (spellCastData.RemainingRunes.HasValue) + data << spellCastData.RemainingRunes.Value; + + if (spellCastData.ProjectileVisual.HasValue) + data << spellCastData.ProjectileVisual.Value; + + return data; +} + +WorldPacket const* WorldPackets::Spells::SpellStart::Write() +{ + _worldPacket << Cast; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SpellGo::Write() +{ + _worldPacket << Cast; + + _worldPacket.WriteBit(LogData.HasValue); + _worldPacket.FlushBits(); + + if (LogData.HasValue) + _worldPacket << LogData.Value; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() +{ + _worldPacket << uint32(SpellID.size()); + for (int32 spell : SpellID) + _worldPacket << spell; + + _worldPacket.WriteBit(SuppressMessaging); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SpellFailure::Write() +{ + _worldPacket << CasterUnit; + _worldPacket << CastID; + _worldPacket << SpellID; + _worldPacket << Reason; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write() +{ + _worldPacket << CasterUnit; + _worldPacket << CastID; + _worldPacket << SpellID; + _worldPacket << Reason; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::CastFailed::Write() +{ + _worldPacket << SpellID; + _worldPacket << Reason; + _worldPacket << FailedArg1; + _worldPacket << FailedArg2; + _worldPacket << CastID; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData const& spellModifierData) +{ + data << spellModifierData.ModifierValue; + data << spellModifierData.ClassIndex; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifier const& spellModifier) +{ + data << spellModifier.ModIndex; + data << uint32(spellModifier.ModifierData.size()); + for (WorldPackets::Spells::SpellModifierData const& modData : spellModifier.ModifierData) + data << modData; + + return data; +} + +WorldPacket const* WorldPackets::Spells::SetSpellModifier::Write() +{ + _worldPacket << uint32(Modifiers.size()); + for (WorldPackets::Spells::SpellModifier const& spellMod : Modifiers) + _worldPacket << spellMod; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SendRemovedSpell::Write() +{ + _worldPacket << uint32(Spells.size()); + for (uint32 spellId : Spells) + _worldPacket << uint32(spellId); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 2b4e4c3c146..98882fc2e26 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -20,10 +20,12 @@ #include "Packet.h" #include "Player.h" +#include "SpellAuras.h" +#include "Spell.h" namespace WorldPackets { - namespace Spell + namespace Spells { class CategoryCooldown final : public ServerPacket { @@ -58,7 +60,10 @@ namespace WorldPackets class UpdateActionButtons final : public ServerPacket { public: - UpdateActionButtons() : ServerPacket(SMSG_ACTION_BUTTONS, MAX_ACTION_BUTTONS*8+1) { } + UpdateActionButtons() : ServerPacket(SMSG_ACTION_BUTTONS, MAX_ACTION_BUTTONS * 8 + 1) + { + std::memset(ActionButtons, 0, sizeof(ActionButtons)); + } WorldPacket const* Write() override; @@ -72,6 +77,17 @@ namespace WorldPackets */ }; + class SetActionButton final : public ClientPacket + { + public: + SetActionButton(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTION_BUTTON, std::move(packet)) {} + + void Read() override; + + uint64 Action = 0; ///< two packed uint32 (action and type) + uint8 Index = 0; + }; + class SendUnlearnSpells final : public ServerPacket { public: @@ -81,7 +97,273 @@ namespace WorldPackets 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: + SendAuraUpdate() : ServerPacket(SMSG_AURA_UPDATE) { } + + WorldPacket const* Write() override; + void Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count); + void BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level); + }; + + class SpellCastRequest final : public ClientPacket + { + public: + SpellCastRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) + { + ASSERT(packet.GetOpcode() == CMSG_CAST_SPELL || packet.GetOpcode() == CMSG_PET_CAST_SPELL); + } + + void Read() override; + + ObjectGuid PetGuid; + uint8 CastID; + uint32 SpellID; + uint32 Misc; + uint32 TargetFlags; + ObjectGuid UnitGuid; + ObjectGuid ItemGuid; + + ObjectGuid SrcTransportGuid; + ObjectGuid DstTransportGuid; + Position SrcPos; + Position DstPos; + float Orientation; + + std::string Name; + float Pitch; + float Speed; + ObjectGuid Guid; + uint32 SendCastFlags; + + MovementInfo movementInfo; + }; + + struct TargetLocation + { + ObjectGuid Transport; + Position Location; + }; + + struct SpellTargetData + { + uint32 Flags = 0; + ObjectGuid Unit; + ObjectGuid Item; + Optional<TargetLocation> SrcLocation; + Optional<TargetLocation> DstLocation; + Optional<float> Orientation; // Not found in JAM structures + std::string Name; + }; + + struct SpellMissStatus + { + uint8 Reason = 0; + uint8 ReflectStatus = 0; + }; + + struct SpellPowerData + { + int32 Cost = 0; + int8 Type = 0; + }; + + struct RuneData + { + uint8 Start = 0; + uint8 Count = 0; + std::vector<uint8> Cooldowns; + }; + + struct MissileTrajectoryResult + { + uint32 TravelTime = 0; + float Pitch = 0.0f; + }; + + struct SpellAmmo + { + int32 DisplayID = 0; + int8 InventoryType = 0; + }; + + struct ProjectileVisualData + { + int32 ID[2]; + }; + + struct CreatureImmunities + { + uint32 School = 0; + uint32 Value = 0; + }; + + struct SpellHealPrediction + { + ObjectGuid BeaconGUID; + uint32 Points = 0; + uint8 Type = 0; + }; + + struct SpellCastData + { + ObjectGuid CasterGUID; + ObjectGuid CasterUnit; + uint8 CastID = 0; + int32 SpellID = 0; + uint32 CastFlags = 0; + uint32 CastFlagsEx = 0; + uint32 CastTime = 0; + std::vector<ObjectGuid> HitTargets; + std::vector<ObjectGuid> MissTargets; + std::vector<SpellMissStatus> MissStatus; + SpellTargetData Target; + std::vector<SpellPowerData> RemainingPower; + Optional<RuneData> RemainingRunes; + MissileTrajectoryResult MissileTrajectory; + SpellAmmo Ammo; + Optional<ProjectileVisualData> ProjectileVisual; + uint8 DestLocSpellCastIndex = 0; + std::vector<TargetLocation> TargetPoints; + CreatureImmunities Immunities; + SpellHealPrediction Predict; + }; + + class SpellGo final : public ServerPacket + { + public: + SpellGo() : ServerPacket(SMSG_SPELL_GO) { } + + WorldPacket const* Write() override; + + Optional<SpellCastLogData> LogData; + SpellCastData Cast; + }; + + class SpellStart final : public ServerPacket + { + public: + SpellStart() : ServerPacket(SMSG_SPELL_START) { } + + WorldPacket const* Write() override; + + SpellCastData Cast; + }; + + class LearnedSpells final : public ServerPacket + { + public: + LearnedSpells() : ServerPacket(SMSG_LEARNED_SPELLS, 9) { } + + WorldPacket const* Write() override; + + std::vector<int32> SpellID; + bool SuppressMessaging = false; + }; + + class SpellFailure final : public ServerPacket + { + public: + SpellFailure() : ServerPacket(SMSG_SPELL_FAILURE, 16+4+1+1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterUnit; + uint32 SpellID = 0; + uint8 Reason = 0; + uint8 CastID = 0; + }; + + class SpellFailedOther final : public ServerPacket + { + public: + SpellFailedOther() : ServerPacket(SMSG_SPELL_FAILED_OTHER, 16+4+1+1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterUnit; + uint32 SpellID = 0; + uint16 Reason = 0; + uint8 CastID = 0; + }; + + class CastFailed final : public ServerPacket + { + public: + CastFailed(OpcodeServer opcode) : ServerPacket(opcode, 4+4+4+4+1) { } + + WorldPacket const* Write() override; + + int32 Reason = 0; + int32 FailedArg1 = -1; + int32 FailedArg2 = -1; + int32 SpellID = 0; + uint8 CastID = 0; + }; + + struct SpellModifierData + { + float ModifierValue = 0.0f; + uint8 ClassIndex = 0; + }; + + struct SpellModifier + { + uint8 ModIndex = 0; + std::vector<SpellModifierData> ModifierData; + }; + + class SetSpellModifier final : public ServerPacket + { + public: + SetSpellModifier(OpcodeServer opcode) : ServerPacket(opcode, 20) { } + + WorldPacket const* Write() override; + + std::vector<SpellModifier> Modifiers; + }; + + class SendRemovedSpell final : public ServerPacket + { + public: + SendRemovedSpell() : ServerPacket(SMSG_REMOVED_SPELL, 4) { } + + WorldPacket const* Write() override; + + std::vector<uint32> Spells; + }; } } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation const& targetLocation); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellPowerData const& spellPowerData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& runeData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::MissileTrajectoryResult const& missileTrajectory); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellAmmo const& spellAmmo); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ProjectileVisualData const& projectileVisual); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::CreatureImmunities const& immunities); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHealPrediction const& spellPred); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData const& spellCastData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData const& spellModifierData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifier const& spellModifier); + #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 4855f663662..d340b476cf9 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -41,3 +41,17 @@ void WorldPackets::Talent::SetSpecialization::Read() { _worldPacket >> SpecGroupIndex; } + + +void WorldPackets::Talent::LearnTalent::Read() +{ + uint32 count; + _worldPacket >> count; + + for (uint32 i = 0; i < count; ++i) + { + uint16 talent; + _worldPacket >> talent; + Talents.push_back(talent); + } +}
\ No newline at end of file diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index 21753e22c8d..2bc8b3934a8 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -57,6 +57,19 @@ namespace WorldPackets uint32 SpecGroupIndex = 0; }; + + class LearnTalent final : public ClientPacket + { + public: + LearnTalent(WorldPacket&& packet) : ClientPacket(std::move(packet)) + { + ASSERT(packet.GetOpcode() == CMSG_LEARN_TALENT); + } + + void Read() override; + std::vector<uint16> Talents; + + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 84efecae188..2129633b021 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -19,20 +19,25 @@ #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/MiscPackets.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 +class PacketHandler : public ClientOpcodeHandler { public: - PacketHandler(char const* _name, SessionStatus _status, PacketProcessing _processing) : OpcodeHandler(_name, _status, _processing) { } + PacketHandler(char const* name, SessionStatus status, PacketProcessing processing) : ClientOpcodeHandler(name, status, processing) { } void Call(WorldSession* session, WorldPacket& packet) const override { @@ -43,10 +48,10 @@ public: }; template<void(WorldSession::*HandlerFunction)(WorldPacket&)> -class PacketHandler<WorldPacket, HandlerFunction> : public OpcodeHandler +class PacketHandler<WorldPacket, HandlerFunction> : public ClientOpcodeHandler { public: - PacketHandler(char const* _name, SessionStatus _status, PacketProcessing _processing) : OpcodeHandler(_name, _status, _processing) { } + PacketHandler(char const* name, SessionStatus status, PacketProcessing processing) : ClientOpcodeHandler(name, status, processing) { } void Call(WorldSession* session, WorldPacket& packet) const override { @@ -57,9 +62,9 @@ public: OpcodeTable opcodeTable; template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)> -void OpcodeTable::ValidateAndSetOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing) +void OpcodeTable::ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing) { - if (uint32(opcode) == 0xBADD) + if (uint32(opcode) == NULL_OPCODE) { TC_LOG_ERROR("network", "Opcode %s does not have a value", name); return; @@ -80,9 +85,9 @@ void OpcodeTable::ValidateAndSetOpcode(OpcodeClient opcode, char const* name, Se _internalTableClient[opcode] = new PacketHandler<PacketClass, HandlerFunction>(name, status, processing); } -void OpcodeTable::ValidateAndSetOpcode(OpcodeServer opcode, char const* name, SessionStatus status) +void OpcodeTable::ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx) { - if (uint32(opcode) == 0xBADD) + if (uint32(opcode) == NULL_OPCODE) { TC_LOG_ERROR("network", "Opcode %s does not have a value", name); return; @@ -94,23 +99,35 @@ void OpcodeTable::ValidateAndSetOpcode(OpcodeServer opcode, char const* name, Se return; } + if (conIdx >= MAX_CONNECTION_TYPES) + { + TC_LOG_ERROR("network", "Tried to set invalid connection type %u for opcode %s", conIdx, name); + return; + } + + if (IsInstanceOnlyOpcode(opcode) && conIdx != CONNECTION_TYPE_INSTANCE) + { + TC_LOG_ERROR("network", "Tried to set invalid connection type %u for instance only opcode %s", conIdx, name); + return; + } + if (_internalTableServer[opcode] != NULL) { TC_LOG_ERROR("network", "Tried to override server handler of %s with %s (opcode %u)", opcodeTable[opcode]->Name, name, opcode); return; } - _internalTableServer[opcode] = new PacketHandler<WorldPacket, &WorldSession::Handle_ServerSide>(name, status, PROCESS_INPLACE); + _internalTableServer[opcode] = new ServerOpcodeHandler(name, status, conIdx); } /// Correspondence between opcodes and their names void OpcodeTable::Initialize() { #define DEFINE_OPCODE_HANDLER_OLD(opcode, status, processing, handler) \ - ValidateAndSetOpcode<WorldPacket, handler>(opcode, #opcode, status, processing); + ValidateAndSetClientOpcode<WorldPacket, handler>(opcode, #opcode, status, processing); #define DEFINE_HANDLER(opcode, status, processing, packetclass, handler) \ - ValidateAndSetOpcode<packetclass, handler>(opcode, #opcode, status, processing); + ValidateAndSetClientOpcode<packetclass, handler>(opcode, #opcode, status, processing); DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptGrantLevel ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode ); @@ -154,7 +171,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 ); @@ -175,7 +192,7 @@ void OpcodeTable::Initialize() 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 ); @@ -197,7 +214,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GUILD_FILTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGuildFilter ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_UPDATE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CAST, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleCancelCastOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CHANNELLING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling ); @@ -206,15 +223,15 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode); DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode ); + DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::SpellCastRequest, &WorldSession::HandleCastSpellOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGEPLAYER_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); 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 ); @@ -260,7 +277,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_AUTHED, 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 ); @@ -275,7 +292,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 ); @@ -294,7 +311,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); @@ -360,12 +377,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_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalent, &WorldSession::HandleLearnTalentOpcode); + 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 ); @@ -385,7 +402,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); @@ -403,25 +420,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 ); @@ -471,12 +486,13 @@ 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_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MoveTeleportAck, &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_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 ); @@ -494,7 +510,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ABANDON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAbandon ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAction ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCastSpellOpcode ); + DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SpellCastRequest, &WorldSession::HandlePetCastSpellOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename ); @@ -523,8 +539,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 ); @@ -546,7 +562,6 @@ void OpcodeTable::Initialize() 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 ); @@ -573,7 +588,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SETSHEATHED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSheathedOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIONBAR_TOGGLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionBarToggles ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTION_BUTTON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionButtonOpcode ); + DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_MOVER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); // STATUS_AUTHED DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ALLOW_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -591,7 +606,7 @@ 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_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 ); @@ -621,26 +636,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_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_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &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 ); @@ -664,8 +677,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,733 +700,750 @@ void OpcodeTable::Initialize() #undef DEFINE_OPCODE_HANDLER_OLD #undef DEFINE_HANDLER -#define DEFINE_SERVER_OPCODE_HANDLER(opcode, status) \ - ValidateAndSetOpcode(opcode, #opcode, status) +#define DEFINE_SERVER_OPCODE_HANDLER(opcode, status, con) \ + ValidateAndSetServerOpcode(opcode, #opcode, status, con) - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER); - 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_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MOVEMENT_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_UNIT_DESTROYED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_COMMAND_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_EVENT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_INVITE, STATUS_UNHANDLED); - 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_ATTACKSWING_BADFACING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_CANT_ATTACK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_DEADTARGET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_NOTINRANGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_LIST_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_NOTIFICATION, STATUS_UNHANDLED); - 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE_ALL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVERAGE_ITEM_LEVEL_INFORM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EJECTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EJECT_PENDING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTERED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTRY_INVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EXIT_REQUEST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_INVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_STATE_CHANGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PLAYER_POSITIONS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_RATED_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEEDCONFIRMATION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_WAITFORGROUPS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED); - 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_UNHANDLED); - 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_BINDZONEREPLY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_ITEM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_REMOVED_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_UPDATED_ALERT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_FILTER_GUILD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_ADDED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_REMOVED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_SHAKE, STATUS_UNHANDLED); - 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_MEMBER_COUNT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_UNHANDLED); - 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CREATE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_ENUM, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_RENAME, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_IGNORED_ACCOUNT_MUTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_NOT_IN_PARTY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_AMBIGUOUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_NOT_FOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_RESTRICTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_DISCONNECTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_RECONNECTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_WRONG_FACTION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED); - 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PLAYER_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT1, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_STATE_CHANGED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAIN_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_MOVES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_PACKET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_CONNECT_FAIL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_DISCONNECT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_RECONNECT_TRY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_NOT_IN_INSTANCE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_REMOVED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_RESTORED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CUSTOM_LOAD_SCREEN, STATUS_UNHANDLED); - 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_DEATH_RELEASE_LOC, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_RUNE_REGEN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_OBJECT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_UNHANDLED); - 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_INBOUNDS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUTOFBOUNDS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_UNHANDLED); - 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_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_USE_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLIGHT_SPLINE_SYNC, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLOOD_DETECTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCEACTIONSHOW, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED); - 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_CUSTOM_ANIM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMESPEED_SET, STATUS_UNHANDLED); - 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_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_CREATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_DELETETICKET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_GETTICKET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_SYSTEMSTATUS, STATUS_UNHANDLED); - 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_STATUS_UPDATE, 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_POI, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUPACTION_THROTTLED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_CANCEL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_INVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_LEADER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_ROLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DATA, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_MONEY_WITHDRAWN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_UNHANDLED); - 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_DECLINE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_CANCEL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MAX_DAILY_XP, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_UPDATE_NOTE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_COMPLETE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_DELETED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RECIPES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RENAMED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_WEEKLY_CAP, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARDS_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_UPDATE_ROSTER, STATUS_UNHANDLED); - 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_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_INITIAL_SETUP, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_CURRENCY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_UNHANDLED); - 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_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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_INFO_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REMOVE_PASSIVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_SEND_PASSIVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TEXT_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_DANCE_MOVES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_REWARD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PROPOSAL_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_QUEUE_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHOSEN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_UNHANDLED); - 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_LOAD_CUF_PROFILES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_UNHANDLED); - 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XPGAIN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CLEAR_MONEY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MASTER_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED); - 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_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_MESSAGE_BOX, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRRORIMAGE_DATA, STATUS_UNHANDLED); - 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_TRANSPORT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTRESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FEATHER_FALL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FORCE_RUN_SPEED_CHANGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FORCE_SWIM_SPEED_CHANGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED); - 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED); - 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_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_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_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_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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS_FULL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERIODICAURALOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETGODMODE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOWLIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_SOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ADDED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BROKEN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_GUIDS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_LEARNED_SPELL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_MODE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_NAME_INVALID, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_NAME_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_REMOVED_SPELL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_RENAMEABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SLOT_UPDATED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UPDATE_COMBO_POINTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBINDERROR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_DIFFICULTY_CHANGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_OBJECT_SOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESURRECT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROCRESIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_COMPLETE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_FAILED, STATUS_UNHANDLED); - 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_COMPLETE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILEDTIMER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_NPC_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_INFO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_THROTTLED_ERROR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_RATING, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_OK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REAL_GROUP_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVED_MAIL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REDIRECT_CLIENT, STATUS_NEVER); - 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_SETUP_HISTORY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_BEGIN, STATUS_UNHANDLED); - 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_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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_UNHANDLED); - 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_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_PROJECTILE_POSITION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_RATINGS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDISPELLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLENERGIZELOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLHEALLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINSTAKILLLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINTERRUPTLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGEXECUTE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGMISS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLNONMELEEDAMAGELOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLORDAMAGE_IMMUNE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_ROOT, STATUS_UNHANDLED); - 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_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_MODE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_SPEED, STATUS_UNHANDLED); - 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_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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNROOT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_FLYING, STATUS_UNHANDLED); - 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_MIRROR_TIMER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_STREAMING_MOVIE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED); - 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_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_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_TIME_ADJUSTMENT, 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED); - 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_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_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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_UNHANDLED); - 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_WORLD_STATE, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICESESSION_FULL, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_PARENTAL_CONTROLS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_LEAVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_ROSTER_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SET_TALKER_MUTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_CHECK_ENTRY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SENT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_LAST_RESET, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_RESET_CURRENCY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED); - 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_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MOVEMENT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_UNIT_DESTROYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKERSTATEUPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTART, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTOP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_BADFACING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_CANT_ATTACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_DEADTARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_NOTINRANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REMOVED_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVERAGE_ITEM_LEVEL_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EJECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EJECT_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTERED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTRY_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EXIT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_STATE_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PLAYER_POSITIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_RATED_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEEDCONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_WAITFORGROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_NAME_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDPOINTUPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDZONEREPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_UPDATED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_FILTER_GUILD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_SHAKE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CREATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_ENUM, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_RENAME, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_IGNORED_ACCOUNT_MUTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_NOT_IN_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_AMBIGUOUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_NOT_FOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_RESTRICTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_DISCONNECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_RECONNECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_WRONG_FACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT1, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_MOVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_PACKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_CONNECT_FAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_DISCONNECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_RECONNECT_TRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_NOT_IN_INSTANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CUSTOM_LOAD_SCREEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAMAGE_CALC_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_RUNE_REGEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_OBJECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNTRESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DROP_NEW_CONNECTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_INBOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUTOFBOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUMP_RIDE_TICKETS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ECHO_PARTY_SQUELCH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_USE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLIGHT_SPLINE_SYNC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLOOD_DETECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCEACTIONSHOW, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORGE_MASTER_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_PAGETEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMESPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_CREATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_DELETETICKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_GETTICKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_SYSTEMSTATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_UPDATETEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUPACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_ROLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_MONEY_WITHDRAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT_2, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MAX_DAILY_XP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_UPDATE_NOTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RENAMED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_WEEKLY_CAP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARDS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_UPDATE_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULTS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_TALENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_LOCK_WARNING_QUERY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_SAVE_CREATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ADD_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REMOVE_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_SEND_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TEXT_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_DANCE_MOVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_REWARD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PROPOSAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_QUEUE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIST_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XPGAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CLEAR_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MASTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRRORIMAGE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE_TRANSPORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTRESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTYKILLLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERIODICAURALOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETGODMODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOWLIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BROKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_GUIDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_LEARNED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_NAME_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_NAME_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_REMOVED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_RENAMEABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SLOT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UPDATE_COMBO_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBINDERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_DIFFICULTY_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_OBJECT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROCRESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_KILL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_PVP_KILL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILEDTIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_NPC_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_THROTTLED_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_RATING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_OK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REAL_GROUP_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVED_MAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REDIRECT_CLIENT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFORGE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_SETUP_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_BEGIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_RATINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDISPELLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLENERGIZELOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLHEALLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINSTAKILLLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINTERRUPTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGEXECUTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGMISS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLNONMELEEDAMAGELOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLORDAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_ROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_LAND_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_TURN_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WATER_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_START_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_STOP_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STREAMING_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TAXINODE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEST_DROP_RATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOGGLE_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS_EXTENDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_SUCCEEDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_HEALTH_FREQUENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_SPELLCAST_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_COMBO_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICESESSION_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_PARENTAL_CONTROLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_LEAVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SET_TALKER_MUTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_CHECK_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_LAST_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_RESET_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHOIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); #undef DEFINE_SERVER_OPCODE_HANDLER }; diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index aeb5bada68c..5556a4daf63 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -29,7 +29,10 @@ enum ConnectionType { CONNECTION_TYPE_REALM = 0, - CONNECTION_TYPE_INSTANCE = 1 + CONNECTION_TYPE_INSTANCE = 1, + MAX_CONNECTION_TYPES, + + CONNECTION_TYPE_DEFAULT = -1 }; enum OpcodeMisc : uint32 @@ -144,15 +147,15 @@ enum OpcodeClient : uint32 CMSG_CANCEL_QUEUED_SPELL = 0xBADD, CMSG_CANCEL_TEMP_ENCHANTMENT = 0xBADD, CMSG_CANCEL_TRADE = 0x1159, - CMSG_CAST_SPELL = 0xBADD, + CMSG_CAST_SPELL = 0x08FE, CMSG_CHANGEPLAYER_DIFFICULTY = 0xBADD, 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, @@ -193,7 +196,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, @@ -314,8 +317,8 @@ enum OpcodeClient : uint32 CMSG_KEEP_ALIVE = 0xBADD, CMSG_LEARN_PREVIEW_TALENTS = 0xBADD, CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD, - CMSG_LEARN_TALENT = 0xBADD, - CMSG_LEAVE_CHANNEL = 0xBADD, + CMSG_LEARN_TALENT = 0x0BB6, + CMSG_LEAVE_CHANNEL = 0x19F2, CMSG_LFG_GET_STATUS = 0xBADD, CMSG_LFG_JOIN = 0xBADD, CMSG_LFG_LEAVE = 0xBADD, @@ -335,7 +338,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, @@ -354,22 +357,20 @@ enum OpcodeClient : uint32 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, @@ -426,6 +427,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, @@ -460,7 +462,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, @@ -486,7 +488,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, @@ -509,8 +511,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, @@ -544,7 +545,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, @@ -609,9 +610,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, @@ -624,7 +623,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, @@ -654,8 +653,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, @@ -666,7 +663,6 @@ enum OpcodeClient : uint32 MSG_PARTY_ASSIGNMENT = 0xBADD, MSG_PETITION_DECLINE = 0xBADD, MSG_PETITION_RENAME = 0xBADD, - MSG_PVP_LOG_DATA = 0xBADD, MSG_QUERY_NEXT_MAIL_TIME = 0xBADD, MSG_QUEST_PUSH_RESULT = 0xBADD, MSG_RAID_READY_CHECK = 0xBADD, @@ -688,12 +684,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, @@ -727,12 +725,11 @@ enum OpcodeServer : uint32 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_AURA_UPDATE_ALL = 0xBADD, 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, @@ -756,6 +753,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, @@ -790,7 +788,7 @@ 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, @@ -913,8 +911,10 @@ enum OpcodeServer : uint32 SMSG_FORCE_SET_VEHICLE_REC_ID = 0xBADD, SMSG_FORGE_MASTER_SET = 0xBADD, SMSG_FRIEND_STATUS = 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, @@ -922,8 +922,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, @@ -934,7 +934,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, @@ -964,8 +966,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, @@ -992,7 +996,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, @@ -1016,12 +1020,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, @@ -1038,7 +1043,7 @@ enum OpcodeServer : uint32 SMSG_JOINED_BATTLEGROUND_QUEUE = 0xBADD, SMSG_KICK_REASON = 0xBADD, SMSG_LEARNED_DANCE_MOVES = 0xBADD, - SMSG_LEARNED_SPELL = 0xBADD, + SMSG_LEARNED_SPELLS = 0x08AB, SMSG_LEVELUP_INFO = 0xBADD, SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_DISABLED = 0xBADD, @@ -1087,6 +1092,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, @@ -1101,7 +1107,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, @@ -1109,49 +1115,48 @@ enum OpcodeServer : uint32 SMSG_MOVE_COLLISION_DISABLE = 0xBADD, SMSG_MOVE_COLLISION_ENABLE = 0xBADD, SMSG_MOVE_FEATHER_FALL = 0xBADD, - SMSG_MOVE_FORCE_RUN_SPEED_CHANGE = 0x08F5, - SMSG_MOVE_FORCE_SWIM_SPEED_CHANGE = 0x061A, SMSG_MOVE_GRAVITY_DISABLE = 0x02C6, SMSG_MOVE_GRAVITY_ENABLE = 0xBADD, SMSG_MOVE_KNOCK_BACK = 0xBADD, - SMSG_MOVE_LAND_WALK = 0xBADD, + SMSG_MOVE_LAND_WALK = 0x13DA, SMSG_MOVE_NORMAL_FALL = 0xBADD, SMSG_MOVE_ROOT = 0x1B5A, SMSG_MOVE_SET_ACTIVE_MOVER = 0xBADD, - SMSG_MOVE_SET_CAN_FLY = 0xBADD, + SMSG_MOVE_SET_CAN_FLY = 0x01F6, SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD, SMSG_MOVE_SET_COLLISION_HEIGHT = 0x008D, SMSG_MOVE_SET_COMPOUND_STATE = 0xBADD, SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0xBADD, SMSG_MOVE_SET_FLIGHT_SPEED = 0xBADD, - SMSG_MOVE_SET_HOVER = 0xBADD, + SMSG_MOVE_SET_HOVER = 0x0296, SMSG_MOVE_SET_PITCH_RATE = 0xBADD, SMSG_MOVE_SET_RUN_BACK_SPEED = 0xBADD, - SMSG_MOVE_SET_RUN_SPEED = 0xBADD, + SMSG_MOVE_SET_RUN_SPEED = 0x08F5, SMSG_MOVE_SET_SWIM_BACK_SPEED = 0xBADD, - SMSG_MOVE_SET_SWIM_SPEED = 0xBADD, + SMSG_MOVE_SET_SWIM_SPEED = 0x061A, SMSG_MOVE_SET_TURN_RATE = 0xBADD, 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_FLY = 0x0BAE, SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD, - SMSG_MOVE_UNSET_HOVER = 0xBADD, + SMSG_MOVE_UNSET_HOVER = 0x01A5, SMSG_MOVE_UNSET_WALK_IN_AIR = 0xBADD, SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0xBADD, 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_WATER_WALK = 0xBADD, + SMSG_MOVE_UPDATE_TURN_RATE = 0x08BE, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x01E5, + SMSG_MOVE_WATER_WALK = 0x02A6, SMSG_MULTIPLE_PACKETS = 0xBADD, SMSG_NAME_QUERY_RESPONSE = 0x0828, SMSG_NEW_TAXI_PATH = 0xBADD, @@ -1265,9 +1270,10 @@ enum OpcodeServer : uint32 SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD, SMSG_REFER_A_FRIEND_FAILURE = 0xBADD, SMSG_REFORGE_RESULT = 0xBADD, - SMSG_REMOVED_SPELL = 0xBADD, + SMSG_REFRESH_SPELL_HISTORY = 0x0A2A, + SMSG_REMOVED_SPELL = 0x0B3B, 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, @@ -1283,13 +1289,17 @@ 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 = 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, @@ -1297,6 +1307,7 @@ enum OpcodeServer : uint32 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, @@ -1365,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, @@ -1379,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, @@ -1415,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, @@ -1422,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, @@ -1448,6 +1461,162 @@ enum OpcodeServer : uint32 SMSG_ZONE_UNDER_ATTACK = 0x1401 }; +inline bool IsInstanceOnlyOpcode(uint32 opcode) +{ + // TODO: Use names when known + switch (opcode) + { + case 0x000F: // Client + case 0x0111: // Client + case 0x03E4: // Client + case 0x0549: // Client + case 0x054C: // Client + case 0x055A: // Client + case 0x056C: // Client + case 0x057A: // Client + case 0x057B: // Client + case 0x05CC: // Client + case 0x05EA: // Client + case 0x05EC: // Client + case 0x05F9: // Client + case 0x05FB: // Client + case 0x074C: // Client + case 0x075B: // Client + case 0x076C: // Client + case 0x077B: // Client + case 0x077C: // Client + case 0x07CC: // Client + case 0x07DB: // Client + case 0x07EC: // Client + case 0x07FB: // Client + case 0x07FC: // Client + case 0x0827: // Client + case 0x0935: // Client + case 0x0F0C: // ClientSpell + case 0x0F10: // ClientSpell + case 0x0F1B: // ClientSpell + case 0x0F1C: // ClientSpell + case 0x0F20: // ClientSpell + case 0x0F2C: // ClientSpell + case 0x0F2F: // ClientSpell + case 0x0F3B: // ClientSpell + case 0x0F8B: // ClientSpell + case 0x0F8C: // ClientSpell + case 0x0F90: // ClientSpell + case 0x0F9F: // ClientSpell + case 0x0FA0: // ClientSpell + case SMSG_ATTACKSTOP: // Client + case 0x14C9: // Client + case 0x154A: // Client + case 0x155A: // Client + case 0x155C: // Client + case SMSG_QUESTGIVER_STATUS: // ClientQuest + case 0x156A: // Client + case 0x156B: // Client + case 0x157A: // Client + case 0x157B: // Client + case 0x15DC: // Client + case 0x15EB: // Client + case 0x15FB: // Client + case 0x170C: // ClientSpell + case 0x171C: // ClientSpell + case 0x171F: // ClientSpell + case 0x172C: // ClientSpell + case 0x172F: // ClientSpell + case 0x173C: // ClientSpell + case 0x173F: // ClientSpell + case 0x1740: // ClientSpell + case 0x1790: // ClientSpell + case 0x179B: // ClientSpell + case 0x179F: // ClientSpell + case SMSG_ATTACKSTART: // Client + case 0x1D82: // ClientQuest + case 0x1D83: // ClientQuest + case 0x1D85: // ClientQuest + case 0x1D87: // ClientQuest + case 0x1D93: // ClientQuest + case 0x1D96: // ClientQuest + case 0x1D97: // ClientQuest + case 0x1DA1: // ClientQuest + case 0x1DA2: // ClientQuest + case 0x1DA3: // ClientQuest + case 0x1DA4: // ClientQuest + case 0x1DA5: // ClientQuest + case 0x1DA7: // ClientQuest + case SMSG_QUERY_TIME_RESPONSE: // Client + case 0x1DC2: // ClientQuest + case 0x1DC6: // ClientQuest + case 0x1DC7: // ClientQuest + case 0x1DD2: // ClientQuest + case 0x1DD3: // ClientQuest + case 0x1DD6: // ClientQuest + case 0x1DD7: // ClientQuest + case 0x1DD8: // ClientQuest + case 0x1DE4: // ClientQuest + case 0x1DE5: // ClientQuest + case 0x1DE7: // ClientQuest + case 0x1F02: // ClientQuest + case 0x1F06: // ClientQuest + case 0x1F07: // ClientQuest + case 0x1F0C: // ClientSpell + case 0x1F12: // ClientQuest + case 0x1F13: // ClientQuest + case 0x1F16: // ClientQuest + case 0x1F17: // ClientQuest + case 0x1F18: // ClientQuest + case 0x1F1C: // ClientSpell + case 0x1F1F: // ClientSpell + case 0x1F24: // ClientQuest + case 0x1F25: // ClientQuest + case 0x1F27: // ClientQuest + case 0x1F2C: // ClientSpell + case 0x1F2F: // ClientSpell + case 0x1F3C: // ClientSpell + case 0x1F3F: // ClientSpell + case 0x1F40: // ClientSpell + case 0x1F44: // ClientQuest + case 0x1F48: // ClientQuest + case 0x1F51: // ClientQuest + case 0x1F55: // ClientQuest + case 0x1F57: // ClientQuest + case 0x1F61: // ClientQuest + case 0x1F63: // ClientQuest + case 0x1F64: // ClientQuest + case 0x1F65: // ClientQuest + case 0x1F67: // ClientQuest + case 0x1F85: // ClientQuest + case 0x1F86: // ClientQuest + case 0x1F87: // ClientQuest + case 0x1F90: // ClientSpell + case 0x1F92: // ClientQuest + case 0x1F94: // ClientQuest + case 0x1F96: // ClientQuest + case 0x1F97: // ClientQuest + case 0x1F9B: // ClientSpell + case 0x1F9F: // ClientSpell + case 0x1FA1: // ClientQuest + case 0x1FA2: // ClientQuest + case 0x1FA3: // ClientQuest + case 0x1FA4: // ClientQuest + case 0x1FA5: // ClientQuest + case 0x1FA7: // ClientQuest + case 0x1FC2: // ClientQuest + case 0x1FC6: // ClientQuest + case 0x1FC7: // ClientQuest + case 0x1FD2: // ClientQuest + case 0x1FD3: // ClientQuest + case 0x1FD6: // ClientQuest + case 0x1FD7: // ClientQuest + case 0x1FD8: // ClientQuest + case 0x1FE4: // ClientQuest + case 0x1FE5: // ClientQuest + case 0x1FE7: // ClientQuest + return true; + default: + return false; + } +} + /// Player state enum SessionStatus { @@ -1479,18 +1648,33 @@ class WorldSession; class OpcodeHandler { public: - OpcodeHandler(char const* _name, SessionStatus _status, PacketProcessing _processing) - : Name(_name), Status(_status), ProcessingPlace(_processing) { } - + OpcodeHandler(char const* name, SessionStatus status) : Name(name), Status(status) { } virtual ~OpcodeHandler() { } - virtual void Call(WorldSession* session, WorldPacket& packet) const = 0; - char const* Name; SessionStatus Status; +}; + +class ClientOpcodeHandler : public OpcodeHandler +{ +public: + ClientOpcodeHandler(char const* name, SessionStatus status, PacketProcessing processing) + : OpcodeHandler(name, status), ProcessingPlace(processing) { } + + virtual void Call(WorldSession* session, WorldPacket& packet) const = 0; + PacketProcessing ProcessingPlace; }; +class ServerOpcodeHandler : public OpcodeHandler +{ +public: + ServerOpcodeHandler(char const* name, SessionStatus status, ConnectionType conIdx) + : OpcodeHandler(name, status), ConnectionIndex(conIdx) { } + + ConnectionType ConnectionIndex; +}; + class OpcodeTable { public: @@ -1514,24 +1698,24 @@ class OpcodeTable void Initialize(); - OpcodeHandler const* operator[](OpcodeClient index) const + ClientOpcodeHandler const* operator[](OpcodeClient index) const { return _internalTableClient[index]; } - OpcodeHandler const* operator[](OpcodeServer index) const + ServerOpcodeHandler const* operator[](OpcodeServer index) const { return _internalTableServer[index]; } private: template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)> - void ValidateAndSetOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing); + void ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing); - void ValidateAndSetOpcode(OpcodeServer opcode, char const* name, SessionStatus status); + void ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx); - OpcodeHandler* _internalTableClient[NUM_OPCODE_HANDLERS]; - OpcodeHandler* _internalTableServer[NUM_OPCODE_HANDLERS]; + ClientOpcodeHandler* _internalTableClient[NUM_OPCODE_HANDLERS]; + ServerOpcodeHandler* _internalTableServer[NUM_OPCODE_HANDLERS]; }; extern OpcodeTable opcodeTable; diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index 65b2f6fcae1..270f2598553 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -27,11 +27,11 @@ class WorldPacket : public ByteBuffer { public: // just container for later use - WorldPacket() : ByteBuffer(0), m_opcode(UNKNOWN_OPCODE), _connection(CONNECTION_TYPE_REALM) + WorldPacket() : ByteBuffer(0), m_opcode(UNKNOWN_OPCODE), _connection(CONNECTION_TYPE_DEFAULT) { } - WorldPacket(uint32 opcode, size_t res = 200, ConnectionType connection = CONNECTION_TYPE_REALM) : ByteBuffer(res), + WorldPacket(uint32 opcode, size_t res = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) : ByteBuffer(res), m_opcode(opcode), _connection(connection) { } WorldPacket(WorldPacket&& packet) : ByteBuffer(std::move(packet)), m_opcode(packet.m_opcode), _connection(packet._connection) @@ -56,7 +56,7 @@ class WorldPacket : public ByteBuffer WorldPacket(uint32 opcode, MessageBuffer&& buffer, ConnectionType connection) : ByteBuffer(std::move(buffer)), m_opcode(opcode), _connection(connection) { } - void Initialize(uint32 opcode, size_t newres = 200, ConnectionType connection = CONNECTION_TYPE_REALM) + void Initialize(uint32 opcode, size_t newres = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) { clear(); _storage.reserve(newres); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 18fe28344b0..3a9f5e70204 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -60,7 +60,7 @@ std::string const DefaultPlayerName = "<none>"; bool MapSessionFilter::Process(WorldPacket* packet) { - OpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; + ClientOpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; //let's check if our opcode can be really processed in Map::Update() if (opHandle->ProcessingPlace == PROCESS_INPLACE) @@ -82,7 +82,8 @@ bool MapSessionFilter::Process(WorldPacket* packet) //OR packet handler is not thread-safe! bool WorldSessionFilter::Process(WorldPacket* packet) { - OpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; + ClientOpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; + //check if packet handler is supposed to be safe if (opHandle->ProcessingPlace == PROCESS_INPLACE) return true; @@ -121,7 +122,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), @@ -130,7 +131,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) { @@ -193,9 +194,6 @@ std::string WorldSession::GetPlayerInfo() const /// Send a packet to the client void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/) { - if (!m_Socket[packet->GetConnection()]) - return; - if (packet->GetOpcode() == NULL_OPCODE) { TC_LOG_ERROR("network.opcode", "Prevented sending of NULL_OPCODE to %s", GetPlayerInfo().c_str()); @@ -207,10 +205,38 @@ void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/ return; } + ServerOpcodeHandler const* handler = opcodeTable[static_cast<OpcodeServer>(packet->GetOpcode())]; + + if (!handler) + { + TC_LOG_ERROR("network.opcode", "Prevented sending of opcode %u with non existing handler to %s", packet->GetOpcode(), GetPlayerInfo().c_str()); + return; + } + + // Default connection index defined in Opcodes.cpp table + ConnectionType conIdx = handler->ConnectionIndex; + + // Override connection index + if (packet->GetConnection() != CONNECTION_TYPE_DEFAULT) + { + if (packet->GetConnection() != CONNECTION_TYPE_INSTANCE && IsInstanceOnlyOpcode(packet->GetOpcode())) + { + TC_LOG_ERROR("network.opcode", "Prevented sending of instance only opcode %u with connection type %u to %s", packet->GetOpcode(), packet->GetConnection(), GetPlayerInfo().c_str()); + return; + } + + conIdx = packet->GetConnection(); + } + + if (!m_Socket[conIdx]) + { + TC_LOG_ERROR("network.opcode", "Prevented sending of %s to non existent socket %u to %s", GetOpcodeNameForLogging(static_cast<OpcodeServer>(packet->GetOpcode())).c_str(), conIdx, GetPlayerInfo().c_str()); + return; + } + if (!forced) { - OpcodeHandler const* handler = opcodeTable[static_cast<OpcodeServer>(packet->GetOpcode())]; - if (!handler || handler->Status == STATUS_UNHANDLED) + if (handler->Status == STATUS_UNHANDLED) { TC_LOG_ERROR("network.opcode", "Prevented sending disabled opcode %s to %s", GetOpcodeNameForLogging(static_cast<OpcodeServer>(packet->GetOpcode())).c_str(), GetPlayerInfo().c_str()); return; @@ -253,7 +279,7 @@ void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/ sScriptMgr->OnPacketSend(this, *packet); - m_Socket[packet->GetConnection()]->SendPacket(*packet); + m_Socket[conIdx]->SendPacket(*packet); } /// Add an incoming packet to the queue @@ -311,7 +337,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) if (!AntiDOS.EvaluateOpcode(*packet, currentTime)) KickPlayer(); - OpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; + ClientOpcodeHandler const* opHandle = opcodeTable[static_cast<OpcodeClient>(packet->GetOpcode())]; try { switch (opHandle->Status) @@ -695,7 +721,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; @@ -718,20 +744,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); } @@ -744,38 +770,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() { WorldPackets::Misc::TutorialFlags packet; - memcpy(packet.TutorialData, m_Tutorials, sizeof(packet.TutorialData)); + 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 +810,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 b508acb604e..b95b3ce4330 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -102,20 +102,52 @@ namespace WorldPackets 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 { class QueryGuildInfo; } - + + namespace Spells + { + class SpellCastRequest; + class SetActionButton; + } + namespace Talent { class SetSpecialization; + class LearnTalent; } namespace Trade @@ -125,8 +157,22 @@ namespace WorldPackets namespace Misc { + class SetSelection; class ViolenceLevel; class TimeSyncResponse; + class TutorialSetFlag; + } + + namespace Movement + { + class ClientPlayerMovement; + class WorldPortAck; + class MoveTeleportAck; + } + + namespace NPC + { + class Hello; } namespace Query @@ -134,11 +180,14 @@ namespace WorldPackets class QueryCreature; class QueryPlayerName; class QueryPageText; + class QueryNPCText; + class DBQueryBulk; } - namespace Movement + namespace Quest { - class ClientPlayerMovement; + class QuestGiverStatusQuery; + class QuestGiverStatusMultipleQuery; } } @@ -161,6 +210,41 @@ enum AccountDataType #define REGISTERED_ADDON_PREFIX_SOFTCAP 64 +enum TutorialAction +{ + TUTORIAL_ACTION_UPDATE = 0, + TUTORIAL_ACTION_CLEAR = 1, + TUTORIAL_ACTION_RESET = 2 +}; + +/* +enum Tutorials +{ + 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 + struct AccountData { time_t Time = 0; @@ -302,7 +386,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; @@ -377,21 +463,21 @@ class WorldSession bool CheckStableMaster(ObjectGuid guid); // Account Data - AccountData const* GetAccountData(AccountDataType type) const { 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 @@ -547,7 +633,7 @@ class WorldSession // Knockback void HandleMoveKnockBackAck(WorldPacket& recvPacket); - void HandleMoveTeleportAck(WorldPacket& recvPacket); + void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet); void HandleForceSpeedChangeAck(WorldPacket& recvData); void HandleSetCollisionHeightAck(WorldPacket& recvPacket); @@ -575,7 +661,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); @@ -597,21 +683,20 @@ class WorldSession void HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet); void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request); - void HandleSetActionButtonOpcode(WorldPacket& recvPacket); + void HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet); void HandleGameObjectUseOpcode(WorldPacket& recPacket); void HandleMeetingStoneInfo(WorldPacket& recPacket); void HandleGameobjectReportUse(WorldPacket& recvPacket); 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); @@ -706,16 +791,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); @@ -770,7 +855,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); @@ -786,20 +871,20 @@ class WorldSession void HandleUseItemOpcode(WorldPacket& recvPacket); void HandleOpenItemOpcode(WorldPacket& recvPacket); - void HandleCastSpellOpcode(WorldPacket& recvPacket); + void HandleCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest); void HandleCancelCastOpcode(WorldPacket& recvPacket); void HandleCancelAuraOpcode(WorldPacket& recvPacket); void HandleCancelGrowthAuraOpcode(WorldPacket& recvPacket); void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket); - void HandleLearnTalentOpcode(WorldPacket& recvPacket); + void HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet); 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); @@ -815,13 +900,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); @@ -833,9 +926,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); @@ -850,7 +943,6 @@ 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); @@ -859,9 +951,7 @@ class WorldSession 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); @@ -873,7 +963,7 @@ class WorldSession void HandlePetRename(WorldPacket& recvData); void HandlePetCancelAuraOpcode(WorldPacket& recvPacket); void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket); - void HandlePetCastSpellOpcode(WorldPacket& recvPacket); + void HandlePetCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest); void HandlePetLearnTalent(WorldPacket& recvPacket); void HandleLearnPreviewTalentsPet(WorldPacket& recvPacket); @@ -1046,7 +1136,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); @@ -1056,7 +1146,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); @@ -1141,7 +1230,7 @@ class WorldSession ObjectGuid::LowType m_GUIDLow; // set logined or recently logout player (while m_playerRecentlyLogout set) Player* _player; - std::shared_ptr<WorldSocket> m_Socket[2]; + std::shared_ptr<WorldSocket> m_Socket[MAX_CONNECTION_TYPES]; std::string m_Address; // Current Remote Address // std::string m_LAddress; // Last Attempted Remote Adress - we can not set attempted ip for a non-existing session! @@ -1165,9 +1254,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 aa1426d5fd2..7f4b2cc906e 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -55,8 +55,8 @@ uint32 const SizeOfClientHeader[2][2] = uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint32), sizeof(uint32) }; WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), - _type(CONNECTION_TYPE_REALM), _authSeed(rand32()), - _OverSpeedPings(0), _worldSession(nullptr), _initialized(false) + _type(CONNECTION_TYPE_REALM), _authSeed(rand32()), _OverSpeedPings(0), + _worldSession(nullptr), _compressionStream(nullptr), _initialized(false) { _headerBuffer.Resize(SizeOfClientHeader[0][0]); } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 628e4e0721d..e75a3424c2f 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -23,14 +23,12 @@ enum AURA_FLAGS { AFLAG_NONE = 0x00, - AFLAG_EFF_INDEX_0 = 0x01, - AFLAG_EFF_INDEX_1 = 0x02, - AFLAG_EFF_INDEX_2 = 0x04, - AFLAG_CASTER = 0x08, - AFLAG_POSITIVE = 0x10, - AFLAG_DURATION = 0x20, - AFLAG_ANY_EFFECT_AMOUNT_SENT = 0x40, // used with AFLAG_EFF_INDEX_0/1/2 - AFLAG_NEGATIVE = 0x80 + AFLAG_NOCASTER = 0x01, + AFLAG_POSITIVE = 0x02, + AFLAG_DURATION = 0x04, + AFLAG_SCALABLE = 0x08, + AFLAG_NEGATIVE = 0x10, + AFLAG_UNK20 = 0x20 }; // these are modes, in which aura effect handler may be called @@ -430,7 +428,114 @@ enum AuraType SPELL_AURA_368 = 368, // Not used in 4.3.4 SPELL_AURA_ENABLE_POWER_BAR_TIMER = 369, SPELL_AURA_SET_FAIR_FAR_CLIP = 370, // Overrides client's View Distance setting to max("Fair", current_setting) - TOTAL_AURAS = 371 // 4.3.4 + SPELL_AURA_371 = 371, + SPELL_AURA_372 = 372, + SPELL_AURA_373 = 373, + SPELL_AURA_374 = 374, + SPELL_AURA_375 = 375, + SPELL_AURA_376 = 376, + SPELL_AURA_377 = 377, + SPELL_AURA_378 = 378, + SPELL_AURA_379 = 379, + SPELL_AURA_380 = 380, + SPELL_AURA_381 = 381, + SPELL_AURA_382 = 382, + SPELL_AURA_383 = 383, + SPELL_AURA_384 = 384, + SPELL_AURA_385 = 385, + SPELL_AURA_386 = 386, + SPELL_AURA_387 = 387, + SPELL_AURA_388 = 388, + SPELL_AURA_389 = 389, + SPELL_AURA_390 = 390, + SPELL_AURA_391 = 391, + SPELL_AURA_392 = 392, + SPELL_AURA_393 = 393, + SPELL_AURA_394 = 394, + SPELL_AURA_395 = 395, + SPELL_AURA_396 = 396, + SPELL_AURA_397 = 397, + SPELL_AURA_398 = 398, + SPELL_AURA_399 = 399, + SPELL_AURA_400 = 400, + SPELL_AURA_401 = 401, + SPELL_AURA_402 = 402, + SPELL_AURA_403 = 403, + SPELL_AURA_404 = 404, + SPELL_AURA_405 = 405, + SPELL_AURA_406 = 406, + SPELL_AURA_407 = 407, + SPELL_AURA_408 = 408, + SPELL_AURA_409 = 409, + SPELL_AURA_410 = 410, + SPELL_AURA_411 = 411, + SPELL_AURA_412 = 412, + SPELL_AURA_413 = 413, + SPELL_AURA_414 = 414, + SPELL_AURA_415 = 415, + SPELL_AURA_416 = 416, + SPELL_AURA_417 = 417, + SPELL_AURA_418 = 418, + SPELL_AURA_419 = 419, + SPELL_AURA_420 = 420, + SPELL_AURA_421 = 421, + SPELL_AURA_422 = 422, + SPELL_AURA_423 = 423, + SPELL_AURA_424 = 424, + SPELL_AURA_425 = 425, + SPELL_AURA_426 = 426, + SPELL_AURA_427 = 427, + SPELL_AURA_428 = 428, + SPELL_AURA_429 = 429, + SPELL_AURA_430 = 430, + SPELL_AURA_431 = 431, + SPELL_AURA_432 = 432, + SPELL_AURA_433 = 433, + SPELL_AURA_434 = 434, + SPELL_AURA_435 = 435, + SPELL_AURA_436 = 436, + SPELL_AURA_437 = 437, + SPELL_AURA_438 = 438, + SPELL_AURA_439 = 439, + SPELL_AURA_440 = 440, + SPELL_AURA_441 = 441, + SPELL_AURA_442 = 442, + SPELL_AURA_443 = 443, + SPELL_AURA_444 = 444, + SPELL_AURA_445 = 445, + SPELL_AURA_446 = 446, + SPELL_AURA_447 = 447, + SPELL_AURA_448 = 448, + SPELL_AURA_449 = 449, + SPELL_AURA_450 = 450, + SPELL_AURA_451 = 451, + SPELL_AURA_452 = 452, + SPELL_AURA_453 = 453, + SPELL_AURA_454 = 454, + SPELL_AURA_455 = 455, + SPELL_AURA_456 = 456, + SPELL_AURA_457 = 457, + SPELL_AURA_458 = 458, + SPELL_AURA_459 = 459, + SPELL_AURA_460 = 460, + SPELL_AURA_461 = 461, + SPELL_AURA_462 = 462, + SPELL_AURA_463 = 463, + SPELL_AURA_464 = 464, + SPELL_AURA_465 = 465, + SPELL_AURA_466 = 466, + SPELL_AURA_467 = 467, + SPELL_AURA_468 = 468, + SPELL_AURA_469 = 469, + SPELL_AURA_471 = 471, + SPELL_AURA_472 = 472, + SPELL_AURA_473 = 473, + SPELL_AURA_474 = 474, + SPELL_AURA_475 = 475, + SPELL_AURA_476 = 476, + SPELL_AURA_477 = 477, + SPELL_AURA_478 = 478, + TOTAL_AURAS = 479 // 4.3.4 }; enum AuraObjectType diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index c55c92d296e..88cb4c942b9 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -429,11 +429,119 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleUnused, //368 unused (4.3.4) &AuraEffect::HandleNULL, //369 SPELL_AURA_ENABLE_POWER_BAR_TIMER &AuraEffect::HandleNULL, //370 SPELL_AURA_SET_FAIR_FAR_CLIP + &AuraEffect::HandleNULL, //371 + &AuraEffect::HandleNULL, //372 + &AuraEffect::HandleNULL, //373 + &AuraEffect::HandleNULL, //374 + &AuraEffect::HandleNULL, //375 + &AuraEffect::HandleNULL, //376 + &AuraEffect::HandleNULL, //377 + &AuraEffect::HandleNULL, //378 + &AuraEffect::HandleNULL, //379 + &AuraEffect::HandleNULL, //380 + &AuraEffect::HandleNULL, //381 + &AuraEffect::HandleNULL, //382 + &AuraEffect::HandleNULL, //383 + &AuraEffect::HandleNULL, //384 + &AuraEffect::HandleNULL, //385 + &AuraEffect::HandleNULL, //386 + &AuraEffect::HandleNULL, //387 + &AuraEffect::HandleNULL, //388 + &AuraEffect::HandleNULL, //389 + &AuraEffect::HandleNULL, //390 + &AuraEffect::HandleNULL, //391 + &AuraEffect::HandleNULL, //392 + &AuraEffect::HandleNULL, //393 + &AuraEffect::HandleNULL, //394 + &AuraEffect::HandleNULL, //395 + &AuraEffect::HandleNULL, //396 + &AuraEffect::HandleNULL, //397 + &AuraEffect::HandleNULL, //398 + &AuraEffect::HandleNULL, //399 + &AuraEffect::HandleNULL, //400 + &AuraEffect::HandleNULL, //401 + &AuraEffect::HandleNULL, //402 + &AuraEffect::HandleNULL, //403 + &AuraEffect::HandleNULL, //404 + &AuraEffect::HandleNULL, //405 + &AuraEffect::HandleNULL, //406 + &AuraEffect::HandleNULL, //407 + &AuraEffect::HandleNULL, //408 + &AuraEffect::HandleNULL, //409 + &AuraEffect::HandleNULL, //410 + &AuraEffect::HandleNULL, //411 + &AuraEffect::HandleNULL, //412 + &AuraEffect::HandleNULL, //413 + &AuraEffect::HandleNULL, //414 + &AuraEffect::HandleNULL, //415 + &AuraEffect::HandleNULL, //416 + &AuraEffect::HandleNULL, //417 + &AuraEffect::HandleNULL, //418 + &AuraEffect::HandleNULL, //419 + &AuraEffect::HandleNULL, //420 + &AuraEffect::HandleNULL, //421 + &AuraEffect::HandleNULL, //422 + &AuraEffect::HandleNULL, //423 + &AuraEffect::HandleNULL, //424 + &AuraEffect::HandleNULL, //425 + &AuraEffect::HandleNULL, //426 + &AuraEffect::HandleNULL, //427 + &AuraEffect::HandleNULL, //428 + &AuraEffect::HandleNULL, //429 + &AuraEffect::HandleNULL, //430 + &AuraEffect::HandleNULL, //431 + &AuraEffect::HandleNULL, //432 + &AuraEffect::HandleNULL, //433 + &AuraEffect::HandleNULL, //434 + &AuraEffect::HandleNULL, //435 + &AuraEffect::HandleNULL, //436 + &AuraEffect::HandleNULL, //437 + &AuraEffect::HandleNULL, //438 + &AuraEffect::HandleNULL, //439 + &AuraEffect::HandleNULL, //440 + &AuraEffect::HandleNULL, //441 + &AuraEffect::HandleNULL, //442 + &AuraEffect::HandleNULL, //443 + &AuraEffect::HandleNULL, //444 + &AuraEffect::HandleNULL, //445 + &AuraEffect::HandleNULL, //446 + &AuraEffect::HandleNULL, //447 + &AuraEffect::HandleNULL, //448 + &AuraEffect::HandleNULL, //449 + &AuraEffect::HandleNULL, //450 + &AuraEffect::HandleNULL, //451 + &AuraEffect::HandleNULL, //452 + &AuraEffect::HandleNULL, //453 + &AuraEffect::HandleNULL, //454 + &AuraEffect::HandleNULL, //455 + &AuraEffect::HandleNULL, //456 + &AuraEffect::HandleNULL, //457 + &AuraEffect::HandleNULL, //458 + &AuraEffect::HandleNULL, //459 + &AuraEffect::HandleNULL, //460 + &AuraEffect::HandleNULL, //461 + &AuraEffect::HandleNULL, //462 + &AuraEffect::HandleNULL, //463 + &AuraEffect::HandleNULL, //464 + &AuraEffect::HandleNULL, //465 + &AuraEffect::HandleNULL, //466 + &AuraEffect::HandleNULL, //467 + &AuraEffect::HandleNULL, //468 + &AuraEffect::HandleNULL, //469 + &AuraEffect::HandleNULL, //471 + &AuraEffect::HandleNULL, //472 + &AuraEffect::HandleNULL, //473 + &AuraEffect::HandleNULL, //474 + &AuraEffect::HandleNULL, //475 + &AuraEffect::HandleNULL, //476 + &AuraEffect::HandleNULL, //477 + &AuraEffect::HandleNULL, //478 }; -AuraEffect::AuraEffect(Aura* base, uint8 effIndex, int32 *baseAmount, Unit* caster): +AuraEffect::AuraEffect(Aura* base, uint32 effIndex, int32 *baseAmount, Unit* caster) : m_base(base), m_spellInfo(base->GetSpellInfo()), -m_baseAmount(baseAmount ? *baseAmount : m_spellInfo->Effects[effIndex].BasePoints), +_effectInfo(base->GetSpellEffectInfo(effIndex)), +m_baseAmount(baseAmount ? *baseAmount : base->GetSpellEffectInfo(effIndex)->BasePoints), m_damage(0), m_critChance(0.0f), m_donePct(1.0f), m_spellmod(NULL), m_periodicTimer(0), m_tickNumber(0), m_effIndex(effIndex), m_canBeRecalculated(true), m_isPeriodic(false) @@ -476,10 +584,10 @@ int32 AuraEffect::CalculateAmount(Unit* caster) // default amount calculation int32 amount = 0; - if (!(m_spellInfo->AttributesEx8 & SPELL_ATTR8_MASTERY_SPECIALIZATION) || G3D::fuzzyEq(m_spellInfo->Effects[m_effIndex].BonusCoefficient, 0.0f)) - amount = m_spellInfo->Effects[m_effIndex].CalcValue(caster, &m_baseAmount, GetBase()->GetOwner()->ToUnit()); + if (!(m_spellInfo->AttributesEx8 & SPELL_ATTR8_MASTERY_SPECIALIZATION) || G3D::fuzzyEq(GetSpellEffectInfo()->BonusCoefficient, 0.0f)) + amount = GetSpellEffectInfo()->CalcValue(caster, &m_baseAmount, GetBase()->GetOwner()->ToUnit()); else if (caster && caster->GetTypeId() == TYPEID_PLAYER) - amount = int32(caster->GetFloatValue(PLAYER_MASTERY) * m_spellInfo->Effects[m_effIndex].BonusCoefficient); + amount = int32(caster->GetFloatValue(PLAYER_MASTERY) * GetSpellEffectInfo()->BonusCoefficient); // check item enchant aura cast if (!amount && caster) @@ -604,7 +712,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster) void AuraEffect::CalculatePeriodic(Unit* caster, bool resetPeriodicTimer /*= true*/, bool load /*= false*/) { - m_period = m_spellInfo->Effects[m_effIndex].ApplyAuraPeriod; + m_period = GetSpellEffectInfo()->ApplyAuraPeriod; // prepare periodics switch (GetAuraType()) @@ -694,7 +802,7 @@ void AuraEffect::CalculateSpellMod() m_spellmod->type = SpellModType(uint32(GetAuraType())); // SpellModType value == spell aura types m_spellmod->spellId = GetId(); - m_spellmod->mask = GetSpellInfo()->Effects[GetEffIndex()].SpellClassMask; + m_spellmod->mask = GetSpellEffectInfo()->SpellClassMask; m_spellmod->charges = GetBase()->GetCharges(); } m_spellmod->value = GetAmount(); @@ -1021,7 +1129,7 @@ bool AuraEffect::IsAffectingSpell(SpellInfo const* spell) const return false; // Check EffectClassMask - if (m_spellInfo->Effects[m_effIndex].SpellClassMask & spell->SpellFamilyFlags) + if (GetSpellEffectInfo()->SpellClassMask & spell->SpellFamilyFlags) return true; return false; } @@ -1091,6 +1199,7 @@ void AuraEffect::HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) switch (GetAuraType()) { case SPELL_AURA_PROC_TRIGGER_SPELL: + case SPELL_AURA_PROC_TRIGGER_SPELL_2: HandleProcTriggerSpellAuraProc(aurApp, eventInfo); break; case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE: @@ -1105,6 +1214,9 @@ void AuraEffect::HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE: HandleRaidProcFromChargeWithValueAuraProc(aurApp, eventInfo); break; + case SPELL_AURA_PROC_ON_POWER_AMOUNT: + HandleProcTriggerSpellOnPowerAmountAuraProc(aurApp, eventInfo); + break; default: break; } @@ -1114,7 +1226,7 @@ void AuraEffect::HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) void AuraEffect::CleanupTriggeredSpells(Unit* target) { - uint32 tSpellId = m_spellInfo->Effects[GetEffIndex()].TriggerSpell; + uint32 tSpellId = GetSpellEffectInfo()->TriggerSpell; if (!tSpellId) return; @@ -1127,8 +1239,8 @@ void AuraEffect::CleanupTriggeredSpells(Unit* target) // needed for spell 43680, maybe others /// @todo is there a spell flag, which can solve this in a more sophisticated way? - if (m_spellInfo->Effects[GetEffIndex()].ApplyAuraName == SPELL_AURA_PERIODIC_TRIGGER_SPELL && - uint32(m_spellInfo->GetDuration()) == m_spellInfo->Effects[GetEffIndex()].ApplyAuraPeriod) + if (GetSpellEffectInfo()->ApplyAuraName == SPELL_AURA_PERIODIC_TRIGGER_SPELL && + uint32(m_spellInfo->GetDuration()) == GetSpellEffectInfo()->ApplyAuraPeriod) return; target->RemoveAurasDueToSpell(tSpellId, GetCasterGUID()); @@ -1268,30 +1380,6 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const target->CastSpell(target, 24932, true, NULL, this); } - // Heart of the Wild - if (AuraEffect const* heartOfTheWild = target->GetAuraEffectOfRankedSpell(17003, EFFECT_0)) - { - uint32 heartOfTheWildSpellId = 0; - int32 heartOfTheWildAmount = 0; - - switch (GetMiscValue()) - { - case FORM_CAT: - heartOfTheWildSpellId = 24900; - heartOfTheWildAmount = heartOfTheWild->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - break; - case FORM_BEAR: - heartOfTheWildSpellId = 24899; - heartOfTheWildAmount = heartOfTheWild->GetSpellInfo()->Effects[EFFECT_2].CalcValue(); - break; - default: - break; - } - - if (heartOfTheWildSpellId) - target->CastCustomSpell(target, heartOfTheWildSpellId, &heartOfTheWildAmount, NULL, NULL, true, NULL, this); - } - switch (GetMiscValue()) { case FORM_CAT: @@ -1327,12 +1415,6 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const int32 bp = aurEff->GetAmount(); target->CastCustomSpell(target, 48418, &bp, NULL, NULL, true); } - // Survival of the Fittest - if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DRUID, 961, EFFECT_0)) - { - int32 bp = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()); - target->CastCustomSpell(target, 62069, &bp, NULL, NULL, true, 0, this); - } break; case FORM_MOONKIN: // Master Shapeshifter - Moonkin @@ -2594,9 +2676,8 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo vehicleId = creatureInfo->VehicleId; //some spell has one aura of mount and one of vehicle - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (GetSpellInfo()->Effects[i].Effect == SPELL_EFFECT_SUMMON - && GetSpellInfo()->Effects[i].MiscValue == GetMiscValue()) + for (SpellEffectInfo const* effect : GetBase()->GetSpellEffectInfos()) + if (effect && effect->Effect == SPELL_EFFECT_SUMMON && effect->MiscValue == GetMiscValue()) displayId = 0; } @@ -4598,8 +4679,9 @@ void AuraEffect::HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mod flag128 mask; Unit::AuraEffectList const& noReagent = target->GetAuraEffectsByType(SPELL_AURA_NO_REAGENT_USE); - for (Unit::AuraEffectList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i) - mask |= (*i)->m_spellInfo->Effects[(*i)->m_effIndex].SpellClassMask; + for (Unit::AuraEffectList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i) + if (SpellEffectInfo const* effect = (*i)->GetSpellEffectInfo()) + mask |= effect->SpellClassMask; target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1 , mask[0]); target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1+1, mask[1]); @@ -5021,11 +5103,11 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod if (GetAmount() <= 0) return; - if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0) + if (GetSpellEffectInfo()->ItemType == 0) return; // Soul Shard - if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265) + if (GetSpellEffectInfo()->ItemType == 6265) { // Soul Shard only from units that grant XP or honor if (!plCaster->isHonorOrXPTarget(target) || @@ -5038,16 +5120,16 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod uint32 count = m_amount; ItemPosCountVec dest; - InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellInfo()->Effects[m_effIndex].ItemType, count, &noSpaceForCount); + InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellEffectInfo()->ItemType, count, &noSpaceForCount); if (msg != EQUIP_ERR_OK) { count-=noSpaceForCount; - plCaster->SendEquipError(msg, NULL, NULL, GetSpellInfo()->Effects[m_effIndex].ItemType); + plCaster->SendEquipError(msg, NULL, NULL, GetSpellEffectInfo()->ItemType); if (count == 0) return; } - Item* newitem = plCaster->StoreNewItem(dest, GetSpellInfo()->Effects[m_effIndex].ItemType, true); + Item* newitem = plCaster->StoreNewItem(dest, GetSpellEffectInfo()->ItemType, true); if (!newitem) { plCaster->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); @@ -5186,19 +5268,19 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo { Unit* target = aurApp->GetTarget(); - uint32 triggeredSpellId = sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->Effects[m_effIndex].TriggerSpell, target); + uint32 triggeredSpellId = GetSpellEffectInfo()->TriggerSpell; SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggeredSpellId); if (!triggeredSpellInfo) return; + Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, target->GetMap()->GetDifficulty()) ? GetCaster() : target; + if (!caster) + return; + if (mode & AURA_EFFECT_HANDLE_REAL) { if (apply) { - Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCaster() : target; - - if (!caster) - return; // If amount avalible cast with basepoints (Crypt Fever for example) if (GetAmount()) caster->CastCustomSpell(target, triggeredSpellId, &m_amount, NULL, NULL, true, NULL, this); @@ -5207,13 +5289,13 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo } else { - ObjectGuid casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID(); + ObjectGuid casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, caster->GetMap()->GetDifficulty()) ? GetCasterGUID() : target->GetGUID(); target->RemoveAura(triggeredSpellId, casterGUID, 0, aurApp->GetRemoveMode()); } } else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply) { - ObjectGuid casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID(); + ObjectGuid casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, caster->GetMap()->GetDifficulty()) ? GetCasterGUID() : target->GetGUID(); // change the stack amount to be equal to stack amount of our aura if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID)) triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount()); @@ -5384,7 +5466,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const } case 62292: // Blaze (Pool of Tar) // should we use custom damage? - target->CastSpell((Unit*)NULL, m_spellInfo->Effects[m_effIndex].TriggerSpell, true); + target->CastSpell((Unit*)NULL, GetSpellEffectInfo()->TriggerSpell, true); break; case 62399: // Overload Circuit if (target->GetMap()->IsDungeon() && int(target->GetAppliedAuras().count(62399)) >= (target->GetMap()->IsHeroic() ? 4 : 2)) @@ -5408,7 +5490,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const // Mirror Image if (GetId() == 55342) // Set name of summons to name of caster - target->CastSpell((Unit*)NULL, m_spellInfo->Effects[m_effIndex].TriggerSpell, true); + target->CastSpell((Unit*)NULL, GetSpellEffectInfo()->TriggerSpell, true); break; } case SPELLFAMILY_DRUID: @@ -5501,7 +5583,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) const { // generic casting code with custom spells and target/caster customs - uint32 triggerSpellId = GetSpellInfo()->Effects[GetEffIndex()].TriggerSpell; + uint32 triggerSpellId = GetSpellEffectInfo()->TriggerSpell; SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId); SpellInfo const* auraSpellInfo = GetSpellInfo(); @@ -5765,7 +5847,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) if (triggeredSpellInfo) { - if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) + if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, target->GetMap()->GetDifficulty()) ? caster : target) { triggerCaster->CastSpell(target, triggeredSpellInfo, true, NULL, this); TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id); @@ -5782,10 +5864,10 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* caster) const { - uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell; + uint32 triggerSpellId = GetSpellEffectInfo()->TriggerSpell; if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) { - if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) + if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, target->GetMap()->GetDifficulty()) ? caster : target) { int32 basepoints = GetAmount(); triggerCaster->CastCustomSpell(target, triggerSpellId, &basepoints, &basepoints, &basepoints, true, nullptr, this); @@ -5808,7 +5890,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const } // Consecrate ticks can miss and will not show up in the combat log - if (GetSpellInfo()->Effects[GetEffIndex()].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && + if (GetSpellEffectInfo()->Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && caster->SpellHitResult(target, GetSpellInfo(), false) != SPELL_MISS_NONE) return; @@ -5827,11 +5909,14 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const break; case 38772: // Grievous Wound { - uint32 percent = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); - if (!target->HealthBelowPct(percent)) + if (SpellEffectInfo const* effect = GetSpellInfo()->GetEffect(DIFFICULTY_NONE, EFFECT_1)) { - target->RemoveAurasDueToSpell(GetSpellInfo()->Id); - return; + uint32 percent = effect->CalcValue(caster); + if (!target->HealthBelowPct(percent)) + { + target->RemoveAurasDueToSpell(GetSpellInfo()->Id); + return; + } } break; } @@ -5843,7 +5928,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); // AOE spells are not affected by the new periodic system. - bool isAreaAura = m_spellInfo->Effects[m_effIndex].IsAreaAuraEffect() || m_spellInfo->Effects[m_effIndex].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); + bool isAreaAura = GetSpellEffectInfo()->IsAreaAuraEffect() || GetSpellEffectInfo()->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); // ignore negative values (can be result apply spellmods to aura damage uint32 damage = isAreaAura ? std::max(GetAmount(), 0) : m_damage; @@ -5854,11 +5939,11 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE) { if (isAreaAura) - damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT); - damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()); // Calculate armor mitigation - if (Unit::IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) + if (caster->IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) { uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, GetSpellInfo()); cleanDamage.mitigated_damage += damage - damageReductedArmor; @@ -5902,7 +5987,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const damage = uint32(target->CountPctFromMaxHealth(damage)); if (!(m_spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) - if (m_spellInfo->Effects[m_effIndex].IsTargetingArea() || isAreaAura) + if (GetSpellEffectInfo()->IsTargetingArea() || isAreaAura) { damage = int32(float(damage) * target->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask)); if (caster->GetTypeId() != TYPEID_PLAYER) @@ -5950,6 +6035,18 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); } +bool AuraEffect::IsAreaAuraEffect() const +{ + if (_effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || + _effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID || + _effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_FRIEND || + _effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_ENEMY || + _effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_PET || + _effectInfo->Effect == SPELL_EFFECT_APPLY_AREA_AURA_OWNER) + return true; + return false; +} + void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const { if (!caster || !target->IsAlive()) @@ -5961,7 +6058,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c return; } - if (GetSpellInfo()->Effects[GetEffIndex()].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && + if (GetSpellEffectInfo()->Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && caster->SpellHitResult(target, GetSpellInfo(), false) != SPELL_MISS_NONE) return; @@ -5969,7 +6066,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c uint32 resist = 0; CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); - bool isAreaAura = m_spellInfo->Effects[m_effIndex].IsAreaAuraEffect() || m_spellInfo->Effects[m_effIndex].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); + bool isAreaAura = GetSpellEffectInfo()->IsAreaAuraEffect() || GetSpellEffectInfo()->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); // ignore negative values (can be result apply spellmods to aura damage uint32 damage = isAreaAura ? std::max(GetAmount(), 0) : m_damage; @@ -5977,12 +6074,12 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c { // Script Hook For HandlePeriodicDamageAurasTick -- Allow scripts to change the Damage pre class mitigation calculations sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); - damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT); + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT); } - damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()); // Calculate armor mitigation - if (Unit::IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) + if (caster->IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) { uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, GetSpellInfo()); cleanDamage.mitigated_damage += damage - damageReductedArmor; @@ -5990,7 +6087,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c } if (!(m_spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) - if (m_spellInfo->Effects[m_effIndex].IsTargetingArea() || isAreaAura) + if (GetSpellEffectInfo()->IsTargetingArea() || isAreaAura) { damage = int32(float(damage) * target->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask)); if (caster->GetTypeId() != TYPEID_PLAYER) @@ -6032,10 +6129,10 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c int32 new_damage = caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), false); if (caster->IsAlive()) { - float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); + float gainMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster); - uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetBase()->GetStackAmount())); - heal = uint32(caster->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, GetBase()->GetStackAmount())); + uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount())); + heal = uint32(caster->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount())); int32 gain = caster->HealBySpell(caster, GetSpellInfo(), heal); caster->getHostileRefManager().threatAssist(caster, gain * 0.5f, GetSpellInfo()); @@ -6063,7 +6160,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) caster->ModifyHealth(-(int32)damage); TC_LOG_DEBUG("spells", "PeriodicTick: donator %u target %u damage %u.", caster->GetEntry(), target->GetEntry(), damage); - float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); + float gainMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster); damage = int32(damage * gainMultiplier); @@ -6089,7 +6186,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const if (GetBase()->IsPermanent() && target->IsFullHealth()) return; - bool isAreaAura = m_spellInfo->Effects[m_effIndex].IsAreaAuraEffect() || m_spellInfo->Effects[m_effIndex].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); + bool isAreaAura = GetSpellEffectInfo()->IsAreaAuraEffect() || GetSpellEffectInfo()->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA); // ignore negative values (can be result apply spellmods to aura damage int32 damage = isAreaAura ? std::max(GetAmount(), 0) : m_damage; @@ -6131,8 +6228,8 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const damage += addition; } if (isAreaAura) - damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()) * caster->SpellHealingPctDone(target, m_spellInfo); - damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); + damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()) * caster->SpellHealingPctDone(target, m_spellInfo); + damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), GetBase()->GetStackAmount()); } bool crit = false; @@ -6196,7 +6293,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con return; } - if (GetSpellInfo()->Effects[GetEffIndex()].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && + if (GetSpellEffectInfo()->Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA && caster->SpellHitResult(target, GetSpellInfo(), false) != SPELL_MISS_NONE) return; @@ -6219,7 +6316,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con int32 drainedAmount = -target->ModifyPower(powerType, -drainAmount); - float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); + float gainMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster); SpellPeriodicAuraLogInfo pInfo(this, drainedAmount, 0, 0, 0, gainMultiplier, false); target->SendPeriodicAuraLog(&pInfo); @@ -6336,7 +6433,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con uint32 gain = uint32(-target->ModifyPower(powerType, -damage)); - float dmgMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); + float dmgMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster); SpellInfo const* spellProto = GetSpellInfo(); // maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG @@ -6365,7 +6462,7 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve Unit* triggerCaster = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); - uint32 triggerSpellId = GetSpellInfo()->Effects[GetEffIndex()].TriggerSpell; + uint32 triggerSpellId = GetSpellEffectInfo()->TriggerSpell; if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) { TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId()); @@ -6380,7 +6477,7 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp Unit* triggerCaster = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); - uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell; + uint32 triggerSpellId = GetSpellEffectInfo()->TriggerSpell; if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) { int32 basepoints0 = GetAmount(); @@ -6396,8 +6493,8 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv Unit* target = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); SpellNonMeleeDamage damageInfo(target, triggerTarget, GetId(), GetSpellInfo()->SchoolMask); - uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE); - damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); + uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE, GetSpellEffectInfo()); + damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE, GetSpellEffectInfo()); target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo()); target->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); target->SendSpellNonMeleeDamageLog(&damageInfo); @@ -6438,7 +6535,7 @@ void AuraEffect::HandleRaidProcFromChargeAuraProc(AuraApplication* aurApp, ProcE { if (Unit* caster = GetCaster()) { - float radius = GetSpellInfo()->Effects[GetEffIndex()].CalcRadius(caster); + float radius = GetSpellEffectInfo()->CalcRadius(caster); if (Unit* triggerTarget = target->GetNextRandomRaidMemberOrPet(radius)) { @@ -6479,7 +6576,7 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA { if (Unit* caster = GetCaster()) { - float radius = GetSpellInfo()->Effects[GetEffIndex()].CalcRadius(caster); + float radius = GetSpellEffectInfo()->CalcRadius(caster); if (Unit* triggerTarget = target->GetNextRandomRaidMemberOrPet(radius)) { @@ -6494,6 +6591,35 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA target->CastCustomSpell(target, triggerSpellId, &value, NULL, NULL, true, NULL, this, GetCasterGUID()); } +void AuraEffect::HandleProcTriggerSpellOnPowerAmountAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) +{ + // Power amount required to proc the spell + int32 powerAmountRequired = GetAmount(); + // Power type required to proc + Powers powerRequired = Powers(_effectInfo->MiscValue); + + if (!powerRequired || !powerAmountRequired) + { + TC_LOG_ERROR("spells", "AuraEffect::HandleProcTriggerSpellOnPowerAmountAuraProc: Spell %u have 0 PowerAmountRequired in EffectAmount[%d] or 0 PowerRequired in EffectMiscValue", GetId(), GetEffIndex()); + return /*false*/; + } + + Unit* triggerCaster = aurApp->GetTarget(); + Unit* triggerTarget = eventInfo.GetProcTarget(); + + if (triggerCaster->GetPower(powerRequired) != powerAmountRequired) + return /*false*/; + + uint32 triggerSpellId = _effectInfo->TriggerSpell; + if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) + { + TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellOnPowerAmountAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId()); + triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo, true, nullptr, this); + } + else + TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellOnPowerAmountAuraProc: Could not trigger spell %u from aura %u proc, because the spell does not have an entry in Spell.dbc.", triggerSpellId, GetId()); +} + void AuraEffect::HandleAuraForceWeather(AuraApplication const* aurApp, uint8 mode, bool apply) const { if (!(mode & AURA_EFFECT_HANDLE_REAL)) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 22571f4851e..ebfeece4c7c 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -29,13 +29,13 @@ typedef void(AuraEffect::*pAuraEffectHandler)(AuraApplication const* aurApp, uin class AuraEffect { - friend void Aura::_InitEffects(uint8 effMask, Unit* caster, int32 *baseAmount); - friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8 effMask, Unit* caster, int32* baseAmount, Item* castItem, ObjectGuid casterGUID); + friend void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount); + friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); friend Aura::~Aura(); - private: - ~AuraEffect(); - explicit AuraEffect(Aura* base, uint8 effIndex, int32 *baseAmount, Unit* caster); + public: + ~AuraEffect(); + AuraEffect(Aura* base, uint32 effIndex, int32 *baseAmount, Unit* caster); Unit* GetCaster() const { return GetBase()->GetCaster(); } ObjectGuid GetCasterGUID() const { return GetBase()->GetCasterGUID(); } Aura* GetBase() const { return m_base; } @@ -49,9 +49,9 @@ class AuraEffect int32 GetBaseAmount() const { return m_baseAmount; } int32 GetPeriod() const { return m_period; } - int32 GetMiscValueB() const { return m_spellInfo->Effects[m_effIndex].MiscValueB; } - int32 GetMiscValue() const { return m_spellInfo->Effects[m_effIndex].MiscValue; } - AuraType GetAuraType() const { return (AuraType)m_spellInfo->Effects[m_effIndex].ApplyAuraName; } + int32 GetMiscValueB() const { return GetSpellEffectInfo()->MiscValueB; } + int32 GetMiscValue() const { return GetSpellEffectInfo()->MiscValue; } + AuraType GetAuraType() const { return (AuraType)GetSpellEffectInfo()->ApplyAuraName; } int32 GetAmount() const { return m_amount; } void SetAmount(int32 amount) { m_amount = amount; m_canBeRecalculated = false;} @@ -87,7 +87,7 @@ class AuraEffect bool IsPeriodic() const { return m_isPeriodic; } void SetPeriodic(bool isPeriodic) { m_isPeriodic = isPeriodic; } bool IsAffectingSpell(SpellInfo const* spell) const; - bool HasSpellClassMask() const { return m_spellInfo->Effects[m_effIndex].SpellClassMask; } + bool HasSpellClassMask() const { return GetSpellEffectInfo()->SpellClassMask; } void SendTickImmune(Unit* target, Unit* caster) const; void PeriodicTick(AuraApplication * aurApp, Unit* caster) const; @@ -98,10 +98,18 @@ class AuraEffect // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras void HandleShapeshiftBoosts(Unit* target, bool apply) const; + + SpellEffectInfo const* GetSpellEffectInfo() const { return _effectInfo; } + + bool IsEffect() const { return _effectInfo->Effect != 0; } + bool IsEffect(SpellEffectName effectName) const { return _effectInfo->Effect == uint32(effectName); } + bool IsAreaAuraEffect() const; + private: Aura* const m_base; SpellInfo const* const m_spellInfo; + SpellEffectInfo const* _effectInfo; int32 const m_baseAmount; int32 m_amount; @@ -312,6 +320,7 @@ class AuraEffect void HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); void HandleRaidProcFromChargeAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); void HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); + void HandleProcTriggerSpellOnPowerAmountAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); }; namespace Trinity diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 67df56d892e..9037715152a 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -26,6 +26,7 @@ #include "Unit.h" #include "Spell.h" #include "SpellAuraEffects.h" +#include "SpellPackets.h" #include "DynamicObject.h" #include "ObjectAccessor.h" #include "Util.h" @@ -37,9 +38,9 @@ #include "Vehicle.h" #include "Config.h" -AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint8 effMask): +AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint32 effMask): _target(target), _base(aura), _removeMode(AURA_REMOVE_NONE), _slot(MAX_AURAS), -_flags(AFLAG_NONE), _effectsToApply(effMask), _needClientUpdate(false) +_flags(AFLAG_NONE), _effectsToApply(effMask), _needClientUpdate(false), _effectMask(0) { ASSERT(GetTarget() && GetBase()); @@ -113,19 +114,19 @@ void AuraApplication::_Remove() } } -void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) +void AuraApplication::_InitFlags(Unit* caster, uint32 effMask) { // mark as selfcast if needed - _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_CASTER : AFLAG_NONE; + _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_NONE : AFLAG_NOCASTER; // aura is cast by self or an enemy // one negative effect and we know aura is negative if (IsSelfcast() || !caster || !caster->IsFriendlyTo(GetTarget())) { bool negativeFound = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetBase()->GetSpellEffectInfos()) { - if (((1<<i) & effMask) && !GetBase()->GetSpellInfo()->IsPositiveEffect(i)) + if (effect && ((1 << effect->EffectIndex) & effMask) && !GetBase()->GetSpellInfo()->IsPositiveEffect(effect->EffectIndex)) { negativeFound = true; break; @@ -138,9 +139,9 @@ void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) else { bool positiveFound = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetBase()->GetSpellEffectInfos()) { - if (((1<<i) & effMask) && GetBase()->GetSpellInfo()->IsPositiveEffect(i)) + if (effect && ((1 << effect->EffectIndex) & effMask) && GetBase()->GetSpellInfo()->IsPositiveEffect(effect->EffectIndex)) { positiveFound = true; break; @@ -150,12 +151,17 @@ void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) } if (GetBase()->GetSpellInfo()->AttributesEx8 & SPELL_ATTR8_AURA_SEND_AMOUNT) - _flags |= AFLAG_ANY_EFFECT_AMOUNT_SENT; + _flags |= AFLAG_SCALABLE; } void AuraApplication::_HandleEffect(uint8 effIndex, bool apply) { AuraEffect* aurEff = GetBase()->GetEffect(effIndex); + if (!aurEff) + { + TC_LOG_ERROR("spells", "Aura %u has no effect at effectIndex %u but _HandleEffect was called", GetBase()->GetSpellInfo()->Id, uint32(effIndex)); + return; + } ASSERT(aurEff); ASSERT(HasEffect(effIndex) == (!apply)); ASSERT((1<<effIndex) & _effectsToApply); @@ -163,14 +169,14 @@ void AuraApplication::_HandleEffect(uint8 effIndex, bool apply) if (apply) { - ASSERT(!(_flags & (1<<effIndex))); - _flags |= 1<<effIndex; + ASSERT(!(_effectMask & (1<<effIndex))); + _effectMask |= 1<<effIndex; aurEff->HandleEffect(this, AURA_EFFECT_HANDLE_REAL, true); } else { - ASSERT(_flags & (1<<effIndex)); - _flags &= ~(1<<effIndex); + ASSERT(_effectMask & (1<<effIndex)); + _effectMask &= ~(1<<effIndex); aurEff->HandleEffect(this, AURA_EFFECT_HANDLE_REAL, false); // Remove all triggered by aura spells vs unlimited duration @@ -193,7 +199,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const Aura const* aura = GetBase(); data << uint32(aura->GetId()); - uint32 flags = _flags; + uint8 flags = _flags; if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION)) flags |= AFLAG_DURATION; data << uint16(flags); @@ -202,7 +208,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const // stack amount has priority over charges (checked on retail with spell 50262) data << uint8(aura->GetSpellInfo()->StackAmount ? aura->GetStackAmount() : aura->GetCharges()); - if (!(flags & AFLAG_CASTER)) + if (!(flags & AFLAG_NOCASTER)) data << aura->GetCasterGUID().WriteAsPacked(); if (flags & AFLAG_DURATION) @@ -211,44 +217,43 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const data << uint32(aura->GetDuration()); } - if (flags & AFLAG_ANY_EFFECT_AMOUNT_SENT) - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (AuraEffect const* eff = aura->GetEffect(i)) - if (HasEffect(i)) // Not all of aura's effects have to be applied on every target - data << int32(eff->GetAmount()); + if (flags & AFLAG_SCALABLE) + for (AuraEffect const* effect : GetBase()->GetAuraEffects()) + if (effect && HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target + data << int32(effect->GetAmount()); } void AuraApplication::ClientUpdate(bool remove) { _needClientUpdate = false; - WorldPacket data(SMSG_AURA_UPDATE); - data << GetTarget()->GetPackGUID(); - BuildUpdatePacket(data, remove); + WorldPackets::Spells::SendAuraUpdate update; + update.Init(false, GetTarget()->GetGUID(), 1); + update.BuildUpdatePacket(this, remove, GetTarget()->getLevel()); // TODO 6.x should be caster's level - _target->SendMessageToSet(&data, true); + _target->SendMessageToSet(const_cast<WorldPacket*>(update.Write()), true); } -uint8 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 avalibleEffectMask, WorldObject* owner) +uint32 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 avalibleEffectMask, WorldObject* owner) { ASSERT(spellProto); ASSERT(owner); - uint8 effMask = 0; + uint32 effMask = 0; switch (owner->GetTypeId()) { case TYPEID_UNIT: case TYPEID_PLAYER: - for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(owner->GetMap()->GetDifficulty())) { - if (spellProto->Effects[i].IsUnitOwnedAuraEffect()) - effMask |= 1 << i; + if (effect && effect->IsUnitOwnedAuraEffect()) + effMask |= 1 << effect->EffectIndex; } break; case TYPEID_DYNAMICOBJECT: - for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellProto->GetEffectsForDifficulty(owner->GetMap()->GetDifficulty())) { - if (spellProto->Effects[i].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA) - effMask |= 1 << i; + if (effect && effect->Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA) + effMask |= 1 << effect->EffectIndex; } break; default: @@ -257,7 +262,7 @@ uint8 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 avalibleE return effMask & avalibleEffectMask; } -Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, bool* refresh /*= NULL*/) +Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, bool* refresh /*= NULL*/) { ASSERT(spellproto); ASSERT(owner); @@ -265,9 +270,10 @@ Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint8 tryEffMas ASSERT(tryEffMask <= MAX_EFFECT_MASK); if (refresh) *refresh = false; - uint8 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner); + uint32 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner); if (!effMask) return NULL; + if (Aura* foundAura = owner->ToUnit()->_TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID)) { // we've here aura, which script triggered removal after modding stack amount @@ -283,7 +289,7 @@ Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint8 tryEffMas return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID); } -Aura* Aura::TryCreate(SpellInfo const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/) +Aura* Aura::TryCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/) { ASSERT(spellproto); ASSERT(owner); @@ -295,7 +301,7 @@ Aura* Aura::TryCreate(SpellInfo const* spellproto, uint8 tryEffMask, WorldObject return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID); } -Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount, Item* castItem, ObjectGuid casterGUID) +Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID) { ASSERT(effMask); ASSERT(spellproto); @@ -354,7 +360,6 @@ m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEven m_duration = m_maxDuration; m_procCharges = CalcMaxCharges(caster); m_isUsingCharges = m_procCharges != 0; - memset(m_effects, 0, sizeof(m_effects)); // m_casterLevel = cast item level/caster level, caster level should be saved to db, confirmed with sniffs } @@ -366,15 +371,27 @@ AuraScript* Aura::GetScriptByName(std::string const& scriptName) const return NULL; } -void Aura::_InitEffects(uint8 effMask, Unit* caster, int32 *baseAmount) +SpellEffectInfo const* Aura::GetSpellEffectInfo(uint32 index) const +{ + if (index >= _spelEffectInfos.size()) + return nullptr; + + return _spelEffectInfos[index]; +} + +void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount) { // shouldn't be in constructor - functions in AuraEffect::AuraEffect use polymorphism - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + _spelEffectInfos = m_spellInfo->GetEffectsForDifficulty(GetOwner()->GetMap()->GetDifficulty()); + + ASSERT(!_spelEffectInfos.empty()); + + _effects.resize(GetSpellEffectInfos().size()); + + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) { - if (effMask & (uint8(1) << i)) - m_effects[i] = new AuraEffect(this, i, baseAmount ? baseAmount + i : NULL, caster); - else - m_effects[i] = NULL; + if (effect && effMask & (uint8(1) << effect->EffectIndex)) + _effects[effect->EffectIndex] = new AuraEffect(this, effect->EffectIndex, baseAmount ? baseAmount + effect->EffectIndex : NULL, caster); } } @@ -389,9 +406,9 @@ Aura::~Aura() m_loadedScripts.erase(itr); } - // free effects memory - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - delete m_effects[i]; + // free effects memory todo 6.x + //for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + // delete m_effects[i]; ASSERT(m_applications.empty()); _DeleteRemovedApplications(); @@ -407,6 +424,14 @@ Unit* Aura::GetCaster() const return ObjectAccessor::GetUnit(*GetOwner(), GetCasterGUID()); } +AuraEffect* Aura::GetEffect(uint32 index) const +{ + if (index >= _effects.size()) + return nullptr; + + return _effects[index]; +} + AuraObjectType Aura::GetType() const { return (m_owner->GetTypeId() == TYPEID_DYNAMICOBJECT) ? DYNOBJ_AURA_TYPE : UNIT_AURA_TYPE; @@ -494,7 +519,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply) // fill up to date target list // target, effMask - std::map<Unit*, uint8> targets; + std::map<Unit*, uint32> targets; FillTargetMap(targets, caster); @@ -503,7 +528,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply) // mark all auras as ready to remove for (ApplicationMap::iterator appIter = m_applications.begin(); appIter != m_applications.end();++appIter) { - std::map<Unit*, uint8>::iterator existing = targets.find(appIter->second->GetTarget()); + std::map<Unit*, uint32>::iterator existing = targets.find(appIter->second->GetTarget()); // not found in current area - remove the aura if (existing == targets.end()) targetsToRemove.push_back(appIter->second->GetTarget()); @@ -520,7 +545,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply) } // register auras for units - for (std::map<Unit*, uint8>::iterator itr = targets.begin(); itr!= targets.end();) + for (std::map<Unit*, uint32>::iterator itr = targets.begin(); itr!= targets.end();) { // aura mustn't be already applied on target if (AuraApplication * aurApp = GetApplicationOfTarget(itr->first->GetGUID())) @@ -613,7 +638,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply) return; // apply aura effects for units - for (std::map<Unit*, uint8>::iterator itr = targets.begin(); itr!= targets.end();++itr) + for (std::map<Unit*, uint32>::iterator itr = targets.begin(); itr!= targets.end();++itr) { if (AuraApplication * aurApp = GetApplicationOfTarget(itr->first->GetGUID())) { @@ -674,9 +699,9 @@ void Aura::UpdateOwner(uint32 diff, WorldObject* owner) m_updateTargetMapInterval -= diff; // update aura effects - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_effects[i]) - m_effects[i]->Update(diff, caster); + for (AuraEffect* effect : GetAuraEffects()) + if (effect) + effect->Update(diff, caster); // remove spellmods after effects update if (modSpell) @@ -880,9 +905,9 @@ void Aura::SetStackAmount(uint8 stackAmount) if (!(*apptItr)->GetRemoveMode()) HandleAuraSpecificMods(*apptItr, caster, false, true); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (HasEffect(i)) - m_effects[i]->ChangeAmount(m_effects[i]->CalculateAmount(caster), false, true); + for (AuraEffect* effect : GetAuraEffects()) + if (effect) + effect->ChangeAmount(effect->CalculateAmount(caster), false, true); for (std::list<AuraApplication*>::const_iterator apptItr = applications.begin(); apptItr != applications.end(); ++apptItr) if (!(*apptItr)->GetRemoveMode()) @@ -945,11 +970,11 @@ void Aura::RefreshSpellMods() player->RestoreAllSpellMods(0, this); } -bool Aura::HasMoreThanOneEffectForType(AuraType auraType) const +bool Aura::HasMoreThanOneEffectForType(AuraType auraType, uint32 difficulty) const { uint32 count = 0; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (HasEffect(i) && AuraType(GetSpellInfo()->Effects[i].ApplyAuraName) == auraType) + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) + if (effect && HasEffect(effect->EffectIndex) && AuraType(effect->ApplyAuraName) == auraType) ++count; return count > 1; @@ -957,8 +982,8 @@ bool Aura::HasMoreThanOneEffectForType(AuraType auraType) const bool Aura::IsArea() const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (HasEffect(i) && GetSpellInfo()->Effects[i].IsAreaAuraEffect()) + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) + if (effect && HasEffect(effect->EffectIndex) && effect->IsAreaAuraEffect()) return true; return false; @@ -1020,7 +1045,7 @@ bool Aura::CanBeSaved() const bool Aura::CanBeSentToClient() const { - return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE) || HasEffectType(SPELL_AURA_CAST_WHILE_WALKING); + return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect(GetOwner() ? GetOwner()->GetMap()->GetDifficulty() : DIFFICULTY_NONE) || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE) || HasEffectType(SPELL_AURA_CAST_WHILE_WALKING); } bool Aura::IsSingleTargetWith(Aura const* aura) const @@ -1080,7 +1105,7 @@ int32 Aura::CalcDispelChance(Unit* auraTarget, bool offensive) const return 100 - resistChance; } -void Aura::SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 * amount) +void Aura::SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 *amount) { m_maxDuration = maxduration; m_duration = duration; @@ -1088,22 +1113,23 @@ void Aura::SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint m_isUsingCharges = m_procCharges != 0; m_stackAmount = stackamount; Unit* caster = GetCaster(); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_effects[i]) - { - m_effects[i]->SetAmount(amount[i]); - m_effects[i]->SetCanBeRecalculated((recalculateMask & (1 << i)) != 0); - m_effects[i]->CalculatePeriodic(caster, false, true); - m_effects[i]->CalculateSpellMod(); - m_effects[i]->RecalculateAmount(caster); - } + for (AuraEffect* effect : GetAuraEffects()) + { + if (!effect) + continue; + effect->SetAmount(amount[effect->GetEffIndex()]); + effect->SetCanBeRecalculated((recalculateMask & (1 << effect->GetEffIndex())) != 0); + effect->CalculatePeriodic(caster, false, true); + effect->CalculateSpellMod(); + effect->RecalculateAmount(caster); + } } bool Aura::HasEffectType(AuraType type) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (AuraEffect* effect : GetAuraEffects()) { - if (HasEffect(i) && m_effects[i]->GetAuraType() == type) + if (effect && effect->GetAuraType() == type) return true; } return false; @@ -1113,17 +1139,26 @@ void Aura::RecalculateAmountOfEffects() { ASSERT (!IsRemoved()); Unit* caster = GetCaster(); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (HasEffect(i)) - m_effects[i]->RecalculateAmount(caster); + for (AuraEffect* effect : GetAuraEffects()) + if (effect && !IsRemoved()) + effect->RecalculateAmount(caster); } void Aura::HandleAllEffects(AuraApplication * aurApp, uint8 mode, bool apply) { ASSERT (!IsRemoved()); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_effects[i] && !IsRemoved()) - m_effects[i]->HandleEffect(aurApp, mode, apply); + for (AuraEffect* effect : GetAuraEffects()) + if (effect && !IsRemoved()) + effect->HandleEffect(aurApp, mode, apply); +} + +uint32 Aura::GetEffectMask() const +{ + uint32 effMask = 0; + for (AuraEffect* effect : GetAuraEffects()) + if (effect) + effMask |= 1 << effect->GetEffIndex(); + return effMask; } void Aura::GetApplicationList(std::list<AuraApplication*> & applicationList) const @@ -1310,8 +1345,8 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b // Improved Devouring Plague if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3790, 0)) { - uint32 damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT); - damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT); + uint32 damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT, GetEffect(0)->GetSpellEffectInfo()); + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetEffect(0)->GetSpellEffectInfo()); int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100; int32 heal = int32(CalculatePct(basepoints0, 15)); @@ -1517,47 +1552,40 @@ void Aura::HandleAuraSpecificPeriodics(AuraApplication const* aurApp, Unit* cast if (!caster || aurApp->GetRemoveMode()) return; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (AuraEffect* effect : GetAuraEffects()) { - if (!HasEffect(i)) + if (!effect || effect->IsAreaAuraEffect() || effect->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) continue; - if (m_spellInfo->Effects[i].IsAreaAuraEffect() || m_spellInfo->Effects[i].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) - continue; - - switch (m_spellInfo->Effects[i].ApplyAuraName) + switch (effect->GetSpellEffectInfo()->ApplyAuraName) { case SPELL_AURA_PERIODIC_DAMAGE: case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: case SPELL_AURA_PERIODIC_LEECH: { - AuraEffect* aurEff = GetEffect(i); - // ignore non positive values (can be result apply spellmods to aura damage - uint32 damage = std::max(aurEff->GetAmount(), 0); + uint32 damage = std::max(effect->GetAmount(), 0); // Script Hook For HandlePeriodicDamageAurasTick -- Allow scripts to change the Damage pre class mitigation calculations sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); - aurEff->SetDonePct(caster->SpellDamagePctDone(target, m_spellInfo, DOT)); // Calculate done percentage first! - aurEff->SetDamage(caster->SpellDamageBonusDone(target, m_spellInfo, damage, DOT, GetStackAmount()) * aurEff->GetDonePct()); - aurEff->SetCritChance(caster->GetUnitSpellCriticalChance(target, m_spellInfo, m_spellInfo->GetSchoolMask())); + effect->SetDonePct(caster->SpellDamagePctDone(target, m_spellInfo, DOT)); // Calculate done percentage first! + effect->SetDamage(caster->SpellDamageBonusDone(target, m_spellInfo, damage, DOT, effect->GetSpellEffectInfo(), GetStackAmount()) * effect->GetDonePct()); + effect->SetCritChance(caster->GetUnitSpellCriticalChance(target, m_spellInfo, m_spellInfo->GetSchoolMask())); break; } case SPELL_AURA_PERIODIC_HEAL: case SPELL_AURA_OBS_MOD_HEALTH: { - AuraEffect* aurEff = GetEffect(i); - // ignore non positive values (can be result apply spellmods to aura damage - uint32 damage = std::max(aurEff->GetAmount(), 0); + uint32 damage = std::max(effect->GetAmount(), 0); // Script Hook For HandlePeriodicDamageAurasTick -- Allow scripts to change the Damage pre class mitigation calculations sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); - aurEff->SetDonePct(caster->SpellHealingPctDone(target, m_spellInfo)); // Calculate done percentage first! - aurEff->SetDamage(caster->SpellHealingBonusDone(target, m_spellInfo, damage, DOT, GetStackAmount()) * aurEff->GetDonePct()); - aurEff->SetCritChance(caster->GetUnitSpellCriticalChance(target, m_spellInfo, m_spellInfo->GetSchoolMask())); + effect->SetDonePct(caster->SpellHealingPctDone(target, m_spellInfo)); // Calculate done percentage first! + effect->SetDamage(caster->SpellHealingBonusDone(target, m_spellInfo, damage, DOT, effect->GetSpellEffectInfo(), GetStackAmount()) * effect->GetDonePct()); + effect->SetCritChance(caster->GetUnitSpellCriticalChance(target, m_spellInfo, m_spellInfo->GetSchoolMask())); break; } default: @@ -1605,12 +1633,17 @@ bool Aura::CanStackWith(Aura const* existingAura) const if (IsPassive() && sameCaster && m_spellInfo->IsDifferentRankOf(existingSpellInfo)) return false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : existingAura->GetSpellEffectInfos()) { // prevent remove triggering aura by triggered aura - if (existingSpellInfo->Effects[i].TriggerSpell == GetId() - // prevent remove triggered aura by triggering aura refresh - || m_spellInfo->Effects[i].TriggerSpell == existingAura->GetId()) + if (effect && effect->TriggerSpell == GetId()) + return true; + } + + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) + { + // prevent remove triggered aura by triggering aura refresh + if (effect && effect->TriggerSpell == existingAura->GetId()) return true; } @@ -1620,7 +1653,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const // * The minimap tracking list will only show a check mark next to the last skill activated // Sometimes this bugs out and doesn't switch the check mark. It has no effect on the actual tracking though. // * The minimap dots are yellow for both resources - if (m_spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES) && existingSpellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES)) + if (m_spellInfo->HasAura(GetOwner()->GetMap()->GetDifficulty(), SPELL_AURA_TRACK_RESOURCES) && existingSpellInfo->HasAura(GetOwner()->GetMap()->GetDifficulty(), SPELL_AURA_TRACK_RESOURCES)) return sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES); // check spell specific stack rules @@ -1659,7 +1692,10 @@ bool Aura::CanStackWith(Aura const* existingAura) const // check same periodic auras for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { - switch (m_spellInfo->Effects[i].ApplyAuraName) + SpellEffectInfo const* effect = GetSpellEffectInfo(i); + if (!effect) + continue; + switch (effect->ApplyAuraName) { // DOT or HOT from different casters will stack case SPELL_AURA_PERIODIC_DAMAGE: @@ -1673,9 +1709,12 @@ bool Aura::CanStackWith(Aura const* existingAura) const case SPELL_AURA_OBS_MOD_POWER: case SPELL_AURA_OBS_MOD_HEALTH: case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: - // periodic auras which target areas are not allowed to stack this way (replenishment for example) - if (m_spellInfo->Effects[i].IsTargetingArea() || existingSpellInfo->Effects[i].IsTargetingArea()) - break; + { + SpellEffectInfo const* existingEffect = GetSpellEffectInfo(i); + // periodic auras which target areas are not allowed to stack this way (replenishment for example) + if (effect->IsTargetingArea() || (existingEffect && existingEffect->IsTargetingArea())) + break; + } return true; default: break; @@ -2246,7 +2285,7 @@ void Aura::CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraAppli } } -UnitAura::UnitAura(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID) +UnitAura::UnitAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID) : Aura(spellproto, owner, caster, castItem, casterGUID) { m_AuraDRGroup = DIMINISHING_NONE; @@ -2280,31 +2319,31 @@ void UnitAura::Remove(AuraRemoveMode removeMode) GetUnitOwner()->RemoveOwnedAura(this, removeMode); } -void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) +void UnitAura::FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) { - for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) { - if (!HasEffect(effIndex)) + if (!effect || !HasEffect(effect->EffectIndex)) continue; UnitList targetList; // non-area aura - if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_APPLY_AURA) + if (effect->Effect == SPELL_EFFECT_APPLY_AURA) { targetList.push_back(GetUnitOwner()); } else { - float radius = GetSpellInfo()->Effects[effIndex].CalcRadius(caster); + float radius = effect->CalcRadius(caster); if (!GetUnitOwner()->HasUnitState(UNIT_STATE_ISOLATED)) { - switch (GetSpellInfo()->Effects[effIndex].Effect) + switch (effect->Effect) { case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: case SPELL_EFFECT_APPLY_AREA_AURA_RAID: { targetList.push_back(GetUnitOwner()); - Trinity::AnyGroupedUnitInObjectRangeCheck u_check(GetUnitOwner(), GetUnitOwner(), radius, GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID); + Trinity::AnyGroupedUnitInObjectRangeCheck u_check(GetUnitOwner(), GetUnitOwner(), radius, effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID); Trinity::UnitListSearcher<Trinity::AnyGroupedUnitInObjectRangeCheck> searcher(GetUnitOwner(), targetList, u_check); GetUnitOwner()->VisitNearbyObject(radius, searcher); break; @@ -2340,16 +2379,16 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) for (UnitList::iterator itr = targetList.begin(); itr!= targetList.end();++itr) { - std::map<Unit*, uint8>::iterator existing = targets.find(*itr); + std::map<Unit*, uint32>::iterator existing = targets.find(*itr); if (existing != targets.end()) - existing->second |= 1<<effIndex; + existing->second |= 1 << effect->EffectIndex; else - targets[*itr] = 1<<effIndex; + targets[*itr] = 1 << effect->EffectIndex; } } } -DynObjAura::DynObjAura(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID) +DynObjAura::DynObjAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID) : Aura(spellproto, owner, caster, castItem, casterGUID) { LoadScripts(); @@ -2374,18 +2413,18 @@ void DynObjAura::Remove(AuraRemoveMode removeMode) _Remove(removeMode); } -void DynObjAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* /*caster*/) +void DynObjAura::FillTargetMap(std::map<Unit*, uint32> & targets, Unit* /*caster*/) { Unit* dynObjOwnerCaster = GetDynobjOwner()->GetCaster(); float radius = GetDynobjOwner()->GetRadius(); - for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + for (SpellEffectInfo const* effect : GetSpellEffectInfos()) { - if (!HasEffect(effIndex)) + if (!effect || !HasEffect(effect->EffectIndex)) continue; UnitList targetList; - if (GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DYNOBJ_ALLY - || GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ALLY) + if (effect->TargetB.GetTarget() == TARGET_DEST_DYNOBJ_ALLY + || effect->TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ALLY) { Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius); Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(GetDynobjOwner(), targetList, u_check); @@ -2400,11 +2439,11 @@ void DynObjAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* /*caster* for (UnitList::iterator itr = targetList.begin(); itr!= targetList.end();++itr) { - std::map<Unit*, uint8>::iterator existing = targets.find(*itr); + std::map<Unit*, uint32>::iterator existing = targets.find(*itr); if (existing != targets.end()) - existing->second |= 1<<effIndex; + existing->second |= 1 << effect->EffectIndex; else - targets[*itr] = 1<<effIndex; + targets[*itr] = 1 << effect->EffectIndex; } } } diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index f69d9baafe0..c2c356efa4b 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -41,24 +41,25 @@ class ChargeDropEvent; class AuraApplication { - friend void Unit::_ApplyAura(AuraApplication * aurApp, uint8 effMask); + friend void Unit::_ApplyAura(AuraApplication * aurApp, uint32 effMask); friend void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode); friend void Unit::_ApplyAuraEffect(Aura* aura, uint8 effIndex); friend void Unit::RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode); - friend AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint8 effMask); + friend AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint32 effMask); private: Unit* const _target; Aura* const _base; AuraRemoveMode _removeMode:8; // Store info for know remove aura reason uint8 _slot; // Aura slot on unit uint8 _flags; // Aura info flag - uint8 _effectsToApply; // Used only at spell hit to determine which effect should be applied + uint32 _effectsToApply; // Used only at spell hit to determine which effect should be applied bool _needClientUpdate:1; + uint32 _effectMask; - explicit AuraApplication(Unit* target, Unit* caster, Aura* base, uint8 effMask); + explicit AuraApplication(Unit* target, Unit* caster, Aura* base, uint32 effMask); void _Remove(); private: - void _InitFlags(Unit* caster, uint8 effMask); + void _InitFlags(Unit* caster, uint32 effMask); void _HandleEffect(uint8 effIndex, bool apply); public: @@ -67,10 +68,10 @@ class AuraApplication uint8 GetSlot() const { return _slot; } uint8 GetFlags() const { return _flags; } - uint8 GetEffectMask() const { return _flags & (AFLAG_EFF_INDEX_0 | AFLAG_EFF_INDEX_1 | AFLAG_EFF_INDEX_2); } - bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_flags & (1 << effect)) != 0; } + uint32 GetEffectMask() const { return _effectMask; } + bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_effectMask & (1 << effect)) != 0; } bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; } - bool IsSelfcast() const { return (_flags & AFLAG_CASTER) != 0; } + bool IsSelfcast() const { return (_flags & AFLAG_NOCASTER) == 0; } uint8 GetEffectsToApply() const { return _effectsToApply; } void SetRemoveMode(AuraRemoveMode mode) { _removeMode = mode; } @@ -84,16 +85,16 @@ class AuraApplication class Aura { - friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); + friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); public: typedef std::map<ObjectGuid, AuraApplication*> ApplicationMap; - static uint8 BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 avalibleEffectMask, WorldObject* owner); - static Aura* TryRefreshStackOrCreate(SpellInfo const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, bool* refresh = NULL); - static Aura* TryCreate(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty); - static Aura* Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount, Item* castItem, ObjectGuid casterGUID); + static uint32 BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 avalibleEffectMask, WorldObject* owner); + static Aura* TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, bool* refresh = NULL); + static Aura* TryCreate(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty); + static Aura* Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); explicit Aura(SpellInfo const* spellproto, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID); - void _InitEffects(uint8 effMask, Unit* caster, int32 *baseAmount); + void _InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount); virtual ~Aura(); SpellInfo const* GetSpellInfo() const { return m_spellInfo; } @@ -113,7 +114,7 @@ class Aura void _Remove(AuraRemoveMode removeMode); virtual void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) = 0; - virtual void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) = 0; + virtual void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) = 0; void UpdateTargetMap(Unit* caster, bool apply = true); void _RegisterForTargets() {Unit* caster = GetCaster(); UpdateTargetMap(caster, false);} @@ -152,7 +153,7 @@ class Aura uint8 GetCasterLevel() const { return m_casterLevel; } - bool HasMoreThanOneEffectForType(AuraType auraType) const; + bool HasMoreThanOneEffectForType(AuraType auraType, uint32 difficulty) const; bool IsArea() const; bool IsPassive() const; bool IsDeathPersistent() const; @@ -175,13 +176,14 @@ class Aura void UnregisterSingleTarget(); int32 CalcDispelChance(Unit* auraTarget, bool offensive) const; - void SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 * amount); + void SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 *baseAmount); // helpers for aura effects bool HasEffect(uint8 effIndex) const { return GetEffect(effIndex) != NULL; } bool HasEffectType(AuraType type) const; - AuraEffect* GetEffect(uint8 effIndex) const { ASSERT (effIndex < MAX_SPELL_EFFECTS); return m_effects[effIndex]; } - uint8 GetEffectMask() const { uint8 effMask = 0; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (m_effects[i]) effMask |= 1<<i; return effMask; } + //AuraEffect* GetEffect(uint8 effIndex) const { ASSERT (effIndex < MAX_SPELL_EFFECTS); return Effects[effIndex]; } + AuraEffect* GetEffect(uint32 index) const; + uint32 GetEffectMask() const; void RecalculateAmountOfEffects(); void HandleAllEffects(AuraApplication * aurApp, uint8 mode, bool apply); @@ -242,6 +244,12 @@ class Aura AuraScript* GetScriptByName(std::string const& scriptName) const; std::list<AuraScript*> m_loadedScripts; + + AuraEffectVector GetAuraEffects() const { return _effects; } + + SpellEffectInfoVector GetSpellEffectInfos() const { return _spelEffectInfos; } + SpellEffectInfo const* GetSpellEffectInfo(uint32 index) const; + private: void _DeleteRemovedApplications(); protected: @@ -260,7 +268,7 @@ class Aura uint8 m_procCharges; // Aura charges (0 for infinite) uint8 m_stackAmount; // Aura stack amount - AuraEffect* m_effects[3]; + //AuraEffect* m_effects[3]; ApplicationMap m_applications; bool m_isRemoved:1; @@ -271,20 +279,23 @@ class Aura private: Unit::AuraApplicationList m_removedApplications; + + AuraEffectVector _effects; + SpellEffectInfoVector _spelEffectInfos; }; class UnitAura : public Aura { - friend Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); - protected: - explicit UnitAura(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); + friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); public: + explicit UnitAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); + void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication * aurApp) override; void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * aurApp) override; void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override; - void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) override; + void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) override; // Allow Apply Aura Handler to modify and access m_AuraDRGroup void SetDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; } @@ -296,13 +307,13 @@ class UnitAura : public Aura class DynObjAura : public Aura { - friend Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); - protected: - explicit DynObjAura(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); + friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); public: + explicit DynObjAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID); + void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override; - void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) override; + void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) override; }; class ChargeDropEvent : public BasicEvent diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 8583d055123..f376e0979b2 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -57,6 +57,7 @@ #include "DB2Stores.h" #include "Battlefield.h" #include "BattlefieldMgr.h" +#include "SpellPackets.h" extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS]; @@ -118,6 +119,28 @@ SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0), m_strTarget() m_targetMask = 0; } +SpellCastTargets::SpellCastTargets(Unit* caster, uint32 targetMask, ObjectGuid targetGuid, ObjectGuid itemTargetGuid, ObjectGuid srcTransportGuid, ObjectGuid destTransportGuid, Position srcPos, Position destPos, float elevation, float missileSpeed, std::string targetString) : + m_targetMask(targetMask), m_objectTargetGUID(targetGuid), m_itemTargetGUID(itemTargetGuid), m_elevation(elevation), m_speed(missileSpeed), m_strTarget(targetString) +{ + m_objectTarget = NULL; + m_itemTarget = NULL; + m_itemTargetEntry = 0; + + m_src._transportGUID = srcTransportGuid; + if (m_src._transportGUID != ObjectGuid::Empty) + m_src._transportOffset.Relocate(srcPos); + else + m_src._position.Relocate(srcPos); + + m_dst._transportGUID = destTransportGuid; + if (m_dst._transportGUID != ObjectGuid::Empty) + m_dst._transportOffset.Relocate(destPos); + else + m_dst._position.Relocate(destPos); + + Update(caster); +} + SpellCastTargets::~SpellCastTargets() { } void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) @@ -173,9 +196,41 @@ void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) Update(caster); } -void SpellCastTargets::Write(ByteBuffer& data) +void SpellCastTargets::Write(WorldPackets::Spells::SpellTargetData& data) { - data << uint32(m_targetMask); + data.Flags = m_targetMask; + + if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_MINIPET)) + data.Unit = m_objectTargetGUID; + + if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM) && m_itemTarget) + data.Item = m_itemTarget->GetGUID(); + + if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) + { + WorldPackets::Spells::TargetLocation& target = data.SrcLocation.Value; + target.Transport = m_src._transportGUID; // relative position guid here - transport for example + if (!m_src._transportGUID.IsEmpty()) + target.Location = m_src._transportOffset; + else + target.Location = m_src._position; + data.SrcLocation.HasValue = true; + } + + if (m_targetMask & TARGET_FLAG_DEST_LOCATION) + { + WorldPackets::Spells::TargetLocation& target = data.DstLocation.Value; + target.Transport = m_dst._transportGUID; // relative position guid here - transport for example + if (!m_dst._transportGUID.IsEmpty()) + target.Location = m_dst._transportOffset; + else + target.Location = m_dst._position; + data.DstLocation.HasValue = true; + } + + if (m_targetMask & TARGET_FLAG_STRING) + data.Name = m_strTarget; + /*data << uint32(m_targetMask); if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_MINIPET)) data << m_objectTargetGUID.WriteAsPacked(); @@ -207,7 +262,7 @@ void SpellCastTargets::Write(ByteBuffer& data) } if (m_targetMask & TARGET_FLAG_STRING) - data << m_strTarget; + data << m_strTarget;*/ } ObjectGuid SpellCastTargets::GetOrigUnitTargetGUID() const @@ -507,20 +562,26 @@ void SpellCastTargets::OutDebug() const TC_LOG_INFO("spells", "elevation: %f", m_elevation); } -SpellValue::SpellValue(SpellInfo const* proto) +SpellValue::SpellValue(Difficulty diff, SpellInfo const* proto) { - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - EffectBasePoints[i] = proto->Effects[i].BasePoints; + // todo 6.x + SpellEffectInfoVector effects = proto->GetEffectsForDifficulty(diff); + ASSERT(effects.size() <= MAX_SPELL_EFFECTS); + for (SpellEffectInfo const* effect : effects) + if (effect) + EffectBasePoints[effect->EffectIndex] = effect->BasePoints; + MaxAffectedTargets = proto->MaxAffectedTargets; RadiusMod = 1.0f; AuraStackAmount = 1; } Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID, bool skipCheck) : -m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, caster)), -m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster) -, m_spellValue(new SpellValue(m_spellInfo)), m_preGeneratedPath(PathGenerator(m_caster)) +m_spellInfo(info), m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster), +m_spellValue(new SpellValue(caster->GetMap()->GetDifficulty(), m_spellInfo)), m_preGeneratedPath(PathGenerator(m_caster)) { + _effects = info->GetEffectsForDifficulty(caster->GetMap()->GetDifficulty()); + m_customError = SPELL_CUSTOM_ERROR_NONE; m_skipCheck = skipCheck; m_selfContainer = NULL; @@ -592,7 +653,9 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme gameObjTarget = NULL; destTarget = NULL; damage = 0; + variance = 0.0f; effectHandleMode = SPELL_EFFECT_HANDLE_LAUNCH; + effectInfo = nullptr; m_diminishLevel = DIMINISHING_LEVEL_1; m_diminishGroup = DIMINISHING_NONE; m_damage = 0; @@ -764,36 +827,40 @@ void Spell::SelectSpellTargets() SelectExplicitTargets(); uint32 processedAreaEffectsMask = 0; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + + for (SpellEffectInfo const* effect : GetEffects()) { + if (!effect) + continue; + // not call for empty effect. // Also some spells use not used effect targets for store targets for dummy effect in triggered spells - if (!m_spellInfo->Effects[i].IsEffect()) + if (!effect->IsEffect()) continue; // set expected type of implicit targets to be sent to client - uint32 implicitTargetMask = GetTargetFlagMask(m_spellInfo->Effects[i].TargetA.GetObjectType()) | GetTargetFlagMask(m_spellInfo->Effects[i].TargetB.GetObjectType()); + uint32 implicitTargetMask = GetTargetFlagMask(effect->TargetA.GetObjectType()) | GetTargetFlagMask(effect->TargetB.GetObjectType()); if (implicitTargetMask & TARGET_FLAG_UNIT) m_targets.SetTargetFlag(TARGET_FLAG_UNIT); if (implicitTargetMask & (TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM)) m_targets.SetTargetFlag(TARGET_FLAG_GAMEOBJECT); - SelectEffectImplicitTargets(SpellEffIndex(i), m_spellInfo->Effects[i].TargetA, processedAreaEffectsMask); - SelectEffectImplicitTargets(SpellEffIndex(i), m_spellInfo->Effects[i].TargetB, processedAreaEffectsMask); + SelectEffectImplicitTargets(SpellEffIndex(effect->EffectIndex), effect->TargetA, processedAreaEffectsMask); + SelectEffectImplicitTargets(SpellEffIndex(effect->EffectIndex), effect->TargetB, processedAreaEffectsMask); // Select targets of effect based on effect type // those are used when no valid target could be added for spell effect based on spell target type // some spell effects use explicit target as a default target added to target map (like SPELL_EFFECT_LEARN_SPELL) // some spell effects add target to target map only when target type specified (like SPELL_EFFECT_WEAPON) // some spell effects don't add anything to target map (confirmed with sniffs) (like SPELL_EFFECT_DESTROY_ALL_TOTEMS) - SelectEffectTypeImplicitTargets(i); + SelectEffectTypeImplicitTargets(effect->EffectIndex); if (m_targets.HasDst()) - AddDestTarget(*m_targets.GetDst(), i); + AddDestTarget(*m_targets.GetDst(), effect->EffectIndex); if (m_spellInfo->IsChanneled()) { - uint8 mask = (1 << i); + uint32 mask = (1 << effect->EffectIndex); for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { if (ihit->effectMask & mask) @@ -863,18 +930,23 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar // targets for effect already selected if (effectMask & processedEffectMask) return; - // choose which targets we can select at once - for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j) + if (SpellEffectInfo const* _effect = GetEffect(effIndex)) { - SpellEffectInfo const* effects = GetSpellInfo()->Effects; - if (effects[j].IsEffect() && - effects[effIndex].TargetA.GetTarget() == effects[j].TargetA.GetTarget() && - effects[effIndex].TargetB.GetTarget() == effects[j].TargetB.GetTarget() && - effects[effIndex].ImplicitTargetConditions == effects[j].ImplicitTargetConditions && - effects[effIndex].CalcRadius(m_caster) == effects[j].CalcRadius(m_caster) && - CheckScriptEffectImplicitTargets(effIndex, j)) + // choose which targets we can select at once + for (SpellEffectInfo const* effect : GetEffects()) { - effectMask |= 1 << j; + //for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j) + if (!effect || effect->EffectIndex <= uint32(effIndex)) + continue; + if (effect->IsEffect() && + _effect->TargetA.GetTarget() == effect->TargetA.GetTarget() && + _effect->TargetB.GetTarget() == effect->TargetB.GetTarget() && + _effect->ImplicitTargetConditions == effect->ImplicitTargetConditions && + _effect->CalcRadius(m_caster) == effect->CalcRadius(m_caster) && + CheckScriptEffectImplicitTargets(effIndex, effect->EffectIndex)) + { + effectMask |= 1 << effect->EffectIndex; + } } } processedEffectMask |= effectMask; @@ -1009,6 +1081,10 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar return; } + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return; + float range = 0.0f; switch (targetType.GetCheckType()) { @@ -1030,7 +1106,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar break; } - ConditionList* condList = m_spellInfo->Effects[effIndex].ImplicitTargetConditions; + ConditionList* condList = effect->ImplicitTargetConditions; // handle emergency case - try to use other provided targets if no conditions provided if (targetType.GetCheckType() == TARGET_CHECK_ENTRY && (!condList || condList->empty())) @@ -1116,9 +1192,12 @@ void Spell::SelectImplicitConeTargets(SpellEffIndex effIndex, SpellImplicitTarge std::list<WorldObject*> targets; SpellTargetObjectTypes objectType = targetType.GetObjectType(); SpellTargetCheckTypes selectionType = targetType.GetCheckType(); - ConditionList* condList = m_spellInfo->Effects[effIndex].ImplicitTargetConditions; + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return; + ConditionList* condList = effect->ImplicitTargetConditions; float coneAngle = float(M_PI) / 2; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod; + float radius = effect->CalcRadius(m_caster) * m_spellValue->RadiusMod; if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList)) { @@ -1199,8 +1278,11 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge } std::list<WorldObject*> targets; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod; - SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), m_spellInfo->Effects[effIndex].ImplicitTargetConditions); + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return; + float radius = effect->CalcRadius(m_caster) * m_spellValue->RadiusMod; + SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), effect->ImplicitTargetConditions); CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType); @@ -1236,7 +1318,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici if (SpellTargetPosition const* st = sSpellMgr->GetSpellTargetPosition(m_spellInfo->Id, effIndex)) { /// @todo fix this check - if (m_spellInfo->HasEffect(SPELL_EFFECT_TELEPORT_UNITS) || m_spellInfo->HasEffect(SPELL_EFFECT_BIND)) + if (HasEffect(SPELL_EFFECT_TELEPORT_UNITS) || HasEffect(SPELL_EFFECT_BIND)) dest = SpellDestination(st->target_X, st->target_Y, st->target_Z, st->target_Orientation, (int32)st->target_mapId); else if (st->target_mapId == m_caster->GetMapId()) dest = SpellDestination(st->target_X, st->target_Y, st->target_Z, st->target_Orientation); @@ -1284,23 +1366,26 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici } default: { - float dist; - float angle = targetType.CalcDirectionAngle(); - float objSize = m_caster->GetObjectSize(); - if (targetType.GetTarget() == TARGET_DEST_CASTER_SUMMON) - dist = PET_FOLLOW_DIST; - else - dist = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); + if (SpellEffectInfo const* effect = GetEffect(effIndex)) + { + float dist; + float angle = targetType.CalcDirectionAngle(); + float objSize = m_caster->GetObjectSize(); + if (targetType.GetTarget() == TARGET_DEST_CASTER_SUMMON) + dist = PET_FOLLOW_DIST; + else + dist = effect->CalcRadius(m_caster); - if (dist < objSize) - dist = objSize; - else if (targetType.GetTarget() == TARGET_DEST_CASTER_RANDOM) - dist = objSize + (dist - objSize) * float(rand_norm()); + if (dist < objSize) + dist = objSize; + else if (targetType.GetTarget() == TARGET_DEST_CASTER_RANDOM) + dist = objSize + (dist - objSize) * float(rand_norm()); - Position pos = dest._position; - m_caster->MovePositionToFirstCollision(pos, dist, angle); + Position pos = dest._position; + m_caster->MovePositionToFirstCollision(pos, dist, angle); - dest.Relocate(pos); + dest.Relocate(pos); + } break; } } @@ -1323,18 +1408,21 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffIndex effIndex, SpellImplici break; default: { - float angle = targetType.CalcDirectionAngle(); - float objSize = target->GetObjectSize(); - float dist = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); - if (dist < objSize) - dist = objSize; - else if (targetType.GetTarget() == TARGET_DEST_TARGET_RANDOM) - dist = objSize + (dist - objSize) * float(rand_norm()); - - Position pos = dest._position; - target->MovePositionToFirstCollision(pos, dist, angle); - - dest.Relocate(pos); + if (SpellEffectInfo const* effect = GetEffect(effIndex)) + { + float angle = targetType.CalcDirectionAngle(); + float objSize = target->GetObjectSize(); + float dist = effect->CalcRadius(m_caster); + if (dist < objSize) + dist = objSize; + else if (targetType.GetTarget() == TARGET_DEST_TARGET_RANDOM) + dist = objSize + (dist - objSize) * float(rand_norm()); + + Position pos = dest._position; + target->MovePositionToFirstCollision(pos, dist, angle); + + dest.Relocate(pos); + } break; } } @@ -1365,15 +1453,18 @@ void Spell::SelectImplicitDestDestTargets(SpellEffIndex effIndex, SpellImplicitT return; default: { - float angle = targetType.CalcDirectionAngle(); - float dist = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); - if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM) - dist *= float(rand_norm()); + if (SpellEffectInfo const* effect = GetEffect(effIndex)) + { + float angle = targetType.CalcDirectionAngle(); + float dist = effect->CalcRadius(m_caster); + if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM) + dist *= float(rand_norm()); - Position pos = dest._position; - m_caster->MovePositionToFirstCollision(pos, dist, angle); + Position pos = dest._position; + m_caster->MovePositionToFirstCollision(pos, dist, angle); - dest.Relocate(pos); + dest.Relocate(pos); + } break; } } @@ -1451,21 +1542,25 @@ void Spell::SelectImplicitTargetObjectTargets(SpellEffIndex effIndex, SpellImpli void Spell::SelectImplicitChainTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType, WorldObject* target, uint32 effMask) { - uint32 maxTargets = m_spellInfo->Effects[effIndex].ChainTargets; + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return; + + uint32 maxTargets = effect->ChainTargets; if (Player* modOwner = m_caster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_JUMP_TARGETS, maxTargets, this); if (maxTargets > 1) { // mark damage multipliers as used - for (uint32 k = effIndex; k < MAX_SPELL_EFFECTS; ++k) - if (effMask & (1 << k)) - m_damageMultipliers[k] = 1.0f; + for (SpellEffectInfo const* eff : GetEffects()) + if (eff && (effMask & (1 << eff->EffectIndex))) + m_damageMultipliers[eff->EffectIndex] = 1.0f; m_applyMultiplierMask |= effMask; std::list<WorldObject*> targets; SearchChainTargets(targets, maxTargets - 1, target, targetType.GetObjectType(), targetType.GetCheckType() - , m_spellInfo->Effects[effIndex].ImplicitTargetConditions, targetType.GetTarget() == TARGET_UNIT_TARGET_CHAINHEAL_ALLY); + , effect->ImplicitTargetConditions, targetType.GetTarget() == TARGET_UNIT_TARGET_CHAINHEAL_ALLY); // Chain primary target is added earlier CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType); @@ -1644,11 +1739,14 @@ void Spell::SelectImplicitTrajTargets(SpellEffIndex effIndex) veh->SetLastShootPos(*m_targets.GetDstPos()); } -void Spell::SelectEffectTypeImplicitTargets(uint8 effIndex) +void Spell::SelectEffectTypeImplicitTargets(uint32 effIndex) { // special case for SPELL_EFFECT_SUMMON_RAF_FRIEND and SPELL_EFFECT_SUMMON_PLAYER /// @todo this is a workaround - target shouldn't be stored in target map for those spells - switch (m_spellInfo->Effects[effIndex].Effect) + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return; + switch (effect->Effect) { case SPELL_EFFECT_SUMMON_RAF_FRIEND: case SPELL_EFFECT_SUMMON_PLAYER: @@ -1667,17 +1765,17 @@ void Spell::SelectEffectTypeImplicitTargets(uint8 effIndex) } // select spell implicit targets based on effect type - if (!m_spellInfo->Effects[effIndex].GetImplicitTargetType()) + if (!effect->GetImplicitTargetType()) return; - uint32 targetMask = m_spellInfo->Effects[effIndex].GetMissingTargetMask(); + uint32 targetMask = effect->GetMissingTargetMask(); if (!targetMask) return; WorldObject* target = NULL; - switch (m_spellInfo->Effects[effIndex].GetImplicitTargetType()) + switch (effect->GetImplicitTargetType()) { // add explicit object target or self to the target map case EFFECT_IMPLICIT_TARGET_EXPLICIT: @@ -2012,9 +2110,9 @@ void Spell::CleanupTargetList() void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= true*/, bool implicit /*= true*/, Position const* losPosition /*= nullptr*/) { - for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) - if (!m_spellInfo->Effects[effIndex].IsEffect() || !CheckEffectTarget(target, effIndex, losPosition)) - effectMask &= ~(1 << effIndex); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (!effect->IsEffect() || !CheckEffectTarget(target, effect->EffectIndex, losPosition))) + effectMask &= ~(1 << effect->EffectIndex); // no effects left if (!effectMask) @@ -2025,9 +2123,9 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= return; // Check for effect immune skip if immuned - for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) - if (target->IsImmunedToSpellEffect(m_spellInfo, effIndex)) - effectMask &= ~(1 << effIndex); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && target->IsImmunedToSpellEffect(m_spellInfo, effect->EffectIndex)) + effectMask &= ~(1 << effect->EffectIndex); ObjectGuid targetGUID = target->GetGUID(); @@ -2120,19 +2218,22 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= void Spell::AddGOTarget(GameObject* go, uint32 effectMask) { - for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + for (SpellEffectInfo const* effect : GetEffects()) { - if (!m_spellInfo->Effects[effIndex].IsEffect()) - effectMask &= ~(1 << effIndex); + if (!effect) + continue; + + if (!effect->IsEffect()) + effectMask &= ~(1 << effect->EffectIndex); else { - switch (m_spellInfo->Effects[effIndex].Effect) + switch (effect->Effect) { case SPELL_EFFECT_GAMEOBJECT_DAMAGE: case SPELL_EFFECT_GAMEOBJECT_REPAIR: case SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE: if (go->GetGoType() != GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) - effectMask &= ~(1 << effIndex); + effectMask &= ~(1 << effect->EffectIndex); break; default: break; @@ -2187,9 +2288,9 @@ void Spell::AddGOTarget(GameObject* go, uint32 effectMask) void Spell::AddItemTarget(Item* item, uint32 effectMask) { - for (uint32 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) - if (!m_spellInfo->Effects[effIndex].IsEffect()) - effectMask &= ~(1 << effIndex); + for (SpellEffectInfo const* effect : GetEffects()) + if (!effect || !effect->IsEffect()) + effectMask &= ~(1 << effect->EffectIndex); // no effects left if (!effectMask) @@ -2234,10 +2335,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) { uint8 farMask = 0; // create far target mask - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_spellInfo->Effects[i].IsFarUnitTargetEffect()) - if ((1 << i) & mask) - farMask |= (1 << i); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && effect->IsFarUnitTargetEffect()) + if ((1 << effect->EffectIndex) & mask) + farMask |= (1 << effect->EffectIndex); if (!farMask) return; @@ -2248,9 +2349,9 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) // do far effects on the unit // can't use default call because of threading, do stuff as fast as possible - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (farMask & (1 << i)) - HandleEffects(unit, NULL, NULL, i, SPELL_EFFECT_HANDLE_HIT_TARGET); + for(SpellEffectInfo const* effect : GetEffects()) + if (effect && (farMask & (1 << effect->EffectIndex))) + HandleEffects(unit, NULL, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_HIT_TARGET); return; } @@ -2433,7 +2534,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } } - if (missInfo != SPELL_MISS_EVADE && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) + if (missInfo != SPELL_MISS_EVADE && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || HasEffect(SPELL_EFFECT_DISPEL))) { m_caster->CombatStart(unit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO)); @@ -2474,10 +2575,10 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // disable effects to which unit is immune SpellMissInfo returnVal = SPELL_MISS_IMMUNE; - for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber) - if (effectMask & (1 << effectNumber)) - if (unit->IsImmunedToSpellEffect(m_spellInfo, effectNumber)) - effectMask &= ~(1 << effectNumber); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex))) + if (unit->IsImmunedToSpellEffect(m_spellInfo, effect->EffectIndex)) + effectMask &= ~(1 << effect->EffectIndex); if (!effectMask) return returnVal; @@ -2535,9 +2636,9 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA } uint8 aura_effmask = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (effectMask & (1 << i) && m_spellInfo->Effects[i].IsUnitOwnedAuraEffect()) - aura_effmask |= 1 << i; + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex) && effect->IsUnitOwnedAuraEffect())) + aura_effmask |= 1 << effect->EffectIndex; // Get Data Needed for Diminishing Returns, some effects may have multiple auras, so this must be done on spell hit, not aura add m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell != nullptr); @@ -2557,18 +2658,21 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Select rank for aura with level requirements only in specific cases // Unit has to be target only of aura effect, both caster and target have to be players, target has to be other than unit target SpellInfo const* aurSpellInfo = m_spellInfo; - int32 basePoints[3]; + int32 basePoints[MAX_SPELL_EFFECTS]; if (scaleAura) { aurSpellInfo = m_spellInfo->GetAuraRankForLevel(unitTarget->getLevel()); ASSERT(aurSpellInfo); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : aurSpellInfo->GetEffectsForDifficulty(0)) { - basePoints[i] = aurSpellInfo->Effects[i].BasePoints; - if (m_spellInfo->Effects[i].Effect != aurSpellInfo->Effects[i].Effect) + basePoints[effect->EffectIndex] = effect->BasePoints; + if (SpellEffectInfo const* myEffect = GetEffect(effect->EffectIndex)) { - aurSpellInfo = m_spellInfo; - break; + if (myEffect->Effect != effect->Effect) + { + aurSpellInfo = m_spellInfo; + break; + } } } } @@ -2577,7 +2681,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA { bool refresh = false; m_spellAura = Aura::TryRefreshStackOrCreate(aurSpellInfo, effectMask, unit, - m_originalCaster, (aurSpellInfo == m_spellInfo) ? &m_spellValue->EffectBasePoints[0] : &basePoints[0], m_CastItem, ObjectGuid::Empty, &refresh); + m_originalCaster, (aurSpellInfo == m_spellInfo) ? m_spellValue->EffectBasePoints : basePoints, m_CastItem, ObjectGuid::Empty, &refresh); if (m_spellAura) { // Set aura stack amount to desired value @@ -2599,8 +2703,8 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA { m_spellAura->Remove(); bool found = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (effectMask & (1 << i) && m_spellInfo->Effects[i].Effect != SPELL_EFFECT_APPLY_AURA) + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex) && effect->Effect != SPELL_EFFECT_APPLY_AURA)) found = true; if (!found) return SPELL_MISS_IMMUNE; @@ -2624,10 +2728,11 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA { int32 origDuration = duration; duration = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (AuraEffect const* eff = m_spellAura->GetEffect(i)) - if (int32 period = eff->GetPeriod()) // period is hastened by UNIT_MOD_CAST_SPEED - duration = std::max(std::max(origDuration / period, 1) * period, duration); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect) + if (AuraEffect const* eff = m_spellAura->GetEffect(effect->EffectIndex)) + if (int32 period = eff->GetPeriod()) // period is hastened by UNIT_MOD_CAST_SPEED + duration = std::max(std::max(origDuration / period, 1) * period, duration); // if there is no periodic effect if (!duration) @@ -2646,9 +2751,9 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA } } - for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber) - if (effectMask & (1 << effectNumber)) - HandleEffects(unit, NULL, NULL, effectNumber, SPELL_EFFECT_HANDLE_HIT_TARGET); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex))) + HandleEffects(unit, NULL, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_HIT_TARGET); return SPELL_MISS_NONE; } @@ -2742,9 +2847,9 @@ void Spell::DoAllEffectOnTarget(GOTargetInfo* target) PrepareScriptHitHandlers(); CallScriptBeforeHitHandlers(); - for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber) - if (effectMask & (1 << effectNumber)) - HandleEffects(NULL, NULL, go, effectNumber, SPELL_EFFECT_HANDLE_HIT_TARGET); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex))) + HandleEffects(NULL, NULL, go, effect->EffectIndex, SPELL_EFFECT_HANDLE_HIT_TARGET); CallScriptOnHitHandlers(); CallScriptAfterHitHandlers(); @@ -2759,9 +2864,9 @@ void Spell::DoAllEffectOnTarget(ItemTargetInfo* target) PrepareScriptHitHandlers(); CallScriptBeforeHitHandlers(); - for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber) - if (effectMask & (1 << effectNumber)) - HandleEffects(NULL, target->item, NULL, effectNumber, SPELL_EFFECT_HANDLE_HIT_TARGET); + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (effectMask & (1 << effect->EffectIndex))) + HandleEffects(NULL, target->item, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_HIT_TARGET); CallScriptOnHitHandlers(); @@ -2776,9 +2881,9 @@ bool Spell::UpdateChanneledTargetList() uint8 channelTargetEffectMask = m_channelTargetEffectMask; uint8 channelAuraMask = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_APPLY_AURA) - channelAuraMask |= 1<<i; + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) + channelAuraMask |= 1 << effect->EffectIndex; channelAuraMask &= channelTargetEffectMask; @@ -2843,15 +2948,15 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered // Fill aura scaling information if (m_caster->IsControlledByPlayer() && !m_spellInfo->IsPassive() && m_spellInfo->SpellLevel && !m_spellInfo->IsChanneled() && !(_triggeredCastFlags & TRIGGERED_IGNORE_AURA_SCALING)) { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_APPLY_AURA) + if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) { // Change aura with ranks only if basepoints are taken from spellInfo and aura is positive - if (m_spellInfo->IsPositiveEffect(i)) + if (m_spellInfo->IsPositiveEffect(effect->EffectIndex)) { - m_auraScaleMask |= (1 << i); - if (m_spellValue->EffectBasePoints[i] != m_spellInfo->Effects[i].BasePoints) + m_auraScaleMask |= (1 << effect->EffectIndex); + if (m_spellValue->EffectBasePoints[effect->EffectIndex] != effect->BasePoints) { m_auraScaleMask = 0; break; @@ -2966,8 +3071,8 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered if (!(_triggeredCastFlags & TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS) && m_spellInfo->IsBreakingStealth()) { m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CAST); - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_spellInfo->Effects[i].GetUsedTargetObjectType() == TARGET_OBJECT_TYPE_UNIT) + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && effect->GetUsedTargetObjectType() == TARGET_OBJECT_TYPE_UNIT) { m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_SPELL_ATTACK); break; @@ -3296,10 +3401,6 @@ void Spell::handle_immediate() // Remove used for cast item if need (it can be already NULL after TakeReagents call TakeCastItem(); - // handle ammo consumption for thrown weapons - if (m_spellInfo->IsRangedWeaponSpell() && m_spellInfo->IsChanneled()) - TakeAmmo(); - if (m_spellState != SPELL_STATE_CASTING) finish(true); // successfully finish spell cast (not last in case autorepeat or channel spell) } @@ -3391,14 +3492,14 @@ void Spell::_handle_immediate_phase() PrepareScriptHitHandlers(); // handle effects with SPELL_EFFECT_HANDLE_HIT mode - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { // don't do anything for empty effect - if (!m_spellInfo->Effects[j].IsEffect()) + if (!effect || !effect->IsEffect()) continue; // call effect handlers to handle destination hit - HandleEffects(NULL, NULL, NULL, j, SPELL_EFFECT_HANDLE_HIT); + HandleEffects(NULL, NULL, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_HIT); } // process items @@ -3436,7 +3537,7 @@ void Spell::_handle_finish_phase() HandleHolyPower(m_caster->m_movedPlayer); } - if (m_caster->m_extraAttacks && m_spellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + if (m_caster->m_extraAttacks && HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) { if (Unit* victim = ObjectAccessor::FindUnit(m_targets.GetOrigUnitTargetGUID())) m_caster->HandleProcExtraAttackFor(victim); @@ -3494,9 +3595,10 @@ void Spell::update(uint32 difftime) // check if the player caster has moved before the spell finished // with the exception of spells affected with SPELL_AURA_CAST_WHILE_WALKING effect + SpellEffectInfo const* effect = GetEffect(EFFECT_0); if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) && m_caster->isMoving() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) && - (m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR)) && + ((effect && effect->Effect != SPELL_EFFECT_STUCK) || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR)) && !m_caster->HasAuraTypeWithAffectMask(SPELL_AURA_CAST_WHILE_WALKING, m_spellInfo)) { // don't cancel for melee, autorepeat, triggered and instant spells @@ -3671,17 +3773,18 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas if (result == SPELL_CAST_OK) return; - WorldPacket data(opcode, (4+1+1)); - data << uint8(cast_count); - data << uint32(spellInfo->Id); - data << uint8(result); // problem + WorldPackets::Spells::CastFailed packet(opcode); + packet.CastID = cast_count; + packet.SpellID = spellInfo->Id; + packet.Reason = result; + switch (result) { case SPELL_FAILED_NOT_READY: - data << uint32(0); // unknown (value 1 update cooldowns on client flag) + packet.FailedArg1 = 0; // unknown (value 1 update cooldowns on client flag) break; case SPELL_FAILED_REQUIRES_SPELL_FOCUS: - data << uint32(spellInfo->RequiresSpellFocus); // SpellFocusObject.dbc id + packet.FailedArg1 = spellInfo->RequiresSpellFocus; // SpellFocusObject.dbc id break; case SPELL_FAILED_REQUIRES_AREA: // AreaTable.dbc id // hardcode areas limitation case @@ -3689,71 +3792,71 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas { case 41617: // Cenarion Mana Salve case 41619: // Cenarion Healing Salve - data << uint32(3905); + packet.FailedArg1 = 3905; break; case 41618: // Bottled Nethergon Energy case 41620: // Bottled Nethergon Vapor - data << uint32(3842); + packet.FailedArg1 = 3842; break; case 45373: // Bloodberry Elixir - data << uint32(4075); + packet.FailedArg1 = 4075; break; default: // default case (don't must be) - data << uint32(0); + packet.FailedArg1 = 0; break; } break; case SPELL_FAILED_TOTEMS: if (spellInfo->Totem[0]) - data << uint32(spellInfo->Totem[0]); + packet.FailedArg1 = spellInfo->Totem[0]; if (spellInfo->Totem[1]) - data << uint32(spellInfo->Totem[1]); + packet.FailedArg2 = spellInfo->Totem[1]; break; case SPELL_FAILED_TOTEM_CATEGORY: if (spellInfo->TotemCategory[0]) - data << uint32(spellInfo->TotemCategory[0]); + packet.FailedArg1 = spellInfo->TotemCategory[0]; if (spellInfo->TotemCategory[1]) - data << uint32(spellInfo->TotemCategory[1]); + packet.FailedArg2 = spellInfo->TotemCategory[1]; break; case SPELL_FAILED_EQUIPPED_ITEM_CLASS: case SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND: case SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND: - data << uint32(spellInfo->EquippedItemClass); - data << uint32(spellInfo->EquippedItemSubClassMask); + packet.FailedArg1 = spellInfo->EquippedItemClass; + packet.FailedArg2 = spellInfo->EquippedItemSubClassMask; break; case SPELL_FAILED_TOO_MANY_OF_ITEM: { - uint32 item = 0; - for (int8 eff = 0; eff < MAX_SPELL_EFFECTS; eff++) - if (spellInfo->Effects[eff].ItemType) - item = spellInfo->Effects[eff].ItemType; - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); - if (proto && proto->ItemLimitCategory) - data << uint32(proto->ItemLimitCategory); - break; + uint32 item = 0; + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(caster->GetMap()->GetDifficulty())) + if (effect->ItemType) + item = effect->ItemType; + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); + if (proto && proto->ItemLimitCategory) + packet.FailedArg1 = proto->ItemLimitCategory; + break; } case SPELL_FAILED_PREVENTED_BY_MECHANIC: - data << uint32(spellInfo->GetAllEffectsMechanicMask()); // SpellMechanic.dbc id + packet.FailedArg1 = spellInfo->GetAllEffectsMechanicMask(); // SpellMechanic.dbc id break; case SPELL_FAILED_NEED_EXOTIC_AMMO: - data << uint32(spellInfo->EquippedItemSubClassMask); // seems correct... + packet.FailedArg1 = spellInfo->EquippedItemSubClassMask; // seems correct... break; case SPELL_FAILED_NEED_MORE_ITEMS: - data << uint32(0); // Item id - data << uint32(0); // Item count? + packet.FailedArg1 = 0; // Item id + packet.FailedArg2 = 0; // Item count? break; case SPELL_FAILED_MIN_SKILL: - data << uint32(0); // SkillLine.dbc id - data << uint32(0); // required skill value + packet.FailedArg1 = 0; // SkillLine.dbc id + packet.FailedArg2 = 0; // required skill value break; case SPELL_FAILED_FISHING_TOO_LOW: - data << uint32(0); // required fishing skill + packet.FailedArg1 = 0; // required fishing skill break; case SPELL_FAILED_CUSTOM_ERROR: - data << uint32(customError); + packet.FailedArg1 = customError; break; case SPELL_FAILED_SILENCED: - data << uint32(0); // Unknown + packet.FailedArg1 = 0; // Unknown break; case SPELL_FAILED_REAGENTS: { @@ -3773,14 +3876,15 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas } } - data << uint32(missingItem); // first missing item + packet.FailedArg1 = missingItem; // first missing item break; } // TODO: SPELL_FAILED_NOT_STANDING default: break; } - caster->GetSession()->SendPacket(&data); + + caster->GetSession()->SendPacket(packet.Write()); } void Spell::SendSpellStart() @@ -3788,7 +3892,7 @@ void Spell::SendSpellStart() if (!IsNeedSendToClient()) return; - //TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); + TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); uint32 castFlags = CAST_FLAG_HAS_TRAJECTORY; @@ -3803,7 +3907,81 @@ void Spell::SendSpellStart() if (m_spellInfo->RuneCostID && m_spellInfo->PowerType == POWER_RUNES) castFlags |= CAST_FLAG_NO_GCD; // not needed, but Blizzard sends it - WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2)); + WorldPackets::Spells::SpellStart packet; + WorldPackets::Spells::SpellCastData& castData = packet.Cast; + + if (m_CastItem) + castData.CasterGUID = m_CastItem->GetGUID(); + else + castData.CasterGUID = m_caster->GetGUID(); + + castData.CasterUnit = m_caster->GetGUID(); + castData.CastID = m_cast_count; // pending spell cast? + castData.SpellID = m_spellInfo->Id; + castData.CastFlags = castFlags; + castData.CastTime = m_casttime; + + m_targets.Write(castData.Target); + + if (castFlags & CAST_FLAG_POWER_LEFT_SELF) + { + /// @todo Implement multiple power types + WorldPackets::Spells::SpellPowerData powerData; + powerData.Type = m_spellInfo->PowerType; + powerData.Cost = m_caster->GetPower((Powers)m_spellInfo->PowerType); + castData.RemainingPower.push_back(powerData); + } + + if (castFlags & CAST_FLAG_RUNE_LIST) // rune cooldowns list + { + WorldPackets::Spells::RuneData& runeData = castData.RemainingRunes.Value; + //TODO: There is a crash caused by a spell with CAST_FLAG_RUNE_LIST casted by a creature + //The creature is the mover of a player, so HandleCastSpellOpcode uses it as the caster + if (Player* player = m_caster->ToPlayer()) + { + runeData.Start = m_runesState; // runes state before + runeData.Count = player->GetRunesState(); // runes state after + for (uint8 i = 0; i < MAX_RUNES; ++i) + { + // float casts ensure the division is performed on floats as we need float result + float baseCd = float(player->GetRuneBaseCooldown(i)); + runeData.Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed + } + } + else + { + runeData.Start = 0; + runeData.Count = 0; + for (uint8 i = 0; i < MAX_RUNES; ++i) + runeData.Cooldowns.push_back(0); + } + + castData.RemainingRunes.HasValue = true; + } + + /** @todo implement spell ammo packet data + if (castFlags & CAST_FLAG_PROJECTILE) + { + castData.Ammo.DisplayID = 0; + castData.Ammo.InventoryType = 0; + }**/ + + /** @todo implement spell immunity packet data + if (castFlags & CAST_FLAG_IMMUNITY) + { + castData.Immunities.School = 0; + castData.Immunities.Value = 0; + }**/ + + /** @todo implement heal prediction packet data + if (castFlags & CAST_FLAG_HEAL_PREDICTION) + { + castData.Predict.BeconGUID = ?? + castData.Predict.Points = 0; + castData.Predict.Type = 0; + }**/ + + /*WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2)); if (m_CastItem) data << m_CastItem->GetPackGUID(); else @@ -3863,9 +4041,9 @@ void Spell::SendSpellStart() data << uint8(0); // unkByte // if (unkByte == 2) // data.append(0); - } + }*/ - m_caster->SendMessageToSet(&data, true); + m_caster->SendMessageToSet(packet.Write(), true); } void Spell::SendSpellGo() @@ -3874,7 +4052,7 @@ void Spell::SendSpellGo() if (!IsNeedSendToClient()) return; - //TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_GO id=%u", m_spellInfo->Id); + TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_GO id=%u", m_spellInfo->Id); uint32 castFlags = CAST_FLAG_UNKNOWN_9; @@ -3897,7 +4075,7 @@ void Spell::SendSpellGo() castFlags |= CAST_FLAG_RUNE_LIST; // rune cooldowns list } - if (m_spellInfo->HasEffect(SPELL_EFFECT_ACTIVATE_RUNE)) + if (HasEffect(SPELL_EFFECT_ACTIVATE_RUNE)) castFlags |= CAST_FLAG_RUNE_LIST; // rune cooldowns list if (m_targets.HasTraj()) @@ -3906,7 +4084,68 @@ void Spell::SendSpellGo() if (!m_spellInfo->StartRecoveryTime) castFlags |= CAST_FLAG_NO_GCD; - WorldPacket data(SMSG_SPELL_GO, 50); // guess size + WorldPackets::Spells::SpellGo packet; + WorldPackets::Spells::SpellCastData& castData = packet.Cast; + + if (m_CastItem) + castData.CasterGUID = m_CastItem->GetGUID(); + else + castData.CasterGUID = m_caster->GetGUID(); + + castData.CasterUnit = m_caster->GetGUID(); + castData.CastID = m_cast_count; // pending spell cast? + castData.SpellID = m_spellInfo->Id; + castData.CastFlags = castFlags; + castData.CastTime = getMSTime(); + + /// @todo implement multiple targets + if (m_targets.GetUnitTarget()) + castData.HitTargets.push_back(m_targets.GetUnitTargetGUID()); + + m_targets.Write(castData.Target); + + if (castFlags & CAST_FLAG_POWER_LEFT_SELF) + { + /// @todo Implement multiple power types + WorldPackets::Spells::SpellPowerData powerData; + powerData.Type = m_spellInfo->PowerType; + powerData.Cost = m_caster->GetPower((Powers)m_spellInfo->PowerType); + castData.RemainingPower.push_back(powerData); + } + + if (castFlags & CAST_FLAG_RUNE_LIST) // rune cooldowns list + { + WorldPackets::Spells::RuneData& runeData = castData.RemainingRunes.Value; + //TODO: There is a crash caused by a spell with CAST_FLAG_RUNE_LIST casted by a creature + //The creature is the mover of a player, so HandleCastSpellOpcode uses it as the caster + if (Player* player = m_caster->ToPlayer()) + { + runeData.Start = m_runesState; // runes state before + runeData.Count = player->GetRunesState(); // runes state after + for (uint8 i = 0; i < MAX_RUNES; ++i) + { + // float casts ensure the division is performed on floats as we need float result + float baseCd = float(player->GetRuneBaseCooldown(i)); + runeData.Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed + } + } + else + { + runeData.Start = 0; + runeData.Count = 0; + for (uint8 i = 0; i < MAX_RUNES; ++i) + runeData.Cooldowns.push_back(0); + } + + castData.RemainingRunes.HasValue = true; + } + + if (castFlags & CAST_FLAG_ADJUST_MISSILE) + { + castData.MissileTrajectory.TravelTime = m_delayMoment; + castData.MissileTrajectory.Pitch = m_targets.GetElevation(); + } + /*WorldPacket data(SMSG_SPELL_GO, 50); // guess size if (m_CastItem) data << m_CastItem->GetPackGUID(); @@ -3922,7 +4161,7 @@ void Spell::SendSpellGo() WriteSpellGoTargets(&data); - m_targets.Write(data); + //m_targets.Write(data); if (castFlags & CAST_FLAG_POWER_LEFT_SELF) data << uint32(m_caster->GetPower((Powers)m_spellInfo->PowerType)); @@ -3970,7 +4209,7 @@ void Spell::SendSpellGo() if (m_targets.GetTargetMask() & TARGET_FLAG_EXTRA_TARGETS) { data << uint32(0); // Extra targets count - /* + for (uint8 i = 0; i < count; ++i) { data << float(0); // Target Position X @@ -3978,10 +4217,10 @@ void Spell::SendSpellGo() data << float(0); // Target Position Z data << uint64(0); // Target Guid } - */ - } - m_caster->SendMessageToSet(&data, true); + }*/ + + m_caster->SendMessageToSet(packet.Write(), true); } /// Writes miss and hit targets for a SMSG_SPELL_GO packet @@ -4052,9 +4291,9 @@ void Spell::SendLogExecute() data << uint32(m_spellInfo->Id); uint8 effCount = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (m_effectExecuteData[i]) + if (effect && m_effectExecuteData[effect->EffectIndex]) ++effCount; } @@ -4062,17 +4301,17 @@ void Spell::SendLogExecute() return; data << uint32(effCount); - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (!m_effectExecuteData[i]) + if (!effect || !m_effectExecuteData[effect->EffectIndex]) continue; - data << uint32(m_spellInfo->Effects[i].Effect); // spell effect + data << uint32(effect->Effect); // spell effect - data.append(*m_effectExecuteData[i]); + data.append(*m_effectExecuteData[effect->EffectIndex]); - delete m_effectExecuteData[i]; - m_effectExecuteData[i] = NULL; + delete m_effectExecuteData[effect->EffectIndex]; + m_effectExecuteData[effect->EffectIndex] = NULL; } m_caster->SendMessageToSet(&data, true); } @@ -4184,19 +4423,19 @@ void Spell::ExecuteLogEffectResurrect(uint8 effIndex, Unit* target) void Spell::SendInterrupted(uint8 result) { - WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1)); - data << m_caster->GetPackGUID(); - data << uint8(m_cast_count); - data << uint32(m_spellInfo->Id); - data << uint8(result); - m_caster->SendMessageToSet(&data, true); + WorldPackets::Spells::SpellFailure failurePacket; + failurePacket.CasterUnit = m_caster->GetGUID(); + failurePacket.CastID = m_cast_count; + failurePacket.SpellID = m_spellInfo->Id; + failurePacket.Reason = result; + m_caster->SendMessageToSet(failurePacket.Write(), true); - data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4)); - data << m_caster->GetPackGUID(); - data << uint8(m_cast_count); - data << uint32(m_spellInfo->Id); - data << uint8(result); - m_caster->SendMessageToSet(&data, true); + WorldPackets::Spells::SpellFailedOther failedPacket; + failedPacket.CasterUnit = m_caster->GetGUID(); + failedPacket.CastID = m_cast_count; + failedPacket.SpellID = m_spellInfo->Id; + failedPacket.Reason = result; + m_caster->SendMessageToSet(failedPacket.Write(), true); } void Spell::SendChannelUpdate(uint32 time) @@ -4407,36 +4646,6 @@ void Spell::TakePower() m_caster->ModifyPower(powerType, -irand(0, m_powerCost/4)); } -void Spell::TakeAmmo() -{ - if (m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER) - { - Item* pItem = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK); - - // wands don't have ammo - if (!pItem || pItem->IsBroken() || pItem->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_WAND) - return; - - if ((pItem->GetTemplate()->InventoryType == INVTYPE_THROWN || - pItem->GetTemplate()->InventoryType == INVTYPE_RANGED || - pItem->GetTemplate()->InventoryType == INVTYPE_RANGEDRIGHT) - && roll_chance_f(sWorld->getRate(RATE_DURABILITY_LOSS_DAMAGE))) - { - if (pItem->GetMaxStackCount() == 1) - { - // decrease durability for non-stackable throw weapon - m_caster->ToPlayer()->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_RANGED); - } - else - { - // decrease items amount for stackable throw weapon - uint32 count = 1; - m_caster->ToPlayer()->DestroyItemCount(pItem, count, true); - } - } - } -} - SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) { if (m_spellInfo->PowerType != POWER_RUNES || !runeCostID) @@ -4693,11 +4902,17 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGOT gameObjTarget = pGOTarget; destTarget = &m_destTargets[i]._position; - uint8 eff = m_spellInfo->Effects[i].Effect; + effectInfo = GetEffect(i); + if (!effectInfo) + { + TC_LOG_ERROR("spells", "Spell: %u HandleEffects at EffectIndex: %u missing effect", m_spellInfo->Id, i); + return; + } + uint32 eff = effectInfo->Effect; - TC_LOG_DEBUG("spells", "Spell: %u Effect : %u", m_spellInfo->Id, eff); + TC_LOG_DEBUG("spells", "Spell: %u Effect: %u", m_spellInfo->Id, eff); - damage = CalculateDamage(i, unitTarget); + damage = CalculateDamage(i, unitTarget, &variance); bool preventDefault = CallScriptEffectHandlers((SpellEffIndex)i, mode); @@ -4816,9 +5031,9 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_CASTER_AURASTATE; // Note: spell 62473 requres casterAuraSpell = triggering spell - if (m_spellInfo->CasterAuraSpell && !m_caster->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->CasterAuraSpell, m_caster))) + if (m_spellInfo->CasterAuraSpell && !m_caster->HasAura(m_spellInfo->CasterAuraSpell)) return SPELL_FAILED_CASTER_AURASTATE; - if (m_spellInfo->ExcludeCasterAuraSpell && m_caster->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->ExcludeCasterAuraSpell, m_caster))) + if (m_spellInfo->ExcludeCasterAuraSpell && m_caster->HasAura(m_spellInfo->ExcludeCasterAuraSpell)) return SPELL_FAILED_CASTER_AURASTATE; if (reqCombat && m_caster->IsInCombat() && !m_spellInfo->CanBeUsedInCombat()) @@ -4831,7 +5046,8 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->isMoving() && !m_caster->HasAuraTypeWithAffectMask(SPELL_AURA_CAST_WHILE_WALKING, m_spellInfo)) { // skip stuck spell to allow use it in falling case and apply spell limitations at movement - if ((!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR) || m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK) && + SpellEffectInfo const* effect = GetEffect(EFFECT_0); + if ((!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR) || (effect && effect->Effect != SPELL_EFFECT_STUCK)) && (IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0)) return SPELL_FAILED_MOVING; } @@ -4916,9 +5132,9 @@ SpellCastResult Spell::CheckCast(bool strict) } // check pet presence - for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { - if (m_spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PET) + if (effect && effect->TargetA.GetTarget() == TARGET_UNIT_PET) { if (!m_caster->GetGuardianPet()) { @@ -5009,10 +5225,12 @@ SpellCastResult Spell::CheckCast(bool strict) if (castResult != SPELL_CAST_OK) return castResult; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { + if (!effect) + continue; // for effects of spells that have only one target - switch (m_spellInfo->Effects[i].Effect) + switch (effect->Effect) { case SPELL_EFFECT_DUMMY: { @@ -5039,7 +5257,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_BAD_TARGETS; - if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_PET) + if (effect->TargetA.GetTarget() != TARGET_UNIT_PET) break; Pet* pet = m_caster->ToPlayer()->GetPet(); @@ -5047,7 +5265,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (!pet) return SPELL_FAILED_NO_PET; - SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(m_spellInfo->Effects[i].TriggerSpell); + SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(effect->TriggerSpell); if (!learn_spellproto) return SPELL_FAILED_NOT_KNOWN; @@ -5078,7 +5296,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (!pet || pet->GetOwner() != m_caster) return SPELL_FAILED_BAD_TARGETS; - SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(m_spellInfo->Effects[i].TriggerSpell); + SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(effect->TriggerSpell); if (!learn_spellproto) return SPELL_FAILED_NOT_KNOWN; @@ -5090,7 +5308,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_APPLY_GLYPH: { - uint32 glyphId = m_spellInfo->Effects[i].MiscValue; + uint32 glyphId = effect->MiscValue; if (GlyphPropertiesEntry const* gp = sGlyphPropertiesStore.LookupEntry(glyphId)) if (m_caster->HasAura(gp->SpellID)) return SPELL_FAILED_UNIQUE_GLYPH; @@ -5127,7 +5345,7 @@ SpellCastResult Spell::CheckCast(bool strict) // Can be area effect, Check only for players and not check if target - caster (spell can have multiply drain/burn effects) if (m_caster->GetTypeId() == TYPEID_PLAYER) if (Unit* target = m_targets.GetUnitTarget()) - if (target != m_caster && target->getPowerType() != Powers(m_spellInfo->Effects[i].MiscValue)) + if (target != m_caster && target->getPowerType() != Powers(effect->MiscValue)) return SPELL_FAILED_BAD_TARGETS; break; } @@ -5200,13 +5418,13 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_OPEN_LOCK: { - if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_TARGET && - m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET) + if (effect->TargetA.GetTarget() != TARGET_GAMEOBJECT_TARGET && + effect->TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET) break; if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc. // we need a go target in case of TARGET_GAMEOBJECT_TARGET - || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())) + || (effect->TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())) return SPELL_FAILED_BAD_TARGETS; Item* pTempItem = NULL; @@ -5219,7 +5437,7 @@ SpellCastResult Spell::CheckCast(bool strict) pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.GetItemTargetGUID()); // we need a go target, or an openable item target in case of TARGET_GAMEOBJECT_ITEM_TARGET - if (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET && + if (effect->TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET && !m_targets.GetGOTarget() && (!pTempItem || !pTempItem->GetTemplate()->LockID || !pTempItem->IsLocked())) return SPELL_FAILED_BAD_TARGETS; @@ -5246,7 +5464,7 @@ SpellCastResult Spell::CheckCast(bool strict) int32 skillValue = 0; // check lock compatibility - SpellCastResult res = CanOpenLock(i, lockId, skillId, reqSkillValue, skillValue); + SpellCastResult res = CanOpenLock(effect->EffectIndex, lockId, skillId, reqSkillValue, skillValue); if (res != SPELL_CAST_OK) return res; @@ -5274,7 +5492,7 @@ SpellCastResult Spell::CheckCast(bool strict) // This is generic summon effect case SPELL_EFFECT_SUMMON: { - SummonPropertiesEntry const* SummonProperties = sSummonPropertiesStore.LookupEntry(m_spellInfo->Effects[i].MiscValueB); + SummonPropertiesEntry const* SummonProperties = sSummonPropertiesStore.LookupEntry(effect->MiscValueB); if (!SummonProperties) break; switch (SummonProperties->Category) @@ -5408,9 +5626,11 @@ SpellCastResult Spell::CheckCast(bool strict) } } - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - switch (m_spellInfo->Effects[i].ApplyAuraName) + if (!effect) + continue; + switch (effect->ApplyAuraName) { case SPELL_AURA_MOD_POSSESS_PET: { @@ -5432,8 +5652,8 @@ SpellCastResult Spell::CheckCast(bool strict) if (!m_caster->GetCharmerGUID().IsEmpty()) return SPELL_FAILED_CHARMED; - if (m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_CHARM - || m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_POSSESS) + if (effect->ApplyAuraName == SPELL_AURA_MOD_CHARM + || effect->ApplyAuraName == SPELL_AURA_MOD_POSSESS) { if (!m_caster->GetPetGUID().IsEmpty()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; @@ -5456,7 +5676,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (target->GetOwner() && target->GetOwner()->GetTypeId() == TYPEID_PLAYER) return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED; - int32 damage = CalculateDamage(i, target); + int32 damage = CalculateDamage(effect->EffectIndex, target); if (damage && int32(target->getLevel()) > damage) return SPELL_FAILED_HIGHLEVEL; } @@ -5508,7 +5728,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_AURA_PERIODIC_MANA_LEECH: { - if (m_spellInfo->Effects[i].IsTargetingArea()) + if (effect->IsTargetingArea()) break; if (!m_targets.GetUnitTarget()) @@ -5608,14 +5828,17 @@ SpellCastResult Spell::CheckCasterAuras() const // We use bitmasks so the loop is done only once and not on every aura check below. if (m_spellInfo->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY) { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY) - school_immune |= uint32(m_spellInfo->Effects[i].MiscValue); - else if (m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MECHANIC_IMMUNITY) - mechanic_immune |= 1 << uint32(m_spellInfo->Effects[i].MiscValue); - else if (m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_DISPEL_IMMUNITY) - dispel_immune |= SpellInfo::GetDispelMask(DispelType(m_spellInfo->Effects[i].MiscValue)); + if (!effect) + continue; + + if (effect->ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY) + school_immune |= uint32(effect->MiscValue); + else if (effect->ApplyAuraName == SPELL_AURA_MECHANIC_IMMUNITY) + mechanic_immune |= 1 << uint32(effect->MiscValue); + else if (effect->ApplyAuraName == SPELL_AURA_DISPEL_IMMUNITY) + dispel_immune |= SpellInfo::GetDispelMask(DispelType(effect->MiscValue)); } // immune movement impairment and loss of control if (m_spellInfo->Id == 42292 || m_spellInfo->Id == 59752 || m_spellInfo->Id == 19574) @@ -5684,9 +5907,12 @@ SpellCastResult Spell::CheckCasterAuras() const //Make a second check for spell failed so the right SPELL_FAILED message is returned. //That is needed when your casting is prevented by multiple states and you are only immune to some of them. - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (AuraEffect* part = aura->GetEffect(i)) + if (!effect) + continue; + + if (AuraEffect* part = aura->GetEffect(effect->EffectIndex)) { switch (part->GetAuraType()) { @@ -5758,25 +5984,28 @@ bool Spell::CanAutoCast(Unit* target) { ObjectGuid targetguid = target->GetGUID(); - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { - if (m_spellInfo->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA) + if (!effect) + continue; + + if (effect->Effect == SPELL_EFFECT_APPLY_AURA) { if (m_spellInfo->StackAmount <= 1) { - if (target->HasAuraEffect(m_spellInfo->Id, j)) + if (target->HasAuraEffect(m_spellInfo->Id, effect->EffectIndex)) return false; } else { - if (AuraEffect* aureff = target->GetAuraEffect(m_spellInfo->Id, j)) + if (AuraEffect* aureff = target->GetAuraEffect(m_spellInfo->Id, effect->EffectIndex)) if (aureff->GetBase()->GetStackAmount() >= m_spellInfo->StackAmount) return false; } } - else if (m_spellInfo->Effects[j].IsAreaAuraEffect()) + else if (effect->IsAreaAuraEffect()) { - if (target->HasAuraEffect(m_spellInfo->Id, j)) + if (target->HasAuraEffect(m_spellInfo->Id, effect->EffectIndex)) return false; } } @@ -5921,13 +6150,13 @@ SpellCastResult Spell::CheckItems() { // such items should only fail if there is no suitable effect at all - see Rejuvenation Potions for example SpellCastResult failReason = SPELL_CAST_OK; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { // skip check, pet not required like checks, and for TARGET_UNIT_PET m_targets.GetUnitTarget() is not the real target but the caster - if (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_PET) + if (!effect || effect->TargetA.GetTarget() == TARGET_UNIT_PET) continue; - if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_HEAL) + if (effect->Effect == SPELL_EFFECT_HEAL) { if (m_targets.GetUnitTarget()->IsFullHealth()) { @@ -5942,15 +6171,15 @@ SpellCastResult Spell::CheckItems() } // Mana Potion, Rage Potion, Thistle Tea(Rogue), ... - if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_ENERGIZE) + if (effect->Effect == SPELL_EFFECT_ENERGIZE) { - if (m_spellInfo->Effects[i].MiscValue < 0 || m_spellInfo->Effects[i].MiscValue >= int8(MAX_POWERS)) + if (effect->MiscValue < 0 || effect->MiscValue >= int8(MAX_POWERS)) { failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER; continue; } - Powers power = Powers(m_spellInfo->Effects[i].MiscValue); + Powers power = Powers(effect->MiscValue); if (m_targets.GetUnitTarget()->GetPower(power) == m_targets.GetUnitTarget()->GetMaxPower(power)) { failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER; @@ -6048,34 +6277,37 @@ SpellCastResult Spell::CheckItems() } // special checks for spell effects - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - switch (m_spellInfo->Effects[i].Effect) + if (!effect) + continue; + + switch (effect->Effect) { case SPELL_EFFECT_CREATE_ITEM: case SPELL_EFFECT_CREATE_ITEM_2: { - if (!IsTriggered() && m_spellInfo->Effects[i].ItemType) + if (!IsTriggered() && effect->ItemType) { ItemPosCountVec dest; - InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1); + InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, effect->ItemType, 1); if (msg != EQUIP_ERR_OK) { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(m_spellInfo->Effects[i].ItemType); + ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(effect->ItemType); /// @todo Needs review if (pProto && !(pProto->ItemLimitCategory)) { - player->SendEquipError(msg, NULL, NULL, m_spellInfo->Effects[i].ItemType); + player->SendEquipError(msg, NULL, NULL, effect->ItemType); return SPELL_FAILED_DONT_REPORT; } else { if (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (m_spellInfo->SpellFamilyFlags[0] & 0x40000000))) return SPELL_FAILED_TOO_MANY_OF_ITEM; - else if (!(player->HasItemCount(m_spellInfo->Effects[i].ItemType))) + else if (!(player->HasItemCount(effect->ItemType))) return SPELL_FAILED_TOO_MANY_OF_ITEM; - else - player->CastSpell(m_caster, m_spellInfo->Effects[EFFECT_1].CalcValue(), false); // move this to anywhere + else if (SpellEffectInfo const* efi = GetEffect(EFFECT_1)) + player->CastSpell(m_caster, efi->CalcValue(), false); // move this to anywhere return SPELL_FAILED_DONT_REPORT; } } @@ -6083,7 +6315,7 @@ SpellCastResult Spell::CheckItems() break; } case SPELL_EFFECT_ENCHANT_ITEM: - if (m_spellInfo->Effects[i].ItemType && m_targets.GetItemTarget() + if (effect->ItemType && m_targets.GetItemTarget() && (m_targets.GetItemTarget()->IsVellum())) { // cannot enchant vellum for other player @@ -6093,10 +6325,10 @@ SpellCastResult Spell::CheckItems() if (m_CastItem && m_CastItem->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_TRIGGERED_CAST) return SPELL_FAILED_TOTEM_CATEGORY; ItemPosCountVec dest; - InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1); + InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, effect->ItemType, 1); if (msg != EQUIP_ERR_OK) { - player->SendEquipError(msg, NULL, NULL, m_spellInfo->Effects[i].ItemType); + player->SendEquipError(msg, NULL, NULL, effect->ItemType); return SPELL_FAILED_DONT_REPORT; } } @@ -6123,7 +6355,7 @@ SpellCastResult Spell::CheckItems() } } - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(m_spellInfo->Effects[i].MiscValue); + SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(effect->MiscValue); // do not allow adding usable enchantments to items that have use effect already if (enchantEntry) { @@ -6168,7 +6400,7 @@ SpellCastResult Spell::CheckItems() // Not allow enchant in trade slot for some enchant type if (item->GetOwner() != m_caster) { - uint32 enchant_id = m_spellInfo->Effects[i].MiscValue; + uint32 enchant_id = effect->MiscValue; SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) return SPELL_FAILED_ERROR; @@ -6285,7 +6517,7 @@ SpellCastResult Spell::CheckItems() } case SPELL_EFFECT_CREATE_MANA_GEM: { - uint32 item_id = m_spellInfo->Effects[i].ItemType; + uint32 item_id = effect->ItemType; ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item_id); if (!pProto) @@ -6457,9 +6689,12 @@ bool Spell::UpdatePointers() WorldObject* transport = NULL; // update effect destinations (in case of moved transport dest target) - for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + for (SpellEffectInfo const* effect : GetEffects()) { - SpellDestination& dest = m_destTargets[effIndex]; + if (!effect) + continue; + + SpellDestination& dest = m_destTargets[effect->EffectIndex]; if (!dest._transportGUID) continue; @@ -6490,7 +6725,11 @@ CurrentSpellTypes Spell::GetCurrentContainer() const bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* losPosition) const { - switch (m_spellInfo->Effects[eff].ApplyAuraName) + SpellEffectInfo const* effect = GetEffect(eff); + if (!effect) + return false; + + switch (effect->ApplyAuraName) { case SPELL_AURA_MOD_POSSESS: case SPELL_AURA_MOD_CHARM: @@ -6520,7 +6759,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo /// @todo shit below shouldn't be here, but it's temporary //Check targets for LOS visibility (except spells without range limitations) - switch (m_spellInfo->Effects[eff].Effect) + switch (effect->Effect) { case SPELL_EFFECT_RESURRECT_NEW: // player far away, maybe his corpse near? @@ -6731,21 +6970,19 @@ bool Spell::IsValidDeadOrAliveTarget(Unit const* target) const void Spell::HandleLaunchPhase() { // handle effects with SPELL_EFFECT_HANDLE_LAUNCH mode - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { // don't do anything for empty effect - if (!m_spellInfo->Effects[i].IsEffect()) + if (!effect || !effect->IsEffect()) continue; - HandleEffects(NULL, NULL, NULL, i, SPELL_EFFECT_HANDLE_LAUNCH); + HandleEffects(NULL, NULL, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_LAUNCH); } float multiplier[MAX_SPELL_EFFECTS]; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (m_applyMultiplierMask & (1 << i)) - multiplier[i] = m_spellInfo->Effects[i].CalcDamageMultiplier(m_originalCaster, this); - - bool usesAmmo = (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_DIRECT_DAMAGE) != 0; + for (SpellEffectInfo const* effect : GetEffects()) + if (effect && (m_applyMultiplierMask & (1 << effect->EffectIndex))) + multiplier[effect->EffectIndex] = effect->CalcDamageMultiplier(m_originalCaster, this); for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { @@ -6755,31 +6992,6 @@ void Spell::HandleLaunchPhase() if (!mask) continue; - // do not consume ammo anymore for Hunter's volley spell - if (IsTriggered() && m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && m_spellInfo->IsTargetingArea()) - usesAmmo = false; - - if (usesAmmo) - { - bool ammoTaken = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++) - { - if (!(mask & 1<<i)) - continue; - switch (m_spellInfo->Effects[i].Effect) - { - case SPELL_EFFECT_SCHOOL_DAMAGE: - case SPELL_EFFECT_WEAPON_DAMAGE: - case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: - case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: - case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: - ammoTaken=true; - TakeAmmo(); - } - if (ammoTaken) - break; - } - } DoAllEffectOnLaunchTarget(target, multiplier); } } @@ -6796,18 +7008,18 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) if (!unit) return; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if (targetInfo.effectMask & (1<<i)) + if (effect && (targetInfo.effectMask & (1<<effect->EffectIndex))) { m_damage = 0; m_healing = 0; - HandleEffects(unit, NULL, NULL, i, SPELL_EFFECT_HANDLE_LAUNCH_TARGET); + HandleEffects(unit, NULL, NULL, effect->EffectIndex, SPELL_EFFECT_HANDLE_LAUNCH_TARGET); if (m_damage > 0) { - if (m_spellInfo->Effects[i].IsTargetingArea() || m_spellInfo->Effects[i].IsAreaAuraEffect() || m_spellInfo->Effects[i].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) + if (effect->IsTargetingArea() || effect->IsAreaAuraEffect() || effect->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) { m_damage = int32(float(m_damage) * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask)); if (m_caster->GetTypeId() != TYPEID_PLAYER) @@ -6822,10 +7034,10 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) } } - if (m_applyMultiplierMask & (1 << i)) + if (m_applyMultiplierMask & (1 << effect->EffectIndex)) { - m_damage = int32(m_damage * m_damageMultipliers[i]); - m_damageMultipliers[i] *= multiplier[i]; + m_damage = int32(m_damage * m_damageMultipliers[effect->EffectIndex]); + m_damageMultipliers[effect->EffectIndex] *= multiplier[effect->EffectIndex]; } targetInfo.damage += m_damage; } @@ -6845,6 +7057,10 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk if (!lockInfo) return SPELL_FAILED_BAD_TARGETS; + SpellEffectInfo const* effect = GetEffect(effIndex); + if (!effect) + return SPELL_FAILED_BAD_TARGETS; // no idea about correct error + bool reqKey = false; // some locks not have reqs for (int j = 0; j < MAX_LOCK_CASE; ++j) @@ -6863,7 +7079,7 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk reqKey = true; // wrong locktype, skip - if (uint32(m_spellInfo->Effects[effIndex].MiscValue) != lockInfo->Index[j]) + if (uint32(effect->MiscValue) != lockInfo->Index[j]) continue; skillId = SkillByLockType(LockType(lockInfo->Index[j])); @@ -6878,8 +7094,8 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk // skill bonus provided by casting spell (mostly item spells) // add the effect base points modifier from the spell cast (cheat lock / skeleton key etc.) - if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET) - skillValue += m_spellInfo->Effects[effIndex].CalcValue(); + if (effect->TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || effect->TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET) + skillValue += effect->CalcValue(); if (skillValue < reqSkillValue) return SPELL_FAILED_LOW_CASTLEVEL; @@ -6898,17 +7114,15 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk void Spell::SetSpellValue(SpellValueMod mod, int32 value) { + if (mod < SPELLVALUE_BASE_POINT_END) + { + if (SpellEffectInfo const* effect = GetEffect(mod)) + m_spellValue->EffectBasePoints[mod] = effect->CalcBaseValue(value); + return; + } + switch (mod) { - case SPELLVALUE_BASE_POINT0: - m_spellValue->EffectBasePoints[0] = m_spellInfo->Effects[EFFECT_0].CalcBaseValue(value); - break; - case SPELLVALUE_BASE_POINT1: - m_spellValue->EffectBasePoints[1] = m_spellInfo->Effects[EFFECT_1].CalcBaseValue(value); - break; - case SPELLVALUE_BASE_POINT2: - m_spellValue->EffectBasePoints[2] = m_spellInfo->Effects[EFFECT_2].CalcBaseValue(value); - break; case SPELLVALUE_RADIUS_MOD: m_spellValue->RadiusMod = (float)value / 10000; break; @@ -6931,7 +7145,7 @@ void Spell::FinishTargetProcessing() SendLogExecute(); } -void Spell::InitEffectExecuteData(uint8 effIndex) +void Spell::InitEffectExecuteData(uint32 effIndex) { ASSERT(effIndex < MAX_SPELL_EFFECTS); if (!m_effectExecuteData[effIndex]) @@ -7193,9 +7407,9 @@ bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByA { bool only_on_caster = (triggeredByAura && (triggeredByAura->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_CASTER)); // If triggeredByAura has SPELL_ATTR4_PROC_ONLY_ON_CASTER then it can only proc on a cast spell with TARGET_UNIT_CASTER - for (uint8 i = 0;i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffects()) { - if ((effMask & (1 << i)) && (!only_on_caster || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_CASTER))) + if (effect && ((effMask & (1 << effect->EffectIndex)) && (!only_on_caster || (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER)))) return true; } return false; @@ -7236,19 +7450,23 @@ void Spell::PrepareTriggersExecutedOnHit() continue; SpellInfo const* auraSpellInfo = (*i)->GetSpellInfo(); uint32 auraSpellIdx = (*i)->GetEffIndex(); - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(auraSpellInfo->Effects[auraSpellIdx].TriggerSpell)) + // todo 6.x + if (SpellEffectInfo const* auraEffect = auraSpellInfo->GetEffect(m_caster->GetMap()->GetDifficulty(), auraSpellIdx)) { - // calculate the chance using spell base amount, because aura amount is not updated on combo-points change - // this possibly needs fixing - int32 auraBaseAmount = (*i)->GetBaseAmount(); - // proc chance is stored in effect amount - int32 chance = m_caster->CalculateSpellDamage(NULL, auraSpellInfo, auraSpellIdx, &auraBaseAmount); - // build trigger and add to the list - HitTriggerSpell spellTriggerInfo; - spellTriggerInfo.triggeredSpell = spellInfo; - spellTriggerInfo.triggeredByAura = auraSpellInfo; - spellTriggerInfo.chance = chance * (*i)->GetBase()->GetStackAmount(); - m_hitTriggerSpells.push_back(spellTriggerInfo); + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(auraEffect->TriggerSpell)) + { + // calculate the chance using spell base amount, because aura amount is not updated on combo-points change + // this possibly needs fixing + int32 auraBaseAmount = (*i)->GetBaseAmount(); + // proc chance is stored in effect amount + int32 chance = m_caster->CalculateSpellDamage(NULL, auraSpellInfo, auraSpellIdx, &auraBaseAmount); + // build trigger and add to the list + HitTriggerSpell spellTriggerInfo; + spellTriggerInfo.triggeredSpell = spellInfo; + spellTriggerInfo.triggeredByAura = auraSpellInfo; + spellTriggerInfo.chance = chance * (*i)->GetBase()->GetStackAmount(); + m_hitTriggerSpells.push_back(spellTriggerInfo); + } } } } @@ -7321,6 +7539,16 @@ void Spell::CancelGlobalCooldown() m_caster->ToPlayer()->GetGlobalCooldownMgr().CancelGlobalCooldown(m_spellInfo); } +bool Spell::HasEffect(SpellEffectName effect) const +{ + for (SpellEffectInfo const* eff : GetEffects()) + { + if (eff && eff->IsEffect(effect)) + return true; + } + return false; +} + namespace Trinity { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index dc07449c41f..57302c4f32e 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -25,6 +25,14 @@ #include "SpellInfo.h" #include "PathGenerator.h" +namespace WorldPackets +{ + namespace Spells + { + struct SpellTargetData; + } +} + class Unit; class Player; class GameObject; @@ -99,10 +107,11 @@ class SpellCastTargets { public: SpellCastTargets(); + SpellCastTargets(Unit* caster, uint32 targetMask, ObjectGuid targetGuid, ObjectGuid itemTargetGuid, ObjectGuid srcTransportGuid, ObjectGuid destTransportGuid, Position srcPos, Position destPos, float elevation, float missileSpeed, std::string targetString); ~SpellCastTargets(); void Read(ByteBuffer& data, Unit* caster); - void Write(ByteBuffer& data); + void Write(WorldPackets::Spells::SpellTargetData& data); uint32 GetTargetMask() const { return m_targetMask; } void SetTargetMask(uint32 newMask) { m_targetMask = newMask; } @@ -168,6 +177,7 @@ class SpellCastTargets void Update(Unit* caster); void OutDebug() const; + std::string GetTargetString() const { return m_strTarget; } private: uint32 m_targetMask; @@ -191,7 +201,7 @@ class SpellCastTargets struct SpellValue { - explicit SpellValue(SpellInfo const* proto); + explicit SpellValue(Difficulty diff, SpellInfo const* proto); int32 EffectBasePoints[MAX_SPELL_EFFECTS]; uint32 MaxAffectedTargets; float RadiusMod; @@ -377,7 +387,7 @@ class Spell void SelectImplicitChainTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType, WorldObject* target, uint32 effMask); void SelectImplicitTrajTargets(SpellEffIndex effIndex); - void SelectEffectTypeImplicitTargets(uint8 effIndex); + void SelectEffectTypeImplicitTargets(uint32 effIndex); uint32 GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionList* condList); template<class SEARCHER> void SearchTargets(SEARCHER& searcher, uint32 containerMask, Unit* referer, Position const* pos, float radius); @@ -394,7 +404,6 @@ class Spell void cast(bool skipCheck = false); void finish(bool ok = true); void TakePower(); - void TakeAmmo(); void TakeRunePower(bool didHit); void TakeReagents(); @@ -417,7 +426,7 @@ class Spell SpellCastResult CheckCasterAuras() const; SpellCastResult CheckArenaAndRatedBattlegroundCastRules(); - int32 CalculateDamage(uint8 i, Unit const* target) const { return m_caster->CalculateSpellDamage(target, m_spellInfo, i, &m_spellValue->EffectBasePoints[i]); } + int32 CalculateDamage(uint8 i, Unit const* target, float* var = nullptr) const { return m_caster->CalculateSpellDamage(target, m_spellInfo, i, &m_spellValue->EffectBasePoints[i], var); } bool HaveTargetsForEffect(uint8 effect) const; void Delayed(); @@ -503,6 +512,24 @@ class Spell void CleanupTargetList(); void SetSpellValue(SpellValueMod mod, int32 value); + + SpellEffectInfoVector GetEffects() const { return _effects; } + SpellEffectInfo const* GetEffect(uint32 index) const + { + if (index >= _effects.size()) + return nullptr; + + return _effects[index]; + } + + bool HasEffect(SpellEffectName effect) const; + + Spell** m_selfContainer; // pointer to our spell container (if applicable) + + SpellInfo const* GetTriggeredByAuraSpell() const { return m_triggeredByAuraSpell; } + + int32 GetTimer() const { return m_timer; } + protected: bool HasGlobalCooldown() const; void TriggerGlobalCooldown(); @@ -518,8 +545,6 @@ class Spell // e.g. damage around area spell trigered by victim aura and damage enemies of aura caster Unit* m_originalCaster; // cached pointer for m_originalCaster, updated at Spell::UpdatePointers() - Spell** m_selfContainer; // pointer to our spell container (if applicable) - //Spell data SpellSchoolMask m_spellSchoolMask; // Spell school (can be overwrite for some spells (wand shoot for example) WeaponAttackType m_attackType; // For weapon based attack @@ -558,7 +583,9 @@ class Spell GameObject* gameObjTarget; WorldLocation* destTarget; int32 damage; + float variance; SpellEffectHandleMode effectHandleMode; + SpellEffectInfo const* effectInfo; // used in effects handlers Aura* m_spellAura; @@ -591,7 +618,7 @@ class Spell uint64 timeDelay; SpellMissInfo missCondition:8; SpellMissInfo reflectResult:8; - uint8 effectMask:8; + uint32 effectMask:32; bool processed:1; bool alive:1; bool crit:1; @@ -599,13 +626,13 @@ class Spell int32 damage; }; std::list<TargetInfo> m_UniqueTargetInfo; - uint8 m_channelTargetEffectMask; // Mask req. alive targets + uint32 m_channelTargetEffectMask; // Mask req. alive targets struct GOTargetInfo { ObjectGuid targetGUID; uint64 timeDelay; - uint8 effectMask:8; + uint32 effectMask:32; bool processed:1; }; std::list<GOTargetInfo> m_UniqueGOTargetInfo; @@ -613,7 +640,7 @@ class Spell struct ItemTargetInfo { Item *item; - uint8 effectMask; + uint32 effectMask; }; std::list<ItemTargetInfo> m_UniqueItemInfo; @@ -638,7 +665,7 @@ class Spell void FinishTargetProcessing(); // spell execution log - void InitEffectExecuteData(uint8 effIndex); + void InitEffectExecuteData(uint32 effIndex); void CheckEffectExecuteData(); // Scripting system @@ -689,7 +716,7 @@ class Spell SpellInfo const* m_triggeredByAuraSpell; bool m_skipCheck; - uint8 m_auraScaleMask; + uint32 m_auraScaleMask; PathGenerator m_preGeneratedPath; ByteBuffer * m_effectExecuteData[MAX_SPELL_EFFECTS]; @@ -704,6 +731,8 @@ class Spell Spell(Spell const& right) = delete; Spell& operator=(Spell const& right) = delete; + + SpellEffectInfoVector _effects; }; namespace Trinity diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9c12abbe6e2..e3d2b9d3d1f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -252,6 +252,68 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectUnused, //180 SPELL_EFFECT_180 unused &Spell::EffectUnused, //181 SPELL_EFFECT_181 unused &Spell::EffectNULL, //182 SPELL_EFFECT_182 + &Spell::EffectNULL, //183 SPELL_EFFECT_183 + &Spell::EffectNULL, //184 SPELL_EFFECT_184 + &Spell::EffectNULL, //185 SPELL_EFFECT_185 + &Spell::EffectNULL, //186 SPELL_EFFECT_186 + &Spell::EffectNULL, //187 SPELL_EFFECT_187 + &Spell::EffectNULL, //188 SPELL_EFFECT_188 + &Spell::EffectNULL, //189 SPELL_EFFECT_189 + &Spell::EffectNULL, //190 SPELL_EFFECT_190 + &Spell::EffectNULL, //191 SPELL_EFFECT_191 + &Spell::EffectNULL, //192 SPELL_EFFECT_192 + &Spell::EffectNULL, //193 SPELL_EFFECT_193 + &Spell::EffectNULL, //194 SPELL_EFFECT_194 + &Spell::EffectNULL, //195 SPELL_EFFECT_195 + &Spell::EffectNULL, //196 SPELL_EFFECT_196 + &Spell::EffectNULL, //197 SPELL_EFFECT_197 + &Spell::EffectNULL, //198 SPELL_EFFECT_198 + &Spell::EffectNULL, //199 SPELL_EFFECT_199 + &Spell::EffectNULL, //200 SPELL_EFFECT_200 + &Spell::EffectNULL, //201 SPELL_EFFECT_201 + &Spell::EffectNULL, //202 SPELL_EFFECT_202 + &Spell::EffectNULL, //203 SPELL_EFFECT_203 + &Spell::EffectNULL, //204 SPELL_EFFECT_204 + &Spell::EffectNULL, //205 SPELL_EFFECT_205 + &Spell::EffectNULL, //206 SPELL_EFFECT_206 + &Spell::EffectNULL, //207 SPELL_EFFECT_207 + &Spell::EffectNULL, //208 SPELL_EFFECT_208 + &Spell::EffectNULL, //209 SPELL_EFFECT_209 + &Spell::EffectNULL, //210 SPELL_EFFECT_210 + &Spell::EffectNULL, //211 SPELL_EFFECT_211 + &Spell::EffectNULL, //212 SPELL_EFFECT_212 + &Spell::EffectNULL, //213 SPELL_EFFECT_213 + &Spell::EffectNULL, //214 SPELL_EFFECT_214 + &Spell::EffectNULL, //215 SPELL_EFFECT_215 + &Spell::EffectNULL, //216 SPELL_EFFECT_216 + &Spell::EffectNULL, //217 SPELL_EFFECT_217 + &Spell::EffectNULL, //218 SPELL_EFFECT_218 + &Spell::EffectNULL, //219 SPELL_EFFECT_219 + &Spell::EffectNULL, //220 SPELL_EFFECT_220 + &Spell::EffectNULL, //221 SPELL_EFFECT_221 + &Spell::EffectNULL, //222 SPELL_EFFECT_222 + &Spell::EffectNULL, //223 SPELL_EFFECT_223 + &Spell::EffectNULL, //224 SPELL_EFFECT_224 + &Spell::EffectNULL, //225 SPELL_EFFECT_225 + &Spell::EffectNULL, //226 SPELL_EFFECT_226 + &Spell::EffectNULL, //227 SPELL_EFFECT_227 + &Spell::EffectNULL, //228 SPELL_EFFECT_228 + &Spell::EffectNULL, //229 SPELL_EFFECT_229 + &Spell::EffectNULL, //230 SPELL_EFFECT_230 + &Spell::EffectNULL, //231 SPELL_EFFECT_231 + &Spell::EffectNULL, //232 SPELL_EFFECT_232 + &Spell::EffectNULL, //233 SPELL_EFFECT_233 + &Spell::EffectNULL, //234 SPELL_EFFECT_234 + &Spell::EffectNULL, //235 SPELL_EFFECT_235 + &Spell::EffectNULL, //236 SPELL_EFFECT_236 + &Spell::EffectNULL, //237 SPELL_EFFECT_237 + &Spell::EffectNULL, //238 SPELL_EFFECT_238 + &Spell::EffectNULL, //239 SPELL_EFFECT_239 + &Spell::EffectNULL, //240 SPELL_EFFECT_240 + &Spell::EffectNULL, //241 SPELL_EFFECT_241 + &Spell::EffectNULL, //242 SPELL_EFFECT_242 + &Spell::EffectNULL, //243 SPELL_EFFECT_243 + &Spell::EffectNULL, //244 SPELL_EFFECT_244 }; void Spell::EffectNULL(SpellEffIndex /*effIndex*/) @@ -284,7 +346,7 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) return; uint32 health = damage; - uint32 mana = m_spellInfo->Effects[effIndex].MiscValue; + uint32 mana = effectInfo->MiscValue; ExecuteLogEffectResurrect(effIndex, target); target->SetResurrectRequestData(m_caster, health, mana, 0); SendResurrectRequest(target); @@ -359,7 +421,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) { // Consumption case 28865: - damage = (((InstanceMap*)m_caster->GetMap())->GetDifficulty() == REGULAR_DIFFICULTY ? 2750 : 4250); + damage = (((InstanceMap*)m_caster->GetMap())->GetDifficulty() == DIFFICULTY_NONE ? 2750 : 4250); break; // percent from health with min case 25599: // Thundercrash @@ -419,23 +481,6 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) } case SPELLFAMILY_PRIEST: { - // Improved Mind Blast (Mind Blast in shadow form bonus) - if (m_caster->GetShapeshiftForm() == FORM_SHADOW && (m_spellInfo->SpellFamilyFlags[0] & 0x00002000)) - { - Unit::AuraEffectList const& ImprMindBlast = m_caster->GetAuraEffectsByType(SPELL_AURA_ADD_FLAT_MODIFIER); - for (Unit::AuraEffectList::const_iterator i = ImprMindBlast.begin(); i != ImprMindBlast.end(); ++i) - { - if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_PRIEST && - ((*i)->GetSpellInfo()->SpellIconID == 95)) - { - int chance = (*i)->GetSpellInfo()->Effects[EFFECT_1].CalcValue(m_caster); - if (roll_chance_i(chance)) - // Mind Trauma - m_caster->CastSpell(unitTarget, 48301, true, nullptr); - break; - } - } - } break; } case SPELLFAMILY_DRUID: @@ -464,31 +509,14 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x00010000, 0, 0, m_caster->GetGUID())) { // count consumed deadly poison doses at target - bool needConsume = true; uint32 spellId = aurEff->GetId(); uint32 doses = aurEff->GetBase()->GetStackAmount(); if (doses > combo) doses = combo; - // Master Poisoner - Unit::AuraEffectList const& auraList = player->GetAuraEffectsByType(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK); - for (Unit::AuraEffectList::const_iterator iter = auraList.begin(); iter != auraList.end(); ++iter) - { - if ((*iter)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && (*iter)->GetSpellInfo()->SpellIconID == 1960) - { - uint32 chance = (*iter)->GetSpellInfo()->Effects[EFFECT_2].CalcValue(m_caster); - - if (chance && roll_chance_i(chance)) - needConsume = false; - - break; - } - } - - if (needConsume) - for (uint32 i = 0; i < doses; ++i) - unitTarget->RemoveAuraFromStack(spellId, m_caster->GetGUID()); + for (uint32 i = 0; i < doses; ++i) + unitTarget->RemoveAuraFromStack(spellId, m_caster->GetGUID()); damage *= doses; damage += int32(player->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * combo); @@ -533,10 +561,11 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) } } - if (m_originalCaster && damage > 0 && apply_direct_bonus) + if (m_originalCaster && apply_direct_bonus) { - damage = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); - damage = unitTarget->SpellDamageBonusTaken(m_originalCaster, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + uint32 bonus = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effectInfo); + damage = bonus + uint32(bonus * variance); + damage = unitTarget->SpellDamageBonusTaken(m_originalCaster, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effectInfo); } m_damage += damage; @@ -612,16 +641,16 @@ void Spell::EffectDummy(SpellEffIndex effIndex) sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, itemTarget); } -void Spell::EffectTriggerSpell(SpellEffIndex effIndex) +void Spell::EffectTriggerSpell(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET && effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 triggered_spell_id = effectInfo->TriggerSpell; /// @todo move those to spell scripts - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_SPELL + if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_SPELL && effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) { // special cases @@ -718,13 +747,13 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) SpellCastTargets targets; if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) { - if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo)) + if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, m_caster->GetMap()->GetDifficulty())) return; targets.SetUnitTarget(unitTarget); } else //if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH) { - if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, m_caster->GetMap()->GetDifficulty()) && (effectInfo->GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) return; if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) @@ -738,7 +767,7 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) CustomSpellValues values; // set basepoints for trigger with value effect - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE) + if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE) { values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); @@ -754,13 +783,13 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, NULL, NULL, m_originalCasterGUID); } -void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) +void Spell::EffectTriggerMissileSpell(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET && effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 triggered_spell_id = effectInfo->TriggerSpell; // normal case SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -773,13 +802,13 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellCastTargets targets; if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) { - if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo)) + if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, m_caster->GetMap()->GetDifficulty())) return; targets.SetUnitTarget(unitTarget); } else //if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { - if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, m_caster->GetMap()->GetDifficulty()) && (effectInfo->GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) return; if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) @@ -790,7 +819,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) CustomSpellValues values; // set basepoints for trigger with value effect - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE) + if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE) { // maybe need to set value only when basepoints == 0? values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); @@ -807,7 +836,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, NULL, NULL, m_originalCasterGUID); } -void Spell::EffectForceCast(SpellEffIndex effIndex) +void Spell::EffectForceCast(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -815,7 +844,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) if (!unitTarget) return; - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 triggered_spell_id = effectInfo->TriggerSpell; // normal case SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -826,7 +855,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) return; } - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST && damage) + if (effectInfo->Effect == SPELL_EFFECT_FORCE_CAST && damage) { switch (m_spellInfo->Id) { @@ -850,7 +879,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) CustomSpellValues values; // set basepoints for trigger with value effect - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE) + if (effectInfo->Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE) { // maybe need to set value only when basepoints == 0? values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); @@ -864,12 +893,12 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) unitTarget->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK); } -void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) +void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 triggered_spell_id = effectInfo->TriggerSpell; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) @@ -924,12 +953,15 @@ void Spell::EffectJumpDest(SpellEffIndex effIndex) void Spell::CalculateJumpSpeeds(uint8 i, float dist, float & speedXY, float & speedZ) { - if (m_spellInfo->Effects[i].MiscValue) - speedZ = float(m_spellInfo->Effects[i].MiscValue)/10; - else if (m_spellInfo->Effects[i].MiscValueB) - speedZ = float(m_spellInfo->Effects[i].MiscValueB)/10; - else - speedZ = 10.0f; + if (SpellEffectInfo const* effect = GetEffect(i)) + { + if (effect->MiscValue) + speedZ = float(effect->MiscValue) / 10; + else if (effect->MiscValueB) + speedZ = float(effect->MiscValueB) / 10; + else + speedZ = 10.0f; + } speedXY = dist * 10.0f / speedZ; } @@ -1087,7 +1119,7 @@ void Spell::EffectApplyAreaAura(SpellEffIndex effIndex) m_spellAura->_ApplyEffectForTargets(effIndex); } -void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) +void Spell::EffectUnlearnSpecialization(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -1096,7 +1128,7 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) return; Player* player = unitTarget->ToPlayer(); - uint32 spellToUnlearn = m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 spellToUnlearn = effectInfo->TriggerSpell; player->RemoveSpell(spellToUnlearn); @@ -1108,17 +1140,18 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) + if (effectInfo->MiscValue < 0 || effectInfo->MiscValue >= int8(MAX_POWERS)) return; - Powers powerType = Powers(m_spellInfo->Effects[effIndex].MiscValue); + Powers powerType = Powers(effectInfo->MiscValue); if (!unitTarget || !unitTarget->IsAlive() || unitTarget->getPowerType() != powerType || damage < 0) return; // add spell damage bonus - damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); - damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + uint32 bonus = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effectInfo); + damage = bonus + uint32(bonus * variance); + damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE, effectInfo); int32 newDamage = -(unitTarget->ModifyPower(powerType, -damage)); @@ -1127,7 +1160,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) // Don't restore from self drain if (m_caster != unitTarget) { - gainMultiplier = m_spellInfo->Effects[effIndex].CalcValueMultiplier(m_originalCaster, this); + gainMultiplier = effectInfo->CalcValueMultiplier(m_originalCaster, this); int32 gain = int32(newDamage* gainMultiplier); @@ -1136,7 +1169,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) ExecuteLogEffectTakeTargetPower(effIndex, unitTarget, powerType, newDamage, gainMultiplier); } -void Spell::EffectSendEvent(SpellEffIndex effIndex) +void Spell::EffectSendEvent(SpellEffIndex /*effIndex*/) { // we do not handle a flag dropping or clicking on flag in battleground by sendevent system if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET @@ -1159,7 +1192,7 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) // this check was requested by scripters, but it has some downsides: // now it's impossible to script (using sEventScripts) a cast which misses all targets // or to have an ability to script the moment spell hits dest (in a case when there are object targets present) - if (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT_MASK)) + if (effectInfo->GetProvidedTargetMask() & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT_MASK)) return; // some spells have no target entries in dbc and they use focus target if (focusObject) @@ -1167,14 +1200,14 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) /// @todo there should be a possibility to pass dest target to event script } - TC_LOG_DEBUG("spells", "Spell ScriptStart %u for spellid %u in EffectSendEvent ", m_spellInfo->Effects[effIndex].MiscValue, m_spellInfo->Id); + TC_LOG_DEBUG("spells", "Spell ScriptStart %u for spellid %u in EffectSendEvent ", effectInfo->MiscValue, m_spellInfo->Id); if (ZoneScript* zoneScript = m_caster->GetZoneScript()) - zoneScript->ProcessEvent(target, m_spellInfo->Effects[effIndex].MiscValue); + zoneScript->ProcessEvent(target, effectInfo->MiscValue); else if (InstanceScript* instanceScript = m_caster->GetInstanceScript()) // needed in case Player is the caster - instanceScript->ProcessEvent(target, m_spellInfo->Effects[effIndex].MiscValue); + instanceScript->ProcessEvent(target, effectInfo->MiscValue); - m_caster->GetMap()->ScriptsStart(sEventScripts, m_spellInfo->Effects[effIndex].MiscValue, m_caster, target); + m_caster->GetMap()->ScriptsStart(sEventScripts, effectInfo->MiscValue, m_caster, target); } void Spell::EffectPowerBurn(SpellEffIndex effIndex) @@ -1182,10 +1215,10 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) + if (effectInfo->MiscValue < 0 || effectInfo->MiscValue >= int8(MAX_POWERS)) return; - Powers powerType = Powers(m_spellInfo->Effects[effIndex].MiscValue); + Powers powerType = Powers(effectInfo->MiscValue); if (!unitTarget || !unitTarget->IsAlive() || unitTarget->getPowerType() != powerType || damage < 0) return; @@ -1201,7 +1234,7 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex) int32 newDamage = -(unitTarget->ModifyPower(powerType, -damage)); // NO - Not a typo - EffectPowerBurn uses effect value multiplier - not effect damage multiplier - float dmgMultiplier = m_spellInfo->Effects[effIndex].CalcValueMultiplier(m_originalCaster, this); + float dmgMultiplier = effectInfo->CalcValueMultiplier(m_originalCaster, this); // add log data before multiplication (need power amount, not damage) ExecuteLogEffectTakeTargetPower(effIndex, unitTarget, powerType, newDamage, 0.0f); @@ -1271,7 +1304,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) int32 tickheal = targetAura->GetAmount(); if (Unit* auraCaster = targetAura->GetCaster()) - tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT); + tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT, effectInfo); //int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1; //It is said that talent bonus should not be included @@ -1294,11 +1327,15 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) } // Death Pact - return pct of max health to caster else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00080000) - addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL, effectInfo); else - addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL); + { + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL, effectInfo); + uint32 bonus = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL, effectInfo); + damage = bonus + uint32(bonus * variance); + } - addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); + addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL, effectInfo); // Remove Grievious bite if fully healed if (unitTarget->HasAura(48920) && (unitTarget->GetHealth() + addhealth >= unitTarget->GetMaxHealth())) @@ -1320,8 +1357,8 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) if (!m_originalCaster) return; - uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL); - heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL, effectInfo); + heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL, effectInfo); m_healing += heal; } @@ -1338,12 +1375,13 @@ void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) if (!m_originalCaster) return; - uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL, effectInfo); + heal += uint32(heal * variance); - m_healing += unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); + m_healing += unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL, effectInfo); } -void Spell::EffectHealthLeech(SpellEffIndex effIndex) +void Spell::EffectHealthLeech(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -1351,12 +1389,13 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex) if (!unitTarget || !unitTarget->IsAlive() || damage < 0) return; - damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); - damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + uint32 bonus = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effectInfo); + damage = bonus + uint32(bonus * variance); + damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE, effectInfo); TC_LOG_DEBUG("spells", "HealthLeech :%i", damage); - float healMultiplier = m_spellInfo->Effects[effIndex].CalcValueMultiplier(m_originalCaster, this); + float healMultiplier = effectInfo->CalcValueMultiplier(m_originalCaster, this); m_damage += damage; // get max possible damage, don't count overkill for heal @@ -1364,8 +1403,8 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex) if (m_caster->IsAlive()) { - healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL); - healthGain = m_caster->SpellHealingBonusTaken(m_caster, m_spellInfo, healthGain, HEAL); + healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL, effectInfo); + healthGain = m_caster->SpellHealingBonusTaken(m_caster, m_spellInfo, healthGain, HEAL, effectInfo); m_caster->HealBySpell(m_caster, m_spellInfo, uint32(healthGain)); } @@ -1491,8 +1530,8 @@ void Spell::EffectCreateItem(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - DoCreateItem(effIndex, m_spellInfo->Effects[effIndex].ItemType); - ExecuteLogEffectCreateItem(effIndex, m_spellInfo->Effects[effIndex].ItemType); + DoCreateItem(effIndex, effectInfo->ItemType); + ExecuteLogEffectCreateItem(effIndex, effectInfo->ItemType); } void Spell::EffectCreateItem2(SpellEffIndex effIndex) @@ -1505,7 +1544,7 @@ void Spell::EffectCreateItem2(SpellEffIndex effIndex) Player* player = unitTarget->ToPlayer(); - uint32 item_id = m_spellInfo->Effects[effIndex].ItemType; + uint32 item_id = effectInfo->ItemType; if (item_id) DoCreateItem(effIndex, item_id); @@ -1553,7 +1592,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) if (!m_spellAura) { Unit* caster = m_caster->GetEntry() == WORLD_TRIGGER ? m_originalCaster : m_caster; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(caster); + float radius = effectInfo->CalcRadius(caster); // Caster not in world, might be spell triggered from aura removal if (!caster->IsInWorld()) @@ -1578,7 +1617,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) m_spellAura->_ApplyEffectForTargets(effIndex); } -void Spell::EffectEnergize(SpellEffIndex effIndex) +void Spell::EffectEnergize(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -1588,10 +1627,10 @@ void Spell::EffectEnergize(SpellEffIndex effIndex) if (!unitTarget->IsAlive()) return; - if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) + if (effectInfo->MiscValue < 0 || effectInfo->MiscValue >= int8(MAX_POWERS)) return; - Powers power = Powers(m_spellInfo->Effects[effIndex].MiscValue); + Powers power = Powers(effectInfo->MiscValue); if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !(m_spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER)) return; @@ -1687,7 +1726,7 @@ void Spell::EffectEnergize(SpellEffIndex effIndex) } } -void Spell::EffectEnergizePct(SpellEffIndex effIndex) +void Spell::EffectEnergizePct(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -1697,10 +1736,10 @@ void Spell::EffectEnergizePct(SpellEffIndex effIndex) if (!unitTarget->IsAlive()) return; - if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) + if (effectInfo->MiscValue < 0 || effectInfo->MiscValue >= int8(MAX_POWERS)) return; - Powers power = Powers(m_spellInfo->Effects[effIndex].MiscValue); + Powers power = Powers(effectInfo->MiscValue); if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !(m_spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER)) return; @@ -1887,7 +1926,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) ExecuteLogEffectOpenLock(effIndex, gameObjTarget ? (Object*)gameObjTarget : (Object*)itemTarget); } -void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) +void Spell::EffectSummonChangeItem(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -1905,7 +1944,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) if (m_CastItem->GetOwnerGUID() != player->GetGUID()) return; - uint32 newitemid = m_spellInfo->Effects[effIndex].ItemType; + uint32 newitemid = effectInfo->ItemType; if (!newitemid) return; @@ -2022,14 +2061,14 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 entry = m_spellInfo->Effects[effIndex].MiscValue; + uint32 entry = effectInfo->MiscValue; if (!entry) return; - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(m_spellInfo->Effects[effIndex].MiscValueB); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(effectInfo->MiscValueB); if (!properties) { - TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u", m_spellInfo->Effects[effIndex].MiscValueB); + TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u", effectInfo->MiscValueB); return; } @@ -2130,7 +2169,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) } default: { - float radius = m_spellInfo->Effects[effIndex].CalcRadius(); + float radius = effectInfo->CalcRadius(); TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN; @@ -2175,8 +2214,8 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) // The spell that this effect will trigger. It has SPELL_AURA_CONTROL_VEHICLE uint32 spellId = VEHICLE_SPELL_RIDE_HARDCODED; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(m_spellInfo->Effects[effIndex].CalcValue()); - if (spellInfo && spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE)) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(effectInfo->CalcValue()); + if (spellInfo && spellInfo->HasAura(m_originalCaster->GetMap()->GetDifficulty(), SPELL_AURA_CONTROL_VEHICLE)) spellId = spellInfo->Id; // Hard coded enter vehicle spell @@ -2214,13 +2253,13 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) Player* player = unitTarget->ToPlayer(); - uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : m_spellInfo->Effects[effIndex].TriggerSpell; + uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : effectInfo->TriggerSpell; player->LearnSpell(spellToLearn, false); TC_LOG_DEBUG("spells", "Spell: %s has learned spell %u from %s", player->GetGUID().ToString().c_str(), spellToLearn, m_caster->GetGUID().ToString().c_str()); } -void Spell::EffectDispel(SpellEffIndex effIndex) +void Spell::EffectDispel(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -2229,7 +2268,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex) return; // Create dispel mask by dispel type - uint32 dispel_type = m_spellInfo->Effects[effIndex].MiscValue; + uint32 dispel_type = effectInfo->MiscValue; uint32 dispelMask = SpellInfo::GetDispelMask(DispelType(dispel_type)); DispelChargesList dispel_list; @@ -2316,12 +2355,15 @@ void Spell::EffectDispel(SpellEffIndex effIndex) // Devour Magic if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->GetCategory() == SPELLCATEGORY_DEVOUR_MAGIC) { - int32 heal_amount = m_spellInfo->Effects[EFFECT_1].CalcValue(m_caster); - m_caster->CastCustomSpell(m_caster, 19658, &heal_amount, NULL, NULL, true); - // Glyph of Felhunter - if (Unit* owner = m_caster->GetOwner()) + if (SpellEffectInfo const* effect = GetEffect(EFFECT_1)) + { + int32 heal_amount = effect->CalcValue(m_caster); + m_caster->CastCustomSpell(m_caster, 19658, &heal_amount, NULL, NULL, true); + // Glyph of Felhunter + if (Unit* owner = m_caster->GetOwner()) if (owner->GetAura(56249)) owner->CastCustomSpell(owner, 19658, &heal_amount, NULL, NULL, true); + } } } @@ -2376,7 +2418,7 @@ void Spell::EffectPickPocket(SpellEffIndex /*effIndex*/) m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING); } -void Spell::EffectAddFarsight(SpellEffIndex effIndex) +void Spell::EffectAddFarsight(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -2384,7 +2426,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) if (m_caster->GetTypeId() != TYPEID_PLAYER) return; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(); + float radius = effectInfo->CalcRadius(); int32 duration = m_spellInfo->GetDuration(); // Caster not in world, might be spell triggered from aura removal if (!m_caster->IsInWorld()) @@ -2412,7 +2454,7 @@ void Spell::EffectUntrainTalents(SpellEffIndex /*effIndex*/) unitTarget->ToPlayer()->SendTalentWipeConfirm(m_caster->GetGUID()); } -void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex effIndex) +void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -2423,7 +2465,7 @@ void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex effIndex) if (unitTarget->IsInFlight()) return; - float dis = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); + float dis = effectInfo->CalcRadius(m_caster); float fx, fy, fz; m_caster->GetClosePoint(fx, fy, fz, unitTarget->GetObjectSize(), dis); @@ -2431,7 +2473,7 @@ void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex effIndex) unitTarget->NearTeleportTo(fx, fy, fz, -m_caster->GetOrientation(), unitTarget == m_caster); } -void Spell::EffectLearnSkill(SpellEffIndex effIndex) +void Spell::EffectLearnSkill(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -2442,7 +2484,7 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) if (damage < 0) return; - uint32 skillid = m_spellInfo->Effects[effIndex].MiscValue; + uint32 skillid = effectInfo->MiscValue; SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skillid, unitTarget->getRace(), unitTarget->getClass()); if (!rcEntry) return; @@ -2452,10 +2494,10 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) return; uint16 skillval = unitTarget->ToPlayer()->GetPureSkillValue(skillid); - unitTarget->ToPlayer()->SetSkill(skillid, m_spellInfo->Effects[effIndex].CalcValue(), std::max<uint16>(skillval, 1), tier->Value[damage - 1]); + unitTarget->ToPlayer()->SetSkill(skillid, effectInfo->CalcValue(), std::max<uint16>(skillval, 1), tier->Value[damage - 1]); } -void Spell::EffectPlayMovie(SpellEffIndex effIndex) +void Spell::EffectPlayMovie(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -2463,7 +2505,7 @@ void Spell::EffectPlayMovie(SpellEffIndex effIndex) if (unitTarget->GetTypeId() != TYPEID_PLAYER) return; - uint32 movieId = GetSpellInfo()->Effects[effIndex].MiscValue; + uint32 movieId = effectInfo->MiscValue; if (!sMovieStore.LookupEntry(movieId)) return; @@ -2502,7 +2544,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) player->DestroyItemCount(itemTarget, count, true); unitTarget = player; // and add a scroll - DoCreateItem(effIndex, m_spellInfo->Effects[effIndex].ItemType); + DoCreateItem(effIndex, effectInfo->ItemType); itemTarget = NULL; m_targets.SetItemTarget(NULL); } @@ -2512,7 +2554,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) if (!(m_CastItem && m_CastItem->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_TRIGGERED_CAST)) player->UpdateCraftSkill(m_spellInfo->Id); - uint32 enchant_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 enchant_id = effectInfo->MiscValue; if (!enchant_id) return; @@ -2546,7 +2588,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) } } -void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) +void Spell::EffectEnchantItemPrismatic(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -2558,7 +2600,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) if (!player) return; - uint32 enchantId = m_spellInfo->Effects[effIndex].MiscValue; + uint32 enchantId = effectInfo->MiscValue; if (!enchantId) return; @@ -2622,7 +2664,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) if (!itemTarget) return; - uint32 enchant_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 enchant_id = effectInfo->MiscValue; if (!enchant_id) { @@ -2757,7 +2799,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex) owner = m_originalCaster->GetCharmerOrOwnerPlayerOrPlayerItself(); } - uint32 petentry = m_spellInfo->Effects[effIndex].MiscValue; + uint32 petentry = effectInfo->MiscValue; if (!owner) { @@ -2843,7 +2885,7 @@ void Spell::EffectLearnPetSpell(SpellEffIndex effIndex) if (!pet) return; - SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(m_spellInfo->Effects[effIndex].TriggerSpell); + SpellInfo const* learn_spellproto = sSpellMgr->GetSpellInfo(effectInfo->TriggerSpell); if (!learn_spellproto) return; @@ -2887,7 +2929,7 @@ void Spell::EffectTaunt(SpellEffIndex /*effIndex*/) unitTarget->ToCreature()->AI()->AttackStart(m_caster); } -void Spell::EffectWeaponDmg(SpellEffIndex effIndex) +void Spell::EffectWeaponDmg(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; @@ -2898,9 +2940,11 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) // multiple weapon dmg effect workaround // execute only the last weapon damage // and handle all effects at once - for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { - switch (m_spellInfo->Effects[j].Effect) + if (!effect) + continue; + switch (effect->Effect) { case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: @@ -2988,48 +3032,14 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) // Blood Strike if (m_spellInfo->SpellFamilyFlags[0] & 0x400000) { - float bonusPct = m_spellInfo->Effects[EFFECT_2].CalcValue(m_caster) * unitTarget->GetDiseasesByCaster(m_caster->GetGUID()) / 2.0f; - // Death Knight T8 Melee 4P Bonus - if (AuraEffect const* aurEff = m_caster->GetAuraEffect(64736, EFFECT_0)) - AddPct(bonusPct, aurEff->GetAmount()); - AddPct(totalDamagePercentMod, bonusPct); - break; - } - // Death Strike - if (m_spellInfo->SpellFamilyFlags[0] & 0x10) - { - // Glyph of Death Strike - // 2% more damage per 5 runic power, up to a maximum of 40% - if (AuraEffect const* aurEff = m_caster->GetAuraEffect(59336, EFFECT_0)) - if (uint32 runic = std::min<uint32>(uint32(m_caster->GetPower(POWER_RUNIC_POWER) / 2.5f), aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(m_caster))) - AddPct(totalDamagePercentMod, runic); - break; - } - // Obliterate (12.5% more damage per disease) - if (m_spellInfo->SpellFamilyFlags[1] & 0x20000) - { - float bonusPct = m_spellInfo->Effects[EFFECT_2].CalcValue(m_caster) * unitTarget->GetDiseasesByCaster(m_caster->GetGUID(), false) / 2.0f; - // Death Knight T8 Melee 4P Bonus - if (AuraEffect const* aurEff = m_caster->GetAuraEffect(64736, EFFECT_0)) - AddPct(bonusPct, aurEff->GetAmount()); - AddPct(totalDamagePercentMod, bonusPct); - break; - } - // Blood-Caked Strike - Blood-Caked Blade - if (m_spellInfo->SpellIconID == 1736) - { - AddPct(totalDamagePercentMod, unitTarget->GetDiseasesByCaster(m_caster->GetGUID()) * 50.0f); - break; - } - // Heart Strike - if (m_spellInfo->SpellFamilyFlags[0] & 0x1000000) - { - float bonusPct = m_spellInfo->Effects[EFFECT_2].CalcValue(m_caster) * unitTarget->GetDiseasesByCaster(m_caster->GetGUID()); - // Death Knight T8 Melee 4P Bonus - if (AuraEffect const* aurEff = m_caster->GetAuraEffect(64736, EFFECT_0)) - AddPct(bonusPct, aurEff->GetAmount()); - - AddPct(totalDamagePercentMod, bonusPct); + if (SpellEffectInfo const* effect = GetEffect(EFFECT_2)) + { + float bonusPct = effect->CalcValue(m_caster) * unitTarget->GetDiseasesByCaster(m_caster->GetGUID()) / 2.0f; + // Death Knight T8 Melee 4P Bonus + if (AuraEffect const* aurEff = m_caster->GetAuraEffect(64736, EFFECT_0)) + AddPct(bonusPct, aurEff->GetAmount()); + AddPct(totalDamagePercentMod, bonusPct); + } break; } break; @@ -3038,20 +3048,22 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) bool normalized = false; float weaponDamagePercentMod = 1.0f; - for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { - switch (m_spellInfo->Effects[j].Effect) + if (!effect) + continue; + switch (effect->Effect) { case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: - fixed_bonus += CalculateDamage(j, unitTarget); + fixed_bonus += CalculateDamage(effect->EffectIndex, unitTarget); break; case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: - fixed_bonus += CalculateDamage(j, unitTarget); + fixed_bonus += CalculateDamage(effect->EffectIndex, unitTarget); normalized = true; break; case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: - ApplyPct(weaponDamagePercentMod, CalculateDamage(j, unitTarget)); + ApplyPct(weaponDamagePercentMod, CalculateDamage(effect->EffectIndex, unitTarget)); break; default: break; // not weapon damage effect, just skip @@ -3083,11 +3095,13 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) int32 weaponDamage = m_caster->CalculateDamage(m_attackType, normalized, true); // Sequence is important - for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : GetEffects()) { + if (!effect) + continue; // We assume that a spell have at most one fixed_bonus // and at most one weaponDamagePercentMod - switch (m_spellInfo->Effects[j].Effect) + switch (effect->Effect) { case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: @@ -3189,7 +3203,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 gameobject_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 gameobject_id = effectInfo->MiscValue; GameObject* pGameObj = new GameObject; @@ -3321,7 +3335,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 55693: // Remove Collapsing Cave Aura if (!unitTarget) return; - unitTarget->RemoveAurasDueToSpell(m_spellInfo->Effects[effIndex].CalcValue()); + unitTarget->RemoveAurasDueToSpell(effectInfo->CalcValue()); break; // Bending Shinbone case 8856: @@ -3455,7 +3469,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 45151: { //Workaround for Range ... should be global for every ScriptEffect - float radius = m_spellInfo->Effects[effIndex].CalcRadius(); + float radius = effectInfo->CalcRadius(); if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->GetDistance(m_caster) >= radius && !unitTarget->HasAura(46394) && unitTarget != m_caster) unitTarget->CastSpell(unitTarget, 46394, true); @@ -3567,7 +3581,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) return; float x, y, z; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(); + float radius = effectInfo->CalcRadius(); for (uint8 i = 0; i < 15; ++i) { m_caster->GetRandomPoint(*destTarget, radius, x, y, z); @@ -3613,8 +3627,9 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || effIndex != 0) return; - uint32 spellID = m_spellInfo->Effects[EFFECT_0].CalcValue(); - uint32 questID = m_spellInfo->Effects[EFFECT_1].CalcValue(); + // Effects for 58418 and 58420 are all DIFFICULTY_NONE so always valid + uint32 spellID = GetEffect(EFFECT_0)->CalcValue(); + uint32 questID = GetEffect(EFFECT_1)->CalcValue(); if (unitTarget->ToPlayer()->GetQuestStatus(questID) == QUEST_STATUS_COMPLETE) unitTarget->CastSpell(unitTarget, spellID, true); @@ -3664,7 +3679,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) { /// @todo a hack, range = 11, should after some time cast, otherwise too far m_caster->CastSpell(parent, 62496, true); - unitTarget->CastSpell(parent, m_spellInfo->Effects[EFFECT_0].CalcValue()); + unitTarget->CastSpell(parent, GetEffect(EFFECT_0)->CalcValue()); // DIFFICULTY_NONE, so effect always valid } } } @@ -3856,7 +3871,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex) //CREATE DUEL FLAG OBJECT GameObject* pGameObj = new GameObject; - uint32 gameobject_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 gameobject_id = effectInfo->MiscValue; Map* map = m_caster->GetMap(); if (!pGameObj->Create(sObjectMgr->GetGenerator<HighGuid::GameObject>()->Generate(), gameobject_id, @@ -3981,12 +3996,12 @@ void Spell::EffectActivateObject(SpellEffIndex /*effIndex*/) ScriptInfo activateCommand; activateCommand.command = SCRIPT_COMMAND_ACTIVATE_OBJECT; - // int32 unk = m_spellInfo->Effects[effIndex].MiscValue; // This is set for EffectActivateObject spells; needs research + // int32 unk = effectInfo->MiscValue; // This is set for EffectActivateObject spells; needs research gameObjTarget->GetMap()->ScriptCommandStart(activateCommand, 0, m_caster, gameObjTarget); } -void Spell::EffectApplyGlyph(SpellEffIndex effIndex) +void Spell::EffectApplyGlyph(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -4020,7 +4035,7 @@ void Spell::EffectApplyGlyph(SpellEffIndex effIndex) } // apply new one - if (uint32 newGlyph = m_spellInfo->Effects[effIndex].MiscValue) + if (uint32 newGlyph = effectInfo->MiscValue) { if (GlyphPropertiesEntry const* newGlyphProperties = sGlyphPropertiesStore.LookupEntry(newGlyph)) { @@ -4059,7 +4074,7 @@ void Spell::EffectApplyGlyph(SpellEffIndex effIndex) } } -void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex) +void Spell::EffectEnchantHeldItem(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4078,9 +4093,9 @@ void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex) if (!item->IsEquipped()) return; - if (m_spellInfo->Effects[effIndex].MiscValue) + if (effectInfo->MiscValue) { - uint32 enchant_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 enchant_id = effectInfo->MiscValue; int32 duration = m_spellInfo->GetDuration(); //Try duration index first .. if (!duration) duration = damage;//+1; //Base points after .. @@ -4174,7 +4189,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) player->DestroyItemCount(foodItem, count, true); /// @todo fix crash when a spell has two effects, both pointed at the same item target - m_caster->CastCustomSpell(pet, m_spellInfo->Effects[effIndex].TriggerSpell, &benefit, NULL, NULL, true); + m_caster->CastCustomSpell(pet, effectInfo->TriggerSpell, &benefit, NULL, NULL, true); } void Spell::EffectDismissPet(SpellEffIndex effIndex) @@ -4196,8 +4211,8 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 go_id = m_spellInfo->Effects[effIndex].MiscValue; - uint8 slot = m_spellInfo->Effects[effIndex].Effect - SPELL_EFFECT_SUMMON_OBJECT_SLOT1; + uint32 go_id = effectInfo->MiscValue; + uint8 slot = effectInfo->Effect - SPELL_EFFECT_SUMMON_OBJECT_SLOT1; ObjectGuid guid = m_caster->m_ObjectSlot[slot]; if (!guid.IsEmpty()) { @@ -4320,7 +4335,7 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/) unitTarget->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), unitTarget == m_caster); } -void Spell::EffectReputation(SpellEffIndex effIndex) +void Spell::EffectReputation(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4332,7 +4347,7 @@ void Spell::EffectReputation(SpellEffIndex effIndex) int32 repChange = damage; - uint32 factionId = m_spellInfo->Effects[effIndex].MiscValue; + uint32 factionId = effectInfo->MiscValue; FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); if (!factionEntry) @@ -4343,7 +4358,7 @@ void Spell::EffectReputation(SpellEffIndex effIndex) player->GetReputationMgr().ModifyReputation(factionEntry, repChange); } -void Spell::EffectQuestComplete(SpellEffIndex effIndex) +void Spell::EffectQuestComplete(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4352,7 +4367,7 @@ void Spell::EffectQuestComplete(SpellEffIndex effIndex) return; Player* player = unitTarget->ToPlayer(); - uint32 questId = m_spellInfo->Effects[effIndex].MiscValue; + uint32 questId = effectInfo->MiscValue; if (questId) { Quest const* quest = sObjectMgr->GetQuestTemplate(questId); @@ -4377,7 +4392,7 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) m_caster->SendMessageToSet(&data, true); } -void Spell::EffectSelfResurrect(SpellEffIndex effIndex) +void Spell::EffectSelfResurrect(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -4396,7 +4411,7 @@ void Spell::EffectSelfResurrect(SpellEffIndex effIndex) if (damage < 0) { health = uint32(-damage); - mana = m_spellInfo->Effects[effIndex].MiscValue; + mana = effectInfo->MiscValue; } // percent case else @@ -4488,7 +4503,7 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) } } -void Spell::EffectKnockBack(SpellEffIndex effIndex) +void Spell::EffectKnockBack(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4509,13 +4524,13 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) unitTarget->InterruptNonMeleeSpells(true); float ratio = 0.1f; - float speedxy = float(m_spellInfo->Effects[effIndex].MiscValue) * ratio; + float speedxy = float(effectInfo->MiscValue) * ratio; float speedz = float(damage) * ratio; if (speedxy < 0.1f && speedz < 0.1f) return; float x, y; - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_KNOCK_BACK_DEST) + if (effectInfo->Effect == SPELL_EFFECT_KNOCK_BACK_DEST) { if (m_targets.HasDst()) destTarget->GetPosition(x, y); @@ -4530,7 +4545,7 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) unitTarget->KnockbackFrom(x, y, speedxy, speedz); } -void Spell::EffectLeapBack(SpellEffIndex effIndex) +void Spell::EffectLeapBack(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; @@ -4538,13 +4553,13 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex) if (!unitTarget) return; - float speedxy = float(m_spellInfo->Effects[effIndex].MiscValue)/10; - float speedz = float(damage/10); + float speedxy = float(effectInfo->MiscValue) / 10; + float speedz = float(damage / 10); //1891: Disengage m_caster->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891); } -void Spell::EffectQuestClear(SpellEffIndex effIndex) +void Spell::EffectQuestClear(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4553,7 +4568,7 @@ void Spell::EffectQuestClear(SpellEffIndex effIndex) return; Player* player = unitTarget->ToPlayer(); - uint32 quest_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 quest_id = effectInfo->MiscValue; Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); @@ -4587,7 +4602,7 @@ void Spell::EffectQuestClear(SpellEffIndex effIndex) player->RemoveRewardedQuest(quest_id); } -void Spell::EffectSendTaxi(SpellEffIndex effIndex) +void Spell::EffectSendTaxi(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4595,10 +4610,10 @@ void Spell::EffectSendTaxi(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - unitTarget->ToPlayer()->ActivateTaxiPathTo(m_spellInfo->Effects[effIndex].MiscValue, m_spellInfo->Id); + unitTarget->ToPlayer()->ActivateTaxiPathTo(effectInfo->MiscValue, m_spellInfo->Id); } -void Spell::EffectPullTowards(SpellEffIndex effIndex) +void Spell::EffectPullTowards(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4607,7 +4622,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) return; Position pos; - if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_PULL_TOWARDS_DEST) + if (effectInfo->Effect == SPELL_EFFECT_PULL_TOWARDS_DEST) { if (m_targets.HasDst()) pos.Relocate(*destTarget); @@ -4619,13 +4634,13 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) pos.Relocate(m_caster); } - float speedXY = float(m_spellInfo->Effects[effIndex].MiscValue) * 0.1f; + float speedXY = float(effectInfo->MiscValue) * 0.1f; float speedZ = unitTarget->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; unitTarget->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); } -void Spell::EffectDispelMechanic(SpellEffIndex effIndex) +void Spell::EffectDispelMechanic(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4633,7 +4648,7 @@ void Spell::EffectDispelMechanic(SpellEffIndex effIndex) if (!unitTarget) return; - uint32 mechanic = m_spellInfo->Effects[effIndex].MiscValue; + uint32 mechanic = effectInfo->MiscValue; DispelList dispel_list; Unit::AuraMap const& auras = unitTarget->GetOwnedAuras(); for (Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) @@ -4752,7 +4767,7 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - int32 slot = m_spellInfo->Effects[effIndex].MiscValue; + int32 slot = effectInfo->MiscValue; // -1 means all player equipped items and -2 all items if (slot < 0) @@ -4773,7 +4788,7 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex) } } -void Spell::EffectDurabilityDamagePCT(SpellEffIndex effIndex) +void Spell::EffectDurabilityDamagePCT(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -4781,7 +4796,7 @@ void Spell::EffectDurabilityDamagePCT(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - int32 slot = m_spellInfo->Effects[effIndex].MiscValue; + int32 slot = effectInfo->MiscValue; // FIXME: some spells effects have value -1/-2 // Possibly its mean -1 all player equipped items and -2 all items @@ -4818,7 +4833,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - uint32 name_id = m_spellInfo->Effects[effIndex].MiscValue; + uint32 name_id = effectInfo->MiscValue; GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(name_id); @@ -4833,9 +4848,9 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (m_targets.HasDst()) destTarget->GetPosition(fx, fy, fz); //FIXME: this can be better check for most objects but still hack - else if (m_spellInfo->Effects[effIndex].HasRadius() && m_spellInfo->Speed == 0) + else if (effectInfo->HasRadius() && m_spellInfo->Speed == 0) { - float dis = m_spellInfo->Effects[effIndex].CalcRadius(m_originalCaster); + float dis = effectInfo->CalcRadius(m_originalCaster); m_caster->GetClosePoint(fx, fy, fz, DEFAULT_WORLD_OBJECT_SIZE, dis); } else @@ -5044,7 +5059,7 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) target->RemovedInsignia(player); } -void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) +void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5057,7 +5072,7 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) DispelChargesList steal_list; // Create dispel mask by dispel type - uint32 dispelMask = SpellInfo::GetDispelMask(DispelType(m_spellInfo->Effects[effIndex].MiscValue)); + uint32 dispelMask = SpellInfo::GetDispelMask(DispelType(effectInfo->MiscValue)); Unit::AuraMap const& auras = unitTarget->GetOwnedAuras(); for (Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { @@ -5149,7 +5164,7 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) m_caster->SendMessageToSet(&dataSuccess, true); } -void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex) +void Spell::EffectKillCreditPersonal(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5157,10 +5172,10 @@ void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - unitTarget->ToPlayer()->KilledMonsterCredit(m_spellInfo->Effects[effIndex].MiscValue); + unitTarget->ToPlayer()->KilledMonsterCredit(effectInfo->MiscValue); } -void Spell::EffectKillCredit(SpellEffIndex effIndex) +void Spell::EffectKillCredit(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5168,7 +5183,7 @@ void Spell::EffectKillCredit(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - int32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; + int32 creatureEntry = effectInfo->MiscValue; if (!creatureEntry) { if (m_spellInfo->Id == 42793) // Burn Body @@ -5179,7 +5194,7 @@ void Spell::EffectKillCredit(SpellEffIndex effIndex) unitTarget->ToPlayer()->RewardPlayerAndGroupAtEvent(creatureEntry, unitTarget); } -void Spell::EffectQuestFail(SpellEffIndex effIndex) +void Spell::EffectQuestFail(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5187,10 +5202,10 @@ void Spell::EffectQuestFail(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - unitTarget->ToPlayer()->FailQuest(m_spellInfo->Effects[effIndex].MiscValue); + unitTarget->ToPlayer()->FailQuest(effectInfo->MiscValue); } -void Spell::EffectQuestStart(SpellEffIndex effIndex) +void Spell::EffectQuestStart(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5202,7 +5217,7 @@ void Spell::EffectQuestStart(SpellEffIndex effIndex) if (!player) return; - if (Quest const* quest = sObjectMgr->GetQuestTemplate(m_spellInfo->Effects[effIndex].MiscValue)) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(effectInfo->MiscValue)) { if (!player->CanTakeQuest(quest, false)) return; @@ -5234,10 +5249,10 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) if (count == 0) count = 1; for (uint32 j = 0; j < MAX_RUNES && count > 0; ++j) { - if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(m_spellInfo->Effects[effIndex].MiscValue)) + if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(effectInfo->MiscValue)) { if (m_spellInfo->Id == 45529) - if (player->GetBaseRune(j) != RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) + if (player->GetBaseRune(j) != RuneType(effectInfo->MiscValueB)) continue; player->SetRuneCooldown(j, 0); --count; @@ -5250,7 +5265,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) for (uint32 l = 0; l + 1 < MAX_RUNES && count > 0; ++l) { // Check if both runes are on cd as that is the only time when this needs to come into effect - if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetCurrentRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB))) + if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(effectInfo->MiscValueB)) && (player->GetRuneCooldown(l + 1) && player->GetCurrentRune(l + 1) == RuneType(effectInfo->MiscValueB))) { // Should always update the rune with the lowest cd if (l + 1 < MAX_RUNES && player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1)) @@ -5280,7 +5295,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) } } -void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) +void Spell::EffectCreateTamedPet(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5288,7 +5303,7 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || !unitTarget->GetPetGUID().IsEmpty() || unitTarget->getClass() != CLASS_HUNTER) return; - uint32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; + uint32 creatureEntry = effectInfo->MiscValue; Pet* pet = unitTarget->CreateTamedPetFrom(creatureEntry, m_spellInfo->Id); if (!pet) return; @@ -5313,14 +5328,14 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) } } -void Spell::EffectDiscoverTaxi(SpellEffIndex effIndex) +void Spell::EffectDiscoverTaxi(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - uint32 nodeid = m_spellInfo->Effects[effIndex].MiscValue; + uint32 nodeid = effectInfo->MiscValue; if (sTaxiNodesStore.LookupEntry(nodeid)) unitTarget->ToPlayer()->GetSession()->SendDiscoverNewTaxiNode(nodeid); } @@ -5373,7 +5388,7 @@ void Spell::EffectGameObjectRepair(SpellEffIndex /*effIndex*/) gameObjTarget->ModifyHealth(damage, m_caster); } -void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex) +void Spell::EffectGameObjectSetDestructionState(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5382,7 +5397,7 @@ void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex) return; Player* player = m_originalCaster->GetCharmerOrOwnerPlayerOrPlayerItself(); - gameObjTarget->SetDestructibleState(GameObjectDestructibleState(m_spellInfo->Effects[effIndex].MiscValue), player, true); + gameObjTarget->SetDestructibleState(GameObjectDestructibleState(effectInfo->MiscValue), player, true); } void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians) @@ -5464,7 +5479,7 @@ void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) unitTarget->SetByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED); } -void Spell::EffectPlayMusic(SpellEffIndex effIndex) +void Spell::EffectPlayMusic(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5472,7 +5487,7 @@ void Spell::EffectPlayMusic(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - uint32 soundid = m_spellInfo->Effects[effIndex].MiscValue; + uint32 soundid = effectInfo->MiscValue; if (!sSoundEntriesStore.LookupEntry(soundid)) { @@ -5508,7 +5523,7 @@ void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/) unitTarget->ToPlayer()->ActivateTalentGroup(damage-1); // damage is 1 or 2, spec is 0 or 1 } -void Spell::EffectPlaySound(SpellEffIndex effIndex) +void Spell::EffectPlaySound(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5529,7 +5544,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) break; } - uint32 soundId = m_spellInfo->Effects[effIndex].MiscValue; + uint32 soundId = effectInfo->MiscValue; if (!sSoundEntriesStore.LookupEntry(soundId)) { @@ -5540,7 +5555,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) player->PlayDirectSound(soundId, player); } -void Spell::EffectRemoveAura(SpellEffIndex effIndex) +void Spell::EffectRemoveAura(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5548,7 +5563,7 @@ void Spell::EffectRemoveAura(SpellEffIndex effIndex) if (!unitTarget) return; // there may be need of specifying casterguid of removed auras - unitTarget->RemoveAurasDueToSpell(m_spellInfo->Effects[effIndex].TriggerSpell); + unitTarget->RemoveAurasDueToSpell(effectInfo->TriggerSpell); } void Spell::EffectDamageFromMaxHealthPCT(SpellEffIndex /*effIndex*/) @@ -5562,7 +5577,7 @@ void Spell::EffectDamageFromMaxHealthPCT(SpellEffIndex /*effIndex*/) m_damage += unitTarget->CountPctFromMaxHealth(damage); } -void Spell::EffectGiveCurrency(SpellEffIndex effIndex) +void Spell::EffectGiveCurrency(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5570,10 +5585,10 @@ void Spell::EffectGiveCurrency(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - unitTarget->ToPlayer()->ModifyCurrency(m_spellInfo->Effects[effIndex].MiscValue, damage); + unitTarget->ToPlayer()->ModifyCurrency(effectInfo->MiscValue, damage); } -void Spell::EffectCastButtons(SpellEffIndex effIndex) +void Spell::EffectCastButtons(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -5582,8 +5597,8 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex) return; Player* p_caster = m_caster->ToPlayer(); - uint32 button_id = m_spellInfo->Effects[effIndex].MiscValue + 132; - uint32 n_buttons = m_spellInfo->Effects[effIndex].MiscValueB; + uint32 button_id = effectInfo->MiscValue + 132; + uint32 n_buttons = effectInfo->MiscValueB; for (; n_buttons; --n_buttons, ++button_id) { @@ -5628,25 +5643,27 @@ void Spell::EffectRechargeManaGem(SpellEffIndex /*effIndex*/) if (!player) return; - - uint32 item_id = m_spellInfo->Effects[EFFECT_0].ItemType; - - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item_id); - if (!pProto) + if (SpellEffectInfo const* effect = GetEffect(EFFECT_0)) { - player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); - return; - } + uint32 item_id = effect->ItemType; - if (Item* pItem = player->GetItemByEntry(item_id)) - { - for (int x = 0; x < pProto->Effects.size(); ++x) - pItem->SetSpellCharges(x, pProto->Effects[x].Charges); - pItem->SetState(ITEM_CHANGED, player); + ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item_id); + if (!pProto) + { + player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + return; + } + + if (Item* pItem = player->GetItemByEntry(item_id)) + { + for (int x = 0; x < pProto->Effects.size(); ++x) + pItem->SetSpellCharges(x, pProto->Effects[x].Charges); + pItem->SetState(ITEM_CHANGED, player); + } } } -void Spell::EffectBind(SpellEffIndex effIndex) +void Spell::EffectBind(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5659,8 +5676,8 @@ void Spell::EffectBind(SpellEffIndex effIndex) WorldLocation homeLoc; uint32 areaId = player->GetAreaId(); - if (m_spellInfo->Effects[effIndex].MiscValue) - areaId = m_spellInfo->Effects[effIndex].MiscValue; + if (effectInfo->MiscValue) + areaId = effectInfo->MiscValue; if (m_targets.HasDst()) homeLoc.WorldRelocate(*destTarget); @@ -5668,27 +5685,19 @@ 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); } -void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) +void Spell::EffectSummonRaFFriend(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -5696,10 +5705,10 @@ void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) if (m_caster->GetTypeId() != TYPEID_PLAYER || !unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - m_caster->CastSpell(unitTarget, m_spellInfo->Effects[effIndex].TriggerSpell, true); + m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, true); } -void Spell::EffectUnlockGuildVaultTab(SpellEffIndex effIndex) +void Spell::EffectUnlockGuildVaultTab(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -5707,7 +5716,7 @@ void Spell::EffectUnlockGuildVaultTab(SpellEffIndex effIndex) // Safety checks done in Spell::CheckCast Player* caster = m_caster->ToPlayer(); if (Guild* guild = caster->GetGuild()) - guild->HandleBuyBankTab(caster->GetSession(), m_spellInfo->Effects[effIndex].BasePoints - 1); // Bank tabs start at zero internally + guild->HandleBuyBankTab(caster->GetSession(), effectInfo->BasePoints - 1); // Bank tabs start at zero internally } void Spell::EffectResurrectWithAura(SpellEffIndex effIndex) @@ -5731,8 +5740,8 @@ void Spell::EffectResurrectWithAura(SpellEffIndex effIndex) uint32 health = target->CountPctFromMaxHealth(damage); uint32 mana = CalculatePct(target->GetMaxPower(POWER_MANA), damage); uint32 resurrectAura = 0; - if (sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[effIndex].TriggerSpell)) - resurrectAura = GetSpellInfo()->Effects[effIndex].TriggerSpell; + if (sSpellMgr->GetSpellInfo(effectInfo->TriggerSpell)) + resurrectAura = effectInfo->TriggerSpell; if (resurrectAura && target->HasAura(resurrectAura)) return; @@ -5742,7 +5751,7 @@ void Spell::EffectResurrectWithAura(SpellEffIndex effIndex) SendResurrectRequest(target); } -void Spell::EffectCreateAreaTrigger(SpellEffIndex effIndex) +void Spell::EffectCreateAreaTrigger(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; @@ -5754,7 +5763,7 @@ void Spell::EffectCreateAreaTrigger(SpellEffIndex effIndex) pos = destTarget->GetPosition(); // trigger entry/miscvalue relation is currently unknown, for now use MiscValue as trigger entry - uint32 triggerEntry = GetSpellInfo()->Effects[effIndex].MiscValue; + uint32 triggerEntry = effectInfo->MiscValue; AreaTrigger * areaTrigger = new AreaTrigger; if (!areaTrigger->CreateAreaTrigger(sObjectMgr->GetGenerator<HighGuid::AreaTrigger>()->Generate(), triggerEntry, GetCaster(), GetSpellInfo(), pos)) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index cc88cc41e5a..da3135f6001 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -341,10 +341,8 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) { - SpellScalingEntry const* scaling = spellInfo->GetSpellScaling(); - _spellInfo = spellInfo; - _effIndex = _effect ? _effect->EffectIndex : effIndex; + EffectIndex = _effect ? _effect->EffectIndex : effIndex; Effect = _effect ? _effect->Effect : 0; ApplyAuraName = _effect ? _effect->EffectAura : 0; ApplyAuraPeriod = _effect ? _effect->EffectAuraPeriod : 0; @@ -358,6 +356,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; @@ -366,11 +365,15 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con ItemType = _effect ? _effect->EffectItemType : 0; TriggerSpell = _effect ? _effect->EffectTriggerSpell : 0; SpellClassMask = _effect ? _effect->EffectSpellClassMask : flag128(); + BonusCoefficientFromAP = _effect ? _effect->BonusCoefficientFromAP : 0.0f; ImplicitTargetConditions = NULL; - // TODO: 6.x these values are no longer in dbc - ScalingMultiplier = /*scaling ? scaling->Multiplier[_effIndex] :*/ 0.0f; - DeltaScalingMultiplier = /*scaling ? scaling->RandomMultiplier[_effIndex] :*/ 0.0f; - ComboScalingMultiplier = /*scaling ? scaling->OtherMultiplier[_effIndex] :*/ 0.0f; + + uint32 _effectScalingId = _effect ? sSpellEffectScallingByEffectId.find(_effect->ID) != sSpellEffectScallingByEffectId.end() ? sSpellEffectScallingByEffectId[_effect->ID] : 0 : 0; + SpellEffectScalingEntry const* _effectScalingEntry = sSpellEffectScalingStore.LookupEntry(_effectScalingId); + + Scaling.Coefficient = _effectScalingEntry ? _effectScalingEntry->Coefficient : 0.0f; + Scaling.Variance = _effectScalingEntry ? _effectScalingEntry->Variance : 0.0f; + Scaling.ResourceCoefficient = _effectScalingEntry ? _effectScalingEntry->ResourceCoefficient : 0.0f; } bool SpellEffectInfo::IsEffect() const @@ -378,7 +381,7 @@ bool SpellEffectInfo::IsEffect() const return Effect != 0; } -bool SpellEffectInfo::IsEffect(SpellEffects effectName) const +bool SpellEffectInfo::IsEffect(SpellEffectName effectName) const { return Effect == uint32(effectName); } @@ -429,42 +432,71 @@ bool SpellEffectInfo::IsUnitOwnedAuraEffect() const return IsAreaAuraEffect() || Effect == SPELL_EFFECT_APPLY_AURA; } -int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const* target) const +int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* bp /*= nullptr*/, Unit const* target /*= nullptr*/, float* variance /*= nullptr*/) const { float basePointsPerLevel = RealPointsPerLevel; int32 basePoints = bp ? *bp : BasePoints; float comboDamage = PointsPerResource; // base amount modification based on spell lvl vs caster lvl - if (ScalingMultiplier != 0.0f) + if (Scaling.Coefficient != 0.0f) { - if (caster) + int32 level = _spellInfo->SpellLevel; + if (target && _spellInfo->IsPositiveEffect(EffectIndex) && (Effect == SPELL_EFFECT_APPLY_AURA)) + level = target->getLevel(); + else if (caster) + level = caster->getLevel(); + + if (!(_spellInfo->AttributesEx11 & SPELL_ATTR11_UNK2) && _spellInfo->AttributesEx10 & SPELL_ATTR10_UNK12) + level = _spellInfo->BaseLevel; + + if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel > level) + level = _spellInfo->Scaling.MaxScalingLevel; + + float value = 0.0f; + if (level > 0) { - int32 level = caster->getLevel(); - if (target && _spellInfo->IsPositiveEffect(_effIndex) && (Effect == SPELL_EFFECT_APPLY_AURA)) - level = target->getLevel(); + if (!_spellInfo->Scaling.Class) + return 0; - if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.LookupEntry((_spellInfo->ScalingClass != -1 ? _spellInfo->ScalingClass - 1 : MAX_CLASSES - 1) * 100 + level - 1)) + if (!_spellInfo->Scaling.ScalesFromItemLevel) { - float multiplier = gtScaling->value; - if (_spellInfo->CastTimeMax > 0 && _spellInfo->CastTimeMaxLevel > level) - multiplier *= float(_spellInfo->CastTimeMin + (level - 1) * (_spellInfo->CastTimeMax - _spellInfo->CastTimeMin) / (_spellInfo->CastTimeMaxLevel - 1)) / float(_spellInfo->CastTimeMax); - if (_spellInfo->CoefLevelBase > level) - multiplier *= (1.0f - _spellInfo->CoefBase) * (float)(level - 1) / (float)(_spellInfo->CoefLevelBase - 1) + _spellInfo->CoefBase; - - float preciseBasePoints = ScalingMultiplier * multiplier; - if (DeltaScalingMultiplier) + if (!(_spellInfo->AttributesEx11 & SPELL_ATTR11_UNK2)) { - float delta = fabs(DeltaScalingMultiplier * ScalingMultiplier * multiplier * 0.5f); - preciseBasePoints += frand(-delta, delta); + if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.EvaluateTable(level - 1, (_spellInfo->Scaling.Class > 0 ? _spellInfo->Scaling.Class - 1 : MAX_CLASSES - 1))) + value = gtScaling->value; } + else + value = GetRandomPropertyPoints(level, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); + } + else + value = GetRandomPropertyPoints(_spellInfo->Scaling.ScalesFromItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); - basePoints = int32(preciseBasePoints); + if (level < _spellInfo->Scaling.CastTimeMaxLevel && _spellInfo->Scaling.CastTimeMax) + value *= float(_spellInfo->Scaling.CastTimeMin + (level - 1) * (_spellInfo->Scaling.CastTimeMax - _spellInfo->Scaling.CastTimeMin) / (_spellInfo->Scaling.CastTimeMaxLevel - 1)) / float(_spellInfo->Scaling.CastTimeMax); - if (ComboScalingMultiplier) - comboDamage = ComboScalingMultiplier * multiplier; - } + if (level < _spellInfo->Scaling.NerfMaxLevel) + value *= ((((1.0 - _spellInfo->Scaling.NerfFactor) * (level - 1)) / (_spellInfo->Scaling.NerfMaxLevel - 1)) + _spellInfo->Scaling.NerfFactor); + } + + value *= Scaling.Coefficient; + if (value != 0.0f && value < 1.0f) + value = 1.0f; + + if (Scaling.Variance) + { + float delta = fabs(Scaling.Variance * 0.5f); + float valueVariance = frand(-delta, delta); + value += value * valueVariance; + + if (variance) + *variance = valueVariance; } + + basePoints = int32(value); + + if (Scaling.ResourceCoefficient) + comboDamage = Scaling.ResourceCoefficient * value; } else { @@ -508,22 +540,9 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const if (uint8 comboPoints = caster->m_movedPlayer->GetComboPoints()) value += comboDamage * comboPoints; - value = caster->ApplyEffectModifiers(_spellInfo, _effIndex, value); + 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)) @@ -568,13 +587,12 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const if (canEffectScale) { - GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(_spellInfo->SpellLevel - 1); - GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1); + GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(_spellInfo->SpellLevel - 1, 0); + GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0); if (spellScaler && casterScaler) value *= casterScaler->ratio / spellScaler->ratio; } } -// REVIEW - MERGE >>>>>>> master } return int32(value); @@ -862,14 +880,30 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 182 SPELL_EFFECT_182 }; -SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effects) +SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap effects) { Id = spellEntry->ID; + // SpellDifficultyEntry + for (SpellEffectEntryMap::const_iterator itr = effects.begin(); itr != effects.end(); ++itr) + { + SpellEffectEntryVector effects = itr->second; + _effects[itr->first].resize(effects.size()); + + for (uint32 i = effects.size(); i > 0; --i) + { + SpellEffectEntry const* effect = effects[i - 1]; + if (!effect) + continue; + + _effects[itr->first][effect->EffectIndex] = new SpellEffectInfo(spellEntry, this, effect->EffectIndex, effect); + } + } + SpellName = spellEntry->Name_lang; - //Rank = spellEntry->Rank; + Rank = nullptr; RuneCostID = spellEntry->RuneCostID; - //SpellDifficultyId = spellEntry->DifficultyID; + SpellDifficultyId = 0; SpellScalingId = spellEntry->ScalingID; SpellAuraOptionsId = spellEntry->AuraOptionsID; SpellAuraRestrictionsId = spellEntry->AuraRestrictionsID; @@ -880,7 +914,6 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effe SpellEquippedItemsId = spellEntry->EquippedItemsID; SpellInterruptsId = spellEntry->InterruptsID; SpellLevelsId = spellEntry->LevelsID; - //SpellPowerId = spellEntry->PowerID; SpellReagentsId = spellEntry->ReagentsID; SpellShapeshiftId = spellEntry->ShapeshiftID; SpellTargetRestrictionsId = spellEntry->TargetRestrictionsID; @@ -916,18 +949,16 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effe SpellIconID = _misc ? _misc->SpellIconID : 0; ActiveIconID = _misc ? _misc->ActiveIconID : 0; - // SpellDifficultyEntry - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - Effects[i] = SpellEffectInfo(spellEntry, this, i, effects[i]); - // SpellScalingEntry SpellScalingEntry const* _scaling = GetSpellScaling(); - CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; - CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; - CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; - ScalingClass = _scaling ? _scaling->ScalingClass : 0; - CoefBase = _scaling ? _scaling->NerfFactor : 0; - CoefLevelBase = _scaling ? _scaling->NerfMaxLevel : 0; + Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; + Scaling.CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; + Scaling.CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; + Scaling.Class = _scaling ? _scaling->ScalingClass : 0; + Scaling.NerfFactor = _scaling ? _scaling->NerfFactor : 0; + Scaling.NerfMaxLevel = _scaling ? _scaling->NerfMaxLevel : 0; + Scaling.MaxScalingLevel = _scaling ? _scaling->MaxScalingLevel : 0; + Scaling.ScalesFromItemLevel = _scaling ? _scaling->ScalesFromItemLevel : 0; // SpellAuraOptionsEntry SpellAuraOptionsEntry const* _options = GetSpellAuraOptions(); @@ -1040,58 +1071,99 @@ uint32 SpellInfo::GetCategory() const return CategoryEntry ? CategoryEntry->ID : 0; } -bool SpellInfo::HasEffect(SpellEffects effect) const +bool SpellInfo::HasEffect(uint32 difficulty, SpellEffectName effect) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsEffect(effect)) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* eff : effects) + { + if (eff && eff->IsEffect(effect)) return true; + } return false; } -bool SpellInfo::HasAura(AuraType aura) const +bool SpellInfo::HasEffect(SpellEffectName effect) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsAura(aura)) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + { + for (SpellEffectInfo const* eff : itr->second) + { + if (eff && eff->IsEffect(effect)) + return true; + } + } + return false; +} + +bool SpellInfo::HasAura(uint32 difficulty, AuraType aura) const +{ + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) + { + if (effect && effect->IsAura(aura)) return true; + } return false; } -bool SpellInfo::HasAreaAuraEffect() const +bool SpellInfo::HasAreaAuraEffect(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsAreaAuraEffect()) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) + { + if (effect && effect->IsAreaAuraEffect()) return true; + } + return false; +} + +bool SpellInfo::HasAreaAuraEffect() const +{ + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + { + for (SpellEffectInfo const* effect : itr->second) + { + if (effect && effect->IsAreaAuraEffect()) + return true; + } + } return false; } bool SpellInfo::IsExplicitDiscovery() const { - return ((Effects[0].Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM - || Effects[0].Effect == SPELL_EFFECT_CREATE_ITEM_2) - && Effects[1].Effect == SPELL_EFFECT_SCRIPT_EFFECT) + SpellEffectInfo const* effect0 = GetEffect(DIFFICULTY_NONE, EFFECT_0); + SpellEffectInfo const* effect1 = GetEffect(DIFFICULTY_NONE, EFFECT_1); + + return ((effect0 && (effect0->Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM || effect0->Effect == SPELL_EFFECT_CREATE_ITEM_2)) + && effect1 && effect1->Effect == SPELL_EFFECT_SCRIPT_EFFECT) || Id == 64323; } bool SpellInfo::IsLootCrafting() const { - return (Effects[0].Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM || + SpellEffectInfo const* effect0 = GetEffect(DIFFICULTY_NONE, EFFECT_0); + return effect0 && (effect0->Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM || // different random cards from Inscription (121==Virtuoso Inking Set category) r without explicit item - (Effects[0].Effect == SPELL_EFFECT_CREATE_ITEM_2 && - ((TotemCategory[0] != 0 || (Totem[0] != 0 && SpellIconID == 1)) || Effects[0].ItemType == 0))); + (effect0->Effect == SPELL_EFFECT_CREATE_ITEM_2 && + ((TotemCategory[0] != 0 || (Totem[0] != 0 && SpellIconID == 1)) || effect0->ItemType == 0))); } bool SpellInfo::IsQuestTame() const { - return Effects[0].Effect == SPELL_EFFECT_THREAT && Effects[1].Effect == SPELL_EFFECT_APPLY_AURA && Effects[1].ApplyAuraName == SPELL_AURA_DUMMY; + SpellEffectInfo const* effect0 = GetEffect(DIFFICULTY_NONE, EFFECT_0); + SpellEffectInfo const* effect1 = GetEffect(DIFFICULTY_NONE, EFFECT_1); + return effect0 && effect1 && effect0->Effect == SPELL_EFFECT_THREAT && effect1->Effect == SPELL_EFFECT_APPLY_AURA && effect1->ApplyAuraName == SPELL_AURA_DUMMY; } -bool SpellInfo::IsProfessionOrRiding() const +bool SpellInfo::IsProfessionOrRiding(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) { - if (Effects[i].Effect == SPELL_EFFECT_SKILL) + if ((effect && effect->Effect == SPELL_EFFECT_SKILL)) { - uint32 skill = Effects[i].MiscValue; + uint32 skill = effect->MiscValue; if (IsProfessionOrRidingSkill(skill)) return true; @@ -1100,13 +1172,14 @@ bool SpellInfo::IsProfessionOrRiding() const return false; } -bool SpellInfo::IsProfession() const +bool SpellInfo::IsProfession(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) { - if (Effects[i].Effect == SPELL_EFFECT_SKILL) + if (effect && effect->Effect == SPELL_EFFECT_SKILL) { - uint32 skill = Effects[i].MiscValue; + uint32 skill = effect->MiscValue; if (IsProfessionSkill(skill)) return true; @@ -1115,13 +1188,14 @@ bool SpellInfo::IsProfession() const return false; } -bool SpellInfo::IsPrimaryProfession() const +bool SpellInfo::IsPrimaryProfession(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for(SpellEffectInfo const* effect : effects) { - if (Effects[i].Effect == SPELL_EFFECT_SKILL) + if (effect && effect->Effect == SPELL_EFFECT_SKILL) { - uint32 skill = Effects[i].MiscValue; + uint32 skill = effect->MiscValue; if (IsPrimaryProfessionSkill(skill)) return true; @@ -1130,9 +1204,9 @@ bool SpellInfo::IsPrimaryProfession() const return false; } -bool SpellInfo::IsPrimaryProfessionFirstRank() const +bool SpellInfo::IsPrimaryProfessionFirstRank(uint32 difficulty) const { - return IsPrimaryProfession() && GetRank() == 1; + return IsPrimaryProfession(difficulty) && GetRank() == 1; } bool SpellInfo::IsAbilityLearnedWithProfession() const @@ -1163,20 +1237,26 @@ bool SpellInfo::IsAbilityOfSkillType(uint32 skillType) const return false; } -bool SpellInfo::IsAffectingArea() const +bool SpellInfo::IsAffectingArea(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsEffect() && (Effects[i].IsTargetingArea() || Effects[i].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) || Effects[i].IsAreaAuraEffect())) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) + { + if (effect && effect->IsEffect() && (effect->IsTargetingArea() || effect->IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) || effect->IsAreaAuraEffect())) return true; + } return false; } // checks if spell targets are selected from area, doesn't include spell effects in check (like area wide auras for example) -bool SpellInfo::IsTargetingArea() const +bool SpellInfo::IsTargetingArea(uint32 difficulty) const { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsEffect() && Effects[i].IsTargetingArea()) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) + { + if (effect && effect->IsEffect() && effect->IsTargetingArea()) return true; + } return false; } @@ -1185,7 +1265,7 @@ bool SpellInfo::NeedsExplicitUnitTarget() const return (GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK) != 0; } -bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const +bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell, uint32 difficulty) const { if (NeedsExplicitUnitTarget()) return true; @@ -1205,12 +1285,16 @@ bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) con if (triggeringSpell->IsChanneled()) { uint32 mask = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + for (SpellEffectInfo const* effect : effects) { - if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER - && Effects[i].TargetB.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetB.GetTarget() != TARGET_DEST_CASTER) + if (!effect) + continue; + + if (effect->TargetA.GetTarget() != TARGET_UNIT_CASTER && effect->TargetA.GetTarget() != TARGET_DEST_CASTER + && effect->TargetB.GetTarget() != TARGET_UNIT_CASTER && effect->TargetB.GetTarget() != TARGET_DEST_CASTER) { - mask |= Effects[i].GetProvidedTargetMask(); + mask |= effect->GetProvidedTargetMask(); } } @@ -1248,19 +1332,23 @@ bool SpellInfo::IsStackableWithRanks() const return false; // All stance spells. if any better way, change it. - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + SpellEffectInfoVector effects = GetEffectsForDifficulty(DIFFICULTY_NONE); + for (SpellEffectInfo const* effect : effects) { + if (!effect) + continue; + switch (SpellFamilyName) { case SPELLFAMILY_PALADIN: // Paladin aura Spell - if (Effects[i].Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) + if (effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) return false; break; case SPELLFAMILY_DRUID: // Druid form Spell - if (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA && - Effects[i].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) + if (effect->Effect == SPELL_EFFECT_APPLY_AURA && + effect->ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) return false; break; } @@ -1268,9 +1356,9 @@ bool SpellInfo::IsStackableWithRanks() const return true; } -bool SpellInfo::IsPassiveStackableWithRanks() const +bool SpellInfo::IsPassiveStackableWithRanks(uint32 difficulty) const { - return IsPassive() && !HasEffect(SPELL_EFFECT_APPLY_AURA); + return IsPassive() && !HasEffect(difficulty, SPELL_EFFECT_APPLY_AURA); } bool SpellInfo::IsMultiSlotAura() const @@ -1650,12 +1738,12 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a // aura limitations if (player) { - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(player->GetMap()->GetDifficulty())) { - if (!Effects[i].IsAura()) + if (!effect || !effect->IsAura()) continue; - switch (Effects[i].ApplyAuraName) + switch (effect->ApplyAuraName) { case SPELL_AURA_FLY: { @@ -1665,7 +1753,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a } case SPELL_AURA_MOUNTED: { - if (Effects[i].MiscValueB && !player->GetMountCapability(Effects[i].MiscValueB)) + if (effect->MiscValueB && !player->GetMountCapability(effect->MiscValueB)) return SPELL_FAILED_NOT_HERE; break; } @@ -1814,14 +1902,14 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta return SPELL_FAILED_TARGET_AURASTATE; } - if (TargetAuraSpell && !unitTarget->HasAura(sSpellMgr->GetSpellIdForDifficulty(TargetAuraSpell, caster))) + if (TargetAuraSpell && !unitTarget->HasAura(TargetAuraSpell)) return SPELL_FAILED_TARGET_AURASTATE; - if (ExcludeTargetAuraSpell && unitTarget->HasAura(sSpellMgr->GetSpellIdForDifficulty(ExcludeTargetAuraSpell, caster))) + if (ExcludeTargetAuraSpell && unitTarget->HasAura(ExcludeTargetAuraSpell)) return SPELL_FAILED_TARGET_AURASTATE; if (unitTarget->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION)) - if (HasEffect(SPELL_EFFECT_SELF_RESURRECT) || HasEffect(SPELL_EFFECT_RESURRECT) || HasEffect(SPELL_EFFECT_RESURRECT_NEW)) + if (HasEffect(caster->GetMap()->GetDifficulty(), SPELL_EFFECT_SELF_RESURRECT) || HasEffect(caster->GetMap()->GetDifficulty(), SPELL_EFFECT_RESURRECT) || HasEffect(caster->GetMap()->GetDifficulty(), SPELL_EFFECT_RESURRECT_NEW)) return SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED; return SPELL_CAST_OK; @@ -1872,18 +1960,18 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const if (vehicle) { uint16 checkMask = 0; - for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(caster->GetMap()->GetDifficulty())) { - if (Effects[effIndex].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) + if (effect && effect->ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) { - SpellShapeshiftFormEntry const* shapeShiftFromEntry = sSpellShapeshiftFormStore.LookupEntry(Effects[effIndex].MiscValue); + SpellShapeshiftFormEntry const* shapeShiftFromEntry = sSpellShapeshiftFormStore.LookupEntry(effect->MiscValue); if (shapeShiftFromEntry && (shapeShiftFromEntry->Flags & 1) == 0) // unk flag checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED; break; } } - if (HasAura(SPELL_AURA_MOUNTED)) + if (HasAura(caster->GetMap()->GetDifficulty(), SPELL_AURA_MOUNTED)) checkMask |= VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL; if (!checkMask) @@ -1897,12 +1985,12 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const // Can only summon uncontrolled minions/guardians when on controlled vehicle if (vehicleSeat->Flags & (VEHICLE_SEAT_FLAG_CAN_CONTROL | VEHICLE_SEAT_FLAG_UNK2)) { - for (uint32 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(caster->GetMap()->GetDifficulty())) { - if (Effects[i].Effect != SPELL_EFFECT_SUMMON) + if (!effect || effect->Effect != SPELL_EFFECT_SUMMON) continue; - SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(Effects[i].MiscValueB); + SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(effect->MiscValueB); if (props && props->Category != SUMMON_CATEGORY_WILD) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; } @@ -1942,19 +2030,30 @@ uint32 SpellInfo::GetAllEffectsMechanicMask() const uint32 mask = 0; if (Mechanic) mask |= 1 << Mechanic; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsEffect() && Effects[i].Mechanic) - mask |= 1 << Effects[i].Mechanic; + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + { + for (SpellEffectInfo const* effect : itr->second) + { + if (effect && effect->IsEffect() && effect->Mechanic) + mask |= 1 << effect->Mechanic; + } + } return mask; } -uint32 SpellInfo::GetEffectMechanicMask(uint8 effIndex) const +uint32 SpellInfo::GetEffectMechanicMask(uint32 effIndex) const { uint32 mask = 0; if (Mechanic) mask |= 1 << Mechanic; - if (Effects[effIndex].IsEffect() && Effects[effIndex].Mechanic) - mask |= 1 << Effects[effIndex].Mechanic; + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + { + for (SpellEffectInfo const* effect : itr->second) + { + if (effect && effect->EffectIndex == effIndex && effect->IsEffect() && effect->Mechanic) + mask |= 1 << effect->Mechanic; + } + } return mask; } @@ -1963,28 +2062,34 @@ uint32 SpellInfo::GetSpellMechanicMaskByEffectMask(uint32 effectMask) const uint32 mask = 0; if (Mechanic) mask |= 1 << Mechanic; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if ((effectMask & (1 << i)) && Effects[i].Mechanic) - mask |= 1 << Effects[i].Mechanic; + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + { + for (SpellEffectInfo const* effect : itr->second) + { + if (effect && (effectMask & (1 << effect->EffectIndex)) && effect->Mechanic) + mask |= 1 << effect->Mechanic; + } + } return mask; } -Mechanics SpellInfo::GetEffectMechanic(uint8 effIndex) const +Mechanics SpellInfo::GetEffectMechanic(uint32 effIndex, uint32 difficulty) const { - if (Effects[effIndex].IsEffect() && Effects[effIndex].Mechanic) - return Mechanics(Effects[effIndex].Mechanic); + SpellEffectInfo const* effect = GetEffect(difficulty, effIndex); + if (effect && effect->IsEffect() && effect->Mechanic) + return Mechanics(effect->Mechanic); if (Mechanic) return Mechanics(Mechanic); return MECHANIC_NONE; } -bool SpellInfo::HasAnyEffectMechanic() const +/*bool SpellInfo::HasAnyEffectMechanic() const { for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (Effects[i].Mechanic) return true; return false; -} +}*/ uint32 SpellInfo::GetDispelMask() const { @@ -2005,7 +2110,7 @@ uint32 SpellInfo::GetExplicitTargetMask() const return ExplicitTargetMask; } -AuraStateType SpellInfo::GetAuraState() const +AuraStateType SpellInfo::GetAuraState(uint32 difficulty) const { // Seals if (GetSpellSpecific() == SPELL_SPECIFIC_SEAL) @@ -2048,10 +2153,10 @@ AuraStateType SpellInfo::GetAuraState() const return AURA_STATE_BLEEDING; if (GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (Effects[i].IsAura() && (Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN - || Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT)) - return AURA_STATE_FROZEN; + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(difficulty)) + if (effect && effect->IsAura() && (effect->ApplyAuraName == SPELL_AURA_MOD_STUN + || effect->ApplyAuraName == SPELL_AURA_MOD_ROOT)) + return AURA_STATE_FROZEN; switch (Id) { @@ -2076,24 +2181,27 @@ SpellSpecificType SpellInfo::GetSpellSpecific() const { bool food = false; bool drink = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (!Effects[i].IsAura()) - continue; - switch (Effects[i].ApplyAuraName) + for (SpellEffectInfo const* effect : itr->second) { - // Food + if (!effect || !effect->IsAura()) + continue; + switch (effect->ApplyAuraName) + { + // Food case SPELL_AURA_MOD_REGEN: case SPELL_AURA_OBS_MOD_HEALTH: food = true; break; - // Drink + // Drink case SPELL_AURA_MOD_POWER_REGEN: case SPELL_AURA_OBS_MOD_POWER: drink = true; break; default: break; + } } } @@ -2133,8 +2241,8 @@ SpellSpecificType SpellInfo::GetSpellSpecific() const // Arcane brillance and Arcane intelect (normal check fails because of flags difference) if (SpellFamilyFlags[0] & 0x400) return SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE; - - if ((SpellFamilyFlags[0] & 0x1000000) && Effects[0].ApplyAuraName == SPELL_AURA_MOD_CONFUSE) + SpellEffectInfo const* effect = GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (effect && (SpellFamilyFlags[0] & 0x1000000) && effect->ApplyAuraName == SPELL_AURA_MOD_CONFUSE) return SPELL_SPECIFIC_MAGE_POLYMORPH; break; @@ -2220,12 +2328,14 @@ SpellSpecificType SpellInfo::GetSpellSpecific() const break; } - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA) + for (SpellEffectInfo const* effect : itr->second) { - switch (Effects[i].ApplyAuraName) + if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) { + switch (effect->ApplyAuraName) + { case SPELL_AURA_MOD_CHARM: case SPELL_AURA_MOD_POSSESS_PET: case SPELL_AURA_MOD_POSSESS: @@ -2238,10 +2348,10 @@ SpellSpecificType SpellInfo::GetSpellSpecific() const case SPELL_AURA_TRACK_RESOURCES: case SPELL_AURA_TRACK_STEALTHED: return SPELL_SPECIFIC_TRACKER; + } } } } - return SPELL_SPECIFIC_NORMAL; } @@ -2290,11 +2400,11 @@ uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const level = spell->GetCaster()->getLevel(); // not all spells have cast time index and this is all is pasiive abilities - if (level && CastTimeMax > 0) + if (level && Scaling.CastTimeMax > 0) { - castTime = CastTimeMax; - if (CastTimeMaxLevel > level) - castTime = CastTimeMin + int32(level - 1) * (CastTimeMax - CastTimeMin) / (CastTimeMaxLevel - 1); + castTime = Scaling.CastTimeMax; + if (Scaling.CastTimeMaxLevel > level) + castTime = Scaling.CastTimeMin + int32(level - 1) * (Scaling.CastTimeMax - Scaling.CastTimeMin) / (Scaling.CastTimeMaxLevel - 1); } else if (CastTimeEntry) castTime = CastTimeEntry->CastTime; @@ -2311,7 +2421,7 @@ uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const return (castTime > 0) ? uint32(castTime) : 0; } -uint32 SpellInfo::GetMaxTicks() const +uint32 SpellInfo::GetMaxTicks(uint32 difficulty) const { int32 DotDuration = GetDuration(); if (DotDuration == 0) @@ -2321,16 +2431,16 @@ uint32 SpellInfo::GetMaxTicks() const if (DotDuration > 30000) DotDuration = 30000; - for (uint8 x = 0; x < MAX_SPELL_EFFECTS; x++) + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(difficulty)) { - if (Effects[x].Effect == SPELL_EFFECT_APPLY_AURA) - switch (Effects[x].ApplyAuraName) + if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) + switch (effect->ApplyAuraName) { case SPELL_AURA_PERIODIC_DAMAGE: case SPELL_AURA_PERIODIC_HEAL: case SPELL_AURA_PERIODIC_LEECH: - if (Effects[x].ApplyAuraPeriod != 0) - return DotDuration / Effects[x].ApplyAuraPeriod; + if (effect->ApplyAuraPeriod != 0) + return DotDuration / effect->ApplyAuraPeriod; break; } } @@ -2426,8 +2536,8 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) c { if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION) { - GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(SpellLevel - 1); - GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1); + GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(SpellLevel - 1, 0); + GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0); if (spellScaler && casterScaler) powerCost *= casterScaler->ratio / spellScaler->ratio; } @@ -2492,13 +2602,13 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const return this; bool needRankSelection = false; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (IsPositiveEffect(i) && - (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA || - Effects[i].Effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || - Effects[i].Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) && - !Effects[i].ScalingMultiplier) + if (effect && IsPositiveEffect(effect->Effect) && + (effect->Effect == SPELL_EFFECT_APPLY_AURA || + effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || + effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) && + !effect->Scaling.Coefficient) { needRankSelection = true; break; @@ -2550,32 +2660,35 @@ void SpellInfo::_InitializeExplicitTargetMask() bool dstSet = false; uint32 targetMask = Targets; // prepare target mask using effect target entries - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (!Effects[i].IsEffect()) - continue; + for (SpellEffectInfo const* effect : itr->second) + { + if (!effect || !effect->IsEffect()) + continue; - targetMask |= Effects[i].TargetA.GetExplicitTargetMask(srcSet, dstSet); - targetMask |= Effects[i].TargetB.GetExplicitTargetMask(srcSet, dstSet); + targetMask |= effect->TargetA.GetExplicitTargetMask(srcSet, dstSet); + targetMask |= effect->TargetB.GetExplicitTargetMask(srcSet, dstSet); - // add explicit target flags based on spell effects which have EFFECT_IMPLICIT_TARGET_EXPLICIT and no valid target provided - if (Effects[i].GetImplicitTargetType() != EFFECT_IMPLICIT_TARGET_EXPLICIT) - continue; + // add explicit target flags based on spell effects which have EFFECT_IMPLICIT_TARGET_EXPLICIT and no valid target provided + if (effect->GetImplicitTargetType() != EFFECT_IMPLICIT_TARGET_EXPLICIT) + continue; - // extend explicit target mask only if valid targets for effect could not be provided by target types - uint32 effectTargetMask = Effects[i].GetMissingTargetMask(srcSet, dstSet, targetMask); + // extend explicit target mask only if valid targets for effect could not be provided by target types + uint32 effectTargetMask = effect->GetMissingTargetMask(srcSet, dstSet, targetMask); - // don't add explicit object/dest flags when spell has no max range - if (GetMaxRange(true) == 0.0f && GetMaxRange(false) == 0.0f) - effectTargetMask &= ~(TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_DEST_LOCATION); + // don't add explicit object/dest flags when spell has no max range + if (GetMaxRange(true) == 0.0f && GetMaxRange(false) == 0.0f) + effectTargetMask &= ~(TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_DEST_LOCATION); - targetMask |= effectTargetMask; + targetMask |= effectTargetMask; + } } ExplicitTargetMask = targetMask; } -bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const +bool SpellInfo::_IsPositiveEffect(uint32 effIndex, bool deep) const { // not found a single positive spell with this attribute if (Attributes & SPELL_ATTR0_NEGATIVE_1) @@ -2640,40 +2753,50 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const } // Special case: effects which determine positivity of whole spell - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (Effects[i].IsAura() && Effects[i].ApplyAuraName == SPELL_AURA_MOD_STEALTH) - return true; + for (SpellEffectInfo const* effect : itr->second) + { + if (effect && effect->IsAura() && effect->ApplyAuraName == SPELL_AURA_MOD_STEALTH) + return true; + } } - switch (Effects[effIndex].Effect) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - case SPELL_EFFECT_DUMMY: - // some explicitly required dummy effect sets - switch (Id) + for (SpellEffectInfo const* effect : itr->second) + { + if (!effect || effect->EffectIndex != effIndex) + continue; + + switch (effect->Effect) { + case SPELL_EFFECT_DUMMY: + // some explicitly required dummy effect sets + switch (Id) + { case 28441: return false; // AB Effect 000 default: break; - } - break; - // always positive effects (check before target checks that provided non-positive result in some case for positive effects) - case SPELL_EFFECT_HEAL: - case SPELL_EFFECT_LEARN_SPELL: - case SPELL_EFFECT_SKILL_STEP: - case SPELL_EFFECT_HEAL_PCT: - case SPELL_EFFECT_ENERGIZE_PCT: - return true; - case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY: - return false; + } + break; + // always positive effects (check before target checks that provided non-positive result in some case for positive effects) + case SPELL_EFFECT_HEAL: + case SPELL_EFFECT_LEARN_SPELL: + case SPELL_EFFECT_SKILL_STEP: + case SPELL_EFFECT_HEAL_PCT: + case SPELL_EFFECT_ENERGIZE_PCT: + return true; + case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY: + return false; - // non-positive aura use - case SPELL_EFFECT_APPLY_AURA: - case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: - { - switch (Effects[effIndex].ApplyAuraName) + // non-positive aura use + case SPELL_EFFECT_APPLY_AURA: + case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: { + switch (effect->ApplyAuraName) + { case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from bas point sign (negative -> negative) case SPELL_AURA_MOD_STAT: case SPELL_AURA_MOD_SKILL: @@ -2681,16 +2804,16 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case SPELL_AURA_MOD_HEALING_PCT: case SPELL_AURA_MOD_HEALING_DONE: case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE: - if (Effects[effIndex].CalcValue() < 0) + if (effect->CalcValue() < 0) return false; break; case SPELL_AURA_MOD_DAMAGE_TAKEN: // dependent from bas point sign (positive -> negative) - if (Effects[effIndex].CalcValue() > 0) + if (effect->CalcValue() > 0) return false; break; case SPELL_AURA_MOD_CRIT_PCT: case SPELL_AURA_MOD_SPELL_CRIT_CHANCE: - if (Effects[effIndex].CalcValue() > 0) + if (effect->CalcValue() > 0) return true; // some expected positive spells have SPELL_ATTR1_NEGATIVE break; case SPELL_AURA_ADD_TARGET_TRIGGER: @@ -2699,17 +2822,20 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case SPELL_AURA_PERIODIC_TRIGGER_SPELL: if (!deep) { - if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(Effects[effIndex].TriggerSpell)) + if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(effect->TriggerSpell)) { // negative targets of main spell return early - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfoMap::const_iterator it = spellTriggeredProto->_effects.begin(); it != spellTriggeredProto->_effects.end(); ++it) { - if (!spellTriggeredProto->Effects[i].Effect) - continue; - // if non-positive trigger cast targeted to positive target this main cast is non-positive - // this will place this spell auras as debuffs - if (_IsPositiveTarget(spellTriggeredProto->Effects[i].TargetA.GetTarget(), spellTriggeredProto->Effects[i].TargetB.GetTarget()) && !spellTriggeredProto->_IsPositiveEffect(i, true)) - return false; + for (SpellEffectInfo const* eff : itr->second) + { + if (!eff || !eff->Effect) + continue; + // if non-positive trigger cast targeted to positive target this main cast is non-positive + // this will place this spell auras as debuffs + if (_IsPositiveTarget(eff->TargetA.GetTarget(), eff->TargetB.GetTarget()) && !spellTriggeredProto->_IsPositiveEffect(eff->EffectIndex, true)) + return false; + } } } } @@ -2717,9 +2843,23 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const // many positive auras have negative triggered spells at damage for example and this not make it negative (it can be canceled for example) break; case SPELL_AURA_MOD_STUN: //have positive and negative spells, we can't sort its correctly at this moment. - if (effIndex == 0 && Effects[1].Effect == 0 && Effects[2].Effect == 0) + { + bool more = false; + for (SpellEffectInfoMap::const_iterator i = _effects.begin(); i != _effects.end(); ++i) + { + for (SpellEffectInfo const* eff : i->second) + { + if (eff && eff->EffectIndex != 0) + { + more = true; + break; + } + } + } + if (effIndex == 0 && !more) return false; // but all single stun aura spells is negative break; + } case SPELL_AURA_MOD_PACIFY_SILENCE: if (Id == 24740) // Wisp Costume return true; @@ -2734,12 +2874,12 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const return false; case SPELL_AURA_PERIODIC_DAMAGE: // used in positive spells also. // part of negative spell if cast at self (prevent cancel) - if (Effects[effIndex].TargetA.GetTarget() == TARGET_UNIT_CASTER) + if (effect->TargetA.GetTarget() == TARGET_UNIT_CASTER) return false; break; case SPELL_AURA_MOD_DECREASE_SPEED: // used in positive spells also // part of positive spell if cast at self - if (Effects[effIndex].TargetA.GetTarget() != TARGET_UNIT_CASTER) + if (effect->TargetA.GetTarget() != TARGET_UNIT_CASTER) return false; // but not this if this first effect (didn't find better check) if (Attributes & SPELL_ATTR0_NEGATIVE_1 && effIndex == 0) @@ -2748,7 +2888,7 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case SPELL_AURA_MECHANIC_IMMUNITY: { // non-positive immunities - switch (Effects[effIndex].MiscValue) + switch (effect->MiscValue) { case MECHANIC_BANDAGE: case MECHANIC_SHIELD: @@ -2764,10 +2904,10 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case SPELL_AURA_ADD_PCT_MODIFIER: { // non-positive mods - switch (Effects[effIndex].MiscValue) + switch (effect->MiscValue) { case SPELLMOD_COST: // dependent from bas point sign (negative -> positive) - if (Effects[effIndex].CalcValue() > 0) + if (effect->CalcValue() > 0) { if (!deep) { @@ -2793,25 +2933,26 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const } default: break; + } + break; + } + default: + break; } - break; - } - default: - break; - } - - // non-positive targets - if (!_IsPositiveTarget(Effects[effIndex].TargetA.GetTarget(), Effects[effIndex].TargetB.GetTarget())) - return false; - // negative spell if triggered spell is negative - if (!deep && !Effects[effIndex].ApplyAuraName && Effects[effIndex].TriggerSpell) - { - if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(Effects[effIndex].TriggerSpell)) - if (!spellTriggeredProto->_IsPositiveSpell()) + // non-positive targets + if (!_IsPositiveTarget(effect->TargetA.GetTarget(), effect->TargetB.GetTarget())) return false; - } + // negative spell if triggered spell is negative + if (!deep && !effect->ApplyAuraName && effect->TriggerSpell) + { + if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(effect->TriggerSpell)) + if (!spellTriggeredProto->_IsPositiveSpell()) + return false; + } + } + } // ok, positive return true; } @@ -2870,7 +3011,10 @@ SpellLevelsEntry const* SpellInfo::GetSpellLevels() const SpellPowerEntry const* SpellInfo::GetSpellPower() const { - return SpellPowerId ? sSpellPowerStore.LookupEntry(SpellPowerId) : NULL; + auto itr = sSpellPowerBySpellIDStore.find(Id); + if (itr != sSpellPowerBySpellIDStore.end()) + return itr->second; + return NULL; } SpellReagentsEntry const* SpellInfo::GetSpellReagents() const @@ -2931,16 +3075,72 @@ SpellCooldownsEntry const* SpellInfo::GetSpellCooldowns() const void SpellInfo::_UnloadImplicitTargetConditionLists() { // find the same instances of ConditionList and delete them. - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (uint32 d = 0; d < DIFFICULTY_MAX; ++d) { - ConditionList* cur = Effects[i].ImplicitTargetConditions; - if (!cur) - continue; - for (uint8 j = i; j < MAX_SPELL_EFFECTS; ++j) + for (uint32 i = 0; i < _effects.size(); ++i) + { + if (SpellEffectInfo const* effect = GetEffect(d, i)) + { + ConditionList* cur = effect->ImplicitTargetConditions; + if (!cur) + continue; + for (uint8 j = i; j < _effects.size(); ++j) + { + if (SpellEffectInfo const* eff = GetEffect(d, j)) + { + if (eff->ImplicitTargetConditions == cur) + const_cast<SpellEffectInfo*>(eff)->ImplicitTargetConditions = NULL; + } + } + delete cur; + } + } + } +} + +SpellEffectInfoVector SpellInfo::GetEffectsForDifficulty(uint32 difficulty) const +{ + // 6.x todo: add first highest difficulty effect, resize list to max element, add lower diff effects without overwriting any higher diffed ones + + SpellEffectInfoVector effList; + + // DIFFICULTY_NONE effects are the default effects, always active if current difficulty's effects don't overwrite + SpellEffectInfoMap::const_iterator itr = _effects.find(DIFFICULTY_NONE); + if (itr != _effects.end()) + effList = itr->second; + + // downscale difficulty if original was not found + // DIFFICULTY_NONE is already in our list + for (; difficulty > DIFFICULTY_NONE; --difficulty) + { + SpellEffectInfoMap::const_iterator itr = _effects.find(difficulty); + if (itr != _effects.end()) { - if (Effects[j].ImplicitTargetConditions == cur) - Effects[j].ImplicitTargetConditions = NULL; + for (SpellEffectInfo const* effect : itr->second) + { + // overwrite any existing effect from DIFFICULTY_NONE + if (effect) + { + if (effect->EffectIndex >= effList.size()) + effList.resize(effect->EffectIndex + 1); + + effList[effect->EffectIndex] = effect; + } + } + // if we found any effect in our difficulty then stop searching + break; } - delete cur; } + if (effList.empty()) + TC_LOG_ERROR("spells", "GetEffectsForDifficulty did not find any effects for spell %u in difficulty %u", Id, difficulty); + return effList; +} + +SpellEffectInfo const* SpellInfo::GetEffect(uint32 difficulty, uint32 index) const +{ + SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); + if (index >= effects.size()) + return nullptr; + + return effects[index]; } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 1fad30dd23b..0f655580b6d 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -65,6 +65,11 @@ enum SpellCastTargetFlags TARGET_FLAG_DEST_TARGET = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell) TARGET_FLAG_EXTRA_TARGETS = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger) + TARGET_FLAG_UNK400000 = 0X00400000, + TARGET_FLAG_UNK1000000 = 0X01000000, + TARGET_FLAG_UNK4000000 = 0X04000000, + TARGET_FLAG_UNK10000000 = 0X10000000, + TARGET_FLAG_UNK40000000 = 0X40000000, TARGET_FLAG_UNIT_MASK = TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY | TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT_DEAD | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_UNIT_PASSENGER, @@ -230,8 +235,8 @@ private: class SpellEffectInfo { SpellInfo const* _spellInfo; - uint8 _effIndex; public: + uint32 EffectIndex; uint32 Effect; uint32 ApplyAuraName; uint32 ApplyAuraPeriod; @@ -245,6 +250,7 @@ public: int32 MiscValue; int32 MiscValueB; Mechanics Mechanic; + float PositionFacing; SpellImplicitTargetInfo TargetA; SpellImplicitTargetInfo TargetB; SpellRadiusEntry const* RadiusEntry; @@ -253,20 +259,24 @@ public: uint32 ItemType; uint32 TriggerSpell; flag128 SpellClassMask; + float BonusCoefficientFromAP; std::list<Condition*>* ImplicitTargetConditions; // SpellScalingEntry - float ScalingMultiplier; - float DeltaScalingMultiplier; - float ComboScalingMultiplier; + struct ScalingInfo + { + float Coefficient; + float Variance; + float ResourceCoefficient; + } Scaling; - SpellEffectInfo() : _spellInfo(NULL), _effIndex(0), Effect(0), ApplyAuraName(0), ApplyAuraPeriod(0), DieSides(0), + 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), BonusCoefficientFromAP(0.0f), ImplicitTargetConditions(NULL) { } SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect); bool IsEffect() const; - bool IsEffect(SpellEffects effectName) const; + bool IsEffect(SpellEffectName effectName) const; bool IsAura() const; bool IsAura(AuraType aura) const; bool IsTargetingArea() const; @@ -275,7 +285,7 @@ public: bool IsFarDestTargetEffect() const; bool IsUnitOwnedAuraEffect() const; - int32 CalcValue(Unit const* caster = NULL, int32 const* basePoints = NULL, Unit const* target = NULL) const; + int32 CalcValue(Unit const* caster = nullptr, int32 const* basePoints = nullptr, Unit const* target = nullptr, float* variance = nullptr) const; int32 CalcBaseValue(int32 value) const; float CalcValueMultiplier(Unit* caster, Spell* spell = NULL) const; float CalcDamageMultiplier(Unit* caster, Spell* spell = NULL) const; @@ -299,6 +309,14 @@ private: static StaticData _data[TOTAL_SPELL_EFFECTS]; }; +typedef std::vector<SpellEffectInfo const*> SpellEffectInfoVector; +typedef std::unordered_map<uint32, SpellEffectInfoVector> SpellEffectInfoMap; + +typedef std::vector<SpellEffectEntry const*> SpellEffectEntryVector; +typedef std::unordered_map<uint32, SpellEffectEntryVector> SpellEffectEntryMap; + +typedef std::vector<AuraEffect*> AuraEffectVector; + class SpellInfo { public: @@ -390,20 +408,24 @@ public: uint32 SpellEquippedItemsId; uint32 SpellInterruptsId; uint32 SpellLevelsId; - uint32 SpellPowerId; uint32 SpellReagentsId; uint32 SpellShapeshiftId; uint32 SpellTargetRestrictionsId; uint32 SpellTotemsId; uint32 SpellMiscId; // SpellScalingEntry - int32 CastTimeMin; - int32 CastTimeMax; - int32 CastTimeMaxLevel; - int32 ScalingClass; - float CoefBase; - int32 CoefLevelBase; - SpellEffectInfo Effects[MAX_SPELL_EFFECTS]; + struct ScalingInfo + { + int32 CastTimeMin; + int32 CastTimeMax; + uint32 CastTimeMaxLevel; + int32 Class; + float NerfFactor; + uint32 NerfMaxLevel; + uint32 MaxScalingLevel; + uint32 ScalesFromItemLevel; + } Scaling; + uint32 ExplicitTargetMask; SpellChainNode const* ChainEntry; @@ -425,33 +447,35 @@ public: SpellTotemsEntry const* GetSpellTotems() const; SpellMiscEntry const* GetSpellMisc() const; - SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effects); + SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap effects); ~SpellInfo(); uint32 GetCategory() const; - bool HasEffect(SpellEffects effect) const; - bool HasAura(AuraType aura) const; + bool HasEffect(uint32 difficulty, SpellEffectName effect) const; + bool HasEffect(SpellEffectName effect) const; + bool HasAura(uint32 difficulty, AuraType aura) const; + bool HasAreaAuraEffect(uint32 difficulty) const; bool HasAreaAuraEffect() const; bool IsExplicitDiscovery() const; bool IsLootCrafting() const; bool IsQuestTame() const; - bool IsProfessionOrRiding() const; - bool IsProfession() const; - bool IsPrimaryProfession() const; - bool IsPrimaryProfessionFirstRank() const; + bool IsProfessionOrRiding(uint32 difficulty = DIFFICULTY_NONE) const; + bool IsProfession(uint32 difficulty = DIFFICULTY_NONE) const; + bool IsPrimaryProfession(uint32 difficulty = DIFFICULTY_NONE) const; + bool IsPrimaryProfessionFirstRank(uint32 difficulty = DIFFICULTY_NONE) const; bool IsAbilityLearnedWithProfession() const; bool IsAbilityOfSkillType(uint32 skillType) const; - bool IsAffectingArea() const; - bool IsTargetingArea() const; + bool IsAffectingArea(uint32 difficulty) const; + bool IsTargetingArea(uint32 difficulty) const; bool NeedsExplicitUnitTarget() const; - bool NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const; + bool NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell, uint32 difficulty) const; bool IsPassive() const; bool IsAutocastable() const; bool IsStackableWithRanks() const; - bool IsPassiveStackableWithRanks() const; + bool IsPassiveStackableWithRanks(uint32 difficulty) const; bool IsMultiSlotAura() const; bool IsStackableOnOneSlotWithDifferentCasters() const; bool IsCooldownStartedOnEvent() const; @@ -486,15 +510,15 @@ public: SpellSchoolMask GetSchoolMask() const; uint32 GetAllEffectsMechanicMask() const; - uint32 GetEffectMechanicMask(uint8 effIndex) const; + uint32 GetEffectMechanicMask(uint32 effIndex) const; uint32 GetSpellMechanicMaskByEffectMask(uint32 effectMask) const; - Mechanics GetEffectMechanic(uint8 effIndex) const; - bool HasAnyEffectMechanic() const; + Mechanics GetEffectMechanic(uint32 effIndex, uint32 difficulty) const; + //bool HasAnyEffectMechanic() const; uint32 GetDispelMask() const; static uint32 GetDispelMask(DispelType type); uint32 GetExplicitTargetMask() const; - AuraStateType GetAuraState() const; + AuraStateType GetAuraState(uint32 difficulty) const; SpellSpecificType GetSpellSpecific() const; float GetMinRange(bool positive = false) const; @@ -503,7 +527,7 @@ public: int32 GetDuration() const; int32 GetMaxDuration() const; - uint32 GetMaxTicks() const; + uint32 GetMaxTicks(uint32 difficulty) const; uint32 CalcCastTime(uint8 level = 0, Spell* spell = NULL) const; uint32 GetRecoveryTime() const; @@ -523,12 +547,19 @@ public: // loading helpers void _InitializeExplicitTargetMask(); - bool _IsPositiveEffect(uint8 effIndex, bool deep) const; + bool _IsPositiveEffect(uint32 effIndex, bool deep) const; bool _IsPositiveSpell() const; static bool _IsPositiveTarget(uint32 targetA, uint32 targetB); // unloading helpers void _UnloadImplicitTargetConditionLists(); + + SpellEffectInfoVector GetEffectsForDifficulty(uint32 difficulty) const; + SpellEffectInfo const* GetEffect(uint32 difficulty, uint32 index) const; + SpellEffectInfo const* GetEffect(uint32 index) const { return GetEffect(DIFFICULTY_NONE, index); } + SpellEffectInfo const* GetEffect(WorldObject* obj, uint32 index) const { return GetEffect(obj->GetMap()->GetDifficulty(), index); } + + SpellEffectInfoMap _effects; }; #endif // _SPELLINFO_H diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 3b7ab7abe30..544abc9ca87 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -59,9 +59,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, if (spellproto->IsPositive()) return DIMINISHING_NONE; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect: spellproto->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellproto->Effects[i].ApplyAuraName == SPELL_AURA_MOD_TAUNT) + if (effect && effect->ApplyAuraName == SPELL_AURA_MOD_TAUNT) return DIMINISHING_TAUNT; } @@ -370,9 +370,12 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg bool needCheckReagents = false; // check effects - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - switch (spellInfo->Effects[i].Effect) + if (!effect) + continue; + + switch (effect->Effect) { case 0: continue; @@ -381,7 +384,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg case SPELL_EFFECT_CREATE_ITEM: case SPELL_EFFECT_CREATE_ITEM_2: { - if (spellInfo->Effects[i].ItemType == 0) + if (effect->ItemType == 0) { // skip auto-loot crafting spells, its not need explicit item info (but have special fake items sometime) if (!spellInfo->IsLootCrafting()) @@ -398,14 +401,14 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg } // also possible IsLootCrafting case but fake item must exist anyway - else if (!sObjectMgr->GetItemTemplate(spellInfo->Effects[i].ItemType)) + else if (!sObjectMgr->GetItemTemplate(effect->ItemType)) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, effect->ItemType); else - TC_LOG_ERROR("sql.sql", "Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + TC_LOG_ERROR("sql.sql", "Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, effect->ItemType); } return false; } @@ -415,15 +418,15 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg } case SPELL_EFFECT_LEARN_SPELL: { - SpellInfo const* spellInfo2 = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell); + SpellInfo const* spellInfo2 = sSpellMgr->GetSpellInfo(effect->TriggerSpell); if (!IsSpellValid(spellInfo2, player, msg)) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Spell %u learn to broken spell %u, and then...", spellInfo->Id, spellInfo->Effects[i].TriggerSpell); + ChatHandler(player->GetSession()).PSendSysMessage("Spell %u learn to broken spell %u, and then...", spellInfo->Id, effect->TriggerSpell); else - TC_LOG_ERROR("sql.sql", "Spell %u learn to invalid spell %u, and then...", spellInfo->Id, spellInfo->Effects[i].TriggerSpell); + TC_LOG_ERROR("sql.sql", "Spell %u learn to invalid spell %u, and then...", spellInfo->Id, effect->TriggerSpell); } return false; } @@ -453,81 +456,6 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg return true; } -uint32 SpellMgr::GetSpellDifficultyId(uint32 spellId) const -{ - SpellDifficultySearcherMap::const_iterator i = mSpellDifficultySearcherMap.find(spellId); - return i == mSpellDifficultySearcherMap.end() ? 0 : i->second; -} - -void SpellMgr::SetSpellDifficultyId(uint32 spellId, uint32 id) -{ - if (uint32 i = GetSpellDifficultyId(spellId)) - TC_LOG_ERROR("spells", "SpellMgr::SetSpellDifficultyId: Spell %u has already spellDifficultyId %u. Will override with spellDifficultyId %u.", spellId, i, id); - mSpellDifficultySearcherMap[spellId] = id; -} - -// TODO: 6.x adapt to new spell diff system -uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) const -{ - /*if (!GetSpellInfo(spellId)) - return spellId; - - if (!caster || !caster->GetMap() || !caster->GetMap()->IsDungeon()) - return spellId; - - uint32 mode = uint32(caster->GetMap()->GetSpawnMode()); - if (mode >= MAX_DIFFICULTY) - { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: Incorrect Difficulty for spell %u.", spellId); - return spellId; //return source spell - } - - uint32 difficultyId = GetSpellDifficultyId(spellId); - if (!difficultyId) - return spellId; //return source spell, it has only REGULAR_DIFFICULTY - - SpellDifficultyEntry const* difficultyEntry = sSpellDifficultyStore.LookupEntry(difficultyId); - if (!difficultyEntry) - { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: SpellDifficultyEntry not found for spell %u. This should never happen.", spellId); - return spellId; //return source spell - } - - if (difficultyEntry->SpellID[mode] <= 0 && mode > DUNGEON_DIFFICULTY_HEROIC) - { - TC_LOG_DEBUG("spells", "SpellMgr::GetSpellIdForDifficulty: spell %u mode %u spell is NULL, using mode %u", spellId, mode, mode - 2); - mode -= 2; - } - - if (difficultyEntry->SpellID[mode] <= 0) - { - TC_LOG_ERROR("sql.sql", "SpellMgr::GetSpellIdForDifficulty: spell %u mode %u spell is 0. Check spelldifficulty_dbc!", spellId, mode); - return spellId; - } - - TC_LOG_DEBUG("spells", "SpellMgr::GetSpellIdForDifficulty: spellid for spell %u in mode %u is %d", spellId, mode, difficultyEntry->SpellID[mode]); - return uint32(difficultyEntry->SpellID[mode]); - */ - return 0; -} - -SpellInfo const* SpellMgr::GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit const* caster) const -{ - if (!spell) - return NULL; - - uint32 newSpellId = GetSpellIdForDifficulty(spell->Id, caster); - SpellInfo const* newSpell = GetSpellInfo(newSpellId); - if (!newSpell) - { - TC_LOG_DEBUG("spells", "SpellMgr::GetSpellForDifficultyFromSpell: spell %u not found. Check spelldifficulty_dbc!", newSpellId); - return spell; - } - - TC_LOG_DEBUG("spells", "SpellMgr::GetSpellForDifficultyFromSpell: Spell id for instance mode is %u (original %u)", newSpell->Id, spell->Id); - return newSpell; -} - SpellChainNode const* SpellMgr::GetSpellChainNode(uint32 spell_id) const { SpellChainMap::const_iterator itr = mSpellChains.find(spell_id); @@ -1021,22 +949,6 @@ bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcE return true; } -SpellBonusEntry const* SpellMgr::GetSpellBonusData(uint32 spellId) const -{ - // Lookup data - SpellBonusMap::const_iterator itr = mSpellBonusMap.find(spellId); - if (itr != mSpellBonusMap.end()) - return &itr->second; - // Not found, try lookup for 1 spell rank if exist - if (uint32 rank_1 = GetFirstSpellInChain(spellId)) - { - SpellBonusMap::const_iterator itr2 = mSpellBonusMap.find(rank_1); - if (itr2 != mSpellBonusMap.end()) - return &itr2->second; - } - return NULL; -} - SpellThreatEntry const* SpellMgr::GetSpellThreatEntry(uint32 spellID) const { SpellThreatMap::const_iterator itr = mSpellThreatMap.find(spellID); @@ -1479,13 +1391,13 @@ void SpellMgr::LoadSpellLearnSkills() if (!entry) continue; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : entry->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (entry->Effects[i].Effect == SPELL_EFFECT_SKILL) + if (effect && effect->Effect == SPELL_EFFECT_SKILL) { SpellLearnSkillNode dbc_node; - dbc_node.skill = entry->Effects[i].MiscValue; - dbc_node.step = entry->Effects[i].CalcValue(); + dbc_node.skill = effect->MiscValue; + dbc_node.step = effect->CalcValue(); if (dbc_node.skill != SKILL_RIDING) dbc_node.value = 1; else @@ -1562,12 +1474,12 @@ void SpellMgr::LoadSpellLearnSpells() if (!entry) continue; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (SpellEffectInfo const* effect : entry->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (entry->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL) + if (effect && effect->Effect == SPELL_EFFECT_LEARN_SPELL) { SpellLearnSpellNode dbc_node; - dbc_node.spell = entry->Effects[i].TriggerSpell; + dbc_node.spell = effect->TriggerSpell; dbc_node.active = true; // all dbc based learned spells is active (show in spell book or hide by client itself) // ignore learning not existed spells (broken/outdated/or generic learnig spell 483 @@ -1577,7 +1489,7 @@ void SpellMgr::LoadSpellLearnSpells() // talent or passive spells or skill-step spells auto-cast and not need dependent learning, // pet teaching spells must not be dependent learning (cast) // other required explicit dependent learning - dbc_node.autoLearned = entry->Effects[i].TargetA.GetTarget() == TARGET_UNIT_PET || GetTalentBySpellID(spell) || entry->IsPassive() || entry->HasEffect(SPELL_EFFECT_SKILL_STEP); + dbc_node.autoLearned = effect->TargetA.GetTarget() == TARGET_UNIT_PET || GetTalentBySpellID(spell) || entry->IsPassive() || entry->HasEffect(SPELL_EFFECT_SKILL_STEP); SpellLearnSpellMapBounds db_node_bounds = dbSpellLearnSpells.equal_range(spell); @@ -1672,8 +1584,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."); @@ -1694,29 +1606,47 @@ 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; } - if (spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_DEST_DB || spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DB) + 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); mSpellTargetPositions[key] = st; @@ -2121,45 +2051,6 @@ void SpellMgr::LoadSpellProcs() TC_LOG_INFO("server.loading", ">> Loaded %u spell proc conditions and data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void SpellMgr::LoadSpellBonusess() -{ - uint32 oldMSTime = getMSTime(); - - mSpellBonusMap.clear(); // need for reload case - - // 0 1 2 3 4 - QueryResult result = WorldDatabase.Query("SELECT entry, direct_bonus, dot_bonus, ap_bonus, ap_dot_bonus FROM spell_bonus_data"); - if (!result) - { - TC_LOG_INFO("server.loading", ">> Loaded 0 spell bonus data. DB table `spell_bonus_data` is empty."); - return; - } - - uint32 count = 0; - do - { - Field* fields = result->Fetch(); - uint32 entry = fields[0].GetUInt32(); - - SpellInfo const* spell = GetSpellInfo(entry); - if (!spell) - { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_bonus_data` does not exist", entry); - continue; - } - - SpellBonusEntry& sbe = mSpellBonusMap[entry]; - sbe.direct_damage = fields[1].GetFloat(); - sbe.dot_damage = fields[2].GetFloat(); - sbe.ap_bonus = fields[3].GetFloat(); - sbe.ap_dot_bonus = fields[4].GetFloat(); - - ++count; - } while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u extra spell bonus data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); -} - void SpellMgr::LoadSpellThreats() { uint32 oldMSTime = getMSTime(); @@ -2255,9 +2146,16 @@ void SpellMgr::LoadSpellPetAuras() TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_pet_auras` does not exist", spell); continue; } - if (spellInfo->Effects[eff].Effect != SPELL_EFFECT_DUMMY && - (spellInfo->Effects[eff].Effect != SPELL_EFFECT_APPLY_AURA || - spellInfo->Effects[eff].ApplyAuraName != SPELL_AURA_DUMMY)) + SpellEffectInfo const* effect = spellInfo->GetEffect(eff); + if (!effect) + { + TC_LOG_ERROR("spells", "Spell %u listed in `spell_pet_auras` does not have effect at index %u", spell, uint32(eff)); + continue; + } + + if (effect->Effect != SPELL_EFFECT_DUMMY && + (effect->Effect != SPELL_EFFECT_APPLY_AURA || + effect->ApplyAuraName != SPELL_AURA_DUMMY)) { TC_LOG_ERROR("spells", "Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell); continue; @@ -2270,7 +2168,7 @@ void SpellMgr::LoadSpellPetAuras() continue; } - PetAura pa(pet, aura, spellInfo->Effects[eff].TargetA.GetTarget() == TARGET_UNIT_PET, spellInfo->Effects[eff].CalcValue()); + PetAura pa(pet, aura, effect->TargetA.GetTarget() == TARGET_UNIT_PET, effect->CalcValue()); mSpellPetAuraMap[(spell<<8) + eff] = pa; } @@ -2302,11 +2200,11 @@ void SpellMgr::LoadEnchantCustomAttr() if (!(spellInfo->AttributesEx2 & SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA) || !(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT)) continue; - for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[j].Effect == SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) + if (effect && effect->Effect == SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) { - uint32 enchId = spellInfo->Effects[j].MiscValue; + uint32 enchId = effect->MiscValue; SpellItemEnchantmentEntry const* ench = sSpellItemEnchantmentStore.LookupEntry(enchId); if (!ench) continue; @@ -2393,10 +2291,10 @@ void SpellMgr::LoadSpellLinked() } if (effect >= 0) - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* eff : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellInfo->Effects[j].CalcValue() == abs(effect)) - TC_LOG_ERROR("sql.sql", "Spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack)", abs(trigger), abs(effect), j); + if (eff && eff->CalcValue() == abs(effect)) + TC_LOG_ERROR("sql.sql", "Spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack)", abs(trigger), abs(effect), eff->EffectIndex); } spellInfo = GetSpellInfo(abs(effect)); @@ -2570,11 +2468,11 @@ void SpellMgr::LoadPetDefaultSpells() if (!spellEntry) continue; - for (uint8 k = 0; k < MAX_SPELL_EFFECTS; ++k) + for (SpellEffectInfo const* effect : spellEntry->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellEntry->Effects[k].Effect == SPELL_EFFECT_SUMMON || spellEntry->Effects[k].Effect == SPELL_EFFECT_SUMMON_PET) + if (effect && (effect->Effect == SPELL_EFFECT_SUMMON || effect->Effect == SPELL_EFFECT_SUMMON_PET)) { - uint32 creature_id = spellEntry->Effects[k].MiscValue; + uint32 creature_id = effect->MiscValue; CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creature_id); if (!cInfo) continue; @@ -2791,18 +2689,7 @@ void SpellMgr::LoadSpellAreas() TC_LOG_INFO("server.loading", ">> Loaded %u spell area requirements in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -// Temporary structure to hold spell effect entries for faster loading -struct SpellEffectArray -{ - SpellEffectArray() - { - effects[0] = NULL; - effects[1] = NULL; - effects[2] = NULL; - } - - SpellEffectEntry const* effects[MAX_SPELL_EFFECTS]; -}; +typedef std::vector<SpellEffectEntry const*> SpellEffectVector; void SpellMgr::LoadSpellInfoStore() { @@ -2811,25 +2698,30 @@ void SpellMgr::LoadSpellInfoStore() UnloadSpellInfoStore(); mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); - std::map<uint32, SpellEffectArray> effectsBySpell; + std::unordered_map<uint32, SpellEffectEntryMap> effectsBySpell; for (uint32 i = 0; i < sSpellEffectStore.GetNumRows(); ++i) { SpellEffectEntry const* effect = sSpellEffectStore.LookupEntry(i); if (!effect) continue; - - // TODO: 6.x implement dynamic spell effect storage and remove MAX_SPELL_EFFECTS - // This is a temporary fix to avoid crash when loading spells + if (effect->EffectIndex >= MAX_SPELL_EFFECTS) + { + TC_LOG_ERROR("server.loading", "Spell %u has invalid EffectIndex %u, max is %u, skipped", i, effect->EffectIndex, uint32(MAX_SPELL_EFFECTS)); continue; + } - effectsBySpell[effect->SpellID].effects[effect->EffectIndex] = effect; + SpellEffectEntryVector& effectsForDifficulty = effectsBySpell[effect->SpellID][effect->DifficultyID]; + if (effectsForDifficulty.size() <= effect->EffectIndex) + effectsForDifficulty.resize(effect->EffectIndex + 1); + + effectsForDifficulty[effect->EffectIndex] = effect; } for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) - mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i].effects); + mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i]); TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -2891,9 +2783,12 @@ void SpellMgr::LoadSpellInfoCustomAttributes() if (!spellInfo) continue; - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - switch (spellInfo->Effects[j].ApplyAuraName) + if (!effect) + continue; + + switch (effect->ApplyAuraName) { case SPELL_AURA_MOD_POSSESS: case SPELL_AURA_MOD_CONFUSE: @@ -2917,7 +2812,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() break; } - switch (spellInfo->Effects[j].Effect) + switch (effect->Effect) { case SPELL_EFFECT_SCHOOL_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE: @@ -2955,7 +2850,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() // only enchanting profession enchantments procs can stack if (IsPartOfSkillLine(SKILL_ENCHANTING, i)) { - uint32 enchantId = spellInfo->Effects[j].MiscValue; + uint32 enchantId = effect->MiscValue; SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId); if (!enchant) break; @@ -2972,7 +2867,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() // if proced directly from enchantment, not via proc aura // NOTE: Enchant Weapon - Blade Ward also has proc aura spell and is proced directly // however its not expected to stack so this check is good - if (procInfo->HasAura(SPELL_AURA_PROC_TRIGGER_SPELL)) + if (procInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_PROC_TRIGGER_SPELL)) continue; procInfo->AttributesCu |= SPELL_ATTR0_CU_ENCHANT_PROC; @@ -3028,9 +2923,11 @@ void SpellMgr::LoadSpellInfoCorrections() if (!spellInfo) continue; - for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - switch (spellInfo->Effects[j].Effect) + if (!effect) + continue; + switch (effect->Effect) { case SPELL_EFFECT_CHARGE: case SPELL_EFFECT_CHARGE_DEST: @@ -3049,43 +2946,43 @@ void SpellMgr::LoadSpellInfoCorrections() switch (spellInfo->Id) { case 42436: // Drink! (Brewfest) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); break; case 52611: // Summon Skeletons case 52612: // Summon Skeletons - spellInfo->Effects[EFFECT_0].MiscValueB = 64; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->MiscValueB = 64; break; case 40244: // Simon Game Visual case 40245: // Simon Game Visual case 40246: // Simon Game Visual case 40247: // Simon Game Visual case 42835: // Spout, remove damage effect, only anim is needed - spellInfo->Effects[EFFECT_0].Effect = 0; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->Effect = 0; break; case 30657: // Quake - spellInfo->Effects[EFFECT_0].TriggerSpell = 30571; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TriggerSpell = 30571; break; case 30541: // Blaze (needs conditions entry) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(); break; case 63665: // Charge (Argent Tournament emote on riders) case 31298: // Sleep (needs target selection script) case 51904: // Summon Ghouls On Scarlet Crusade (this should use conditions table, script for this spell needs to be fixed) case 68933: // Wrath of Air Totem rank 2 (Aura) case 29200: // Purify Helboar Meat - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(); break; case 31344: // Howl of Azgalor - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yards instead of 50000?! + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yards instead of 50000?! break; case 42818: // Headless Horseman - Wisp Flight Port case 42821: // Headless Horseman - Wisp Flight Missile spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100 yards break; case 36350: // They Must Burn Bomb Aura (self) - spellInfo->Effects[EFFECT_0].TriggerSpell = 36325; // They Must Burn Bomb Drop (DND) + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TriggerSpell = 36325; // They Must Burn Bomb Drop (DND) break; case 49838: // Stop Time spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; @@ -3094,11 +2991,11 @@ void SpellMgr::LoadSpellInfoCorrections() case 62136: // Energize Cores case 54069: // Energize Cores case 56251: // Energize Cores - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); break; case 50785: // Energize Cores case 59372: // Energize Cores - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY); break; case 63320: // Glyph of Life Tap case 53228: // Rapid Killing (Rank 1) @@ -3111,8 +3008,8 @@ void SpellMgr::LoadSpellInfoCorrections() break; case 59725: // Improved Spell Reflection - aoe aura // Target entry seems to be wrong for this spell :/ - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER_AREA_PARTY); - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS_2); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER_AREA_PARTY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS_2); break; case 31347: // Doom case 36327: // Shoot Arcane Explosion Arrow @@ -3184,7 +3081,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 33711: // Murmur's Touch case 38794: // Murmur's Touch spellInfo->MaxAffectedTargets = 1; - spellInfo->Effects[EFFECT_0].TriggerSpell = 33760; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TriggerSpell = 33760; break; case 17941: // Shadow Trance case 22008: // Netherwind Focus @@ -3199,7 +3096,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->ProcCharges = 1; break; case 44544: // Fingers of Frost - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(685904631, 1151048, 0, 0); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(685904631, 1151048, 0, 0); break; case 74396: // Fingers of Frost visual buff spellInfo->ProcCharges = 2; @@ -3214,16 +3111,16 @@ void SpellMgr::LoadSpellInfoCorrections() case 47204: // Everlasting Affliction (4) case 47205: // Everlasting Affliction (5) // add corruption to affected spells - spellInfo->Effects[EFFECT_1].SpellClassMask[0] |= 2; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->SpellClassMask[0] |= 2; break; case 37408: // Oscillation Field spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; break; case 51852: // The Eye of Acherus (no spawn in phase 2 in db) - spellInfo->Effects[EFFECT_0].MiscValue |= 1; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->MiscValue |= 1; break; case 51912: // Crafty's Ultra-Advanced Proto-Typical Shortening Blaster - spellInfo->Effects[EFFECT_0].ApplyAuraPeriod = 3000; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->ApplyAuraPeriod = 3000; break; // Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data // To prevent aura staying on target after talent unlearned @@ -3239,23 +3136,23 @@ void SpellMgr::LoadSpellInfoCorrections() break; case 51466: // Elemental Oath (Rank 1) case 51470: // Elemental Oath (Rank 2) - spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_APPLY_AURA; - spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; - spellInfo->Effects[EFFECT_1].MiscValue = SPELLMOD_EFFECT2; - spellInfo->Effects[EFFECT_1].SpellClassMask = flag128(0x00000000, 0x00004000, 0x00000000, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->Effect = SPELL_EFFECT_APPLY_AURA; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->MiscValue = SPELLMOD_EFFECT2; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->SpellClassMask = flag128(0x00000000, 0x00004000, 0x00000000, 0x00000000); break; case 47569: // Improved Shadowform (Rank 1) // with this spell atrribute aura can be stacked several times spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT; break; case 64904: // Hymn of Hope - spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT; break; case 30421: // Nether Portal - Perseverence - spellInfo->Effects[EFFECT_2].BasePoints += 30000; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_2))->BasePoints += 30000; break; case 41913: // Parasitic Shadowfiend Passive - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; // proc debuff, and summon infinite fiends + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->ApplyAuraName = SPELL_AURA_DUMMY; // proc debuff, and summon infinite fiends break; case 27892: // To Anchor 1 case 27928: // To Anchor 1 @@ -3269,8 +3166,8 @@ void SpellMgr::LoadSpellInfoCorrections() // this is the only known exception, probably just wrong data case 29214: // Wrath of the Plaguebringer case 54836: // Wrath of the Plaguebringer - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); - spellInfo->Effects[EFFECT_1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); break; case 63675: // Improved Devouring Plague spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; @@ -3284,47 +3181,47 @@ void SpellMgr::LoadSpellInfoCorrections() break; case 53241: // Marked for Death (Rank 1) case 53243: // Marked for Death (Rank 2) - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(0x00067801, 0x10820001, 0x00000801, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(0x00067801, 0x10820001, 0x00000801, 0x00000000); break; case 5176: // Wrath case 2912: // Starfire - case 78674: // Starsurge - spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_DUMMY; - spellInfo->Effects[EFFECT_1].TargetA = TARGET_UNIT_CASTER; + //case 78674: // Starsurge 6.x effect 1 is no more + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->Effect = SPELL_EFFECT_DUMMY; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->TargetA = TARGET_UNIT_CASTER; break; case 70728: // Exploit Weakness (needs target selection script) case 70840: // Devious Minds (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_PET); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_PET); break; case 70893: // Culling The Herd (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_MASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_MASTER); break; case 54800: // Sigil of the Frozen Conscience - change class mask to custom extended flags of Icy Touch // this is done because another spell also uses the same SpellFamilyFlags as Icy Touch // SpellFamilyFlags[0] & 0x00000040 in SPELLFAMILY_DEATHKNIGHT is currently unused (3.3.5a) // this needs research on modifier applying rules, does not seem to be in Attributes fields - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(0x00000040, 0x00000000, 0x00000000, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(0x00000040, 0x00000000, 0x00000000, 0x00000000); break; case 64949: // Idol of the Flourishing Life - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(0x00000000, 0x02000000, 0x00000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(0x00000000, 0x02000000, 0x00000000, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; break; case 34231: // Libram of the Lightbringer case 60792: // Libram of Tolerance case 64956: // Libram of the Resolute - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(0x80000000, 0x00000000, 0x00000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(0x80000000, 0x00000000, 0x00000000, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; break; case 28851: // Libram of Light case 28853: // Libram of Divinity case 32403: // Blessed Book of Nagrand - spellInfo->Effects[EFFECT_0].SpellClassMask = flag128(0x40000000, 0x00000000, 0x00000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask = flag128(0x40000000, 0x00000000, 0x00000000, 0x00000000); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; break; case 45602: // Ride Carpet - spellInfo->Effects[EFFECT_0].BasePoints = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->BasePoints = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" break; case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE; @@ -3339,7 +3236,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 56606: // Ride Jokkum case 61791: // Ride Vehicle (Yogg-Saron) /// @todo: remove this when basepoints of all Ride Vehicle auras are calculated correctly - spellInfo->Effects[EFFECT_0].BasePoints = 1; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->BasePoints = 1; break; case 59630: // Black Magic spellInfo->Attributes |= SPELL_ATTR0_PASSIVE; @@ -3350,12 +3247,12 @@ void SpellMgr::LoadSpellInfoCorrections() case 51798: // Brewfest - Relay Race - Intro - Quest Complete case 47134: // Quest Complete //! HACK: This spell break quest complete for alliance and on retail not used °_O - spellInfo->Effects[EFFECT_0].Effect = 0; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->Effect = 0; break; // ULDUAR SPELLS // case 62374: // Pursued (Flame Leviathan) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 63342: // Focused Eyebeam Summon Trigger (Kologarn) spellInfo->MaxAffectedTargets = 1; @@ -3377,7 +3274,7 @@ void SpellMgr::LoadSpellInfoCorrections() // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc. // The above situation causes the visual for this spell to be bugged, so we remove the instakill // effect and implement a script hack for that. - spellInfo->Effects[EFFECT_1].Effect = 0; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->Effect = 0; break; case 64386: // Terrifying Screech (Auriaya) case 64389: // Sentinel Blast (Auriaya) @@ -3391,7 +3288,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx |= SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY; break; case 63414: // Spinning Up (Mimiron) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); spellInfo->ChannelInterruptFlags = 0; break; case 63036: // Rocket Strike (Mimiron) @@ -3411,7 +3308,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->MaxAffectedTargets = 3; break; case 62293: // Cosmic Smash (Algalon the Observer) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER); break; case 62311: // Cosmic Smash (Algalon the Observer) case 64596: // Cosmic Smash (Algalon the Observer) @@ -3426,7 +3323,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 64031: // Scrapyard Teleport case 64032: // Formation Grounds Teleport case 65042: // Prison of Yogg-Saron Teleport - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); break; // ENDOF ULDUAR SPELLS // @@ -3444,14 +3341,14 @@ void SpellMgr::LoadSpellInfoCorrections() // case 72435: // Defiling Horror case 72452: // Defiling Horror - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd break; case 72830: // Achievement Check - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 72900: // Start Halls of Reflection Quest AE - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; // ENDOF HALLS OF REFLECTION SPELLS // @@ -3467,7 +3364,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 70859: // Upper Spire Teleport case 70860: // Frozen Throne Teleport case 70861: // Sindragosa's Lair Teleport - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); break; case 69075: // Bone Storm (Lord Marrowgar) case 70834: // Bone Storm (Lord Marrowgar) @@ -3477,7 +3374,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 71160: // Plague Stench (Stinky) case 71161: // Plague Stench (Stinky) case 71123: // Decimate (Stinky & Precious) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd break; case 71169: // Shadow's Fate spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; @@ -3489,59 +3386,59 @@ void SpellMgr::LoadSpellInfoCorrections() case 73844: // Award Reputation - Boss Kill case 73845: // Award Reputation - Boss Kill case 73846: // Award Reputation - Boss Kill - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 72378: // Blood Nova (Deathbringer Saurfang) case 73058: // Blood Nova (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); break; case 72769: // Scent of Blood (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // no break case 72771: // Scent of Blood (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); break; case 72723: // Resistant Skin (Deathbringer Saurfang adds) // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client - spellInfo->Effects[EFFECT_2].Effect = 0; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_2))->Effect = 0; break; case 70460: // Coldflame Jets (Traps after Saurfang) spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(1); // 10 seconds break; case 71412: // Green Ooze Summon (Professor Putricide) case 71415: // Orange Ooze Summon (Professor Putricide) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); break; case 71159: // Awaken Plagued Zombies spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(21); break; case 70530: // Volatile Ooze Beam Protection (Professor Putricide) - spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; // for an unknown reason this was SPELL_EFFECT_APPLY_AREA_AURA_RAID + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->Effect = SPELL_EFFECT_APPLY_AURA; // for an unknown reason this was SPELL_EFFECT_APPLY_AREA_AURA_RAID break; // THIS IS HERE BECAUSE COOLDOWN ON CREATURE PROCS IS NOT IMPLEMENTED case 71604: // Mutated Strength (Professor Putricide) case 72673: // Mutated Strength (Professor Putricide) case 72674: // Mutated Strength (Professor Putricide) case 72675: // Mutated Strength (Professor Putricide) - spellInfo->Effects[EFFECT_1].Effect = 0; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->Effect = 0; break; case 72454: // Mutated Plague (Professor Putricide) case 72464: // Mutated Plague (Professor Putricide) case 72506: // Mutated Plague (Professor Putricide) case 72507: // Mutated Plague (Professor Putricide) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 70911: // Unbound Plague (Professor Putricide) (needs target selection script) case 72854: // Unbound Plague (Professor Putricide) (needs target selection script) case 72855: // Unbound Plague (Professor Putricide) (needs target selection script) case 72856: // Unbound Plague (Professor Putricide) (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); break; case 71518: // Unholy Infusion Quest Credit (Professor Putricide) case 72934: // Blood Infusion Quest Credit (Blood-Queen Lana'thel) case 72289: // Frost Infusion Quest Credit (Sindragosa) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // another missing radius + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // another missing radius break; case 71708: // Empowered Flare (Blood Prince Council) case 72785: // Empowered Flare (Blood Prince Council) @@ -3565,18 +3462,18 @@ void SpellMgr::LoadSpellInfoCorrections() break; case 72015: // Frostbolt Volley (only heroic) case 72016: // Frostbolt Volley (only heroic) - spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_2))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS); break; case 70936: // Summon Suppressor (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(); break; case 72706: // Achievement Check (Valithria Dreamwalker) case 71357: // Order Whelp - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; case 70598: // Sindragosa's Fury - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); break; case 69846: // Frost Bomb spellInfo->Speed = 0.0f; // This spell's summon happens instantly @@ -3594,12 +3491,12 @@ void SpellMgr::LoadSpellInfoCorrections() case 73708: // Defile case 73709: // Defile case 73710: // Defile - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; case 69030: // Val'kyr Target Search - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; case 69198: // Raging Spirit Visual spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd @@ -3608,9 +3505,9 @@ void SpellMgr::LoadSpellInfoCorrections() case 74295: // Harvest Souls case 74296: // Harvest Souls case 74297: // Harvest Souls - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_2))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 73655: // Harvest Soul spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; @@ -3622,34 +3519,34 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(28); // 5 seconds break; case 73529: // Shadow Trap - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd break; case 74282: // Shadow Trap (searcher) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); // 3yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); // 3yd break; case 72595: // Restore Soul case 73650: // Restore Soul - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; case 74086: // Destroy Soul - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; case 74302: // Summon Spirit Bomb case 74342: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd spellInfo->MaxAffectedTargets = 1; break; case 74341: // Summon Spirit Bomb case 74343: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd spellInfo->MaxAffectedTargets = 3; break; case 73579: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd break; case 72350: // Fury of Frostmourne - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 75127: // Kill Frostmourne Players case 72351: // Fury of Frostmourne @@ -3657,31 +3554,31 @@ void SpellMgr::LoadSpellInfoCorrections() case 72429: // Mass Resurrection case 73159: // Play Movie case 73582: // Trigger Vile Spirit (Inside, Heroic) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 72376: // Raise Dead spellInfo->MaxAffectedTargets = 3; - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd break; case 71809: // Jump spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(3); // 20yd - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd break; case 72405: // Broken Frostmourne - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd break; // ENDOF ICECROWN CITADEL SPELLS // // RUBY SANCTUM SPELLS // case 74799: // Soul Consumption - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS); break; case 74769: // Twilight Cutter case 77844: // Twilight Cutter case 77845: // Twilight Cutter case 77846: // Twilight Cutter - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd break; case 75509: // Twilight Mending spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; @@ -3726,7 +3623,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 76606: // Disable Beacon Beams L case 76608: // Disable Beacon Beams R // Little hack, Increase the radius so it can hit the Cave In Stalkers in the platform. - spellInfo->Effects[EFFECT_0].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_45_YARDS); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_45_YARDS); break; case 75323: // Reverberating Hymn // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. @@ -3755,7 +3652,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->MaxAffectedTargets = 1; break; case 75697: // Evolution - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); break; // ISLE OF CONQUEST SPELLS // @@ -3773,7 +3670,7 @@ void SpellMgr::LoadSpellInfoCorrections() case SPELLFAMILY_PALADIN: // Seals of the Pure should affect Seal of Righteousness if (spellInfo->SpellIconID == 25 && spellInfo->Attributes & SPELL_ATTR0_PASSIVE) - spellInfo->Effects[EFFECT_0].SpellClassMask[1] |= 0x20000000; + const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->SpellClassMask[1] |= 0x20000000; break; case SPELLFAMILY_DEATHKNIGHT: // Icy Touch - extend FamilyFlags (unused value) for Sigil of the Frozen Conscience to use @@ -3790,3 +3687,42 @@ void SpellMgr::LoadSpellInfoCorrections() TC_LOG_INFO("server.loading", ">> Loaded SpellInfo corrections in %u ms", GetMSTimeDiffToNow(oldMSTime)); } + +void SpellMgr::LoadPetFamilySpellsStore() +{ + for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) + { + SkillLineAbilityEntry const* skillLine = sSkillLineAbilityStore.LookupEntry(j); + if (!skillLine) + continue; + + SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillLine->SpellID); + if (!spellInfo) + continue; + + SpellLevelsEntry const* levels = sSpellLevelsStore.LookupEntry(spellInfo->LevelsID); + if (spellInfo->LevelsID && (!levels || levels->SpellLevel)) + continue; + + if (SpellMiscEntry const* spellMisc = sSpellMiscStore.LookupEntry(spellInfo->MiscID)) + { + if (spellMisc->Attributes & SPELL_ATTR0_PASSIVE) + { + for (uint32 i = 1; i < sCreatureFamilyStore.GetNumRows(); ++i) + { + CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(i); + if (!cFamily) + continue; + + if (skillLine->SkillLine != cFamily->SkillLine[0] && skillLine->SkillLine != cFamily->SkillLine[1]) + continue; + + if (skillLine->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) + continue; + + sPetFamilySpellsStore[i].insert(spellInfo->ID); + } + } + } + } +} diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 053935a53cb..3acd13b3a0e 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -313,16 +313,6 @@ struct SpellEnchantProcEntry typedef std::unordered_map<uint32, SpellEnchantProcEntry> SpellEnchantProcEventMap; -struct SpellBonusEntry -{ - float direct_damage; - float dot_damage; - float ap_bonus; - float ap_dot_bonus; -}; - -typedef std::unordered_map<uint32, SpellBonusEntry> SpellBonusMap; - enum SpellGroup { SPELL_GROUP_NONE = 0, @@ -617,12 +607,6 @@ class SpellMgr // Spell correctness for client using static bool IsSpellValid(SpellInfo const* spellInfo, Player* player = NULL, bool msg = true); - // Spell difficulty - uint32 GetSpellDifficultyId(uint32 spellId) const; - void SetSpellDifficultyId(uint32 spellId, uint32 id); - uint32 GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) const; - SpellInfo const* GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit const* caster) const; - // Spell Ranks table SpellChainNode const* GetSpellChainNode(uint32 spell_id) const; uint32 GetFirstSpellInChain(uint32 spell_id) const; @@ -668,9 +652,6 @@ class SpellMgr SpellProcEntry const* GetSpellProcEntry(uint32 spellId) const; bool CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const; - // Spell bonus data table - SpellBonusEntry const* GetSpellBonusData(uint32 spellId) const; - // Spell threat table SpellThreatEntry const* GetSpellThreatEntry(uint32 spellID) const; @@ -705,6 +686,8 @@ class SpellMgr } uint32 GetSpellInfoStoreSize() const { return mSpellInfoMap.size(); } + void LoadPetFamilySpellsStore(); + private: SpellInfo* _GetSpellInfo(uint32 spellId) { return spellId < GetSpellInfoStoreSize() ? mSpellInfoMap[spellId] : NULL; } @@ -723,7 +706,6 @@ class SpellMgr void LoadSpellGroupStackRules(); void LoadSpellProcEvents(); void LoadSpellProcs(); - void LoadSpellBonusess(); void LoadSpellThreats(); void LoadSkillLineAbilityMap(); void LoadSpellPetAuras(); @@ -752,7 +734,6 @@ class SpellMgr SpellGroupStackMap mSpellGroupStack; SpellProcEventMap mSpellProcEventMap; SpellProcMap mSpellProcMap; - SpellBonusMap mSpellBonusMap; SpellThreatMap mSpellThreatMap; SpellPetAuraMap mSpellPetAuraMap; SpellLinkedMap mSpellLinkedMap; diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 8ab3a72b47e..1d5eab259aa 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -110,11 +110,14 @@ std::string _SpellScript::EffectHook::EffIndexToString() bool _SpellScript::EffectNameCheck::Check(SpellInfo const* spellEntry, uint8 effIndex) { - if (!spellEntry->Effects[effIndex].Effect && !effName) + SpellEffectInfo const* effect = spellEntry->GetEffect(effIndex); + if (!effect) + return false; + if (!effect->Effect && !effName) return true; - if (!spellEntry->Effects[effIndex].Effect) + if (!effect->Effect) return false; - return (effName == SPELL_EFFECT_ANY) || (spellEntry->Effects[effIndex].Effect == effName); + return (effName == SPELL_EFFECT_ANY) || (effect->Effect == effName); } std::string _SpellScript::EffectNameCheck::ToString() @@ -132,11 +135,14 @@ std::string _SpellScript::EffectNameCheck::ToString() bool _SpellScript::EffectAuraNameCheck::Check(SpellInfo const* spellEntry, uint8 effIndex) { - if (!spellEntry->Effects[effIndex].ApplyAuraName && !effAurName) + SpellEffectInfo const* effect = spellEntry->GetEffect(effIndex); + if (!effect) + return false; + if (!effect->ApplyAuraName && !effAurName) return true; - if (!spellEntry->Effects[effIndex].ApplyAuraName) + if (!effect->ApplyAuraName) return false; - return (effAurName == SPELL_AURA_ANY) || (spellEntry->Effects[effIndex].ApplyAuraName == effAurName); + return (effAurName == SPELL_AURA_ANY) || (effect->ApplyAuraName == effAurName); } std::string _SpellScript::EffectAuraNameCheck::ToString() @@ -218,8 +224,12 @@ bool SpellScript::TargetHook::CheckEffect(SpellInfo const* spellEntry, uint8 eff if (!targetType) return false; - if (spellEntry->Effects[effIndex].TargetA.GetTarget() != targetType && - spellEntry->Effects[effIndex].TargetB.GetTarget() != targetType) + SpellEffectInfo const* effect = spellEntry->GetEffect(effIndex); + if (!effect) + return false; + + if (effect->TargetA.GetTarget() != targetType && + effect->TargetB.GetTarget() != targetType) return false; SpellImplicitTargetInfo targetInfo(targetType); @@ -635,6 +645,11 @@ SpellValue const* SpellScript::GetSpellValue() return m_spell->m_spellValue; } +SpellEffectInfo const* SpellScript::GetEffectInfo(SpellEffIndex effIndex) const +{ + return m_spell->GetEffect(effIndex); +} + bool AuraScript::_Validate(SpellInfo const* entry) { for (std::list<CheckAreaTargetHandler>::iterator itr = DoCheckAreaTarget.begin(); itr != DoCheckAreaTarget.end(); ++itr) diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 653ae9ab5e9..ba25a056ee8 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -342,6 +342,7 @@ class SpellScript : public _SpellScript Unit* GetOriginalCaster(); SpellInfo const* GetSpellInfo(); SpellValue const* GetSpellValue(); + SpellEffectInfo const* GetEffectInfo(SpellEffIndex) const; // methods useable after spell is prepared // accessors to the explicit targets of the spell 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..992942cefeb 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; + 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..53a2ee814a7 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> @@ -1411,6 +1413,8 @@ void World::SetInitialWorldSettings() LoadDBCStores(m_dataPath); LoadDB2Stores(m_dataPath); + sSpellMgr->LoadPetFamilySpellsStore(); + TC_LOG_INFO("server.loading", "Loading SpellInfo store..."); sSpellMgr->LoadSpellInfoStore(); @@ -1487,9 +1491,6 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Spell Proc conditions and data..."); sSpellMgr->LoadSpellProcs(); - TC_LOG_INFO("server.loading", "Loading Spell Bonus Data..."); - sSpellMgr->LoadSpellBonusess(); - TC_LOG_INFO("server.loading", "Loading Aggro Spells Definitions..."); sSpellMgr->LoadSpellThreats(); @@ -2287,7 +2288,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 +2348,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 +2388,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 +3307,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/ipc/Commands.cpp b/src/server/ipc/Commands.cpp index 8e494fc34b9..61b448d3d01 100644 --- a/src/server/ipc/Commands.cpp +++ b/src/server/ipc/Commands.cpp @@ -49,14 +49,14 @@ zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::ToonHandle& toonHandl return msg; } -zmqpp::message& operator<<(zmqpp::message& msg, IPCHeader& header) +zmqpp::message& operator<<(zmqpp::message& msg, IPCHeader const& header) { msg << header.Channel; msg << header.Command; return msg; } -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle& realm) +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm) { msg << realm.Region; msg << realm.Battlegroup; @@ -64,14 +64,14 @@ zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle& realm) return msg; } -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::Header& header) +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::Header const& header) { msg << header.Ipc; msg << header.Realm; return msg; } -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::ToonHandle& toonHandle) +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::ToonHandle const& toonHandle) { msg << toonHandle.AccountId; msg << toonHandle.GameAccountId; diff --git a/src/server/ipc/Commands.h b/src/server/ipc/Commands.h index 05309a45022..e34f939bae4 100644 --- a/src/server/ipc/Commands.h +++ b/src/server/ipc/Commands.h @@ -75,9 +75,9 @@ zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::RealmHandle& realm); zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::Header& header); zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::ToonHandle& toonHandle); -zmqpp::message& operator<<(zmqpp::message& msg, IPCHeader& header); -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle& realm); -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::Header& header); -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::ToonHandle& toonHandle); +zmqpp::message& operator<<(zmqpp::message& msg, IPCHeader const& header); +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm); +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::Header const& header); +zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::ToonHandle const& toonHandle); #endif // _COMMANDS_H diff --git a/src/server/ipc/ZMQTask.h b/src/server/ipc/ZMQTask.h index 24251893aaa..1141f740f76 100644 --- a/src/server/ipc/ZMQTask.h +++ b/src/server/ipc/ZMQTask.h @@ -45,8 +45,8 @@ protected: zmqpp::poller* _poller; - zmqpp::socket* _inproc; - std::thread* _thread; + zmqpp::socket* _inproc = nullptr; + std::thread* _thread = nullptr; }; #endif // __ZMQTASK_H diff --git a/src/server/ipc/ZmqMux.cpp b/src/server/ipc/ZmqMux.cpp index 2b62eaaf1eb..0f87106a948 100644 --- a/src/server/ipc/ZmqMux.cpp +++ b/src/server/ipc/ZmqMux.cpp @@ -18,15 +18,15 @@ #include "ZmqMux.h" #include "ZmqContext.h" -ZmqMux::ZmqMux(std::string from_uri, std::string to_uri): - _fromAddress(from_uri) +ZmqMux::ZmqMux(std::string const& fromUri, std::string const& toUri): + _fromAddress(fromUri) { - printf("Opening muxer thread from %s to %s\n", from_uri.c_str(), to_uri.c_str()); + printf("Opening muxer thread from %s to %s\n", fromUri.c_str(), toUri.c_str()); _from = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull); _to = sIpcContext->CreateNewSocket(zmqpp::socket_type::push); - _from->bind(from_uri); - _to->connect(to_uri); + _from->bind(fromUri); + _to->connect(toUri); } ZmqMux::~ZmqMux() diff --git a/src/server/ipc/ZmqMux.h b/src/server/ipc/ZmqMux.h index 07336330253..c6ec26596c1 100644 --- a/src/server/ipc/ZmqMux.h +++ b/src/server/ipc/ZmqMux.h @@ -29,7 +29,7 @@ class ZmqMux : public ZMQTask { public: - ZmqMux(std::string from, std::string to); + ZmqMux(std::string const& from, std::string const& to); ~ZmqMux(); bool Send(zmqpp::message*, bool dont_block = false); void Run() override; diff --git a/src/server/ipc/ZmqWorker.cpp b/src/server/ipc/ZmqWorker.cpp index f205ea831b5..a3db41efe18 100644 --- a/src/server/ipc/ZmqWorker.cpp +++ b/src/server/ipc/ZmqWorker.cpp @@ -18,8 +18,8 @@ #include "ZmqWorker.h" #include "ZmqContext.h" -ZmqWorker::ZmqWorker(std::string task_uri, std::string res_uri) : - _taskUri(task_uri), _resultsUri(res_uri) +ZmqWorker::ZmqWorker(std::string const& taskUri, std::string const& resUri) : + _taskUri(taskUri), _resultsUri(resUri) { } @@ -27,7 +27,6 @@ ZmqWorker::~ZmqWorker() { delete _taskQueue; delete _results; - delete _inproc; } void ZmqWorker::HandleOpen() diff --git a/src/server/ipc/ZmqWorker.h b/src/server/ipc/ZmqWorker.h index b3e221e9129..7f9b0cd1382 100644 --- a/src/server/ipc/ZmqWorker.h +++ b/src/server/ipc/ZmqWorker.h @@ -24,19 +24,19 @@ class ZmqWorker : public ZMQTask { public: - ZmqWorker(std::string task_uri, std::string res_uri); + ZmqWorker(std::string const& taskUri, std::string const& resUri); ~ZmqWorker(); void Run() override; protected: void HandleOpen() override; void HandleClose() override; - zmqpp::socket* _results; + zmqpp::socket* _results = nullptr; private: void PerformWork(); virtual void Dispatch(zmqpp::message const&) = 0; - zmqpp::socket* _taskQueue; + zmqpp::socket* _taskQueue = nullptr; std::string _taskUri; std::string _resultsUri; }; 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 20ce825ad5e..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", diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 2cf97403595..e571f30b74e 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -204,7 +204,7 @@ public: // learn highest rank of talent and learn all non-talent spell ranks (recursive by tree) player->LearnSpellHighestRank(talentInfo->SpellID); - player->AddTalent(talentInfo->SpellID, player->GetActiveTalentGroup()); + player->AddTalent(talentInfo->SpellID, player->GetActiveTalentGroup(), true); } handler->SendSysMessage(LANG_COMMAND_LEARN_CLASS_TALENTS); 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_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 39644e5c08f..47f20c622bf 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -808,9 +808,11 @@ public: } bool known = target && target->HasSpell(id); - bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL); - SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell); + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect ? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; bool talent = (GetTalentBySpellID(id) != nullptr); bool passive = spellInfo->IsPassive(); @@ -878,9 +880,11 @@ public: } bool known = target && target->HasSpell(id); - bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL); - SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell); + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; bool talent = (GetTalentBySpellID(id) != nullptr); bool passive = spellInfo->IsPassive(); @@ -1065,39 +1069,44 @@ public: // Search in CharTitles.dbc for (uint32 id = 0; id < sCharTitlesStore.GetNumRows(); id++) { - CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id); - if (titleInfo) + if (CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id)) { - std::string name = target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang; + for (uint8 gender = GENDER_MALE; gender <= GENDER_FEMALE; ++gender) + { + if (target && target->getGender() != gender) + continue; - if (name.empty()) - continue; + std::string name = gender == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang; - if (!Utf8FitTo(name, wNamePart)) - continue; + if (name.empty()) + continue; - if (maxResults && counter == maxResults) - { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; - } + if (!Utf8FitTo(name, wNamePart)) + continue; + + if (maxResults && counter == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; + char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; - char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID - ? handler->GetTrinityString(LANG_ACTIVE) - : ""; + char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID + ? handler->GetTrinityString(LANG_ACTIVE) + : ""; - char titleNameStr[80]; - snprintf(titleNameStr, 80, name.c_str(), targetName); + char titleNameStr[80]; + snprintf(titleNameStr, 80, name.c_str(), targetName); - // send title in "id (idx:idx) - [namedlink locale]" format - if (handler->GetSession()) - handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr); - else - handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr); + // send title in "id (idx:idx) - [namedlink locale]" format + if (handler->GetSession()) + handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr); + else + handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr); - ++counter; + ++counter; + } } } if (counter == 0) // if counter == 0 then we found nth 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 e868811b113..52b8b859c21 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -96,6 +96,7 @@ public: { "unstuck", rbac::RBAC_PERM_COMMAND_UNSTUCK, true, &HandleUnstuckCommand, "", NULL }, { "wchange", rbac::RBAC_PERM_COMMAND_WCHANGE, false, &HandleChangeWeather, "", NULL }, { "mailbox", rbac::RBAC_PERM_COMMAND_MAILBOX, false, &HandleMailBoxCommand, "", NULL }, + { "auras ", rbac::RBAC_PERM_COMMAND_LIST_AURAS, false, &HandleAurasCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; return commandTable; @@ -1135,7 +1136,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 +1218,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 +1359,7 @@ public: return false; } - int32 level = uint32(atol(levelStr)); + int32 level = atol(levelStr); Player* target = handler->getSelectedPlayer(); if (!target) @@ -1380,7 +1381,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 +1780,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) @@ -2248,7 +2249,7 @@ public: SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); - if (Unit::IsDamageReducedByArmor(schoolmask)) + if (handler->GetSession()->GetPlayer()->IsDamageReducedByArmor(schoolmask)) damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK); char* spellStr = strtok((char*)NULL, " "); @@ -2279,7 +2280,10 @@ public: if (!spellid || !sSpellMgr->GetSpellInfo(spellid)) return false; - handler->GetSession()->GetPlayer()->SpellNonMeleeDamageLog(target, spellid, damage); + SpellNonMeleeDamage damageInfo(handler->GetSession()->GetPlayer(), target, spellid, sSpellMgr->GetSpellInfo(spellid)->SchoolMask); + handler->GetSession()->GetPlayer()->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); + target->SendSpellNonMeleeDamageLog(&damageInfo); + target->DealSpellDamage(&damageInfo, true); return true; } @@ -2597,6 +2601,44 @@ public: handler->GetSession()->SendShowMailBox(player->GetGUID()); return true; } + + static bool HandleAurasCommand(ChatHandler* handler, char const* args) + { + Unit* target = handler->GetSession()->GetPlayer()->GetSelectedUnit(); + + if (!target) + { + handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + Unit::AuraApplicationMap const& uAuras = target->GetAppliedAuras(); + handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURAS, uAuras.size()); + for (Unit::AuraApplicationMap::const_iterator itr = uAuras.begin(); itr != uAuras.end(); ++itr) + { + AuraApplication const* aurApp = itr->second; + Aura const* aura = aurApp->GetBase(); + char const* name = aura->GetSpellInfo()->SpellName; + + bool self = target->GetGUID() == aura->GetCasterGUID(); + if (self) + handler->PSendSysMessage("%u: %s (self)", aura->GetId(), name); + else + { + if (Unit* u = aura->GetCaster()) + { + if (u->GetTypeId() == TYPEID_PLAYER) + handler->PSendSysMessage("%u: %s (player: %s)", aura->GetId(), name, u->GetName().c_str()); + else if (u->GetTypeId() == TYPEID_UNIT) + handler->PSendSysMessage("%u: %s (creature: %s)", aura->GetId(), name, u->GetName().c_str()); + } + else + handler->PSendSysMessage("%u: %s)", aura->GetId(), name); + } + } + return true; + } }; void AddSC_misc_commandscript() diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 7d42609a2a0..aadf97e9b0c 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(); @@ -1344,7 +1344,7 @@ public: } // Set gender - target->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender); + target->SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, gender); target->SetByteValue(PLAYER_BYTES_3, 0, gender); // Change display ID 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_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index fa6adcc8eb0..a25c6bbcb59 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -137,7 +137,6 @@ public: { "smart_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_SMART_SCRIPTS, true, &HandleReloadSmartScripts, "", NULL }, { "spell_required", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_REQUIRED, true, &HandleReloadSpellRequiredCommand, "", NULL }, { "spell_area", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_AREA, true, &HandleReloadSpellAreaCommand, "", NULL }, - { "spell_bonus_data", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_BONUS_DATA, true, &HandleReloadSpellBonusesCommand, "", NULL }, { "spell_group", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_GROUP, true, &HandleReloadSpellGroupsCommand, "", NULL }, { "spell_learn_spell", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_LEARN_SPELL, true, &HandleReloadSpellLearnSpellCommand, "", NULL }, { "spell_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_SPELL_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesSpellCommand, "", NULL }, @@ -279,7 +278,6 @@ public: HandleReloadSpellLinkedSpellCommand(handler, "a"); HandleReloadSpellProcEventCommand(handler, "a"); HandleReloadSpellProcsCommand(handler, "a"); - HandleReloadSpellBonusesCommand(handler, "a"); HandleReloadSpellTargetPositionCommand(handler, "a"); HandleReloadSpellThreatsCommand(handler, "a"); HandleReloadSpellGroupStackRulesCommand(handler, "a"); @@ -819,14 +817,6 @@ public: return true; } - static bool HandleReloadSpellBonusesCommand(ChatHandler* handler, const char* /*args*/) - { - TC_LOG_INFO("misc", "Re-Loading Spell Bonus Data..."); - sSpellMgr->LoadSpellBonusess(); - handler->SendGlobalGMSysMessage("DB table `spell_bonus_data` (spell damage/healing coefficients) reloaded."); - return true; - } - static bool HandleReloadSpellTargetPositionCommand(ChatHandler* handler, const char* /*args*/) { TC_LOG_INFO("misc", "Re-Loading Spell target coordinates..."); @@ -954,7 +944,7 @@ public: sObjectMgr->LoadGraveyardZones(); - handler->SendGlobalGMSysMessage("DB table `game_graveyard_zone` reloaded."); + handler->SendGlobalGMSysMessage("DB table `graveyard_zone` reloaded."); return true; } diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 01a0094bfc7..1c3bff77593 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -100,8 +100,7 @@ public: player->SetShapeshiftForm(FORM_NONE); player->setFactionForRace(player->getRace()); - - player->SetUInt32Value(UNIT_FIELD_BYTES_0, ((player->getRace()) | (player->getClass() << 8) | (player->getGender() << 16) | (powerType << 24))); + player->SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, powerType); // reset only if player not in some form; if (player->GetShapeshiftForm() == FORM_NONE) diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index 62d12a94c54..80ddecf8914 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -81,10 +81,7 @@ class boss_alizabal : public CreatureScript struct boss_alizabalAI : public BossAI { - boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) - { - _intro = false; - } + boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) { } void Reset() override { @@ -251,10 +248,9 @@ class boss_alizabal : public CreatureScript } private: - bool _intro; - bool _hate; - bool _skewer; - + bool _intro = false; + bool _hate = false; + bool _skewer = false; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp index 9c203ac2395..5805509cc9b 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp @@ -267,7 +267,7 @@ class spell_occuthar_eyes_of_occuthar : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) + if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue())) return false; return true; } diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp index 008803f9a52..26a6b89dee9 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp @@ -157,12 +157,6 @@ class spell_argaloth_meteor_slash : public SpellScriptLoader { PrepareSpellScript(spell_argaloth_meteor_slash_SpellScript); - bool Load() override - { - _targetCount = 0; - return true; - } - void CountTargets(std::list<WorldObject*>& targets) { _targetCount = targets.size(); @@ -183,7 +177,7 @@ class spell_argaloth_meteor_slash : public SpellScriptLoader } private: - uint32 _targetCount; + uint32 _targetCount = 0; }; SpellScript* GetSpellScript() const override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp index f736aa6ffbc..97d43ab163c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp @@ -357,7 +357,7 @@ class npc_twilight_sadist : public CreatureScript void Reset() override { _combatPhase = false; - if(!me->GetWaypointPath()) + if (!me->GetWaypointPath()) _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, urand(6000, 18000)); } @@ -422,7 +422,7 @@ class npc_twilight_sadist : public CreatureScript private: EventMap _events; InstanceScript* _instance; - bool _combatPhase; + bool _combatPhase = false; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp index 3f2e8f8b243..e97583c3575 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp @@ -114,7 +114,7 @@ class boss_corla : public CreatureScript } private: - bool combatPhase; + bool combatPhase = false; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 4cb0b61365d..9c4865a8d84 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -485,23 +485,23 @@ public: void SpellHit(Unit* /*pAttacker*/, const SpellInfo* Spell) override { //We only care about interrupt effects and only if they are durring a spell currently being cast - if ((Spell->Effects[0].Effect != SPELL_EFFECT_INTERRUPT_CAST && - Spell->Effects[1].Effect != SPELL_EFFECT_INTERRUPT_CAST && - Spell->Effects[2].Effect != SPELL_EFFECT_INTERRUPT_CAST) || !me->IsNonMeleeSpellCast(false)) - return; - - //Interrupt effect - me->InterruptNonMeleeSpells(false); + for (SpellEffectInfo const* effect : Spell->GetEffectsForDifficulty(me->GetMap()->GetDifficulty())) + if (effect && effect->Effect == SPELL_EFFECT_INTERRUPT_CAST && me->IsNonMeleeSpellCast(false)) + { + //Interrupt effect + me->InterruptNonMeleeSpells(false); - //Normally we would set the cooldown equal to the spell duration - //but we do not have access to the DurationStore + //Normally we would set the cooldown equal to the spell duration + //but we do not have access to the DurationStore - switch (CurrentNormalSpell) - { - case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break; - case SPELL_FIREBALL: FireCooldown = 5000; break; - case SPELL_FROSTBOLT: FrostCooldown = 5000; break; - } + switch (CurrentNormalSpell) + { + case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break; + case SPELL_FIREBALL: FireCooldown = 5000; break; + case SPELL_FROSTBOLT: FrostCooldown = 5000; break; + } + return; + } } }; }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 6cd14598a58..6758808c5d9 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -164,8 +164,10 @@ public: { if (Player* player = i->GetSource()) { - if (spell && spell->Effects[0].MiscValue) - player->KilledMonsterCredit(spell->Effects[0].MiscValue); + if (spell) + if (SpellEffectInfo const* effect = spell->GetEffect(EFFECT_0)) + if (effect->MiscValue) + player->KilledMonsterCredit(effect->MiscValue); } } } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 69c188a61dc..e5a42096a04 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -314,7 +314,7 @@ class spell_shadow_portal_rooms : public SpellScriptLoader int8 phase_to_set = 0; int32 gate_to_close = 0; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) + switch (GetSpellInfo()->GetEffect(effIndex)->MiscValue) { case SPELL_EVENT_HALLOFSECRETS: pos_to_summon = 0; // Not yet spawned diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 99b710afb1e..cf0228f5192 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -412,9 +412,14 @@ public: void SpellHit(Unit* /*caster*/, const SpellInfo* Spell) override { - for (uint8 i = 0; i < 3; ++i) - if (Spell->Effects[i].Effect == 38) + for (SpellEffectInfo const* effect : Spell->GetEffectsForDifficulty(DIFFICULTY_NONE)) + { + if (effect && effect->Effect == 38) + { me->DisappearAndDie(); + return; + } + } } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index dd1152a02a5..ac557bcad97 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -141,6 +141,7 @@ class npc_voljin_zulaman : public CreatureScript case EVENT_INTRO_MOVEPOINT_3: Talk(SAY_INTRO_2); _events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3000); + break; case EVENT_BANGING_THE_GONG: DoCast(me, SPELL_BANGING_THE_GONG); if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) @@ -208,7 +209,7 @@ class npc_voljin_zulaman : public CreatureScript private: InstanceScript* _instance; EventMap _events; - uint8 _gongCount; + uint8 _gongCount = 0; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 992b20d2580..e0416b56397 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -25,10 +25,9 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "hyjal.h" -#include "SpellAuras.h" -#include "hyjal_trash.h" +#include "SpellScript.h" #include "Player.h" +#include "hyjal.h" enum Texts { @@ -39,42 +38,59 @@ enum Texts SAY_ENRAGE = 5, SAY_DEATH = 6, SAY_SOUL_CHARGE = 7, + // YELL_ARCHIMONDE_INTRO = 8 }; enum Spells { - SPELL_DENOUEMENT_WISP = 32124, - SPELL_ANCIENT_SPARK = 39349, - SPELL_PROTECTION_OF_ELUNE = 38528, - - SPELL_DRAIN_WORLD_TREE = 39140, - SPELL_DRAIN_WORLD_TREE_2 = 39141, - - SPELL_FINGER_OF_DEATH = 31984, - SPELL_HAND_OF_DEATH = 35354, - SPELL_AIR_BURST = 32014, - SPELL_GRIP_OF_THE_LEGION = 31972, - SPELL_DOOMFIRE_STRIKE = 31903, //summons two creatures - SPELL_DOOMFIRE_SPAWN = 32074, - SPELL_DOOMFIRE = 31945, - SPELL_SOUL_CHARGE_YELLOW = 32045, - SPELL_SOUL_CHARGE_GREEN = 32051, - SPELL_SOUL_CHARGE_RED = 32052, - SPELL_UNLEASH_SOUL_YELLOW = 32054, - SPELL_UNLEASH_SOUL_GREEN = 32057, - SPELL_UNLEASH_SOUL_RED = 32053, - SPELL_FEAR = 31970, + SPELL_DENOUEMENT_WISP = 32124, + SPELL_ANCIENT_SPARK = 39349, + SPELL_PROTECTION_OF_ELUNE = 38528, + + SPELL_DRAIN_WORLD_TREE = 39140, + SPELL_DRAIN_WORLD_TREE_TRIGGERED = 39141, + + SPELL_FINGER_OF_DEATH = 31984, + SPELL_HAND_OF_DEATH = 35354, + SPELL_AIR_BURST = 32014, + SPELL_GRIP_OF_THE_LEGION = 31972, + SPELL_DOOMFIRE_STRIKE = 31903, // summons two creatures + SPELL_DOOMFIRE_SPAWN = 32074, + SPELL_DOOMFIRE = 31945, + SPELL_SOUL_CHARGE_YELLOW = 32045, + SPELL_SOUL_CHARGE_GREEN = 32051, + SPELL_SOUL_CHARGE_RED = 32052, + SPELL_UNLEASH_SOUL_YELLOW = 32054, + SPELL_UNLEASH_SOUL_GREEN = 32057, + SPELL_UNLEASH_SOUL_RED = 32053, + SPELL_FEAR = 31970 +}; + +enum Events +{ + EVENT_HAND_OF_DEATH = 1, // Raid wiper + EVENT_UNLEASH_SOUL_CHARGE, + EVENT_FINGER_OF_DEATH, + EVENT_GRIP_OF_THE_LEGION, + EVENT_FEAR, + EVENT_AIR_BURST, + EVENT_DOOMFIRE, + EVENT_DISTANCE_CHECK, // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage + EVENT_SUMMON_WHISP }; enum Summons { - CREATURE_DOOMFIRE = 18095, - CREATURE_DOOMFIRE_SPIRIT = 18104, - CREATURE_ANCIENT_WISP = 17946, - CREATURE_CHANNEL_TARGET = 22418, + NPC_DOOMFIRE = 18095, + NPC_DOOMFIRE_SPIRIT = 18104, + NPC_ANCIENT_WISP = 17946 }; -Position const NordrassilLoc = {5503.713f, -3523.436f, 1608.781f, 0.0f}; +enum Actions +{ + ACTION_ENRAGE, + ACTION_CHANNEL_WORLD_TREE +}; class npc_ancient_wisp : public CreatureScript { @@ -200,7 +216,6 @@ public: } void MoveInLineOfSight(Unit* who) override - { //will update once TargetGUID is 0. In case noone actually moves(not likely) and this is 0 //when UpdateAI needs it, it will be forced to select randomPoint @@ -249,409 +264,309 @@ class boss_archimonde : public CreatureScript public: boss_archimonde() : CreatureScript("boss_archimonde") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_archimondeAI>(creature); - } - - struct boss_archimondeAI : public hyjal_trashAI + struct boss_archimondeAI : public BossAI { - boss_archimondeAI(Creature* creature) : hyjal_trashAI(creature) + boss_archimondeAI(Creature* creature) : BossAI(creature, DATA_ARCHIMONDE) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() { DoomfireSpiritGUID.Clear(); - damageTaken = 0; - WorldTreeGUID.Clear(); - - DrainNordrassilTimer = 0; - FearTimer = 42000; - AirBurstTimer = 30000; - GripOfTheLegionTimer = urand(5000, 25000); - DoomfireTimer = 20000; - SoulChargeTimer = urand(2000, 30000); + SoulChargeCount = 0; - MeleeRangeCheckTimer = 15000; - HandOfDeathTimer = 2000; WispCount = 0; // When ~30 wisps are summoned, Archimonde dies - EnrageTimer = 600000; // 10 minutes - CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage - SummonWispTimer = 0; + _unleashSpell = 0; + _chargeSpell = 0; Enraged = false; - BelowTenPercent = false; HasProtected = false; - IsChanneling = false; } - InstanceScript* instance; - - ObjectGuid DoomfireSpiritGUID; - ObjectGuid WorldTreeGUID; - - uint32 DrainNordrassilTimer; - uint32 FearTimer; - uint32 AirBurstTimer; - uint32 GripOfTheLegionTimer; - uint32 DoomfireTimer; - uint32 SoulChargeTimer; - uint8 SoulChargeCount; - uint32 MeleeRangeCheckTimer; - uint32 HandOfDeathTimer; - uint32 SummonWispTimer; - uint8 WispCount; - uint32 EnrageTimer; - uint32 CheckDistanceTimer; - - bool Enraged; - bool BelowTenPercent; - bool HasProtected; - bool IsChanneling; + void InitializeAI() override + { + BossAI::InitializeAI(); + DoAction(ACTION_CHANNEL_WORLD_TREE); + } void Reset() override { - instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED); - Initialize(); + _Reset(); + me->RemoveAllAuras(); // Reset Soul Charge auras. } void EnterCombat(Unit* /*who*/) override { - me->InterruptSpell(CURRENT_CHANNELED_SPELL); Talk(SAY_AGGRO); - DoZoneInCombat(); - - instance->SetData(DATA_ARCHIMONDEEVENT, IN_PROGRESS); - } - - void KilledUnit(Unit* victim) override - { - Talk(SAY_SLAY); - - if (victim && victim->GetTypeId() == TYPEID_PLAYER) - GainSoulCharge(victim->ToPlayer()); + _EnterCombat(); + events.ScheduleEvent(EVENT_FEAR, 42000); + events.ScheduleEvent(EVENT_AIR_BURST, 30000); + events.ScheduleEvent(EVENT_GRIP_OF_THE_LEGION, urand(5000, 25000)); + events.ScheduleEvent(EVENT_DOOMFIRE, 20000); + events.ScheduleEvent(EVENT_UNLEASH_SOUL_CHARGE, urand(2000, 30000)); + events.ScheduleEvent(EVENT_FINGER_OF_DEATH, 15000); + events.ScheduleEvent(EVENT_HAND_OF_DEATH, 600000); + events.ScheduleEvent(EVENT_DISTANCE_CHECK, 30000); } - void GainSoulCharge(Player* victim) + void ExecuteEvent(uint32 eventId) override { - switch (victim->getClass()) + switch (eventId) { - case CLASS_PRIEST: - case CLASS_PALADIN: - case CLASS_WARLOCK: - victim->CastSpell(me, SPELL_SOUL_CHARGE_RED, true); + case EVENT_HAND_OF_DEATH: + DoCastAOE(SPELL_HAND_OF_DEATH); + events.ScheduleEvent(EVENT_HAND_OF_DEATH, 2000); + break; + case EVENT_UNLEASH_SOUL_CHARGE: + _chargeSpell = 0; + _unleashSpell = 0; + me->InterruptNonMeleeSpells(false); + switch (urand(0, 2)) + { + case 0: + _chargeSpell = SPELL_SOUL_CHARGE_RED; + _unleashSpell = SPELL_UNLEASH_SOUL_RED; + break; + case 1: + _chargeSpell = SPELL_SOUL_CHARGE_YELLOW; + _unleashSpell = SPELL_UNLEASH_SOUL_YELLOW; + break; + case 2: + _chargeSpell = SPELL_SOUL_CHARGE_GREEN; + _unleashSpell = SPELL_UNLEASH_SOUL_GREEN; + break; + } + + if (me->HasAura(_chargeSpell)) + { + me->RemoveAuraFromStack(_chargeSpell); + DoCastVictim(_unleashSpell); + SoulChargeCount--; + events.ScheduleEvent(EVENT_UNLEASH_SOUL_CHARGE, urand(2000, 30000)); + } + break; + case EVENT_FINGER_OF_DEATH: + if (!SelectTarget(SELECT_TARGET_RANDOM, 0, 5.0f)) // Checks if there are no targets in melee range + { + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_FINGER_OF_DEATH); + events.ScheduleEvent(EVENT_FINGER_OF_DEATH, 1000); + } + else + events.ScheduleEvent(EVENT_FINGER_OF_DEATH, 5000); break; - case CLASS_MAGE: - case CLASS_ROGUE: - case CLASS_WARRIOR: - victim->CastSpell(me, SPELL_SOUL_CHARGE_YELLOW, true); + case EVENT_GRIP_OF_THE_LEGION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_GRIP_OF_THE_LEGION); + events.ScheduleEvent(EVENT_GRIP_OF_THE_LEGION, urand(5000, 25000)); break; - case CLASS_DRUID: - case CLASS_SHAMAN: - case CLASS_HUNTER: - victim->CastSpell(me, SPELL_SOUL_CHARGE_GREEN, true); + case EVENT_AIR_BURST: + Talk(SAY_AIR_BURST); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + DoCast(target, SPELL_AIR_BURST); //not on tank + events.ScheduleEvent(EVENT_AIR_BURST, urand(25000, 40000)); + break; + case EVENT_FEAR: + DoCastAOE(SPELL_FEAR); + events.ScheduleEvent(EVENT_FEAR, 42000); + break; + case EVENT_DOOMFIRE: + Talk(SAY_DOOMFIRE); + if (Unit* temp = SelectTarget(SELECT_TARGET_RANDOM, 1)) + SummonDoomfire(temp); + else + SummonDoomfire(me->GetVictim()); + events.ScheduleEvent(EVENT_DOOMFIRE, 20000); + break; + case EVENT_DISTANCE_CHECK: + if (Creature* channelTrigger = instance->GetCreature(DATA_CHANNEL_TARGET)) + if (me->IsWithinDistInMap(channelTrigger, 75.0f)) + DoAction(ACTION_ENRAGE); + events.ScheduleEvent(EVENT_DISTANCE_CHECK, 5000); + break; + case EVENT_SUMMON_WHISP: + DoSpawnCreature(NPC_ANCIENT_WISP, float(rand32() % 40), float(rand32() % 40), 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + ++WispCount; + if (WispCount >= 30) + me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + events.ScheduleEvent(EVENT_SUMMON_WHISP, 1500); + break; + default: break; } - - SoulChargeTimer = urand(2000, 30000); - ++SoulChargeCount; - } - - void JustDied(Unit* killer) override - { - hyjal_trashAI::JustDied(killer); - Talk(SAY_DEATH); - - instance->SetData(DATA_ARCHIMONDEEVENT, DONE); } - bool CanUseFingerOfDeath() + void DamageTaken(Unit* /*attacker*/, uint32 &damage) override { - // First we check if our current victim is in melee range or not. - Unit* victim = me->GetVictim(); - if (victim && me->IsWithinDistInMap(victim, me->GetAttackDistance(victim))) - return false; - - ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); - if (threatlist.empty()) - return false; - - std::list<Unit*> targets; - ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); - for (; itr != threatlist.end(); ++itr) + if (me->HealthBelowPctDamaged(10, damage)) { - Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (unit && unit->IsAlive()) - targets.push_back(unit); - } + if (!Enraged) + DoAction(ACTION_ENRAGE); - if (targets.empty()) - return false; + if (!HasProtected) + { + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); - targets.sort(Trinity::ObjectDistanceOrderPred(me)); - Unit* target = targets.front(); - if (target) - { - if (!me->IsWithinDistInMap(target, me->GetAttackDistance(target))) - return true; // Cast Finger of Death - else // This target is closest, he is our new tank - me->AddThreat(target, me->getThreatManager().getThreat(me->GetVictim())); + // All members of raid must get this buff + DoCastAOE(SPELL_PROTECTION_OF_ELUNE, true); + HasProtected = true; + events.ScheduleEvent(EVENT_SUMMON_WHISP, 1500); + } } - - return false; } - void JustSummoned(Creature* summoned) override + void KilledUnit(Unit* victim) override { - if (summoned->GetEntry() == CREATURE_ANCIENT_WISP) - summoned->AI()->AttackStart(me); - else - { - summoned->setFaction(me->getFaction()); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - if (summoned->GetEntry() == CREATURE_DOOMFIRE_SPIRIT) - { - DoomfireSpiritGUID = summoned->GetGUID(); - } + Talk(SAY_SLAY); - if (summoned->GetEntry() == CREATURE_DOOMFIRE) + if (victim->GetTypeId() == TYPEID_PLAYER) { - summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN, false); - summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID()); - - if (Unit* DoomfireSpirit = ObjectAccessor::GetUnit(*me, DoomfireSpiritGUID)) + switch (victim->getClass()) { - summoned->GetMotionMaster()->MoveFollow(DoomfireSpirit, 0.0f, 0.0f); - DoomfireSpiritGUID.Clear(); + case CLASS_PRIEST: + case CLASS_PALADIN: + case CLASS_WARLOCK: + victim->CastSpell(me, SPELL_SOUL_CHARGE_RED, true); + break; + case CLASS_MAGE: + case CLASS_ROGUE: + case CLASS_WARRIOR: + victim->CastSpell(me, SPELL_SOUL_CHARGE_YELLOW, true); + break; + case CLASS_DRUID: + case CLASS_SHAMAN: + case CLASS_HUNTER: + victim->CastSpell(me, SPELL_SOUL_CHARGE_GREEN, true); + break; } + + events.ScheduleEvent(EVENT_UNLEASH_SOUL_CHARGE, urand(2000, 30000)); + ++SoulChargeCount; } } - //this is code doing close to what the summoning spell would do (spell 31903) - void SummonDoomfire(Unit* target) + void JustReachedHome() override { - me->SummonCreature(CREATURE_DOOMFIRE_SPIRIT, - target->GetPositionX()+15.0f, target->GetPositionY()+15.0f, target->GetPositionZ(), 0, - TEMPSUMMON_TIMED_DESPAWN, 27000); - - me->SummonCreature(CREATURE_DOOMFIRE, - target->GetPositionX()-15.0f, target->GetPositionY()-15.0f, target->GetPositionZ(), 0, - TEMPSUMMON_TIMED_DESPAWN, 27000); + DoAction(ACTION_CHANNEL_WORLD_TREE); } - void UnleashSoulCharge() + void JustDied(Unit* /*killer*/) override { - me->InterruptNonMeleeSpells(false); - - bool HasCast = false; - uint32 chargeSpell = 0; - uint32 unleashSpell = 0; + Talk(SAY_DEATH); + _JustDied(); + // @todo: remove this when instance script gets updated, kept for compatibility only + instance->SetData(DATA_ARCHIMONDE, DONE); + } - switch (urand(0, 2)) + void JustSummoned(Creature* summoned) override + { + switch (summoned->GetEntry()) { - case 0: - chargeSpell = SPELL_SOUL_CHARGE_RED; - unleashSpell = SPELL_UNLEASH_SOUL_RED; - break; - case 1: - chargeSpell = SPELL_SOUL_CHARGE_YELLOW; - unleashSpell = SPELL_UNLEASH_SOUL_YELLOW; + case NPC_ANCIENT_WISP: + summoned->AI()->AttackStart(me); break; - case 2: - chargeSpell = SPELL_SOUL_CHARGE_GREEN; - unleashSpell = SPELL_UNLEASH_SOUL_GREEN; + case NPC_DOOMFIRE_SPIRIT: + DoomfireSpiritGUID = summoned->GetGUID(); break; - } + case NPC_DOOMFIRE: + summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN, false); + summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID()); - if (me->HasAura(chargeSpell)) - { - me->RemoveAuraFromStack(chargeSpell); - DoCastVictim(unleashSpell); - HasCast = true; - SoulChargeCount--; + if (Unit* DoomfireSpirit = ObjectAccessor::GetUnit(*me, DoomfireSpiritGUID)) + { + summoned->GetMotionMaster()->MoveFollow(DoomfireSpirit, 0.0f, 0.0f); + DoomfireSpiritGUID.Clear(); + } + break; + default: + break; } - - if (HasCast) - SoulChargeTimer = urand(2000, 30000); } - void UpdateAI(uint32 diff) override + void DoAction(int32 actionId) override { - if (!me->IsInCombat()) + switch (actionId) { - // Do not let the raid skip straight to Archimonde. Visible and hostile ONLY if Azagalor is finished. - if ((instance->GetData(DATA_AZGALOREVENT) < DONE) && (me->IsVisible() || (me->getFaction() != 35))) - { - me->SetVisible(false); - me->setFaction(35); - } - else if ((instance->GetData(DATA_AZGALOREVENT) >= DONE) && (!me->IsVisible() || (me->getFaction() == 35))) - { - me->setFaction(1720); - me->SetVisible(true); - } - - if (DrainNordrassilTimer <= diff) - { - if (!IsChanneling) - { - Creature* temp = me->SummonCreature(CREATURE_CHANNEL_TARGET, NordrassilLoc, TEMPSUMMON_TIMED_DESPAWN, 1200000); - - if (temp) - WorldTreeGUID = temp->GetGUID(); - - if (Unit* Nordrassil = ObjectAccessor::GetUnit(*me, WorldTreeGUID)) - { - Nordrassil->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Nordrassil->SetDisplayId(11686); - DoCast(Nordrassil, SPELL_DRAIN_WORLD_TREE); - IsChanneling = true; - } - } - - if (Unit* Nordrassil = ObjectAccessor::GetUnit(*me, WorldTreeGUID)) - { - Nordrassil->CastSpell(me, SPELL_DRAIN_WORLD_TREE_2, true); - DrainNordrassilTimer = 1000; - } - } else DrainNordrassilTimer -= diff; + case ACTION_ENRAGE: + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + Enraged = true; + Talk(SAY_ENRAGE); + break; + case ACTION_CHANNEL_WORLD_TREE: + DoCastAOE(SPELL_DRAIN_WORLD_TREE, true); + break; + default: + break; } + } - if (!UpdateVictim()) + //this is code doing close to what the summoning spell would do (spell 31903) + void SummonDoomfire(Unit* target) + { + if (!target) return; - if (me->HealthBelowPct(10) && !BelowTenPercent && !Enraged) - BelowTenPercent = true; - - if (!Enraged) - { - if (EnrageTimer <= diff) - { - if (HealthAbovePct(10)) - { - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - Enraged = true; - Talk(SAY_ENRAGE); - } - } else EnrageTimer -= diff; + me->SummonCreature(NPC_DOOMFIRE_SPIRIT, + target->GetPositionX()+15.0f, target->GetPositionY()+15.0f, target->GetPositionZ(), 0, + TEMPSUMMON_TIMED_DESPAWN, 27000); - if (CheckDistanceTimer <= diff) - { - // To simplify the check, we simply summon a Creature in the location and then check how far we are from the creature - Creature* Check = me->SummonCreature(CREATURE_CHANNEL_TARGET, NordrassilLoc, TEMPSUMMON_TIMED_DESPAWN, 2000); - if (Check) - { - Check->SetVisible(false); - - if (me->IsWithinDistInMap(Check, 75)) - { - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - Enraged = true; - Talk(SAY_ENRAGE); - } - } - CheckDistanceTimer = 5000; - } else CheckDistanceTimer -= diff; - } + me->SummonCreature(NPC_DOOMFIRE, + target->GetPositionX()-15.0f, target->GetPositionY()-15.0f, target->GetPositionZ(), 0, + TEMPSUMMON_TIMED_DESPAWN, 27000); + } - if (BelowTenPercent) - { - if (!HasProtected) - { - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); + private: + ObjectGuid DoomfireSpiritGUID; + uint8 SoulChargeCount; + uint8 WispCount; + uint32 _chargeSpell; + uint32 _unleashSpell; + bool Enraged; + bool HasProtected; + }; - //all members of raid must get this buff - DoCastVictim(SPELL_PROTECTION_OF_ELUNE, true); - HasProtected = true; - Enraged = true; - } + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_archimondeAI>(creature); + } +}; - if (SummonWispTimer <= diff) - { - DoSpawnCreature(CREATURE_ANCIENT_WISP, float(rand32() % 40), float(rand32() % 40), 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - SummonWispTimer = 1500; - ++WispCount; - } else SummonWispTimer -= diff; +// 39142 - Drain World Tree Dummy +class spell_archimonde_drain_world_tree_dummy : public SpellScriptLoader +{ + public: + spell_archimonde_drain_world_tree_dummy() : SpellScriptLoader("spell_archimonde_drain_world_tree_dummy") { } - if (WispCount >= 30) - me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } + class spell_archimonde_drain_world_tree_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_archimonde_drain_world_tree_dummy_SpellScript); - if (Enraged) + bool Validate(SpellInfo const* /*spellInfo*/) override { - if (HandOfDeathTimer <= diff) - { - DoCastVictim(SPELL_HAND_OF_DEATH); - HandOfDeathTimer = 2000; - } else HandOfDeathTimer -= diff; - return; // Don't do anything after this point. + if (!sSpellMgr->GetSpellInfo(SPELL_DRAIN_WORLD_TREE_TRIGGERED)) + return false; + return true; } - if (SoulChargeCount) + void HandleScript(SpellEffIndex /*effIndex*/) { - if (SoulChargeTimer <= diff) - UnleashSoulCharge(); - else SoulChargeTimer -= diff; + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_DRAIN_WORLD_TREE_TRIGGERED, true); } - if (GripOfTheLegionTimer <= diff) - { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_GRIP_OF_THE_LEGION); - GripOfTheLegionTimer = urand(5000, 25000); - } else GripOfTheLegionTimer -= diff; - - if (AirBurstTimer <= diff) - { - Talk(SAY_AIR_BURST); - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1), SPELL_AIR_BURST);//not on tank - AirBurstTimer = urand(25000, 40000); - } else AirBurstTimer -= diff; - - if (FearTimer <= diff) - { - DoCastVictim(SPELL_FEAR); - FearTimer = 42000; - } else FearTimer -= diff; - - if (DoomfireTimer <= diff) + void Register() override { - Talk(SAY_DOOMFIRE); - Unit* temp = SelectTarget(SELECT_TARGET_RANDOM, 1); - if (!temp) - temp = me->GetVictim(); - - //replace with spell cast 31903 once implicitTarget 73 implemented - SummonDoomfire(temp); - - //supposedly three doomfire can be up at the same time - DoomfireTimer = 20000; - } else DoomfireTimer -= diff; - - if (MeleeRangeCheckTimer <= diff) - { - if (CanUseFingerOfDeath()) - { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_FINGER_OF_DEATH); - MeleeRangeCheckTimer = 1000; - } - - MeleeRangeCheckTimer = 5000; - } else MeleeRangeCheckTimer -= diff; + OnEffectHitTarget += SpellEffectFn(spell_archimonde_drain_world_tree_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; - DoMeleeAttackIfReady(); + SpellScript* GetSpellScript() const override + { + return new spell_archimonde_drain_world_tree_dummy_SpellScript(); } - void WaypointReached(uint32 /*waypointId*/) override { } - }; }; void AddSC_boss_archimonde() @@ -660,4 +575,5 @@ void AddSC_boss_archimonde() new npc_doomfire(); new npc_doomfire_targetting(); new npc_ancient_wisp(); + new spell_archimonde_drain_world_tree_dummy(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h index c5f4d4ae679..54a763573ed 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h @@ -44,7 +44,8 @@ enum DataTypes DATA_HORDE_RETREAT = 17, DATA_RAIDDAMAGE = 18, DATA_RESET_RAIDDAMAGE = 19, - TYPE_RETREAT = 20 + TYPE_RETREAT = 20, + DATA_CHANNEL_TARGET = 21 }; enum WorldStateIds @@ -77,7 +78,8 @@ enum CreaturesIds KAZROGAL = 17888, AZGALOR = 17842, ARCHIMONDE = 17968, - NPC_WORLD_TRIGGER_TINY = 21987 + NPC_WORLD_TRIGGER_TINY = 21987, + NPC_CHANNEL_TARGET = 22418 }; enum GameobjectIds @@ -89,5 +91,6 @@ enum GameobjectIds GO_ROARING_FLAME = 182592 }; -#endif +#define MINRAIDDAMAGE 700000 // minimal damage before trash can drop loot and reputation, resets if faction leader dies +#endif diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 56b79b6b3e1..0394b8535e5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -26,7 +26,6 @@ enum Spells SPELL_METEOR = 33814, //infernal visual SPELL_IMMOLATION = 37059, SPELL_FLAME_BUFFET = 31724, - NPC_TRIGGER = 21987, //World Trigger (Tiny) MODEL_INVIS = 11686, //invisible model SPELL_DISEASE_CLOUD = 31607, SPELL_KNOCKDOWN = 31610, @@ -465,10 +464,7 @@ public: } if (!meteor) { - float x, y, z; - me->GetPosition(x, y, z); - Creature* trigger = me->SummonCreature(NPC_TRIGGER, x + 8, y + 8, z + 25 + rand32() % 10, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1000); - if (trigger) + if (Creature* trigger = me->SummonCreature(NPC_WORLD_TRIGGER_TINY, me->GetPositionWithOffset({ 8.0f, 8.0f, frand(25.0f, 35.0f), 0.0f }), TEMPSUMMON_TIMED_DESPAWN, 1000)) { trigger->SetVisible(false); trigger->setFaction(me->getFaction()); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h index 18122ba2b0c..62f82ebcee1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h @@ -21,8 +21,6 @@ #include "hyjal.h" #include "ScriptedEscortAI.h" -#define MINRAIDDAMAGE 700000//minimal damage before trash can drop loot and reputation, resets if faction leader dies - struct hyjal_trashAI : public npc_escortAI { hyjal_trashAI(Creature* creature); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 176c24f6707..99b8515c6e8 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -26,11 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "InstanceScript.h" #include "ScriptedCreature.h" -#include "hyjal_trash.h" -#include "Player.h" -#include "WorldPacket.h" -#include "Chat.h" -#include "WorldSession.h" +#include "hyjal.h" /* Battle of Mount Hyjal encounters: 0 - Rage Winterchill event @@ -40,8 +36,16 @@ EndScriptData */ 4 - Archimonde event */ -#define YELL_EFFORTS "All of your efforts have been in vain, for the draining of the World Tree has already begun. Soon the heart of your world will beat no more." -#define YELL_EFFORTS_NAME "Archimonde" +enum Yells +{ + YELL_ARCHIMONDE_INTRO = 8 +}; + +ObjectData const creatureData[] = +{ + { NPC_CHANNEL_TARGET, DATA_CHANNEL_TARGET }, + { 0, 0 } // END +}; class instance_hyjal : public InstanceMapScript { @@ -58,6 +62,7 @@ public: instance_mount_hyjal_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + LoadObjectData(creatureData, nullptr); memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); RaidDamage = 0; @@ -105,15 +110,35 @@ public: { switch (creature->GetEntry()) { - case RAGE_WINTERCHILL: RageWinterchill = creature->GetGUID(); break; - case ANETHERON: Anetheron = creature->GetGUID(); break; - case KAZROGAL: Kazrogal = creature->GetGUID(); break; - case AZGALOR: Azgalor = creature->GetGUID(); break; - case ARCHIMONDE: Archimonde = creature->GetGUID(); break; - case JAINA: JainaProudmoore = creature->GetGUID(); break; - case THRALL: Thrall = creature->GetGUID(); break; - case TYRANDE: TyrandeWhisperwind = creature->GetGUID(); break; + case RAGE_WINTERCHILL: + RageWinterchill = creature->GetGUID(); + break; + case ANETHERON: + Anetheron = creature->GetGUID(); + break; + case KAZROGAL: + Kazrogal = creature->GetGUID(); + break; + case AZGALOR: + Azgalor = creature->GetGUID(); + break; + case ARCHIMONDE: + Archimonde = creature->GetGUID(); + if (GetData(DATA_AZGALOREVENT) != DONE) + creature->SetVisible(false); + break; + case JAINA: + JainaProudmoore = creature->GetGUID(); + break; + case THRALL: + Thrall = creature->GetGUID(); + break; + case TYRANDE: + TyrandeWhisperwind = creature->GetGUID(); + break; } + + InstanceScript::OnCreatureCreate(creature); } ObjectGuid GetGuidData(uint32 identifier) const override @@ -147,40 +172,18 @@ public: m_auiEncounter[2] = data; break; case DATA_AZGALOREVENT: + m_auiEncounter[3] = data; + if (data == DONE) { - m_auiEncounter[3] = data; - if (data == DONE) + instance->LoadGrid(5581.49f, -3445.63f); + if (Creature* archimonde = instance->GetCreature(Archimonde)) { - if (ArchiYell) - break; + archimonde->SetVisible(true); - ArchiYell = true; - - Creature* creature = instance->GetCreature(Azgalor); - if (creature) + if (!ArchiYell) { - Creature* unit = creature->SummonCreature(NPC_WORLD_TRIGGER_TINY, creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000); - - Map* map = creature->GetMap(); - if (map->IsDungeon() && unit) - { - unit->SetVisible(false); - Map::PlayerList const &PlayerList = map->GetPlayers(); - if (PlayerList.isEmpty()) - return; - - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (Player* player = i->GetSource()) - { - WorldPacket packet; - - ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS); - player->SendDirectMessage(&packet); - player->PlayDirectSound(10986, player); - } - } - } + ArchiYell = true; + archimonde->AI()->Talk(YELL_ARCHIMONDE_INTRO); } } } 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/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index 9b8b435e93c..386f80c0c64 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -484,7 +484,7 @@ class npc_egg_pile : public CreatureScript private: EventMap _events; - uint32 _callHatchlingSpell; + uint32 _callHatchlingSpell = 0; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index 84a267543c5..15fbef8a08b 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -537,7 +537,7 @@ public: /// TODO: Remove this once we find a general rule for WorldObject::MovePosition (this spell shouldn't take the Z change into consideration) Unit* caster = GetCaster(); float angle = float(rand_norm()) * static_cast<float>(2 * M_PI); - uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm(); + uint32 dist = caster->GetObjectSize() + GetSpellInfo()->GetEffect(effIndex)->CalcRadius(GetCaster()) * (float)rand_norm(); float x = caster->GetPositionX() + dist * std::cos(angle); float y = caster->GetPositionY() + dist * std::sin(angle); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index 47a40dd56ef..38b587eacf7 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -80,7 +80,17 @@ public: struct boss_temple_guardian_anhuurAI : public BossAI { - boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR) { } + boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR) + { + Initialize(); + } + + void Initialize() + { + _phase = PHASE_FIRST_SHIELD; + _oldPhase = PHASE_FIRST_SHIELD; + _beacons = 0; + } void CleanStalkers() { @@ -95,9 +105,7 @@ public: void Reset() override { - _phase = PHASE_FIRST_SHIELD; - _oldPhase = PHASE_FIRST_SHIELD; - _beacons = 0; + Initialize(); _Reset(); CleanStalkers(); me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); @@ -378,7 +386,7 @@ public: { CustomSpellValues values; values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); - caster->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, values, GetTarget()); + caster->CastCustomSpell(GetSpellInfo()->GetEffect(caster, EFFECT_0)->TriggerSpell, values, GetTarget()); } } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index 4377344fb26..30a0e2441fb 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -65,6 +65,7 @@ class instance_halls_of_origination : public InstanceMapScript { case GO_ANHUURS_BRIDGE: AnhuursBridgeGUID = go->GetGUID(); + // no break case GO_DOODAD_ULDUM_ELEVATOR_COL01: case GO_VAULT_OF_LIGHTS_DOOR: case GO_DOODAD_ULDUM_LIGHTMACHINE_01: diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp index 189cc842d9b..919f8b43ce3 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp @@ -106,7 +106,7 @@ public: //THIS GOB IS A TRAP - What shall i do? =( //Cast it spell? Copyed Heigan method floorEruption->SendCustomAnim(floorEruption->GetGoAnimProgress()); - floorEruption->CastSpell(NULL, Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_10MAN_NORMAL ? 17731 : 69294); //pFloorEruption->GetGOInfo()->trap.spellId + floorEruption->CastSpell(NULL, Difficulty(instance->GetSpawnMode()) == DIFFICULTY_10_N ? 17731 : 69294); //pFloorEruption->GetGOInfo()->trap.spellId //Get all immediatly nearby floors std::list<GameObject*> nearFloorList; diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index e0b03d54f69..533d78a68f5 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -518,7 +518,7 @@ class spell_ooze_zap : public SpellScriptLoader SpellCastResult CheckRequirement() { - if (!GetCaster()->HasAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue())) + if (!GetCaster()->HasAura(GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue())) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; // This is actually correct if (!GetExplTargetUnit()) @@ -603,7 +603,7 @@ class spell_energize_aoe : public SpellScriptLoader { for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) { - if ((*itr)->GetTypeId() == TYPEID_PLAYER && (*itr)->ToPlayer()->GetQuestStatus(GetSpellInfo()->Effects[EFFECT_1].CalcValue()) == QUEST_STATUS_INCOMPLETE) + if ((*itr)->GetTypeId() == TYPEID_PLAYER && (*itr)->ToPlayer()->GetQuestStatus(GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()) == QUEST_STATUS_INCOMPLETE) ++itr; else targets.erase(itr++); diff --git a/src/server/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp index e4d5925c950..9f02e14220e 100644 --- a/src/server/scripts/Kalimdor/zone_felwood.cpp +++ b/src/server/scripts/Kalimdor/zone_felwood.cpp @@ -51,7 +51,7 @@ public: void Reset() override { - lasher_clicked = false; + lasherClicked = false; } void OnSpellClick(Unit* clicker, bool& result) override @@ -74,7 +74,7 @@ public: me->CastSpell(me, SPELL_STAND); me->GetMotionMaster()->MoveRandom(8.0f); events.ScheduleEvent(EVENT_CHECK_OOC, 20000); - lasher_clicked = true; + lasherClicked = true; if (Player* player = clicker->ToPlayer()) player->KilledMonsterCredit(NPC_WHISPERWIND_LASHER); @@ -82,7 +82,7 @@ public: void UpdateAI(uint32 diff) override { - if (!lasher_clicked) + if (!lasherClicked) return; events.Update(diff); @@ -104,7 +104,7 @@ public: private: EventMap events; - bool lasher_clicked; + bool lasherClicked = false; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp index 01baf54eef7..1cf0cc56242 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp @@ -241,7 +241,7 @@ class boss_corborus : public CreatureScript private: EncounterState stateIntro; - uint32 countTrashingCharge; + uint32 countTrashingCharge = 0; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp index 0535ac64a9f..08d56f2fa50 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -132,13 +132,11 @@ class boss_high_priestess_azil : public CreatureScript struct boss_high_priestess_azilAI : public BossAI { - boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL), vehicle(creature->GetVehicleKit()) + boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL) { - ASSERT(vehicle); + ASSERT(creature->GetVehicleKit()); } - Vehicle* vehicle; - void Reset() override { _Reset(); @@ -276,7 +274,7 @@ class boss_high_priestess_azil : public CreatureScript me->GetMotionMaster()->MovePoint(POINT_ABOVE_PLATFORM, AbovePlatformPos); break; case EVENT_EARTH_FURY_CHECK_SEAT0: - if (!vehicle->GetPassenger(0)) + if (!me->GetVehicleKit()->GetPassenger(0)) DoCast(SPELL_SEISMIC_SHARD_PREPARE); events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, 1800); break; @@ -318,7 +316,7 @@ class boss_high_priestess_azil : public CreatureScript } private: - uint8 countSeismicShard; + uint8 countSeismicShard = 3; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp index dc2fdb62d19..abfb82284d3 100644 --- a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp @@ -213,7 +213,7 @@ class npc_sc_millhouse_manastorm : public CreatureScript events.Update(diff); // Impending Doom is exception because it needs to be interrupted. - if (me->HasUnitState(UNIT_STATE_CASTING) && !me->GetCurrentSpell(SPELL_IMPENDING_DOOM)) + if (me->HasUnitState(UNIT_STATE_CASTING) && me->GetCurrentSpell(CURRENT_GENERIC_SPELL)->GetSpellInfo()->Id != SPELL_IMPENDING_DOOM_CHANNEL) return; while (uint32 eventId = events.ExecuteEvent()) diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 592d69c5c76..5b88cfb332b 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -142,7 +142,7 @@ public: // clone player->CastSpell(summon, SPELL_CLONE_PLAYER, true); // phase the summon - summon->SetInPhase(spellInfo->Effects[EFFECT_0].MiscValueB, true, true); + summon->SetInPhase(spellInfo->GetEffect(EFFECT_0)->MiscValueB, true, true); } } ++insanityHandled; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index c826b8fc9ef..f1d029e53e2 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -151,7 +151,7 @@ class boss_baltharus_the_warborn : public CreatureScript void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_10_N) { if (me->HealthBelowPctDamaged(50, damage) && _cloneCount == 1) DoAction(ACTION_CLONE); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index ee77671d83e..16cbcee562e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1499,8 +1499,8 @@ class spell_halion_damage_aoe_summon : public SpellScriptLoader { PreventHitDefaultEffect(effIndex); Unit* caster = GetCaster(); - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); + uint32 entry = uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValue); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValueB)); uint32 duration = uint32(GetSpellInfo()->GetDuration()); Position pos = caster->GetPosition(); @@ -1607,8 +1607,8 @@ class spell_halion_clear_debuffs : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { - if (GetHitUnit()->HasAura(GetSpellInfo()->Effects[effIndex].CalcValue())) - GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[effIndex].CalcValue()); + if (GetHitUnit()->HasAura(GetSpellInfo()->GetEffect(effIndex)->CalcValue())) + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->GetEffect(effIndex)->CalcValue()); } void Register() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 69dc25892c1..aa80295d83c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -837,10 +837,9 @@ class spell_impale : public SpellScriptLoader void HandleDamageCalc(SpellEffIndex /*effIndex*/) { Unit* target = GetHitUnit(); - uint32 permafrost = sSpellMgr->GetSpellIdForDifficulty(SPELL_PERMAFROST, target); // make sure Impale doesnt do damage if we are standing on permafrost - if (target && target->HasAura(permafrost)) + if (target && target->HasAura(SPELL_PERMAFROST)) SetHitDamage(0); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 2b541e4b972..b79e093a3e0 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -384,7 +384,7 @@ class boss_toc_champion_controller : public CreatureScript vOtherEntries.push_back(playerTeam == ALLIANCE ? NPC_HORDE_WARRIOR : NPC_ALLIANCE_WARRIOR); uint8 healersSubtracted = 2; - if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) + if (_instance->instance->GetSpawnMode() == DIFFICULTY_25_N || _instance->instance->GetSpawnMode() == DIFFICULTY_25_HC) healersSubtracted = 1; for (uint8 i = 0; i < healersSubtracted; ++i) { @@ -421,7 +421,7 @@ class boss_toc_champion_controller : public CreatureScript vHealersEntries.erase(vHealersEntries.begin() + pos); } - if (_instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || _instance->instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) + if (_instance->instance->GetSpawnMode() == DIFFICULTY_10_N || _instance->instance->GetSpawnMode() == DIFFICULTY_10_HC) for (uint8 i = 0; i < 4; ++i) vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1)); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 7e8653c4a55..25dc59acc34 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -494,7 +494,7 @@ class spell_mistress_kiss : public SpellScriptLoader bool Load() override { if (GetCaster()) - if (sSpellMgr->GetSpellIdForDifficulty(SPELL_MISTRESS_KISS_DAMAGE_SILENCE, GetCaster())) + if (sSpellMgr->GetSpellInfo(SPELL_MISTRESS_KISS_DAMAGE_SILENCE)) return true; return false; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index dec2f44745d..07eec388ca2 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -706,11 +706,11 @@ class spell_powering_up : public SpellScriptLoader bool Load() override { - spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_SURGE_OF_SPEED, GetCaster()); + spellId = SPELL_SURGE_OF_SPEED; if (!sSpellMgr->GetSpellInfo(spellId)) return false; - poweringUp = sSpellMgr->GetSpellIdForDifficulty(SPELL_POWERING_UP, GetCaster()); + poweringUp = SPELL_POWERING_UP; if (!sSpellMgr->GetSpellInfo(poweringUp)) return false; @@ -769,7 +769,7 @@ class spell_valkyr_essences : public SpellScriptLoader bool Load() override { - spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_SURGE_OF_SPEED, GetCaster()); + spellId = SPELL_SURGE_OF_SPEED; if (!sSpellMgr->GetSpellInfo(spellId)) return false; return true; @@ -781,57 +781,54 @@ class spell_valkyr_essences : public SpellScriptLoader { if (dmgInfo.GetSpellInfo()) { - if (uint32 poweringUp = sSpellMgr->GetSpellIdForDifficulty(SPELL_POWERING_UP, owner)) - { - if (urand(0, 99) < 5) - GetTarget()->CastSpell(GetTarget(), spellId, true); + if (urand(0, 99) < 5) + GetTarget()->CastSpell(GetTarget(), spellId, true); - // Twin Vortex part - uint32 lightVortex = sSpellMgr->GetSpellIdForDifficulty(SPELL_LIGHT_VORTEX_DAMAGE, owner); - uint32 darkVortex = sSpellMgr->GetSpellIdForDifficulty(SPELL_DARK_VORTEX_DAMAGE, owner); - int32 stacksCount = dmgInfo.GetSpellInfo()->Effects[EFFECT_0].CalcValue() / 1000 - 1; + // Twin Vortex part + uint32 lightVortex = SPELL_LIGHT_VORTEX_DAMAGE; + uint32 darkVortex = SPELL_DARK_VORTEX_DAMAGE; + int32 stacksCount = dmgInfo.GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue() / 1000 - 1; - if (lightVortex && darkVortex && stacksCount) + if (lightVortex && darkVortex && stacksCount) + { + if (dmgInfo.GetSpellInfo()->Id == darkVortex || dmgInfo.GetSpellInfo()->Id == lightVortex) { - if (dmgInfo.GetSpellInfo()->Id == darkVortex || dmgInfo.GetSpellInfo()->Id == lightVortex) + Aura* pAura = owner->GetAura(SPELL_POWERING_UP); + if (pAura) + { + pAura->ModStackAmount(stacksCount); + owner->CastSpell(owner, SPELL_POWERING_UP, true); + } + else { - Aura* pAura = owner->GetAura(poweringUp); - if (pAura) - { - pAura->ModStackAmount(stacksCount); - owner->CastSpell(owner, poweringUp, true); - } - else - { - owner->CastSpell(owner, poweringUp, true); - if (Aura* pTemp = owner->GetAura(poweringUp)) - pTemp->ModStackAmount(stacksCount); - } + owner->CastSpell(owner, SPELL_POWERING_UP, true); + if (Aura* pTemp = owner->GetAura(SPELL_POWERING_UP)) + pTemp->ModStackAmount(stacksCount); } } + } - // Picking floating balls - uint32 unleashedDark = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNLEASHED_DARK, owner); - uint32 unleashedLight = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNLEASHED_LIGHT, owner); + // Picking floating balls + uint32 unleashedDark = SPELL_UNLEASHED_DARK; + uint32 unleashedLight = SPELL_UNLEASHED_LIGHT; - if (unleashedDark && unleashedLight) + if (unleashedDark && unleashedLight) + { + if (dmgInfo.GetSpellInfo()->Id == unleashedDark || dmgInfo.GetSpellInfo()->Id == unleashedLight) { - if (dmgInfo.GetSpellInfo()->Id == unleashedDark || dmgInfo.GetSpellInfo()->Id == unleashedLight) + // need to do the things in this order, else players might have 100 charges of Powering Up without anything happening + Aura* pAura = owner->GetAura(SPELL_POWERING_UP); + if (pAura) + { + // 2 lines together add the correct amount of buff stacks + pAura->ModStackAmount(stacksCount); + owner->CastSpell(owner, SPELL_POWERING_UP, true); + } + else { - // need to do the things in this order, else players might have 100 charges of Powering Up without anything happening - Aura* pAura = owner->GetAura(poweringUp); - if (pAura) - { - // 2 lines together add the correct amount of buff stacks - pAura->ModStackAmount(stacksCount); - owner->CastSpell(owner, poweringUp, true); - } - else - { - owner->CastSpell(owner, poweringUp, true); - if (Aura* pTemp = owner->GetAura(poweringUp)) - pTemp->ModStackAmount(stacksCount); - } + owner->CastSpell(owner, SPELL_POWERING_UP, true); + if (Aura* pTemp = owner->GetAura(SPELL_POWERING_UP)) + pTemp->ModStackAmount(stacksCount); } } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index cb7e58cfe16..91da9ebd9be 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -274,7 +274,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript { EventStage = 6000; uint32 tributeChest = 0; - if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) + if (instance->GetSpawnMode() == DIFFICULTY_10_HC) { if (TrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_10H_99; @@ -291,7 +291,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript } } } - else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) + else if (instance->GetSpawnMode() == DIFFICULTY_25_HC) { if (TrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_25H_99; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index b91ca893955..f24ca7dd583 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -309,7 +309,7 @@ class spell_trollgore_invader_taunt : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) + if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue())) return false; return true; } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index a014be4369e..ebad98de91a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -89,7 +89,7 @@ class boss_falric : public CreatureScript || (_hopelessnessCount < 3 && me->HealthBelowPctDamaged(10, damage))) { if (_hopelessnessCount) - me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(HopelessnessHelper[_hopelessnessCount - 1], me)); + me->RemoveOwnedAura(HopelessnessHelper[_hopelessnessCount - 1]); DoCast(me, HopelessnessHelper[_hopelessnessCount]); ++_hopelessnessCount; } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index eeb05f44a71..c99ebddae37 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -2390,7 +2390,7 @@ class spell_hor_evasion : public SpellScriptLoader return; float angle = pos.GetAngle(&home); - float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float dist = GetSpellInfo()->GetEffect(EFFECT_0)->CalcRadius(GetCaster()); target->MovePosition(pos, dist, angle); dest.Relocate(pos); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 6053ff295a9..d289d494d62 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -553,8 +553,7 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader if (GetCaster()->GetTypeId() != TYPEID_PLAYER) return; - uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster()); - GetCaster()->RemoveAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->RemoveAura(SPELL_FRENZIED_BLOODTHIRST, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK); // Shadowmourne questline @@ -807,7 +806,7 @@ class spell_blood_queen_pact_of_the_darkfallen_dmg : public SpellScriptLoader void PeriodicTick(AuraEffect const* aurEff) { SpellInfo const* damageSpell = sSpellMgr->EnsureSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE); - int32 damage = damageSpell->Effects[EFFECT_0].CalcValue(); + int32 damage = damageSpell->GetEffect(EFFECT_0)->CalcValue(); float multiplier = 0.3375f + 0.1f * uint32(aurEff->GetTickNumber()/10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) damage = int32(damage * multiplier); GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index b1f6a4a5e83..008a89030a7 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -377,11 +377,7 @@ class spell_festergut_pungent_blight : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { - // Get Inhaled Blight id for our difficulty - uint32 blightId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); - - // ...and remove it - GetCaster()->RemoveAurasDueToSpell(blightId); + GetCaster()->RemoveAurasDueToSpell(uint32(GetEffectValue())); GetCaster()->ToCreature()->AI()->Talk(EMOTE_PUNGENT_BLIGHT); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 416c27b7353..080880608d6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -1847,7 +1847,7 @@ class spell_igb_rocket_pack : public SpellScriptLoader void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { SpellInfo const* damageInfo = sSpellMgr->EnsureSpellInfo(SPELL_ROCKET_PACK_DAMAGE); - GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->Effects[EFFECT_0].CalcValue() + aurEff->GetTickNumber() * aurEff->GetPeriod()), NULL, TRIGGERED_FULL_MASK); + GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->GetEffect(EFFECT_0)->CalcValue() + aurEff->GetTickNumber() * aurEff->GetPeriod()), NULL, TRIGGERED_FULL_MASK); GetTarget()->CastSpell(NULL, SPELL_ROCKET_BURST, TRIGGERED_FULL_MASK); } @@ -1977,7 +1977,7 @@ class spell_igb_periodic_trigger_with_power_cost : public SpellScriptLoader void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->GetEffect(EFFECT_0)->TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 3e78865c924..834b0aeb5e1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -288,7 +288,7 @@ class boss_lady_deathwhisper : public CreatureScript events.ScheduleEvent(EVENT_P1_SUMMON_WAVE, 5000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_P1_SHADOW_BOLT, urand(5500, 6000), 0, PHASE_ONE); events.ScheduleEvent(EVENT_P1_EMPOWER_CULTIST, urand(20000, 30000), 0, PHASE_ONE); - if (GetDifficulty() != RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() != DIFFICULTY_10_N) events.ScheduleEvent(EVENT_DOMINATE_MIND_H, 27000); Talk(SAY_AGGRO); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 2e360e19b75..3a66d3e1363 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -576,7 +576,7 @@ class spell_marrowgar_coldflame_damage : public SpellScriptLoader if (target->HasAura(SPELL_IMPALED)) return false; - if (target->GetExactDist2d(GetOwner()) > GetSpellInfo()->Effects[EFFECT_0].CalcRadius()) + if (target->GetExactDist2d(GetOwner()) > GetSpellInfo()->GetEffect(target, EFFECT_0)->CalcRadius()) return false; if (Aura* aur = target->GetAura(GetId())) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 8f5ca0b4322..d0bf573ba19 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -395,14 +395,14 @@ class boss_professor_putricide : public CreatureScript { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_CREATE_CONCOCTION); DoCast(me, SPELL_CREATE_CONCOCTION); - events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 100); + events.ScheduleEvent(EVENT_PHASE_TRANSITION, spell->CalcCastTime() + 100); break; } case PHASE_COMBAT_3: { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_GUZZLE_POTIONS); DoCast(me, SPELL_GUZZLE_POTIONS); - events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 100); + events.ScheduleEvent(EVENT_PHASE_TRANSITION, spell->CalcCastTime() + 100); break; } default: @@ -725,7 +725,7 @@ class npc_putricide_oozeAI : public ScriptedAI void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override { - if (!_newTargetSelectTimer && spell->Id == sSpellMgr->GetSpellIdForDifficulty(_hitTargetSpellId, me)) + if (!_newTargetSelectTimer && spell->Id == _hitTargetSpellId) _newTargetSelectTimer = 1000; } @@ -1031,7 +1031,7 @@ class spell_putricide_unstable_experiment : public SpellScriptLoader break; } - GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[stage].CalcValue()), true, NULL, NULL, GetCaster()->GetGUID()); + GetCaster()->CastSpell(target, uint32(GetSpellInfo()->GetEffect(stage)->CalcValue()), true, NULL, NULL, GetCaster()->GetGUID()); } void Register() override @@ -1057,11 +1057,10 @@ class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - uint32 adhesiveId = sSpellMgr->GetSpellIdForDifficulty(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()); - if (GetHitUnit()->HasAura(adhesiveId)) + if (GetHitUnit()->HasAura(SPELL_VOLATILE_OOZE_ADHESIVE)) { GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); - GetHitUnit()->RemoveAurasDueToSpell(adhesiveId, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetHitUnit()->RemoveAurasDueToSpell(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); } } @@ -1089,12 +1088,12 @@ class spell_putricide_choking_gas_bomb : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { uint32 skipIndex = urand(0, 2); - for (uint32 i = 0; i < 3; ++i) + for (SpellEffectInfo const* effect : GetSpellInfo()->GetEffectsForDifficulty(GetCaster()->GetMap()->GetDifficulty())) { - if (i == skipIndex) + if (!effect || effect->EffectIndex == skipIndex) continue; - uint32 spellId = uint32(GetSpellInfo()->Effects[i].CalcValue()); + uint32 spellId = uint32(effect->CalcValue()); GetCaster()->CastSpell(GetCaster(), spellId, true, NULL, NULL, GetCaster()->GetGUID()); } } @@ -1141,7 +1140,7 @@ class spell_putricide_unbound_plague : public SpellScriptLoader } - targets.remove_if(Trinity::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_UNBOUND_PLAGUE)); Trinity::Containers::RandomResizeList(targets, 1); } @@ -1154,15 +1153,13 @@ class spell_putricide_unbound_plague : public SpellScriptLoader if (!instance) return; - uint32 plagueId = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()); - - if (!GetHitUnit()->HasAura(plagueId)) + if (!GetHitUnit()->HasAura(SPELL_UNBOUND_PLAGUE)) { if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) { - if (Aura* oldPlague = GetCaster()->GetAura(plagueId, professor->GetGUID())) + if (Aura* oldPlague = GetCaster()->GetAura(SPELL_UNBOUND_PLAGUE, professor->GetGUID())) { - if (Aura* newPlague = professor->AddAura(plagueId, GetHitUnit())) + if (Aura* newPlague = professor->AddAura(SPELL_UNBOUND_PLAGUE, GetHitUnit())) { newPlague->SetMaxDuration(oldPlague->GetMaxDuration()); newPlague->SetDuration(oldPlague->GetDuration()); @@ -1258,11 +1255,10 @@ class spell_putricide_mutated_plague : public SpellScriptLoader if (!caster) return; - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + uint32 triggerSpell = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell; SpellInfo const* spell = sSpellMgr->GetSpellInfo(triggerSpell); - spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster); - int32 damage = spell->Effects[EFFECT_0].CalcValue(caster); + int32 damage = spell->GetEffect(EFFECT_0)->CalcValue(caster); float multiplier = 2.0f; if (GetTarget()->GetMap()->GetSpawnMode() & 1) multiplier = 3.0f; @@ -1275,13 +1271,13 @@ class spell_putricide_mutated_plague : public SpellScriptLoader void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - uint32 healSpell = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + uint32 healSpell = uint32(GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue()); SpellInfo const* healSpellInfo = sSpellMgr->GetSpellInfo(healSpell); if (!healSpellInfo) return; - int32 heal = healSpellInfo->Effects[0].CalcValue() * GetStackAmount(); + int32 heal = healSpellInfo->GetEffect(EFFECT_0)->CalcValue() * GetStackAmount(); GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, NULL, NULL, GetCasterGUID()); } @@ -1445,8 +1441,8 @@ class spell_putricide_mutated_transformation : public SpellScriptLoader return; } - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); + uint32 entry = uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValue); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValueB)); uint32 duration = uint32(GetSpellInfo()->GetDuration()); Position pos = caster->GetPosition(); @@ -1543,8 +1539,7 @@ class spell_putricide_clear_aura_effect_value : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - uint32 auraId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); - GetHitUnit()->RemoveAurasDueToSpell(auraId); + GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue()); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index d5c07fb6942..ee948789bc4 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -745,7 +745,7 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader if (!GetExplTargetDest()) return; - uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; + uint32 triggered_spell_id = GetSpellInfo()->GetEffect(effIndex)->TriggerSpell; float x, y, z; GetExplTargetDest()->GetPosition(x, y, z); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 8e659a746ed..ab19ffe7fed 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -409,10 +409,9 @@ class boss_sindragosa : public CreatureScript void SpellHitTarget(Unit* target, SpellInfo const* spell) override { - if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me)) - if (spellId == spell->Id) - if (Aura const* mysticBuffet = target->GetAura(spell->Id)) - _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount()); + if (spell->Id == 70127) + if (Aura const* mysticBuffet = target->GetAura(spell->Id)) + _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount()); } @@ -1546,7 +1545,7 @@ class spell_frostwarden_handler_focus_fire : public SpellScriptLoader PreventDefaultAction(); if (Unit* caster = GetCaster()) { - caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); + caster->AddThreat(GetTarget(), -float(GetSpellInfo()->GetEffect(caster, EFFECT_1)->CalcValue())); caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 03c26ba2e09..caba9ff5262 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -2437,7 +2437,7 @@ class spell_the_lich_king_summon_into_air : public SpellScriptLoader dest->RelocateOffset(offset); GetHitDest()->RelocateOffset(offset); // spirit bombs get higher - if (GetSpellInfo()->Effects[effIndex].MiscValue == NPC_SPIRIT_BOMB) + if (GetSpellInfo()->GetEffect(effIndex)->MiscValue == NPC_SPIRIT_BOMB) { dest->RelocateOffset(offset); GetHitDest()->RelocateOffset(offset); @@ -2641,7 +2641,7 @@ class spell_the_lich_king_vile_spirits : public SpellScriptLoader void OnPeriodic(AuraEffect const* aurEff) { if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) - GetTarget()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff, GetCasterGUID()); + GetTarget()->CastSpell((Unit*)NULL, aurEff->GetSpellEffectInfo()->TriggerSpell, true, NULL, aurEff, GetCasterGUID()); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 49e24f54b02..eebf5a2c2ea 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -1227,7 +1227,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1306,7 +1306,7 @@ class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1442,7 +1442,7 @@ class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader // return; if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, NULL, NULL, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index abe178a874d..ab7606f5e6f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -1799,7 +1799,7 @@ class spell_icc_sprit_alarm : public SpellScriptLoader { PreventHitDefaultEffect(effIndex); uint32 trapId = 0; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) + switch (GetSpellInfo()->GetEffect(effIndex)->MiscValue) { case EVENT_AWAKEN_WARD_1: trapId = GO_SPIRIT_ALARM_1; @@ -1838,7 +1838,7 @@ class spell_icc_sprit_alarm : public SpellScriptLoader void Register() override { - OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); + OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm_SpellScript::HandleEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 35402771494..90b252a47ce 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -80,7 +80,7 @@ public: Initialize(); - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_25_N) { Position pos; @@ -121,7 +121,7 @@ public: events.ScheduleEvent(EVENT_LOCUST, 90000); events.ScheduleEvent(EVENT_BERSERK, 600000); - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_10_N) events.ScheduleEvent(EVENT_SPAWN_GUARDIAN_NORMAL, urand(15000, 20000)); } @@ -160,7 +160,7 @@ public: case EVENT_IMPALE: //Cast Impale on a random target //Do NOT cast it when we are afflicted by locust swarm - if (!me->HasAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_LOCUST_SWARM, me))) + if (!me->HasAura(SPELL_LOCUST_SWARM)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_IMPALE); events.ScheduleEvent(EVENT_IMPALE, urand(10000, 20000)); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index dcb004cc3a0..568df379f15 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -192,7 +192,7 @@ class npc_faerlina_add : public CreatureScript void Reset() override { - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) { + if (GetDifficulty() == DIFFICULTY_10_N) { me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_BIND, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true); } @@ -200,7 +200,7 @@ class npc_faerlina_add : public CreatureScript void JustDied(Unit* /*killer*/) override { - if (_instance && GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (_instance && GetDifficulty() == DIFFICULTY_10_N) if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FAERLINA))) DoCast(faerlina, SPELL_WIDOWS_EMBRACE); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 39381f38d67..a70d354b966 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -259,7 +259,7 @@ class boss_gothik : public CreatureScript void DoGothikSummon(uint32 entry) { - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_25_N) { switch (entry) { @@ -421,9 +421,9 @@ class boss_gothik : public CreatureScript case EVENT_SUMMON: if (waves[waveCount].entry) { - if ((waves[waveCount].mode == 2) && (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)) + if ((waves[waveCount].mode == 2) && (GetDifficulty() == DIFFICULTY_25_N)) DoGothikSummon(waves[waveCount].entry); - else if ((waves[waveCount].mode == 0) && (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)) + else if ((waves[waveCount].mode == 0) && (GetDifficulty() == DIFFICULTY_10_N)) DoGothikSummon(waves[waveCount].entry); else if (waves[waveCount].mode == 1) DoGothikSummon(waves[waveCount].entry); @@ -443,9 +443,9 @@ class boss_gothik : public CreatureScript if (waves[waveCount].mode == 1) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); - else if ((waves[waveCount].mode == 2) && (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)) + else if ((waves[waveCount].mode == 2) && (GetDifficulty() == DIFFICULTY_25_N)) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); - else if ((waves[waveCount].mode == 0) && (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)) + else if ((waves[waveCount].mode == 0) && (GetDifficulty() == DIFFICULTY_10_N)) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); else events.ScheduleEvent(EVENT_SUMMON, 0); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 929c52a986c..ba54b5150e4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -194,7 +194,7 @@ class spell_grobbulus_poison_cloud : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->TriggerSpell)) return false; return true; } @@ -203,7 +203,7 @@ class spell_grobbulus_poison_cloud : public SpellScriptLoader { PreventDefaultAction(); - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + uint32 triggerSpell = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell; int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 87466b6bf41..8c927dcb0ac 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -30,26 +30,23 @@ EndScriptData */ #include "naxxramas.h" #include "Player.h" -enum Yells +enum Texts { - //when shappiron dies. dialog between kel and lich king (in this order) - SAY_SAPP_DIALOG1 = 0, //not used - SAY_SAPP_DIALOG2_LICH = 1, //not used - SAY_SAPP_DIALOG3 = 2, //not used - SAY_SAPP_DIALOG4_LICH = 3, //not used - SAY_SAPP_DIALOG5 = 4, //not used - SAY_CAT_DIED = 5, //when cat dies, not used - //when each of the 4 wing bosses dies - SAY_TAUNT = 6, SAY_AGGRO = 7, SAY_SLAY = 8, SAY_DEATH = 9, SAY_CHAIN = 10, SAY_FROST_BLAST = 11, SAY_REQUEST_AID = 12, //start of phase 3 - SAY_ANSWER_REQUEST = 13, //lich king answer + EMOTE_PHASE_TWO = 13, SAY_SUMMON_MINIONS = 14, //start of phase 1 - SAY_SPECIAL = 15 + SAY_SPECIAL = 15, + + // The Lich King + SAY_ANSWER_REQUEST = 3, + + // Old World Trigger + SAY_GUARDIAN_SPAWNED = 0 }; enum Events @@ -70,7 +67,10 @@ enum Events EVENT_TRIGGER, EVENT_PHASE, - EVENT_MORTAL_WOUND + EVENT_MORTAL_WOUND, + + EVENT_ANSWER_REQUEST, + EVENT_SUMMON_GUARDIANS }; enum Spells @@ -123,6 +123,13 @@ enum Spells SPELL_MORTAL_WOUND = 28467 }; +enum Phases +{ + PHASE_ONE = 1, // Players move in the circle and Kel'Thuzad spawns his minions. + PHASE_TWO = 2, // Starts on a timer. + PHASE_THREE = 3 // At 45% health. +}; + enum Creatures { NPC_WASTE = 16427, // Soldiers of the Frozen Wastes @@ -270,15 +277,11 @@ public: void Initialize() { nGuardiansOfIcecrownCount = 0; - uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3 - Phase = 0; nAbomination = 0; nWeaver = 0; } - uint32 Phase; - uint32 uiGuardiansOfIcecrownTimer; uint32 uiFaction; uint8 nGuardiansOfIcecrownCount; @@ -345,7 +348,6 @@ public: void EnterCombat(Unit* /*who*/) override { me->setFaction(uiFaction); - _EnterCombat(); for (uint8 i = 0; i <= 3; ++i) { @@ -354,10 +356,10 @@ public: } DoCast(me, SPELL_KELTHUZAD_CHANNEL, false); Talk(SAY_SUMMON_MINIONS); - Phase = 1; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); me->SetFloatValue(UNIT_FIELD_COMBATREACH, 4); me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 4); + events.SetPhase(PHASE_ONE); events.ScheduleEvent(EVENT_TRIGGER, 5000); events.ScheduleEvent(EVENT_WASTE, 15000); events.ScheduleEvent(EVENT_ABOMIN, 30000); @@ -365,6 +367,23 @@ public: events.ScheduleEvent(EVENT_PHASE, 228000); } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (events.IsInPhase(PHASE_TWO) && me->HealthBelowPctDamaged(45, damage)) + { + Talk(SAY_REQUEST_AID); + events.SetPhase(PHASE_THREE); + events.ScheduleEvent(EVENT_ANSWER_REQUEST, 4000); + + for (uint8 i = 0; i <= 3; ++i) + { + if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i))) + if (portal->getLootState() == GO_READY) + portal->UseDoorOrButton(); + } + } + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -372,7 +391,7 @@ public: events.Update(diff); - if (Phase == 1) + if (events.IsInPhase(PHASE_ONE)) { while (uint32 eventId = events.ExecuteEvent()) { @@ -405,6 +424,7 @@ public: case EVENT_PHASE: events.Reset(); Talk(SAY_AGGRO); + Talk(EMOTE_PHASE_TWO); spawns.DespawnAll(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); me->CastStop(); @@ -415,9 +435,9 @@ public: events.ScheduleEvent(EVENT_DETONATE, urand(30000, 40000)); events.ScheduleEvent(EVENT_FISSURE, urand(10000, 30000)); events.ScheduleEvent(EVENT_BLAST, urand(60000, 120000)); - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_25_N) events.ScheduleEvent(EVENT_CHAIN, urand(30000, 60000)); - Phase = 2; + events.SetPhase(PHASE_TWO); break; default: break; @@ -426,38 +446,6 @@ public: } else { - //start phase 3 when we are 45% health - if (Phase != 3) - { - if (HealthBelowPct(45)) - { - Phase = 3; - Talk(SAY_REQUEST_AID); - //here Lich King should respond to KelThuzad but I don't know which Creature to make talk - //so for now just make Kelthuzad says it. - Talk(SAY_ANSWER_REQUEST); - - for (uint8 i = 0; i <= 3; ++i) - { - if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i))) - if (portal->getLootState() == GO_READY) - portal->UseDoorOrButton(); - } - } - } - else if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4)) - { - if (uiGuardiansOfIcecrownTimer <= diff) - { - /// @todo Add missing text - if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)])) - guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2); - ++nGuardiansOfIcecrownCount; - uiGuardiansOfIcecrownTimer = 5000; - } - else uiGuardiansOfIcecrownTimer -= diff; - } - if (me->HasUnitState(UNIT_STATE_CASTING)) return; @@ -609,6 +597,18 @@ public: Talk(SAY_FROST_BLAST); events.Repeat(30000, 90000); break; + case EVENT_ANSWER_REQUEST: + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LICH_KING))) + lichKing->AI()->Talk(SAY_ANSWER_REQUEST); + events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000); + break; + case EVENT_SUMMON_GUARDIANS: + if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)])) + guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2); + ++nGuardiansOfIcecrownCount; + if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4)) + events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000); + break; default: break; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index fc376a5439f..cc7e38173c8 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -112,7 +112,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) { - target->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_WEB_SPRAY, me)); + target->RemoveAura(SPELL_WEB_SPRAY); uint8 pos = rand32() % MAX_POS_WRAP; target->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20); if (Creature* wrap = DoSummon(NPC_WEB_WRAP, PosWrap[pos], 0, TEMPSUMMON_CORPSE_DESPAWN)) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 0e07ff027f6..be4c8583377 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -106,7 +106,7 @@ public: events.ScheduleEvent(EVENT_BALCONY, 110000); events.ScheduleEvent(EVENT_CURSE, 10000 + rand32() % 15000); events.ScheduleEvent(EVENT_WARRIOR, 30000); - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_25_N) events.ScheduleEvent(EVENT_BLINK, urand(20000, 40000)); } } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index b66bc07f2c8..ce478cd0664 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -115,6 +115,7 @@ class instance_naxxramas : public InstanceMapScript minHorsemenDiedTime = 0; maxHorsemenDiedTime = 0; AbominationCount = 0; + CurrentWingTaunt = SAY_KELTHUZAD_FIRST_WING_TAUNT; playerDied = 0; } @@ -156,6 +157,9 @@ class instance_naxxramas : public InstanceMapScript case NPC_KEL_THUZAD: KelthuzadGUID = creature->GetGUID(); break; + case NPC_LICH_KING: + LichKingGUID = creature->GetGUID(); + break; default: break; } @@ -201,6 +205,9 @@ class instance_naxxramas : public InstanceMapScript case GO_KELTHUZAD_TRIGGER: KelthuzadTriggerGUID = go->GetGUID(); break; + case GO_ROOM_KELTHUZAD: + KelthuzadDoorGUID = go->GetGUID(); + break; default: break; } @@ -242,6 +249,15 @@ class instance_naxxramas : public InstanceMapScript playerDied = 1; SaveToDB(); } + + if (Creature* creature = unit->ToCreature()) + if (creature->GetEntry() == NPC_BIGGLESWORTH) + { + // Loads Kel'Thuzad's grid. We need this as he must be active in order for his texts to work. + instance->LoadGrid(3749.67f, -5114.06f); + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(SAY_KELTHUZAD_CAT_DIED); + } } void SetData(uint32 id, uint32 value) override @@ -327,6 +343,8 @@ class instance_naxxramas : public InstanceMapScript return PortalsGUID[3]; case DATA_KELTHUZAD_TRIGGER: return KelthuzadTriggerGUID; + case DATA_LICH_KING: + return LichKingGUID; } return ObjectGuid::Empty; @@ -337,18 +355,131 @@ class instance_naxxramas : public InstanceMapScript if (!InstanceScript::SetBossState(id, state)) return false; - if (id == BOSS_HORSEMEN && state == DONE) + switch (id) { - if (GameObject* horsemenChest = instance->GetGameObject(HorsemenChestGUID)) - { - horsemenChest->SetRespawnTime(horsemenChest->GetRespawnDelay()); - horsemenChest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } + case BOSS_MAEXXNA: + case BOSS_LOATHEB: + case BOSS_THADDIUS: + if (state == DONE) + events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000); + break; + case BOSS_GOTHIK: + if (state == DONE) + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_KORTHAZZ, 10000); + break; + case BOSS_HORSEMEN: + if (state == DONE) + { + if (GameObject* horsemenChest = instance->GetGameObject(HorsemenChestGUID)) + { + horsemenChest->SetRespawnTime(horsemenChest->GetRespawnDelay()); + horsemenChest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000); + } + break; + case BOSS_SAPPHIRON: + if (state == DONE) + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD, 6000); + break; + default: + break; } return true; } + void Update(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DIALOGUE_GOTHIK_KORTHAZZ: + if (Creature* korthazz = instance->GetCreature(ThaneGUID)) + korthazz->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_ZELIEK, 5000); + break; + case EVENT_DIALOGUE_GOTHIK_ZELIEK: + if (Creature* zeliek = instance->GetCreature(SirGUID)) + zeliek->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_BLAUMEUX, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_BLAUMEUX: + if (Creature* blaumeux = instance->GetCreature(LadyGUID)) + blaumeux->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_RIVENDARE, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_RIVENDARE: + if (Creature* rivendare = instance->GetCreature(BaronGUID)) + rivendare->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_BLAUMEUX2, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_BLAUMEUX2: + if (Creature* blaumeux = instance->GetCreature(LadyGUID)) + blaumeux->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN2); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_ZELIEK2, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_ZELIEK2: + if (Creature* zeliek = instance->GetCreature(SirGUID)) + zeliek->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN2); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_KORTHAZZ2, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_KORTHAZZ2: + if (Creature* korthazz = instance->GetCreature(ThaneGUID)) + korthazz->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN2); + events.ScheduleEvent(EVENT_DIALOGUE_GOTHIK_RIVENDARE2, 6000); + break; + case EVENT_DIALOGUE_GOTHIK_RIVENDARE2: + if (Creature* rivendare = instance->GetCreature(BaronGUID)) + rivendare->AI()->Talk(SAY_DIALOGUE_GOTHIK_HORSEMAN2); + break; + case EVENT_KELTHUZAD_WING_TAUNT: + // Loads Kel'Thuzad's grid. We need this as he must be active in order for his texts to work. + instance->LoadGrid(3749.67f, -5114.06f); + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(CurrentWingTaunt); + ++CurrentWingTaunt; + break; + case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD: + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD); + HandleGameObject(KelthuzadDoorGUID, false); + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING, 6000); + break; + case EVENT_DIALOGUE_SAPPHIRON_LICHKING: + if (Creature* lichKing = instance->GetCreature(LichKingGUID)) + lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING); + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2, 16000); + break; + case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2: + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2); + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING2, 9000); + break; + case EVENT_DIALOGUE_SAPPHIRON_LICHKING2: + if (Creature* lichKing = instance->GetCreature(LichKingGUID)) + lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING2); + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3, 12000); + break; + case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3: + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3); + events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4, 6000); + break; + case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4: + if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) + kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4); + HandleGameObject(KelthuzadDoorGUID, true); + break; + default: + break; + } + } + } + void HeiganErupt(uint32 section) { for (uint32 i = 0; i < 4; ++i) @@ -387,11 +518,11 @@ class instance_naxxramas : public InstanceMapScript switch (criteria_id) { case 7600: // Criteria for achievement 2176: And They Would All Go Down Together 15sec of each other 10-man - if (Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_10MAN_NORMAL && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15) + if (Difficulty(instance->GetSpawnMode()) == DIFFICULTY_10_N && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15) return true; return false; case 7601: // Criteria for achievement 2177: And They Would All Go Down Together 15sec of each other 25-man - if (Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_25MAN_NORMAL && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15) + if (Difficulty(instance->GetSpawnMode()) == DIFFICULTY_25_N && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15) return true; return false; // Difficulty checks are done on DB. @@ -450,10 +581,15 @@ class instance_naxxramas : public InstanceMapScript ObjectGuid KelthuzadGUID; ObjectGuid KelthuzadTriggerGUID; ObjectGuid PortalsGUID[4]; + ObjectGuid KelthuzadDoorGUID; + ObjectGuid LichKingGUID; uint8 AbominationCount; + uint8 CurrentWingTaunt; /* The Immortal / The Undying */ uint32 playerDied; + + EventMap events; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index 8325271a403..eb77980f3ba 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -71,6 +71,7 @@ enum Data64 DATA_KELTHUZAD_PORTAL03, DATA_KELTHUZAD_PORTAL04, DATA_KELTHUZAD_TRIGGER, + DATA_LICH_KING }; enum CreaturesIds @@ -89,7 +90,10 @@ enum CreaturesIds NPC_CRYPT_GUARD = 16573, NPC_NAXXRAMAS_FOLLOWER = 16505, NPC_FOLLOWER_WORSHIPPER = 16506, - NPC_DK_UNDERSTUDY = 16803 + NPC_DK_UNDERSTUDY = 16803, + NPC_BIGGLESWORTH = 16998, + NPC_LICH_KING = 16980, + NPC_OLD_WORLD_TRIGGER = 15384 }; enum GameObjectsIds @@ -142,6 +146,50 @@ enum SpellIds SPELL_SLIME = 28801 }; +enum InstanceEvents +{ + // Dialogue that happens after Gothik's death. + EVENT_DIALOGUE_GOTHIK_KORTHAZZ = 1, + EVENT_DIALOGUE_GOTHIK_ZELIEK, + EVENT_DIALOGUE_GOTHIK_BLAUMEUX, + EVENT_DIALOGUE_GOTHIK_RIVENDARE, + EVENT_DIALOGUE_GOTHIK_BLAUMEUX2, + EVENT_DIALOGUE_GOTHIK_ZELIEK2, + EVENT_DIALOGUE_GOTHIK_KORTHAZZ2, + EVENT_DIALOGUE_GOTHIK_RIVENDARE2, + + // Dialogue that happens after each wing. + EVENT_KELTHUZAD_WING_TAUNT, + + // Dialogue that happens after Sapphiron's death. + EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD, + EVENT_DIALOGUE_SAPPHIRON_LICHKING, + EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2, + EVENT_DIALOGUE_SAPPHIRON_LICHKING2, + EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3, + EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4 +}; + +enum InstanceTexts +{ + // The Four Horsemen + SAY_DIALOGUE_GOTHIK_HORSEMAN = 5, + SAY_DIALOGUE_GOTHIK_HORSEMAN2 = 6, + + // Kel'Thuzad + SAY_DIALOGUE_SAPPHIRON_KELTHUZAD = 0, + SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2 = 2, + SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3 = 4, + SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4 = 20, + + SAY_KELTHUZAD_CAT_DIED = 5, + SAY_KELTHUZAD_FIRST_WING_TAUNT = 16, + + // Lich King + SAY_DIALOGUE_SAPPHIRON_LICH_KING = 1, + SAY_DIALOGUE_SAPPHIRON_LICH_KING2 = 2 +}; + /* template<class AI> CreatureAI* GetNaxxramasAI(Creature* creature) diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 813e51ad23c..b4f27710e03 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -406,7 +406,7 @@ public: { _summonDeaths = value; - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_10_N) { if (_summonDeaths == MAX_SUMMONS_PHASE_TWO_10MAN) { @@ -414,7 +414,7 @@ public: DoAction(ACTION_HANDLE_P_THREE_INTRO); } } - else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + else if (GetDifficulty() == DIFFICULTY_25_N) { if (_summonDeaths == MAX_SUMMONS_PHASE_TWO_25MAN) { @@ -862,7 +862,7 @@ public: if (_arcaneReinforcements) { - for (uint8 rangeDisks = 0; rangeDisks < (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 5); rangeDisks++) + for (uint8 rangeDisks = 0; rangeDisks < (GetDifficulty() == DIFFICULTY_10_N ? 4 : 5); rangeDisks++) { Creature* casterDiskSummon = me->SummonCreature(NPC_HOVER_DISK_CASTER, RangeHoverDisksSpawnPositions[rangeDisks]); @@ -878,7 +878,7 @@ public: _arcaneReinforcements = false; - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_25_N) events.ScheduleEvent(EVENT_DELAYED_REINFORCEMENTS, 1*IN_MILLISECONDS, 0, PHASE_TWO); } break; @@ -958,7 +958,7 @@ public: SetPhase(PHASE_THREE, true); break; case EVENT_SURGE_OF_POWER_P_THREE: - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_10_N) { if (Unit* tempSurgeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, SPELL_RIDE_RED_DRAGON_BUDDY)) { @@ -975,7 +975,7 @@ public: } } } - else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + else if (GetDifficulty() == DIFFICULTY_25_N) { memset(_surgeTargetGUID, 0, sizeof(_surgeTargetGUID)); DoCastAOE(SPELL_SURGE_OF_POWER_WARNING_SELECTOR_25, true); @@ -1007,10 +1007,10 @@ public: Talk(SAY_DEATH); if (Creature* alexstraszaGiftBoxBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GIFT_BOX_BUNNY_GUID))) { - if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (GetDifficulty() == DIFFICULTY_10_N) alexstraszaGiftBoxBunny->SummonGameObject(GO_HEART_OF_MAGIC_10, HeartOfMagicSpawnPos.GetPositionX(), HeartOfMagicSpawnPos.GetPositionY(), HeartOfMagicSpawnPos.GetPositionZ(), HeartOfMagicSpawnPos.GetOrientation(), 0.0f, 0.0f, 0.0f, 1.0f, 0); - else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + else if (GetDifficulty() == DIFFICULTY_25_N) alexstraszaGiftBoxBunny->SummonGameObject(GO_HEART_OF_MAGIC_25, HeartOfMagicSpawnPos.GetPositionX(), HeartOfMagicSpawnPos.GetPositionY(), HeartOfMagicSpawnPos.GetPositionZ(), HeartOfMagicSpawnPos.GetOrientation(), 0.0f, 0.0f, 0.0f, 1.0f, 0); } @@ -1786,10 +1786,10 @@ class spell_malygos_arcane_storm : public SpellScriptLoader { // Resize list only to objects that are vehicles. IsCreatureVehicleCheck check(true); - Trinity::Containers::RandomResizeList(targets, check, (malygos->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 10)); + Trinity::Containers::RandomResizeList(targets, check, (malygos->GetMap()->GetDifficulty() == DIFFICULTY_10_N ? 4 : 10)); } else - Trinity::Containers::RandomResizeList(targets, (malygos->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 10)); + Trinity::Containers::RandomResizeList(targets, (malygos->GetMap()->GetDifficulty() == DIFFICULTY_10_N ? 4 : 10)); } void HandleVisual(SpellEffIndex /*effIndex*/) @@ -1948,7 +1948,7 @@ class spell_arcane_overload : public SpellScriptLoader { Creature* arcaneOverload = GetCaster()->ToCreature(); targets.remove_if(ExactDistanceCheck(arcaneOverload, - GetSpellInfo()->Effects[EFFECT_0].CalcRadius(arcaneOverload) * arcaneOverload->GetObjectScale())); + GetSpellInfo()->GetEffect(EFFECT_0)->CalcRadius(arcaneOverload) * arcaneOverload->GetObjectScale())); } void Register() override @@ -2475,9 +2475,9 @@ class spell_alexstrasza_gift_beam_visual : public SpellScriptLoader { if (Creature* target = GetTarget()->ToCreature()) { - if (target->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (target->GetMap()->GetDifficulty() == DIFFICULTY_10_N) _alexstraszaGift = target->SummonGameObject(GO_ALEXSTRASZA_S_GIFT_10, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); - else if (target->GetMap()->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + else if (target->GetMap()->GetDifficulty() == DIFFICULTY_25_N) _alexstraszaGift = target->SummonGameObject(GO_ALEXSTRASZA_S_GIFT_25, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); } } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 90decfbf46e..b689df3c977 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -92,14 +92,14 @@ public: platformGUID = go->GetGUID(); break; case GO_FOCUSING_IRIS_10: - if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (instance->GetDifficulty() == DIFFICULTY_10_N) { irisGUID = go->GetGUID(); focusingIrisPosition = go->GetPosition(); } break; case GO_FOCUSING_IRIS_25: - if (instance->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (instance->GetDifficulty() == DIFFICULTY_25_N) { irisGUID = go->GetGUID(); focusingIrisPosition = go->GetPosition(); @@ -110,11 +110,11 @@ public: exitPortalPosition = go->GetPosition(); break; case GO_HEART_OF_MAGIC_10: - if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) + if (instance->GetDifficulty() == DIFFICULTY_10_N) heartOfMagicGUID = go->GetGUID(); break; case GO_HEART_OF_MAGIC_25: - if (instance->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + if (instance->GetDifficulty() == DIFFICULTY_25_N) heartOfMagicGUID = go->GetGUID(); break; } @@ -240,7 +240,7 @@ public: PowerSparksHandling(); break; case DATA_RESPAWN_IRIS: - SpawnGameObject(instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? GO_FOCUSING_IRIS_10 : GO_FOCUSING_IRIS_25, focusingIrisPosition); + SpawnGameObject(instance->GetDifficulty() == DIFFICULTY_10_N ? GO_FOCUSING_IRIS_10 : GO_FOCUSING_IRIS_25, focusingIrisPosition); break; } } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 3f882e0b99e..b0c4be44ee8 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -418,7 +418,7 @@ class spell_oculus_ride_ruby_emerald_amber_drake_que : public SpellScriptLoader // caster of the triggered spell is wrong for an unknown reason, handle it here correctly PreventDefaultAction(); if (Unit* caster = GetCaster()) - GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); + GetTarget()->CastSpell(caster, aurEff->GetSpellEffectInfo()->TriggerSpell, true); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index fc29369c28f..86a19d16efb 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -28,7 +28,7 @@ EndScriptData */ #include "SpellScript.h" #include "halls_of_lightning.h" -enum Yells +enum Texts { SAY_INTRO_1 = 0, SAY_INTRO_2 = 1, @@ -51,6 +51,21 @@ enum Spells SPELL_PULSING_SHOCKWAVE_AURA = 59414 }; +enum Events +{ + EVENT_ARC_LIGHTNING = 1, + EVENT_LIGHTNING_NOVA, + EVENT_RESUME_PULSING_SHOCKWAVE, + EVENT_INTRO_DIALOGUE +}; + +enum Phases +{ + // Phases are used to allow executing the intro event while UpdateVictim() returns false and convenience. + PHASE_INTRO = 1, + PHASE_NORMAL +}; + enum Misc { ACHIEV_TIMELY_DEATH_START_EVENT = 20384 @@ -65,57 +80,41 @@ class boss_loken : public CreatureScript public: boss_loken() : CreatureScript("boss_loken") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_lokenAI>(creature); - } - - struct boss_lokenAI : public ScriptedAI + struct boss_lokenAI : public BossAI { - boss_lokenAI(Creature* creature) : ScriptedAI(creature) + boss_lokenAI(Creature* creature) : BossAI(creature, DATA_LOKEN) { Initialize(); - instance = creature->GetInstanceScript(); + _isIntroDone = false; } void Initialize() { - m_uiArcLightning_Timer = 15000; - m_uiLightningNova_Timer = 20000; - m_uiResumePulsingShockwave_Timer = 1000; - - m_uiHealthAmountModifier = 1; + _healthAmountModifier = 1; } - InstanceScript* instance; - - uint32 m_uiArcLightning_Timer; - uint32 m_uiLightningNova_Timer; - uint32 m_uiResumePulsingShockwave_Timer; - - uint32 m_uiHealthAmountModifier; - void Reset() override { Initialize(); - - instance->SetBossState(DATA_LOKEN, NOT_STARTED); + _Reset(); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } void EnterCombat(Unit* /*who*/) override { + _EnterCombat(); Talk(SAY_AGGRO); - - instance->SetBossState(DATA_LOKEN, IN_PROGRESS); + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15000); + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20000); + events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, 1000); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); - - instance->SetBossState(DATA_LOKEN, DONE); + _JustDied(); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA); } @@ -125,66 +124,89 @@ public: Talk(SAY_SLAY); } - void UpdateAI(uint32 uiDiff) override + void MoveInLineOfSight(Unit* who) override { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (m_uiResumePulsingShockwave_Timer) + if (!_isIntroDone && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40.0f)) { - if (m_uiResumePulsingShockwave_Timer <= uiDiff) - { - DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); - me->ClearUnitState(UNIT_STATE_CASTING); // this flag breaks movement - - DoCast(me, SPELL_PULSING_SHOCKWAVE, true); - m_uiResumePulsingShockwave_Timer = 0; - } - else - m_uiResumePulsingShockwave_Timer -= uiDiff; + _isIntroDone = true; + Talk(SAY_INTRO_1); + events.ScheduleEvent(EVENT_INTRO_DIALOGUE, 20000, 0, PHASE_INTRO); } + BossAI::MoveInLineOfSight(who); + } - if (m_uiArcLightning_Timer <= uiDiff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_ARC_LIGHTNING); + void UpdateAI(uint32 diff) override + { + if (events.IsInPhase(PHASE_NORMAL) && !UpdateVictim()) + return; - m_uiArcLightning_Timer = urand(15000, 16000); - } - else - m_uiArcLightning_Timer -= uiDiff; + events.Update(diff); - if (m_uiLightningNova_Timer <= uiDiff) + while (uint32 eventId = events.ExecuteEvent()) { - Talk(SAY_NOVA); - Talk(EMOTE_NOVA); - DoCast(me, SPELL_LIGHTNING_NOVA); - - me->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_PULSING_SHOCKWAVE, me)); - m_uiResumePulsingShockwave_Timer = DUNGEON_MODE(5000, 4000); // Pause Pulsing Shockwave aura - m_uiLightningNova_Timer = urand(20000, 21000); + switch (eventId) + { + case EVENT_ARC_LIGHTNING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_ARC_LIGHTNING); + events.ScheduleEvent(EVENT_ARC_LIGHTNING, urand(15000, 16000)); + break; + case EVENT_LIGHTNING_NOVA: + Talk(SAY_NOVA); + Talk(EMOTE_NOVA); + DoCastAOE(SPELL_LIGHTNING_NOVA); + me->RemoveAurasDueToSpell(SPELL_PULSING_SHOCKWAVE); + events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, DUNGEON_MODE(5000, 4000)); // Pause Pulsing Shockwave aura + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, urand(20000, 21000)); + break; + case EVENT_RESUME_PULSING_SHOCKWAVE: + DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); + me->ClearUnitState(UNIT_STATE_CASTING); // This flag breaks movement. + DoCast(me, SPELL_PULSING_SHOCKWAVE, true); + break; + case EVENT_INTRO_DIALOGUE: + Talk(SAY_INTRO_2); + events.SetPhase(PHASE_NORMAL); + break; + default: + break; + } } - else - m_uiLightningNova_Timer -= uiDiff; - // Health check - if (HealthBelowPct(100 - 25 * m_uiHealthAmountModifier)) + DoMeleeAttackIfReady(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(100 - 25 * _healthAmountModifier, damage)) { - switch (m_uiHealthAmountModifier) + switch (_healthAmountModifier) { - case 1: Talk(SAY_75HEALTH); break; - case 2: Talk(SAY_50HEALTH); break; - case 3: Talk(SAY_25HEALTH); break; + case 1: + Talk(SAY_75HEALTH); + break; + case 2: + Talk(SAY_50HEALTH); + break; + case 3: + Talk(SAY_25HEALTH); + break; + default: + break; } - - ++m_uiHealthAmountModifier; + ++_healthAmountModifier; } - - DoMeleeAttackIfReady(); } + + private: + uint32 _healthAmountModifier; + bool _isIntroDone; }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_lokenAI>(creature); + } }; class spell_loken_pulsing_shockwave : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index d63d5e87923..3a707e7fa70 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -428,7 +428,7 @@ public: void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) override { // This is the dummy effect of the spells - if (pSpell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_SHATTER, me)) + if (pSpell->Id == SPELL_SHATTER) if (me->GetEntry() == NPC_BRITTLE_GOLEM) me->DespawnOrUnsummon(); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index 07cdfa3353c..d911bf07439 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -182,7 +182,7 @@ class spell_krystallus_shatter_effect : public SpellScriptLoader if (!GetHitUnit()) return; - float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float radius = GetSpellInfo()->GetEffect(EFFECT_0)->CalcRadius(GetCaster()); if (!radius) return; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index bb7a8592e04..41da9ec09ea 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -615,7 +615,7 @@ class boss_stormcaller_brundir : public CreatureScript break; case EVENT_GROUND: //me->SetLevitate(false); - me->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_LIGHTNING_TENDRILS, me)); + me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS); me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_VISUAL); DoStartMovement(me->GetVictim()); events.CancelEvent(EVENT_GROUND); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 40c189a8da2..b6ac62257d0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -1793,7 +1793,7 @@ class spell_vehicle_throw_passenger : public SpellScriptLoader } } } - if (target && target->IsWithinDist2d(targets.GetDstPos(), GetSpellInfo()->Effects[effIndex].CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct + if (target && target->IsWithinDist2d(targets.GetDstPos(), GetSpellInfo()->GetEffect(effIndex)->CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct passenger->EnterVehicle(target, 0); else { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 93fee8d1964..5952c9f8501 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -1583,7 +1583,7 @@ class spell_freya_iron_roots : public SpellScriptLoader void HandleSummon(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); + uint32 entry = uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValue); Position pos = GetCaster()->GetPosition(); // Not good at all, but this prevents having roots in a different position then player diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 419052baddc..5ac0024c032 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -454,11 +454,11 @@ class spell_ulduar_cancel_stone_grip : public SpellScriptLoader switch (target->GetMap()->GetDifficulty()) { - case RAID_DIFFICULTY_10MAN_NORMAL: - target->RemoveAura(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + case DIFFICULTY_10_N: + target->RemoveAura(GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue()); break; - case RAID_DIFFICULTY_25MAN_NORMAL: - target->RemoveAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); + case DIFFICULTY_25_N: + target->RemoveAura(GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()); break; default: break; @@ -534,7 +534,7 @@ class spell_ulduar_stone_grip_absorb : public SpellScriptLoader if (!GetOwner()->ToCreature()) return; - uint32 rubbleStalkerEntry = (GetOwner()->GetMap()->GetDifficulty() == DUNGEON_DIFFICULTY_NORMAL ? 33809 : 33942); + uint32 rubbleStalkerEntry = (GetOwner()->GetMap()->GetDifficulty() == DIFFICULTY_NORMAL ? 33809 : 33942); Creature* rubbleStalker = GetOwner()->FindNearestCreature(rubbleStalkerEntry, 200.0f, true); if (rubbleStalker) rubbleStalker->CastSpell(rubbleStalker, SPELL_STONE_GRIP_CANCEL, true); @@ -643,7 +643,7 @@ class spell_kologarn_summon_focused_eyebeam : public SpellScriptLoader void HandleForceCast(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true); + GetCaster()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index cad6b045120..947b1ce9b86 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -237,7 +237,7 @@ class boss_razorscale_controller : public CreatureScript { case ACTION_HARPOON_BUILD: events.ScheduleEvent(EVENT_BUILD_HARPOON_1, 50000); - if (me->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_25MAN_NORMAL) + if (me->GetMap()->GetSpawnMode() == DIFFICULTY_25_N) events.ScheduleEvent(EVENT_BUILD_HARPOON_3, 90000); break; case ACTION_PLACE_BROKEN_HARPOON: @@ -1075,7 +1075,7 @@ class spell_razorscale_devouring_flame : public SpellScriptLoader { PreventHitDefaultEffect(effIndex); Unit* caster = GetCaster(); - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); + uint32 entry = uint32(GetSpellInfo()->GetEffect(effIndex)->MiscValue); WorldLocation const* summonLocation = GetExplTargetDest(); if (!caster || !summonLocation) return; 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/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index d49a23c85dd..1e55eb37007 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -572,8 +572,8 @@ public: void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override { if (me->GetCurrentSpell(CURRENT_GENERIC_SPELL)) - for (uint8 i = 0; i < 3; ++i) - if (spell->Effects[i].Effect == SPELL_EFFECT_INTERRUPT_CAST) + for (SpellEffectInfo const* effect : spell->GetEffectsForDifficulty(me->GetMap()->GetDifficulty())) + if (effect->Effect == SPELL_EFFECT_INTERRUPT_CAST) if (me->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == SPELL_SOUL_SHOCK || me->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == SPELL_DEADEN) me->InterruptSpell(CURRENT_GENERIC_SPELL, false); 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/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index 2cee741cbf3..a3404e048ce 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -317,7 +317,7 @@ class spell_gruul_shatter_effect : public SpellScriptLoader if (!GetHitUnit()) return; - float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float radius = GetSpellInfo()->GetEffect(EFFECT_0)->CalcRadius(GetCaster()); if (!radius) return; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index a0673d4aced..c0a7f85cb63 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -154,7 +154,7 @@ class spell_broggok_poison_cloud : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->TriggerSpell)) return false; return true; } @@ -163,7 +163,7 @@ class spell_broggok_poison_cloud : public SpellScriptLoader { PreventDefaultAction(); - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + uint32 triggerSpell = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell; int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index cd433000e8e..7e30ae1a931 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -542,7 +542,7 @@ class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader return; Unit* target = GetUnitOwner(); - target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false); + target->CastSpell(target, GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(), false); } void Register() override diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 0ff7d116a88..cc96b27cb0a 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -89,7 +89,7 @@ class spell_dk_anti_magic_shell_raid : public SpellScriptLoader bool Load() override { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster()); return true; } @@ -138,8 +138,8 @@ class spell_dk_anti_magic_shell_self : public SpellScriptLoader uint32 absorbPct, hpPct; bool Load() override { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - hpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); + absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster()); + hpPct = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(GetCaster()); return true; } @@ -203,7 +203,7 @@ class spell_dk_anti_magic_zone : public SpellScriptLoader bool Load() override { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster()); return true; } @@ -217,7 +217,7 @@ class spell_dk_anti_magic_zone : public SpellScriptLoader void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) { SpellInfo const* talentSpell = sSpellMgr->EnsureSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT); - amount = talentSpell->Effects[EFFECT_0].CalcValue(GetCaster()); + amount = talentSpell->GetEffect(EFFECT_0)->CalcValue(GetCaster()); if (Player* player = GetCaster()->ToPlayer()) amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK)); } @@ -628,7 +628,7 @@ class spell_dk_death_strike : public SpellScriptLoader if (AuraEffect* enabler = GetCaster()->GetAuraEffect(SPELL_DK_DEATH_STRIKE_ENABLER, EFFECT_0, GetCaster()->GetGUID())) { // Call CalculateAmount() to constantly fire the AuraEffect's HandleCalcAmount method - int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetSpellInfo()->Effects[EFFECT_0].ChainAmplitude); + int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetSpellInfo()->GetEffect(EFFECT_0)->ChainAmplitude); if (AuraEffect const* aurEff = GetCaster()->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_DEATH_STRIKE, EFFECT_2)) heal = AddPct(heal, aurEff->GetAmount()); @@ -1045,7 +1045,7 @@ class spell_dk_pestilence : public SpellScriptLoader { aurEffNew->SetCritChance(critChance); // Blood Plague can crit if caster has T9. aurEffNew->SetDonePct(donePct); - aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT) * donePct); + aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT, aurEffNew->GetSpellEffectInfo()) * donePct); } } } @@ -1064,7 +1064,7 @@ class spell_dk_pestilence : public SpellScriptLoader if (AuraEffect* aurEffNew = aurNew->GetEffect(EFFECT_0)) { aurEffNew->SetDonePct(donePct); - aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT) * donePct); + aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT, aurEffNew->GetSpellEffectInfo()) * donePct); } } } @@ -1231,12 +1231,13 @@ class spell_dk_raise_dead : public SpellScriptLoader private: bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue()) - || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_2].CalcValue()) + // 6.x effects changed + /*if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_1)->CalcValue()) + || !sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_2)->CalcValue()) || !sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT) || !sSpellMgr->GetSpellInfo(SPELL_DK_MASTER_OF_GHOULS)) - return false; - return true; + return false;*/ + return false; } bool Load() override @@ -1314,10 +1315,10 @@ class spell_dk_raise_dead : public SpellScriptLoader // Do we have talent Master of Ghouls? if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS)) // summon as pet - return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + return GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue(); // or guardian - return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + return GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(); } void HandleRaiseDead(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 184e12cdccb..c38d6b07124 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -148,8 +148,6 @@ class spell_dru_eclipse_energize : public SpellScriptLoader { PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); - int32 energizeAmount; - bool Load() override { if (GetCaster()->GetTypeId() != TYPEID_PLAYER) @@ -158,8 +156,6 @@ class spell_dru_eclipse_energize : public SpellScriptLoader if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) return false; - energizeAmount = 0; - return true; } @@ -175,7 +171,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader { case SPELL_DRUID_WRATH: { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 + int32 energizeAmount = -GetEffectValue(); // -13 // If we are set to fill the lunar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) @@ -192,7 +188,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader } case SPELL_DRUID_STARFIRE: { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 + int32 energizeAmount = GetEffectValue(); // 20 // If we are set to fill the solar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) @@ -213,7 +209,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 + int32 energizeAmount = GetEffectValue(); // 15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura @@ -222,7 +218,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader } else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 + int32 energizeAmount = -GetEffectValue(); // -15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura @@ -430,7 +426,7 @@ class spell_dru_idol_lifebloom : public SpellScriptLoader spellMod->op = SPELLMOD_DOT; spellMod->type = SPELLMOD_FLAT; spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; + spellMod->mask = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->SpellClassMask; } spellMod->value = aurEff->GetAmount() / 7; } @@ -536,8 +532,8 @@ class spell_dru_lifebloom : public SpellScriptLoader int32 healAmount = aurEff->GetAmount(); if (Unit* caster = GetCaster()) { - healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack); - healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack); + healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), stack); + healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), stack); GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); @@ -560,8 +556,8 @@ class spell_dru_lifebloom : public SpellScriptLoader int32 healAmount = aurEff->GetAmount(); if (Unit* caster = GetCaster()) { - healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); - healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); + healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), dispelInfo->GetRemovedCharges()); + healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), dispelInfo->GetRemovedCharges()); target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); // restore mana @@ -757,7 +753,7 @@ class spell_dru_savage_defense : public SpellScriptLoader bool Load() override { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster()); return true; } @@ -1191,7 +1187,7 @@ class spell_dru_wild_growth : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (spellInfo->Effects[EFFECT_2].IsEffect() || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) + if (spellInfo->GetEffect(EFFECT_2)->IsEffect() || spellInfo->GetEffect(EFFECT_2)->CalcValue() <= 0) return false; return true; } @@ -1200,7 +1196,7 @@ class spell_dru_wild_growth : public SpellScriptLoader { targets.remove_if(RaidCheck(GetCaster())); - uint32 const maxTargets = uint32(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster())); + uint32 const maxTargets = uint32(GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue(GetCaster())); if (targets.size() > maxTargets) { diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index badb19c12c3..87619460ee7 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -59,7 +59,7 @@ class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader bool Load() override { // Max absorb stored in 1 dummy effect - limit = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + limit = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(); return true; } @@ -207,9 +207,9 @@ class spell_gen_alchemist_stone : public SpellScriptLoader uint32 spellId = 0; int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 0.4f); - if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_HEAL)) + if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_HEAL)) spellId = ALECHEMIST_STONE_HEAL; - else if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_ENERGIZE)) + else if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_ENERGIZE)) spellId = ALECHEMIST_STONE_MANA; if (!spellId) @@ -1180,13 +1180,14 @@ class spell_gen_defend : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) - return false; - return true; + // 6.x effects changed + //if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) + // return false; + //if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) + // return false; + //if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) + // return false; + return false; } void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) @@ -1222,23 +1223,24 @@ class spell_gen_defend : public SpellScriptLoader { SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(m_scriptSpellId); + // 6.x effects removed + // Defend spells cast by NPCs (add visuals) - if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + /*if (spell->GetEffect(EFFECT_0)->ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) { AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - + }*/ // Remove Defend spell from player when he dismounts - if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + //if (spell->GetEffect(EFFECT_2)->ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + // OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); // Defend spells cast by players (add/remove visuals) - if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) + /*if (spell->GetEffect(EFFECT_1)->ApplyAuraName == SPELL_AURA_DUMMY) { AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } + }*/ } }; @@ -1264,7 +1266,7 @@ class spell_gen_despawn_self : public SpellScriptLoader void HandleDummy(SpellEffIndex effIndex) { - if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) + if (GetSpellInfo()->GetEffect(effIndex)->Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->GetEffect(effIndex)->Effect == SPELL_EFFECT_SCRIPT_EFFECT) GetCaster()->ToCreature()->DespawnOrUnsummon(); } @@ -1945,10 +1947,10 @@ class spell_gen_mounted_charge: public SpellScriptLoader { SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(m_scriptSpellId); - if (spell->HasEffect(SPELL_EFFECT_SCRIPT_EFFECT)) + if (spell->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_SCRIPT_EFFECT)) OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); - if (spell->Effects[EFFECT_0].Effect == SPELL_EFFECT_CHARGE) + if (spell->GetEffect(EFFECT_0)->Effect == SPELL_EFFECT_CHARGE) OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleChargeEffect, EFFECT_0, SPELL_EFFECT_CHARGE); } }; @@ -2426,8 +2428,8 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader void HandleDummy(SpellEffIndex effIndex) { Player* player = GetCaster()->ToPlayer(); - uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); - int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + uint32 factionId = GetSpellInfo()->GetEffect(effIndex)->CalcValue(); + int32 repChange = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(); FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); if (!factionEntry) @@ -3845,7 +3847,7 @@ public: void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - if (GetCaster()->HasAura(SPELL_MIXOLOGY) && GetCaster()->HasSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell)) + if (GetCaster()->HasAura(SPELL_MIXOLOGY) && GetCaster()->HasSpell(GetSpellInfo()->GetEffect(EFFECT_0)->TriggerSpell)) { switch (GetId()) { diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index 5c84f3045f8..a5eec35d95b 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -691,7 +691,7 @@ class spell_brewfest_relay_race_intro_force_player_to_throw : public SpellScript PreventHitDefaultEffect(effIndex); // All this spells trigger a spell that requires reagents; if the // triggered spell is cast as "triggered", reagents are not consumed - GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); + GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); } void Register() override diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index f8ef7862c35..9f7f0dc4a5b 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -231,42 +231,6 @@ class spell_hun_disengage : public SpellScriptLoader } }; -// 82926 - Fire! -class spell_hun_fire : public SpellScriptLoader -{ - public: - spell_hun_fire() : SpellScriptLoader("spell_hun_fire") { } - - class spell_hun_fire_AuraScript : public AuraScript - { - PrepareAuraScript(spell_hun_fire_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (!spellMod) - { - spellMod = new SpellModifier(GetAura()); - spellMod->op = SPELLMOD_CASTING_TIME; - spellMod->type = SPELLMOD_PCT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - - spellMod->value = -aurEff->GetAmount(); - } - - void Register() override - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_hun_fire_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hun_fire_AuraScript(); - } -}; - // -19572 - Improved Mend Pet class spell_hun_improved_mend_pet : public SpellScriptLoader { @@ -308,42 +272,6 @@ class spell_hun_improved_mend_pet : public SpellScriptLoader } }; -// -19464 Improved Serpent Sting -class spell_hun_improved_serpent_sting : public SpellScriptLoader -{ - public: - spell_hun_improved_serpent_sting() : SpellScriptLoader("spell_hun_improved_serpent_sting") { } - - class spell_hun_improved_serpent_sting_AuraScript : public AuraScript - { - PrepareAuraScript(spell_hun_improved_serpent_sting_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (!spellMod) - { - spellMod = new SpellModifier(GetAura()); - spellMod->op = SpellModOp(aurEff->GetMiscValue()); - spellMod->type = SPELLMOD_PCT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - - spellMod->value = aurEff->GetAmount(); - } - - void Register() override - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_hun_improved_serpent_sting_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hun_improved_serpent_sting_AuraScript(); - } -}; - // 53412 - Invigoration class spell_hun_invigoration : public SpellScriptLoader { @@ -430,7 +358,7 @@ class spell_hun_masters_call : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || - !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) + !sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue())) return false; return true; } @@ -1087,9 +1015,7 @@ void AddSC_hunter_spell_scripts() new spell_hun_chimera_shot(); new spell_hun_cobra_shot(); new spell_hun_disengage(); - new spell_hun_fire(); new spell_hun_improved_mend_pet(); - new spell_hun_improved_serpent_sting(); new spell_hun_invigoration(); new spell_hun_last_stand_pet(); new spell_hun_masters_call(); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 17c72ba5561..baf7ff48cb5 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -221,7 +221,7 @@ class spell_mage_blast_wave : public SpellScriptLoader } private: - uint32 _targetCount; + uint32 _targetCount = 0; }; SpellScript* GetSpellScript() const override @@ -497,7 +497,7 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { - Unit* target = GetTarget(); + /*Unit* target = GetTarget(); if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) { int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET @@ -510,7 +510,7 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader absorbAmount = 0; PreventDefaultAction(); } - } + }*/ } void Register() override @@ -738,7 +738,7 @@ class spell_mage_living_bomb : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) { - if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->Effects[EFFECT_1].CalcValue()))) + if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->GetEffect(EFFECT_1)->CalcValue()))) return false; return true; } @@ -780,7 +780,7 @@ class spell_mage_ice_barrier : public SpellScriptLoader { canBeRecalculated = false; if (Unit* caster = GetCaster()) - amount += int32(0.87f * caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask())); + amount += int32(4.95f * caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask())); } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -836,7 +836,7 @@ class spell_mage_ignite : public SpellScriptLoader SpellInfo const* igniteDot = sSpellMgr->EnsureSpellInfo(SPELL_MAGE_IGNITE); int32 pct = 8 * GetSpellInfo()->GetRank(); - int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); + int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks(DIFFICULTY_NONE)); amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); } @@ -1078,12 +1078,6 @@ class spell_mage_polymorph : public SpellScriptLoader return true; } - bool Load() override - { - _caster = NULL; - return true; - } - bool DoCheck(ProcEventInfo& eventInfo) { _caster = GetCaster(); @@ -1111,7 +1105,7 @@ class spell_mage_polymorph : public SpellScriptLoader } private: - Unit* _caster; + Unit* _caster = nullptr; }; AuraScript* GetAuraScript() const override @@ -1254,7 +1248,7 @@ class spell_mage_ring_of_frost : public SpellScriptLoader void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { std::list<Creature*> MinionList; - GetTarget()->GetAllMinionsByEntry(MinionList, GetSpellInfo()->Effects[EFFECT_0].MiscValue); + GetTarget()->GetAllMinionsByEntry(MinionList, GetSpellInfo()->GetEffect(EFFECT_0)->MiscValue); // Get the last summoned RoF, save it and despawn older ones for (std::list<Creature*>::iterator itr = MinionList.begin(); itr != MinionList.end(); itr++) @@ -1313,7 +1307,7 @@ class spell_mage_ring_of_frost_freeze : public SpellScriptLoader void FilterTargets(std::list<WorldObject*>& targets) { - float outRadius = sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->Effects[EFFECT_0].CalcRadius(); + float outRadius = sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->CalcRadius(); float inRadius = 4.7f; for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) @@ -1456,7 +1450,7 @@ class spell_mage_water_elemental_freeze : public SpellScriptLoader } private: - bool _didHit; + bool _didHit = false; }; SpellScript* GetSpellScript() const diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 1dab620a9c7..f4afee89d6f 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -401,62 +401,6 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader } }; -// 64205 - Divine Sacrifice -class spell_pal_divine_sacrifice : public SpellScriptLoader -{ - public: - spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { } - - class spell_pal_divine_sacrifice_AuraScript : public AuraScript - { - PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript); - - uint32 groupSize, minHpPct; - int32 remainingAmount; - - bool Load() override - { - - if (Unit* caster = GetCaster()) - { - if (caster->GetTypeId() == TYPEID_PLAYER) - { - if (caster->ToPlayer()->GetGroup()) - groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); - else - groupSize = 1; - } - else - return false; - - remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); - minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); - return true; - } - return false; - } - - void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) - { - remainingAmount -= splitAmount; - // break when absorbed everything it could, or if the casters hp drops below 20% - if (Unit* caster = GetCaster()) - if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct)) - caster->RemoveAura(SPELL_PALADIN_DIVINE_SACRIFICE); - } - - void Register() override - { - OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_pal_divine_sacrifice_AuraScript(); - } -}; - // 53385 - Divine Storm class spell_pal_divine_storm : public SpellScriptLoader { @@ -485,7 +429,7 @@ class spell_pal_divine_storm : public SpellScriptLoader bool Load() override { - healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); + healPct = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(GetCaster()); return true; } @@ -1279,7 +1223,6 @@ void AddSC_paladin_spell_scripts() new spell_pal_avenging_wrath(); new spell_pal_beacon_of_light(); new spell_pal_blessing_of_faith(); - new spell_pal_divine_sacrifice(); new spell_pal_divine_storm(); new spell_pal_divine_storm_dummy(); new spell_pal_exorcism_and_holy_wrath_damage(); diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp index 9fd55ae057e..042f1c321ee 100644 --- a/src/server/scripts/Spells/spell_pet.cpp +++ b/src/server/scripts/Spells/spell_pet.cpp @@ -915,7 +915,7 @@ public: if (itr != pet->ToPet()->m_spells.end()) // If pet has Wild Hunt { SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first); // Then get the SpellProto and add the dummy effect value - AddPct(mod, spellInfo->Effects[EFFECT_0].CalcValue()); + AddPct(mod, spellInfo->GetEffect(EFFECT_0)->CalcValue()); } ownerBonus = owner->GetStat(STAT_STAMINA)*mod; @@ -958,7 +958,7 @@ public: if (itr != pet->ToPet()->m_spells.end()) // If pet has Wild Hunt { SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first); // Then get the SpellProto and add the dummy effect value - mod += CalculatePct(1.0f, spellInfo->Effects[EFFECT_1].CalcValue()); + mod += CalculatePct(1.0f, spellInfo->GetEffect(EFFECT_1)->CalcValue()); } bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.22f * mod; @@ -988,7 +988,7 @@ public: if (itr != pet->ToPet()->m_spells.end()) // If pet has Wild Hunt { SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first); // Then get the SpellProto and add the dummy effect value - mod += CalculatePct(1.0f, spellInfo->Effects[EFFECT_1].CalcValue()); + mod += CalculatePct(1.0f, spellInfo->GetEffect(EFFECT_1)->CalcValue()); } bonusDamage = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f * mod; @@ -1450,7 +1450,7 @@ public: amount = -90; // Night of the dead else if (Aura* aur = owner->GetAuraOfRankedSpell(SPELL_NIGHT_OF_THE_DEAD)) - amount = aur->GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + amount = aur->GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue(); } } } @@ -1502,7 +1502,7 @@ public: // Ravenous Dead. Check just if owner has Ravenous Dead since it's effect is not an aura if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0)) - mod += aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue()/100; // Ravenous Dead edits the original scale + mod += aurEff->GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()/100; // Ravenous Dead edits the original scale // Glyph of the Ghoul if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_DEATH_KNIGHT_GLYPH_OF_GHOUL, 0)) @@ -1547,7 +1547,7 @@ public: aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); if (aurEff) { - mod += CalculatePct(mod, aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale + mod += CalculatePct(mod, aurEff->GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()); // Ravenous Dead edits the original scale } // Glyph of the Ghoul aurEff = owner->GetAuraEffect(58686, 0); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 8ec5450072f..77386808136 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -369,7 +369,7 @@ class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader PreventDefaultAction(); SpellInfo const* triggeredSpellInfo = sSpellMgr->EnsureSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); - int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); + int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks(DIFFICULTY_NONE)); GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff); } @@ -402,7 +402,7 @@ class spell_pri_improved_power_word_shield : public SpellScriptLoader spellMod->op = SpellModOp(aurEff->GetMiscValue()); spellMod->type = SPELLMOD_PCT; spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; + spellMod->mask = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->SpellClassMask; } spellMod->value = aurEff->GetAmount(); @@ -483,7 +483,7 @@ class spell_pri_guardian_spirit : public SpellScriptLoader bool Load() override { - healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + healPct = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(); return true; } @@ -752,7 +752,7 @@ class spell_pri_pain_and_suffering_proc : public SpellScriptLoader { uint32 damage = std::max(aur->GetAmount(), 0); sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); - aur->SetDamage(caster->SpellDamageBonusDone(target, aur->GetSpellInfo(), damage, DOT) * aur->GetDonePct()); + aur->SetDamage(caster->SpellDamageBonusDone(target, aur->GetSpellInfo(), damage, DOT, aur->GetSpellEffectInfo()) * aur->GetDonePct()); aur->CalculatePeriodic(caster, false, false); aur->GetBase()->RefreshDuration(); } @@ -1016,8 +1016,8 @@ class spell_pri_renew : public SpellScriptLoader // Divine Touch if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_DIVINE_TOUCH_TALENT, EFFECT_0)) { - uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), aurEff->GetAmount(), DOT); - heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT); + uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), aurEff->GetAmount(), DOT, aurEff->GetSpellEffectInfo()); + heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, aurEff->GetSpellEffectInfo()); int32 basepoints0 = CalculatePct(int32(heal) * aurEff->GetTotalTicks(), empoweredRenewAurEff->GetAmount()); caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_DIVINE_TOUCH, &basepoints0, NULL, NULL, true, NULL, aurEff); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 580549a3d99..e9cf81f2e64 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -635,12 +635,12 @@ class spell_q12683_take_sputum_sample : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - uint32 reqAuraId = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + uint32 reqAuraId = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(); Unit* caster = GetCaster(); if (caster->HasAuraEffect(reqAuraId, 0)) { - uint32 spellId = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + uint32 spellId = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(); caster->CastSpell(caster, spellId, true, NULL); } } @@ -1850,7 +1850,7 @@ class spell_q13086_cannons_target : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) + if (!sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue())) return false; return true; } @@ -2011,7 +2011,7 @@ class spell_q12308_escape_from_silverbrook_summon_worgen : public SpellScriptLoa void ModDest(SpellDestination& dest) { - float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float dist = GetSpellInfo()->GetEffect(EFFECT_0)->CalcRadius(GetCaster()); float angle = frand(0.75f, 1.25f) * float(M_PI); Position pos = GetCaster()->GetNearPosition(dist, angle); @@ -2151,7 +2151,7 @@ class spell_q12619_emblazon_runeblade : public SpellScriptLoader { PreventDefaultAction(); if (Unit* caster = GetCaster()) - caster->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff); + caster->CastSpell(caster, GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, true, NULL, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 9b3b38875af..78ebe0734b5 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -145,7 +145,8 @@ class spell_rog_cheat_death : public SpellScriptLoader bool Load() override { - absorbChance = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + // 6.x has basepoint = 0 ! + absorbChance = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(); return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; } @@ -491,57 +492,6 @@ class spell_rog_master_of_subtlety : public SpellScriptLoader } }; -// 31130 - Nerves of Steel -class spell_rog_nerves_of_steel : public SpellScriptLoader -{ - public: - spell_rog_nerves_of_steel() : SpellScriptLoader("spell_rog_nerves_of_steel") { } - - class spell_rog_nerves_of_steel_AuraScript : public AuraScript - { - PrepareAuraScript(spell_rog_nerves_of_steel_AuraScript); - - public: - spell_rog_nerves_of_steel_AuraScript() - { - absorbPct = 0; - } - - private: - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while stun or fear - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<<MECHANIC_STUN))) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_nerves_of_steel_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_rog_nerves_of_steel_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_rog_nerves_of_steel_AuraScript(); - } -}; - // 58428 - Overkill class spell_rog_overkill : public SpellScriptLoader { @@ -642,51 +592,6 @@ class spell_rog_preparation : public SpellScriptLoader } }; -// 51685 - Prey on the Weak -class spell_rog_prey_on_the_weak : public SpellScriptLoader -{ - public: - spell_rog_prey_on_the_weak() : SpellScriptLoader("spell_rog_prey_on_the_weak") { } - - class spell_rog_prey_on_the_weak_AuraScript : public AuraScript - { - PrepareAuraScript(spell_rog_prey_on_the_weak_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_PREY_ON_THE_WEAK)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - Unit* victim = target->GetVictim(); - if (victim && (target->GetHealthPct() > victim->GetHealthPct())) - { - if (!target->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK)) - { - int32 bp = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); - target->CastCustomSpell(target, SPELL_ROGUE_PREY_ON_THE_WEAK, &bp, nullptr, nullptr, true); - } - } - else - target->RemoveAurasDueToSpell(SPELL_ROGUE_PREY_ON_THE_WEAK); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_prey_on_the_weak_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_rog_prey_on_the_weak_AuraScript(); - } -}; - // 73651 - Recuperate class spell_rog_recuperate : public SpellScriptLoader { @@ -714,7 +619,7 @@ class spell_rog_recuperate : public SpellScriptLoader canBeRecalculated = false; if (Unit* caster = GetCaster()) { - int32 baseAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster) * 1000; + int32 baseAmount = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(caster) * 1000; // Improved Recuperate if (AuraEffect const* auraEffect = caster->GetDummyAuraEffect(SPELLFAMILY_ROGUE, ICON_ROGUE_IMPROVED_RECUPERATE, EFFECT_0)) baseAmount += auraEffect->GetAmount(); @@ -1028,10 +933,8 @@ void AddSC_rogue_spell_scripts() new spell_rog_deadly_poison(); new spell_rog_killing_spree(); new spell_rog_master_of_subtlety(); - new spell_rog_nerves_of_steel(); new spell_rog_overkill(); new spell_rog_preparation(); - new spell_rog_prey_on_the_weak(); new spell_rog_recuperate(); new spell_rog_rupture(); new spell_rog_shiv(); diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 5e8e3a1070f..8e363c6f125 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -236,7 +236,7 @@ class spell_sha_chain_heal : public SpellScriptLoader if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID())) { riptide = true; - amount = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + amount = aurEff->GetSpellInfo()->GetEffect(DIFFICULTY_NONE, EFFECT_2)->CalcValue(); // Consume it GetHitUnit()->RemoveAura(aurEff->GetBase()); } @@ -284,12 +284,12 @@ class spell_sha_earth_shield : public SpellScriptLoader return true; } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/) + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool & /*canBeRecalculated*/) { if (Unit* caster = GetCaster()) { - amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL); - amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL); + amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL, aurEff->GetSpellEffectInfo()); + amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL, aurEff->GetSpellEffectInfo()); //! WORKAROUND // If target is affected by healing reduction, modifier is guaranteed to be negative @@ -561,44 +561,6 @@ class spell_sha_flame_shock : public SpellScriptLoader } }; -// 77794 - Focused Insight -class spell_sha_focused_insight : public SpellScriptLoader -{ - public: - spell_sha_focused_insight() : SpellScriptLoader("spell_sha_focused_insight") { } - - class spell_sha_focused_insight_AuraScript : public AuraScript - { - PrepareAuraScript(spell_sha_focused_insight_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FOCUSED_INSIGHT)) - return false; - return true; - } - - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - int32 basePoints0 = aurEff->GetAmount(); - int32 basePoints1 = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - - GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_FOCUSED_INSIGHT, &basePoints0, &basePoints1, &basePoints1, true, NULL, aurEff); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_sha_focused_insight_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_sha_focused_insight_AuraScript(); - } -}; - // 55440 - Glyph of Healing Wave class spell_sha_glyph_of_healing_wave : public SpellScriptLoader { @@ -659,26 +621,26 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader return sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL) != nullptr; } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex effIndex) { int32 damage = GetEffectValue(); SpellInfo const* triggeringSpell = GetTriggeringSpell(); if (Unit* target = GetHitUnit()) - if (Unit* caster = GetCaster()) + { + if (Unit* owner = GetCaster()->GetOwner()) { - if (Unit* owner = caster->GetOwner()) - { - if (triggeringSpell) - damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); - - // Soothing Rains - if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SOOTHING_RAIN, EFFECT_0)) - AddPct(damage, dummy->GetAmount()); - - damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL)); - } - caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); + if (triggeringSpell) + damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL, triggeringSpell->GetEffect(target, effIndex))); + + // Soothing Rains + if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SOOTHING_RAIN, EFFECT_0)) + AddPct(damage, dummy->GetAmount()); + + if (triggeringSpell) + damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL, triggeringSpell->GetEffect(target, effIndex))); } + GetCaster()->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); + } } void Register() override @@ -1072,7 +1034,7 @@ class spell_sha_nature_guardian : public SpellScriptLoader eventInfo.GetProcTarget()->getThreatManager().modifyThreatPercent(GetTarget(), -10); if (Player* player = GetTarget()->ToPlayer()) - player->AddSpellCooldown(GetSpellInfo()->Id, 0, time(NULL) + aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue()); + player->AddSpellCooldown(GetSpellInfo()->Id, 0, time(NULL) + aurEff->GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()); } void Register() override @@ -1242,7 +1204,6 @@ void AddSC_shaman_spell_scripts() new spell_sha_feedback(); new spell_sha_fire_nova(); new spell_sha_flame_shock(); - new spell_sha_focused_insight(); new spell_sha_glyph_of_healing_wave(); new spell_sha_healing_stream_totem(); new spell_sha_heroism(); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 128cddef1c1..5e745f6ab00 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -201,15 +201,16 @@ class spell_warl_conflagrate : public SpellScriptLoader return true; } - void HandleHit(SpellEffIndex /*effIndex*/) - { - if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID())) - SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()))); - } + // 6.x dmg formula in tooltip + // void HandleHit(SpellEffIndex /*effIndex*/) + // { + // if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID())) + // SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()))); + // } void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + //OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); } }; @@ -426,7 +427,7 @@ class spell_warl_demon_soul : public SpellScriptLoader { if (targetCreature->IsPet()) { - CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); + CreatureTemplate const* ci = targetCreature->GetCreatureTemplate(); switch (ci->family) { case CREATURE_FAMILY_SUCCUBUS: @@ -485,8 +486,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader { if (targetCreature->IsPet()) { - CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); - ASSERT(ci); + CreatureTemplate const* ci = targetCreature->GetCreatureTemplate(); switch (ci->family) { case CREATURE_FAMILY_SUCCUBUS: @@ -536,7 +536,7 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader { PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript); - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + void HandleScriptEffect(SpellEffIndex effIndex) { Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) @@ -545,7 +545,7 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader { uint32 damage = std::max(aurEff->GetAmount(), 0); sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); - aurEff->SetDamage(caster->SpellDamageBonusDone(target, aurEff->GetSpellInfo(), damage, DOT) * aurEff->GetDonePct()); + aurEff->SetDamage(caster->SpellDamageBonusDone(target, aurEff->GetSpellInfo(), damage, DOT, GetEffectInfo(effIndex)) * aurEff->GetDonePct()); aurEff->CalculatePeriodic(caster, false, false); aurEff->GetBase()->RefreshDuration(true); } @@ -563,43 +563,6 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader } }; -// 77799 - Fel Flame - Updated to 4.3.4 -class spell_warl_fel_flame : public SpellScriptLoader -{ - public: - spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { } - - class spell_warl_fel_flame_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_fel_flame_SpellScript); - - void OnHitTarget(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID()); - if (!aura) - aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID()); - - if (!aura) - return; - - int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000; - aura->SetDuration(std::min(newDuration, aura->GetMaxDuration())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_warl_fel_flame_SpellScript; - } -}; - // -47230 - Fel Synergy class spell_warl_fel_synergy : public SpellScriptLoader { @@ -868,7 +831,8 @@ class spell_warl_improved_soul_fire : public SpellScriptLoader // 1454 - Life Tap /// Updated 4.3.4 -class spell_warl_life_tap : public SpellScriptLoader +// 6.x fully changed this +/*class spell_warl_life_tap : public SpellScriptLoader { public: spell_warl_life_tap() : SpellScriptLoader("spell_warl_life_tap") { } @@ -882,7 +846,7 @@ class spell_warl_life_tap : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellInfo*/) override + bool Validate(SpellInfo const* spellInfo) override { if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2)) @@ -890,7 +854,7 @@ class spell_warl_life_tap : public SpellScriptLoader return true; } - void HandleDummy(SpellEffIndex /*effIndex*/) + void HandleDummy(SpellEffIndex effIndex) { Player* caster = GetCaster()->ToPlayer(); if (Unit* target = GetHitUnit()) @@ -935,7 +899,7 @@ class spell_warl_life_tap : public SpellScriptLoader { return new spell_warl_life_tap_SpellScript(); } -}; +};*/ // 687 - Demon Armor // 28176 - Fel Armor @@ -1194,22 +1158,18 @@ class spell_warl_soul_swap : public SpellScriptLoader } }; +#define SoulSwapOverrideScriptName "spell_warl_soul_swap_override" + // 86211 - Soul Swap Override - Also acts as a dot container class spell_warl_soul_swap_override : public SpellScriptLoader { public: - spell_warl_soul_swap_override() : SpellScriptLoader("spell_warl_soul_swap_override") { } + spell_warl_soul_swap_override() : SpellScriptLoader(SoulSwapOverrideScriptName) { } class spell_warl_soul_swap_override_AuraScript : public AuraScript { PrepareAuraScript(spell_warl_soul_swap_override_AuraScript); - bool Load() override - { - _swapCaster = NULL; - return true; - } - //! Forced to, pure virtual functions must have a body when linking void Register() override { } @@ -1221,7 +1181,7 @@ class spell_warl_soul_swap_override : public SpellScriptLoader private: std::list<uint32> _dotList; - Unit* _swapCaster; + Unit* _swapCaster = nullptr; }; AuraScript* GetAuraScript() const override @@ -1249,14 +1209,16 @@ class spell_warl_soul_swap_dot_marker : public SpellScriptLoader if (!warlock || !swapVictim) return; - flag128 classMask = GetSpellInfo()->Effects[effIndex].SpellClassMask; + // effect existance checked in dbc, should not be removed by core at any time, so no need to check for null + SpellEffectInfo const* effect = GetSpellInfo()->GetEffect(DIFFICULTY_NONE, EFFECT_0); + flag128 classMask = effect->SpellClassMask; Unit::AuraApplicationMap const& appliedAuras = swapVictim->GetAppliedAuras(); - SoulSwapOverrideAuraScript* swapSpellScript = NULL; + SoulSwapOverrideAuraScript* swapSpellScript = nullptr; if (Aura* swapOverrideAura = warlock->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) - swapSpellScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverrideAura->GetScriptByName("spell_warl_soul_swap_override")); + swapSpellScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverrideAura->GetScriptByName(SoulSwapOverrideScriptName)); - if (swapSpellScript == NULL) + if (!swapSpellScript) return; for (Unit::AuraApplicationMap::const_iterator itr = appliedAuras.begin(); itr != appliedAuras.end(); ++itr) @@ -1303,9 +1265,9 @@ public: SpellCastResult CheckCast() { Unit* currentTarget = GetExplTargetUnit(); - Unit* swapTarget = NULL; + Unit* swapTarget = nullptr; if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) - if (SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName("spell_warl_soul_swap_override"))) + if (SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName(SoulSwapOverrideScriptName))) swapTarget = swapScript->GetOriginalSwapSource(); // Soul Swap Exhale can't be cast on the same target than Soul Swap @@ -1321,10 +1283,10 @@ public: bool hasGlyph = GetCaster()->HasAura(SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP); std::list<uint32> dotList; - Unit* swapSource = NULL; + Unit* swapSource = nullptr; if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) { - SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName("spell_warl_soul_swap_override")); + SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName(SoulSwapOverrideScriptName)); if (!swapScript) return; dotList = swapScript->GetDotList(); @@ -1452,14 +1414,14 @@ void AddSC_warlock_spell_scripts() new spell_warl_demonic_empowerment(); new spell_warl_demon_soul(); new spell_warl_everlasting_affliction(); - new spell_warl_fel_flame(); + //new spell_warl_fel_flame(); new spell_warl_fel_synergy(); new spell_warl_glyph_of_shadowflame(); new spell_warl_haunt(); new spell_warl_health_funnel(); new spell_warl_healthstone_heal(); new spell_warl_improved_soul_fire(); - new spell_warl_life_tap(); + //new spell_warl_life_tap(); new spell_warl_nether_ward_overrride(); new spell_warl_seduction(); new spell_warl_seed_of_corruption(); diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 3b6b68d3fce..d6ff9375544 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -87,15 +87,15 @@ class spell_warr_bloodthirst : public SpellScriptLoader { PrepareSpellScript(spell_warr_bloodthirst_SpellScript); - void HandleDamage(SpellEffIndex /*effIndex*/) + void HandleDamage(SpellEffIndex effIndex) { int32 damage = GetEffectValue(); ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); if (Unit* target = GetHitUnit()) { - damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); - damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); + damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE, GetEffectInfo(effIndex)); + damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE, GetEffectInfo(effIndex)); } SetHitDamage(damage); } @@ -120,34 +120,6 @@ class spell_warr_bloodthirst : public SpellScriptLoader }; /// Updated 4.3.4 -class spell_warr_bloodthirst_heal : public SpellScriptLoader -{ - public: - spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { } - - class spell_warr_bloodthirst_heal_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript); - - void HandleHeal(SpellEffIndex /*effIndex*/) - { - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) - SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())) / 100); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_warr_bloodthirst_heal_SpellScript(); - } -}; - -/// Updated 4.3.4 class spell_warr_charge : public SpellScriptLoader { public: @@ -216,59 +188,6 @@ class spell_warr_concussion_blow : public SpellScriptLoader } }; -// -12162 - Deep Wounds -class spell_warr_deep_wounds : public SpellScriptLoader -{ - public: - spell_warr_deep_wounds() : SpellScriptLoader("spell_warr_deep_wounds") { } - - class spell_warr_deep_wounds_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warr_deep_wounds_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || - !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || - !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3) || - !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - ApplyPct(damage, 16 * GetSpellInfo()->GetRank()); - - SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC); - uint32 ticks = uint32(spellInfo->GetDuration()) / spellInfo->Effects[EFFECT_0].ApplyAuraPeriod; - - // Add remaining ticks to damage done - if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, EFFECT_0, caster->GetGUID())) - damage += aurEff->GetDamage() * int32(ticks - aurEff->GetTickNumber()); - - damage /= int32(ticks); - - caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, &damage, NULL, NULL, true); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warr_deep_wounds_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_warr_deep_wounds_SpellScript(); - } -}; - /// Updated 4.3.4 class spell_warr_execute : public SpellScriptLoader { @@ -281,7 +200,7 @@ class spell_warr_execute : public SpellScriptLoader void HandleEffect(SpellEffIndex /*effIndex*/) { - Unit* caster = GetCaster(); + /*Unit* caster = GetCaster(); if (GetHitUnit()) { SpellInfo const* spellInfo = GetSpellInfo(); @@ -302,7 +221,7 @@ class spell_warr_execute : public SpellScriptLoader /// Formula taken from the DBC: "${$ap*0.874*$m1/100-1} = 20 rage" int32 moreDamage = int32(rageUsed * (caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.874f * GetEffectValue() / 100.0f - 1) / 200); SetHitDamage(baseDamage + moreDamage); - } + }*/ } void Register() override @@ -317,42 +236,6 @@ class spell_warr_execute : public SpellScriptLoader } }; -// 58387 - Glyph of Sunder Armor -class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader -{ - public: - spell_warr_glyph_of_sunder_armor() : SpellScriptLoader("spell_warr_glyph_of_sunder_armor") { } - - class spell_warr_glyph_of_sunder_armor_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warr_glyph_of_sunder_armor_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (!spellMod) - { - spellMod = new SpellModifier(aurEff->GetBase()); - spellMod->op = SpellModOp(aurEff->GetMiscValue()); - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - - spellMod->value = aurEff->GetAmount(); - } - - void Register() override - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warr_glyph_of_sunder_armor_AuraScript(); - } -}; - // 59725 - Improved Spell Reflection class spell_warr_improved_spell_reflection : public SpellScriptLoader { @@ -991,11 +874,11 @@ class spell_warr_vigilance : public SpellScriptLoader void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - PreventDefaultAction(); + /*PreventDefaultAction(); int32 damage = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue())); GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff); - _procTarget->CastCustomSpell(_procTarget, SPELL_WARRIOR_VENGEANCE, &damage, &damage, &damage, true, NULL, aurEff); + _procTarget->CastCustomSpell(_procTarget, SPELL_WARRIOR_VENGEANCE, &damage, &damage, &damage, true, NULL, aurEff);*/ } void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1058,12 +941,9 @@ class spell_warr_vigilance_trigger : public SpellScriptLoader void AddSC_warrior_spell_scripts() { new spell_warr_bloodthirst(); - new spell_warr_bloodthirst_heal(); new spell_warr_charge(); new spell_warr_concussion_blow(); - new spell_warr_deep_wounds(); new spell_warr_execute(); - new spell_warr_glyph_of_sunder_armor(); new spell_warr_improved_spell_reflection(); new spell_warr_intimidating_shout(); new spell_warr_lambs_to_the_slaughter(); 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/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 17c37c7eba0..3e89041a9e9 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -234,9 +234,12 @@ bool EquippedOk(Player* player, uint32 spellId) if (!spell) return false; - for (uint8 i = 0; i < 3; ++i) + for (SpellEffectInfo const* effect : spell->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - uint32 reqSpell = spell->Effects[i].TriggerSpell; + if (!effect) + continue; + + uint32 reqSpell = effect->TriggerSpell; if (!reqSpell) continue; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 57c0ddf066e..34699c19648 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2159,8 +2159,8 @@ public: const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (spellInfo && spellInfo->Effects[0].Effect == SPELL_EFFECT_SUMMON_OBJECT_WILD) - return spellInfo->Effects[0].MiscValue; + if (spellInfo && spellInfo->GetEffect(EFFECT_0)->Effect == SPELL_EFFECT_SUMMON_OBJECT_WILD) + return spellInfo->GetEffect(EFFECT_0)->MiscValue; return 0; } 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/Socket.h b/src/server/shared/Networking/Socket.h index d3e29ceaaea..5c891d925fa 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -34,7 +34,9 @@ using boost::asio::ip::tcp; #define READ_BLOCK_SIZE 4096 -#define TC_SOCKET_USE_IOCP BOOST_ASIO_HAS_IOCP +#ifdef BOOST_ASIO_HAS_IOCP +#define TC_SOCKET_USE_IOCP +#endif template<class T> class Socket : public std::enable_shared_from_this<T> 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/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(); } }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 71bc9233f87..1aefbfa13de 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -93,7 +93,7 @@ LogsDir = "" # Default: "127.0.0.1;3306;trinity;trinity;auth" - (LoginDatabaseInfo) # "127.0.0.1;3306;trinity;trinity;world" - (WorldDatabaseInfo) # "127.0.0.1;3306;trinity;trinity;characters" - (CharacterDatabaseInfo) -# "127.0.0.1;3306;trinity;trinity;hotfixes" - (HotfixDatabaseInfo) +# "127.0.0.1;3306;trinity;trinity;hotfixes" - (HotfixDatabaseInfo) LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;auth" WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world" @@ -3034,7 +3034,7 @@ AuctionHouseBot.Buyer.Neutral.Chance.Ratio = 3 ################################################################################################### ################################################################################################### -# LOGGING SYSTEM SETTINGS +# LOGGING SYSTEM SETTINGS # # Appender config values: Given a appender "name" # Appender.name @@ -3192,67 +3192,6 @@ Allow.IP.Based.Action.Logging = 0 ################################################################################################### ################################################################################################### -# GUILD LEVELING SETTINGS -# -# Guild.LevelingEnabled -# Description: Controls whether guild can gain levels -# Default: 1 -# - -Guild.LevelingEnabled = 1 - -# -# Guild.SaveInterval -# Description: Time (in minutes) between guild experience saves -# Default: 15 -# - -Guild.SaveInterval = 15 - -# -# Guild.MaxLevel -# Description: Defines max level a guild can reach -# Default: 25 -# - -Guild.MaxLevel = 25 - -# -# Guild.UndeletableLevel -# Description: Guild reaching this level (and higher) cannot be disbanded anymore -# Default: 4 -# - -Guild.UndeletableLevel = 4 - -# -# Guild.XPModifier -# Description: Multiplier for guild experience gained from quests -# Default: 0.25 -# - -Guild.XPModifier = 0.25 - -# -# Guild.DailyXPCap -# Description: Maximum experience points a guild can earn each day -# Default: 7807500 -# - -Guild.DailyXPCap = 7807500 - -# -# Guild.WeeklyReputationCap -# Description: Maximum guild reputation a player can earn every week -# Default: 4375 -# - -Guild.WeeklyReputationCap = 4375 - -# -################################################################################################### - -################################################################################################### # CURRENCIES SETTINGS # # Currency.ResetInterval diff --git a/src/tools/connection_patcher/Program.cpp b/src/tools/connection_patcher/Program.cpp index 56007232d20..8c9060dc45d 100644 --- a/src/tools/connection_patcher/Program.cpp +++ b/src/tools/connection_patcher/Program.cpp @@ -194,6 +194,11 @@ int main(int argc, char** argv) do_patches<Patches::Mac::x64, Patterns::Mac::x64> (&patcher, renamed_binary_path); + { + namespace fs = boost::filesystem; + fs::permissions(renamed_binary_path, fs::add_perms | fs::others_exe | fs::group_exe | fs::owner_exe); + } + do_module<Patches::Mac::x64, Patterns::Mac::x64> ( "97eeb2e28e9e56ed6a22d09f44e2ff43c93315e006bbad43bafc0defaa6f50ae.auth" , "/Users/Shared/Blizzard/Battle.net/Cache/" @@ -211,6 +216,8 @@ int main(int argc, char** argv) catch (std::exception const& ex) { std::cerr << "EX: " << ex.what() << std::endl; + std::cerr << "An error occurred. Press ENTER to continue..."; + std::cin.get(); return 1; } } |